Java阶段二Day11

news2025/1/19 3:09:11

Java阶段二Day11

文章目录

  • Java阶段二Day11
    • DQL
      • 主键与外键
      • 外键约束
      • 多对多关系
      • 内连接
      • 外连接
      • 自连接
    • JDBC
      • 核心接口
      • JDBC连接的基本流程
  • 教师总结
      • 主键与外键
        • 外键约束
          • 结论:关联关系中通常不适用外键约束。
      • 多对多关系
        • 多对多关联查询
        • 练习
          • 题干
          • 答案
      • 内连接
        • 语法
      • 外连接
      • 自连接
        • 定义
        • 场景
        • 形式

DQL

主键与外键

  • 主键(PK):一张表中通常第一个字段为主键字段,用来唯一标识表中的一条记录.主键要求的条件是非空且唯一

  • 外键(FK):一张表中一个字段保存了另一张表中主键字段的值,那么这个字段就是外键字段

  • 在关联关系中,两张表通常就是使用主外键进行关联的,并且在关联查询中总是用等值连接主键与外键来建立两张表中记录的对应关系

  • 通常:定义外键字段的表在关联关系中处于 " 多 " 的一方

    例如:学生与班级表,学生表中有一个字段class_id保存着class表主键id字段的值.此时class_id字段就是外键字段.因此班级表与学生表存在一对多的关系,即:班级表的一条记录可以对应学生表的多条记录

外键约束

如果给某张表的某个字段施加外键约束,此时外键约束要求必须指明该外键对应的是哪张表的主键字段

  • 外键约束要求:外键字段保存的值必须是主键字段存在的值NULL
  • 外键约束引发问题:
    • 外键字段不能保存主键字段没有的值
    • 不能轻易删除主键字段表中的记录,如果外键中存在要删除的主键记录,相当于删除主键而外键字段保存了主键字段没有的值,想删除主键字段记录,先更新外键中存储的主键值为NULL,会带来大量的DML操作
  • 结论:关联关系中通常不使用外键约束

多对多关系

关联关系表的创建

内连接

内连接是i关联查询的另一种写法

语法:

SELECT 子句
FROM 表A
JOIN 表B ON A与B的连接条件
[JOIN 表C ON A与C或B与C的连接条件
 ...
]
WHERE 过滤条件

外连接

外连接也用于关联查询,特点:可以将不满足连接条件的记录也查询出来

  • 左外连接:以JOIN左侧表为驱动表,该表中所有记录都要体现在结果集中,右侧表不满足连接条件的记录对应的字段全部为NULL。前提是如果有过滤条件则仅列出符合过滤条件的记录

    SELECT 子句
    FROM 表A
    LEFT JOIN 表B ON A与B的连接条件
    WHERE 过滤条件
    
  • 右外连接:以JOIN右侧表作为驱动表,该表中的记录都要体现在结果集中,左侧表不满足连接条件的字段都补NULL

    SELECT 子句
    FROM 表A
    RIGHT JOIN 表B ON A与B的连接条件
    WHERE 过滤条件
    
  • 全连接:使用 UNION,合并左外连接和右外连接,取并集,重复记录只记录一次,要保证这些SQL查询时SELECT子句应当是一致的。字段的个数,顺序,类型。

    ORACLE中有全外连接的语法:FULL OUTER JOIN

自连接

自连接指当前表中的一条记录可以对应自己的多条记录

场景:具有相同属性的一组数据之间又存在上下级的树状结构数据

JDBC

JDBC Java数据库连接 Java Database Connectivity,是java官方提供的一套结构,用于连接DBMS并进行相关操作

核心接口

  • Connection: 表示数据库连接
  • Statement: 用来执行SQL语句的语句对象
  • PreparedStatement: 用来执行预编译SQL语句的语句对象用来表示查询结果集
  • ResultSet: 用来表示查询结构集

JDBC连接的基本流程

  1. 加载驱动
  2. 通过DriverManager 与 DBMS 建立连接 获得 Connection对象
  3. 通过连接对象创建语句对象 Statement
  4. 通过语句对象 执行相应的 SQL语句给数据库
  5. 获得执行SQL的结果

教师总结

主键与外键

主键:一张表中通常第一个字段为主键字段,用来唯一标识表中的一条记录.主键要求的条件是非空且唯一

外键:一张表中一个字段保存了另一张表中主键字段的值,那么这个字段就是外键字段.

在关联关系中,两张表通常就是使用主外键进行关联的.并且在关联查询中总是用等值连接主键与外键来建立两张表中记录的对应关系.

通常:定义外键字段的表在关联关系中处于"多"的一方.

例如:学生与班级表,学生表中有一个字段class_id保存着class表主键id字段的值.此时class_id字段

就是外键字段.因此班级表与学生表存在一对多的关系,即:班级表的一条记录可以对应学生表的多条记录.

外键约束

如果给某张表的某个字段施加外键约束,此时外键约束要求必须指明该外键对应的是哪站表的主键字段。

外键约束要求:

  • 外键字段保存的值必须是主键字段存在的值或NULL

外键约束引发的问题:

  • 外键字段不能保存主键字段没有的值
  • 不能轻易删除主键字段表中记录,因为如果外键中存在着要删除的主键记录,此时相当于删除掉主键自己则外键字段保存了主键字段没有的值。
    • 如果想删除主键字段记录,则需要现将该主键的值对应的所有表中外键是该值得记录更新为NULL,此时才可以将其删除,因此会带来大量的DML操作。
结论:关联关系中通常不适用外键约束。

多对多关系

多对多关系:A表与B表双向看待都是一对多,就是多对多关系

多对多关系需要提供一张关联关系表来维系多对多关系.该表保存着两张产生关系表的外键字段.

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-my11SQcv-1682602003626)(C:\Users\TEACHER\IdeaProjects\BirdBoot2303\数据库笔记\image-20230427101108867.png)]

多对多关联查询

  • 查看学习语文的学生都有谁?

    SELECT s.name,su.name,tss.score
    FROM subject su,student s,t_stu_subject_score tss
    WHERE su.id=tss.subject_id
    AND s.id=tss.stu_id
    AND su.name='语文'
    
  • 查看’李费水’都学了哪门课程以及成绩?

    SELECT s.name,su.name,tss.score
    FROM student s,subject su,t_stu_subject_score tss
    WHERE su.id=tss.subject_id
    AND s.id=tss.stu_id
    AND s.name='李费水'
    
    

练习

题干
1.查看1年级1班所有同学的语文成绩是多少?
2.统计1年级1班数学成绩的平均值?
3.统计6年级的英语成绩的平均值?
4.查看"刘苍松"所带班级的英语平均分?
5.查看工资最高的老师所带班级的各科成绩的平均分,最高分和最低分分别是多少?
6.查看每位大队长的5门成绩平均分是多少?
答案
1.查看1年级1班所有同学的语文成绩是多少?
  SELECT s.name,c.name,su.name,tss.score
  FROM class c,student s,t_stu_subject_score tss,subject su
  WHERE c.id=s.class_id
  AND s.id=tss.stu_id
  AND su.id=tss.subject_id
  AND c.name='1年级1班'
  AND su.name='语文'
  
2.统计1年级1班数学成绩的平均值?
  SELECT AVG(tss.score)
  FROM class c,student s,t_stu_subject_score tss,subject su
  WHERE c.id=s.class_id
  AND s.id=tss.stu_id
  AND su.id=tss.subject_id
  AND c.name='1年级1班'
  AND su.name='数学'

3.统计6年级的英语成绩的平均值?
  SELECT AVG(tss.score)
  FROM class c,student s,t_stu_subject_score tss,subject su
  WHERE c.id=s.class_id
  AND s.id=tss.stu_id
  AND su.id=tss.subject_id
  AND c.name LIKE '6年级%'
  AND su.name='英语'
  
  
4.查看"刘苍松"所带班级的英语平均分?
  SELECT AVG(tss.score)
  FROM teacher t,class c,student s,t_stu_subject_score tss,subject su
  WHERE t.id=c.teacher_id
  AND c.id=s.class_id
  AND s.id=tss.stu_id
  AND su.id = tss.subject_id
  AND t.name='刘苍松'
  AND su.name='英语'
  

5.查看工资最高的老师所带班级的各科成绩的平均分,最高分和最低分分别是多少?
  SELECT AVG(tss.score),MAX(tss.score),MIN(tss.score),su.name
  FROM teacher t,class c,student s,t_stu_subject_score tss,subject su
  WHERE t.id=c.teacher_id
  AND c.id=s.class_id
  AND s.id=tss.stu_id
  AND su.id = tss.subject_id
  AND t.salary=(SELECT MAX(salary) FROM teacher)
  GROUP BY su.name

6.查看每位大队长的5门成绩平均分是多少?
  SELECT s.name,AVG(tss.score)
  FROM student s,t_stu_subject_score tss,subject su
  WHERE s.id=tss.stu_id
  AND su.id=tss.subject_id
  AND s.job='大队长'
  GROUP BY s.name
  

内连接

内连接是关联查询的另一种写法

语法

SELECT 子句
FROM 表A
JOIN 表B ON A与B的连接条件
[JOIN 表C ON A与C或B与C的连接条件
 ...
]
WHERE 过滤条件

  • 查看1年级1班的学生信息?列出学生名字,年龄,所在班级

    SELECT s.name,s.age,c.name
    FROM class c,student s
    WHERE c.id=s.class_id		连接条件
    AND c.name='1年级1班'		  过滤条件
    
    内连接写法
    SELECT s.name,s.age,c.name
    FROM class c
    JOIN student s ON c.id=s.class_id		ON子句中书写连接条件
    WHERE c.name='1年级1班'				  WHERE子句中写过滤条件
    
  • 查看教英语的老师都有谁?

    SELECT t.name,su.name
    FROM teacher t,subject su
    WHERE t.subject_id=su.id
    AND su.name='英语'
    
    
    内连接
    SELECT t.name,su.name
    FROM teacher t
    JOIN subject su ON t.subject_id=su.id
    WHERE su.name='英语'
    
  • 查看每个班级名以及对应的班主任名字?

    SELECT c.name,t.name
    FROM teacher t
    JOIN class c ON t.id=c.teacher_id
    
  • 查看王克晶所带班级的女同学都有谁?(列出:老师名字,班级名字,学生名字,学生性别)

    SELECT t.name,c.name,s.name,s.gender
    FROM teacher t
    JOIN class c ON t.id=c.teacher_id
    JOIN student s ON c.id=s.class_id
    WHERE t.name='王克晶'
    AND s.gender='女'
    
    

外连接

外连接也用于关联查询,特点:可以将不满足连接条件的记录也查询出来

  • 左外连接:以JOIN左侧表为驱动表,该表中所有记录都要体现在结果集中,右侧表不满足连接条件的记录对应的字段全部为NULL。前提是如果有过滤条件则仅列出符合过滤条件的记录
  • 右外连接:以JOIN右侧表作为驱动表,该表中的记录都要体现在结果集中,左侧表不满足连接条件的字段都补NULL

  • 查看所有班级信息和对应的班主任信息,如果该班没有班主任也要将班级信息列出来.

    SELECT c.name,t.name
    FROM class c
    JOIN teacher t ON c.teacher_id=t.id
    
    因为class表中有三个班级的teacher_id为99,而teacher表中没有id为99的记录.因此这三条班级记录由于不满足连接条件,所以在结果集中没有被查询出来.
    
    需求是要将class表中记录完整展现(不满足连接条件的记录也要展现)
    SELECT c.name,c.floor,t.name,t.salary
    FROM class c LEFT JOIN teacher t ON c.teacher_id=t.id
    
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KX6HTPQK-1682602003628)(C:\Users\TEACHER\IdeaProjects\BirdBoot2303\数据库笔记\image-20230427115919032.png)]

自连接

定义

自连接是指当前表中的一条记录可以对应自己的多条记录

场景

具有相同属性的一组数据之间又存在上下级的树状结构数据。

例如:

  • 一个公司的人员组织结构。大家都是员工,员工又存在上下级。
  • 电商中常见的分类树

形式

当前表中有一个字段为外键而其保存的是本表主键字段的值

  • 查看’刘苍松’的下属都有谁?

    teacher表中记录了所有老师的信息,而manager字段记录了该老师的上级老师的id
    manager字段记录了teacher表主键字段id的值.
    
    SELECT t.name,m.name
    FROM teacher t,teacher m     将teacher当做两张表看待,t表示保存老师  m表示保存领导
    WHERE t.manager=m.id
    AND m.name='刘苍松'
    
    内连接写法
    SELECT t.name,m.name
    FROM teacher t
    JOIN teacher m ON t.manager=m.id
    WHERE m.name='刘苍松'
    
    
  • 查看3年级2班的班长是谁?(student表中team_leader记录班长的学生id)

    班长的特点:teacher_leader的值与id值相同的学生应当就是该班的班长
    SELECT s.name
    FROM class c
    JOIN student s ON s.class_id=c.id
    WHERE c.name='3年级2班'
    AND s.team_leader=s.id
    
  • 年龄最大的学生所在班的班主任的上司是谁?

    SELECT s.name,s.birth,c.name,t.name,m.name
    FROM student s,class c,teacher t,teacher m
    WHERE s.class_id=c.id
    AND c.teacher_id=t.id
    AND t.manager=m.id
    AND s.birth=(SELECT MIN(birth) FROM student)
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/469536.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

研报精选230427

目录 【行业230427东方金诚】有色金属行业信用风险回顾与2023年展望 【行业230427头豹研究院】2023年中国汽车安全气囊行业词条报告 【行业230427头豹研究院】2023年中国钠离子负极材料行业词条报告 【个股230427开源证券_佳禾食品】公司首次覆盖报告:植脂末龙头再启…

小匠物联出席宁波第五届家电产业数字化对接会助推家电产业数智化

宁波的家电资源与市场充足,特别是小家电,涉及20多个细分行业、近千个品种,其中10多个细分行业小家电产量一直位居全国或全球首列。但受原材料上涨等多重因素的影响,作为宁波市传统优势产业的家电产业也未能避免,产业数…

ldif 数据转成正确的组织结构再探

上次文章最后有说到按照之前的思路来转化组织结构是有坑的,我们现在还只是对接 AD域,ldap 协议的其他产品在细节上还会有些许不同 我们是不能直接粗暴的认为 cn 就是对应标识一个用户, cn 是 common name 的意思,他也可以表示我们…

【LeetCode】(力扣) c/c++刷题-145. 二叉树的后序遍历

题目: 给你一棵二叉树的根节点 root ,返回其节点值的 后序遍历 。 示例 1: 输入:root [1,null,2,3] 输出:[3,2,1] 示例 2: 输入:root [] 输出:[] 示例 3: 输入&a…

线性表的链式存储结构与操作 题目编号:455

题目描述 评论 请你定义一个链表,可以对链表进行“在某个元素之前插入一些元素”、“删除某个位置的元素”、“查找某元素”、“获取某个位置的元素”、“遍历输出所有元素”、“求链表的长度”等操作。键盘输入一些命令,可以执行上述操作。本题中&…

电控针阀和手动可变泄漏阀组合在超高真空度精密PID控制中的应用

摘要:超高真空度的控制普遍采用具有极小开度的可变泄漏阀对进气流量进行微小调节。目前常用的手动可变泄漏阀无法进行超高真空度的自动控制且不准确,电控可变泄漏阀尽管可以实现自动控制但价格昂贵。为了实现自动控制且降低成本,本文提出了手…

线性表的顺序存储结构与操作 题目编号:454

题目描述 请你定义一个顺序表,可以对顺序表进行如下操作: 在某个元素之前插入一些元素 删除某个位置的元素 查找某元素 获取某个位置的元素 遍历输出所有元素 键盘输入一些命令,可以执行上述操作。本题中,顺序表元素为整数&…

【BIM+GIS】Supernap加载实景三维倾斜摄影模型

OSGB是常见的倾斜模型格式,本文讲述如何在Supernap中加载实景三维倾斜摄影模型OSGB。 文章目录 一、生成配置文件二、加载倾斜模型1. 新建场景2. 添加模型3. 高程调整一、生成配置文件 点击【三维数据】→【数据管理】→【生成配置文件】。 参数设置如下: 源路径:选择倾斜模…

荔枝派Zero(全志V3S)开启mplayer,播放音视频

文章目录 前言一、buildroot 配置及编译1、开启 ALSA 和 MPLAY2、编译 二、拷贝到到 SD 卡1、将 rootfs.tar 解压缩到 SD 卡 rootfs 分区②、将 mp4 文件和 mp3 文件拷贝到 SD 卡 rootfs 分区 三、测试1、mplayer 使用2、mplayer 播放音频3、mplayer 播放视频 前言 mplayer 是…

华为在软件工具生态埋下多颗“种子”,静候国产软件产业萌芽

文丨智能相对论 作者丨沈浪 当代的数字经济大厦由各种各样的软件一块一块地搭建起来。然而,站在国内软件行业的中心,热闹的大多是来自上层的软件应用,而沉寂的却总是底层又难又基础的领域,比如软件开发。 软件开发,…

初始新能源汽车

文章目录 电动汽车的三级模块体系VCU(整车控制器)MCU(电机控制器)电池包和BMS(电池管理系统)电动汽车的大三电电动汽车的小三电电动汽车的模块组成 电动汽车的三级模块体系 总体上讲,整个新能源…

牛客刷题篇:客似云来 和 剪花布条(Java)

目录 题目一:客似云来 输入描述 输出描述 解题思路 代码 题目二:剪花布条 输入描述 输出描述 解题思路 代码 题目一:客似云来 链接:客似云来 NowCoder开了一家早餐店,这家店的客人都有个奇怪的癖好&#xff…

算法刷题|1143.最长公共子序列、1035.不相交的线、53.最大子数组和

最长公共子序列 给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0 。 一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符&a…

跨子网通信【路由通信。配置路由】

路由通信条件是:服务器多网卡 or 单网卡多IP 查看路由表 route -n设置一网卡多IP 进行网络配置 进入setup中,选择网络配置 setup选择设备配置 去除DHCP动态协议 进来后,可能会发现无法对静态IP和子网掩码进行编辑,是因为你开启…

Qt - 从零到壹的 打地鼠 游戏

❤️‍🔥欢迎收看西北风的blog,好男人就是我,我就是西北风。✨ 目录 🟥一:创建一个主窗体 🟣二.:添加主窗口背景图片以及相关部件 🔸2.1 添加资源文件 2.1.1 添加资源文件 2.1…

NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_实际操作01---大数据之Nifi工作笔记0040

我们基于之前做的从mysql中获取数据,然后同步数据到mysql中,基于这个案例来做,可以看到上面是,这个案例的所有处理器,我们基于这个来改造. 1.首先我这里重新安装了一个mysql8.0.33 ,安装的是windows版本的,如果你是linux版本的,这里也说一下,如何开启binlog功能,首先要开启bin…

模拟和数字电路 —— 导学篇

前言:本科零基础跨考模电,时间不是很充裕,选择不补学电路分析的基础,直接开始学习模电。如果遇到不会的问题只学习指定的那块。 学习模电需要哪些基本电路知识 比如学习基本放大电路时经常用到的KVL、KCL;学习频率响应…

用C++实现Date类

Date类 判断 大于 小于 等于 等等运算符重载函数 我们先实现一个 > 的运算符重载,然后再实现一个 的运算符重载: bool Date::operator>(const Date& d) {if (_year > d._year){return true;}else if (_year d._year && _mo…

教你如何通过内网穿透轻松实现PL/SQL远程连接Oracle数据库【内网穿透】

文章目录 前言1. 数据库搭建2. 内网穿透2.1 安装cpolar内网穿透2.2 创建隧道映射 3. 公网远程访问4. 配置固定TCP端口地址4.1 保留一个固定的公网TCP端口地址4.2 配置固定公网TCP端口地址4.3 测试使用固定TCP端口地址远程Oracle 转发自CSDN远程穿透的文章:公网远程连…

【PLC】贝加莱PLC理论及操作年度培训

最近在进行PLC培训,主要是贝加莱PLC产品的学习,学习了上下位机的一些基本操作,能够进行一些简单的实践,最后顺利通过年度考核。 0 引言 PLC:可编程逻辑控制器,由CPU、存储器、输入输出接口、电影以及外部设…