Java阶段二Day11
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连接的基本流程
- 加载驱动
- 通过DriverManager 与 DBMS 建立连接 获得 Connection对象
- 通过连接对象创建语句对象 Statement
- 通过语句对象 执行相应的 SQL语句给数据库
- 获得执行SQL的结果
教师总结
主键与外键
主键:一张表中通常第一个字段为主键字段,用来唯一标识表中的一条记录.主键要求的条件是非空且唯一
外键:一张表中一个字段保存了另一张表中主键字段的值,那么这个字段就是外键字段.
在关联关系中,两张表通常就是使用主外键进行关联的.并且在关联查询中总是用等值连接主键与外键来建立两张表中记录的对应关系.
通常:定义外键字段的表在关联关系中处于"多"的一方.
例如:学生与班级表,学生表中有一个字段class_id保存着class表主键id字段的值.此时class_id字段
就是外键字段.因此班级表与学生表存在一对多的关系,即:班级表的一条记录可以对应学生表的多条记录.
外键约束
如果给某张表的某个字段施加外键约束,此时外键约束要求必须指明该外键对应的是哪站表的主键字段。
外键约束要求:
- 外键字段保存的值必须是主键字段存在的值或NULL
外键约束引发的问题:
- 外键字段不能保存主键字段没有的值
- 不能轻易删除主键字段表中记录,因为如果外键中存在着要删除的主键记录,此时相当于删除掉主键自己则外键字段保存了主键字段没有的值。
- 如果想删除主键字段记录,则需要现将该主键的值对应的所有表中外键是该值得记录更新为NULL,此时才可以将其删除,因此会带来大量的DML操作。
结论:关联关系中通常不适用外键约束。
多对多关系
多对多关系:A表与B表双向看待都是一对多,就是多对多关系
多对多关系需要提供一张关联关系表来维系多对多关系.该表保存着两张产生关系表的外键字段.
多对多关联查询
例
-
查看学习语文的学生都有谁?
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
自连接
定义
自连接是指当前表中的一条记录可以对应自己的多条记录
场景
具有相同属性的一组数据之间又存在上下级的树状结构数据。
例如:
- 一个公司的人员组织结构。大家都是员工,员工又存在上下级。
- 电商中常见的分类树
形式
当前表中有一个字段为外键而其保存的是本表主键字段的值
例
-
查看’刘苍松’的下属都有谁?
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)文章来源:https://www.toymoban.com/news/detail-427853.html
班长的特点: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
-
年龄最大的学生所在班的班主任的上司是谁?文章来源地址https://www.toymoban.com/news/detail-427853.html
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)
到了这里,关于Java阶段二Day11的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!