0
点赞
收藏
分享

微信扫一扫

美颜sdk开发实践:如何构建美颜sdk功能?

陈情雅雅 2023-04-28 阅读 56

Java阶段二Day11

文章目录

DQL

主键与外键

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

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

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

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

外键约束

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

  • 外键约束要求:外键字段保存的值必须是主键字段存在的值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)
    
举报

相关推荐

0 条评论