Java阶段二Day11

这篇具有很好参考价值的文章主要介绍了Java阶段二Day11。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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连接的基本流程

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

教师总结

主键与外键

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

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

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

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

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

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

外键约束

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

外键约束要求:

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

外键约束引发的问题:

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

多对多关系

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

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

Java阶段二Day11

多对多关联查询
  • 查看学习语文的学生都有谁?

    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
    
    

    Java阶段二Day11

自连接

定义

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

场景

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

例如:

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

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

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

    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
    
  • 年龄最大的学生所在班的班主任的上司是谁?文章来源地址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模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 将一张表的数据更新到另外一张表中

    update 更新表 set 字段 = (select 参考数据 from 参考表 where 更新表.id = 参考表.id) update 更新表,参考表 set 更新表数据 = 参考表数据 where 更新表.id = 参考表.id

    2024年02月10日
    浏览(70)
  • MYSQL将一张表的数据更新到另外一张表中

    update 更新表 set 字段 = (select 原始数据 from 原始表 where 更新表.id = 原始表.id) 例如: update 更新表,原始表 set 更新表数据 = 原始表数据 where 更新表.id = 原始表.id 例如:update a,b set a.code = b.code ,a.name = b.name where a.id = b.id;

    2024年02月03日
    浏览(49)
  • Java阶段一Day17

    概念 File的每一个实例用于表示一个文件或目录的 使用File可以: 1:访问文件或目录的属性 2:创建/删除文件或目录 3:访问一个目录中的所有子项 但是File不能:访问文件数据 涉及的新单词: file-文件 write-写 read-读 hidden-隐藏 create-创建 make-作 directory-目录 exists-存在 accept-接受 File的

    2023年04月09日
    浏览(33)
  • Java阶段五Day09

    Path , Host 断言都可以实现多服务网关入口 Path 做断言没有跨域问题的(路径断言 域名和端口统一的) 跨域: 只要资源访问请求原始域和目标域其中域名和端口有一个不一样,就叫做跨域 以京东首页为例,理解 cors 首页有一个 ajax 请求 访问 getInfo 资源访问服务 https://black

    2024年02月17日
    浏览(38)
  • Java阶段五Day20

    完成订单 通过分布式消息事务解决本地事务和发消息的一致性 OrderServerService MessageTransSenderRepository MessageTransRepoImpl LocalTransactionLisetner 结算订单 业务流程图 结算执行业务流程 在消费之前 添加分布式锁逻辑 远程调用 provider : account-server (暂时还没实现) consumer : settle-se

    2024年02月14日
    浏览(37)
  • Java阶段五Day08

    学习内容目的 springboot自动配置原理 实现自定义starter(未完善) 自动配置原理 核心注解: SpringBootApplication 组合3个注解: 扫描( ComponentScan ) 配置( SpringBootConfiguration ) 自动配置( EnableAutoConfiguration ) 自动配置注解的逻辑: 在启动类的基础上,导入了springboot的大量自动配

    2024年02月17日
    浏览(37)
  • Java阶段五Day16

    启动servlet冲突问题 解决方法:启动项目main 将传递过来 servlet-api 依赖去除 nacos注册中心 依赖 yaml配置 用户信息验证失败 断点查看源代码 LoginUserFilter (在处理网关解析后的 jwt 数据 userJson 字符串) 如果过滤器不生效,就会导致解析 userJson 没执行,后端代码获取 LongUser 对象

    2024年02月14日
    浏览(33)
  • Java阶段二Day14

    SpringFramework版本 Spring 是一个生态,包含很多子模块,其中 SpringFramework 是核心的基础模块,平时常说的Spring框架指的就是 Spring Framework ,其他子模块也是自它的基础上衍生出来的 当前学习使用5.3.24版本,Spring6版本支持jdk17 SpringFramework核心 IoC:控制反转思想,把对象的创建及

    2024年02月04日
    浏览(33)
  • Java阶段二Day04

    导入学子商城webapp资源后访问其首页,发现页面无法正常显示. 浏览器F12跟踪请求和响应的交互发现两个问题: 1:我们仅发送了两个响应头(Content-Length和Content-Type). 虽然目前仅需要这两个头,但是服务端实际可以根据处理情况设置需要发送其他响应头 2: Content-Type 的值是固定的

    2023年04月23日
    浏览(32)
  • Java阶段二Day01

    StringBuilder是线程不安全的 StringBuffer是线程安全的,它的 append 方法有 synchronized 修饰 StringBuffer是1.0时候出现的,StringBuilder是1.5时候出现的 一般不再多线程情况下使用同一个字符串,所以对线程安全效率低的StringBuffer用的少,所以出现了StringBuilder,其线程虽不安全但是效率高

    2023年04月15日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包