全部章节   >>>>


本章目录

7.1 内连接查询

7.1.1 交叉连接(笛卡尔积)

7.1.2 内连接查询概要

7.1.3 内连接案例

7.1.4 自然连接

7.2 多表连接查询

7.2.1 多表连接查询方法

7.2.2 多表连接查询应用

7.2.3 简单多表连接查询

7.3 外连接查询

7.3.1 外连接查询概念

7.3.2 左外连接(LEFT JOIN)

7.3.3 右外连接(RIGHT JOIN)

7.4 连接查询综合应用

7.4.1 连接查询中的分组统计

总结:


7.1 内连接查询

查询信息的来源如果来自多张表,则必须对这些表进行连接查询。

连接是把不同表的记录连到一起的最普遍的方法,通过连接查询可将多个表作为一个表进行处理。

连接查询分为内连接外连接

7.1.1 交叉连接(笛卡尔积)

交叉连接(Cross Join),又称“笛卡尔连接(Cartesian Join)”或“叉乘(Product)”,它是所有类型的内连接的基础。

如果把表视为行记录的集合,那么交叉连接即返回这两个集合的笛卡尔积,返回到结果集合中的数据行数等于第一张表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。

示例:实现线路表与车辆表笛卡尔积。

select * from line CROSS JOIN vehicle
等价于:
select * from line,vehicle

7.1.2 内连接查询概要

内连接基于连接谓词,它将两张表 ( 如A 和 B) 的列组合在一起,产生新的结果表。

内连接查询会将 A 表的每一行和 B 表的每一行进行比较,并找出满足连接谓词的组合。当连接谓词被满足,A 和 B 中匹配的行会按列组合(并排组合)成结果集中的一行。

内连接分 3 种:交叉连接相等连接自然连接

内连接的语法:

SELECT fieldlist FROM table1 [INNER] JOIN table2
ON table1.column1=table2.column2
[where condition]

语法说明:

  • fieldlist:table1 表和 table2 表中的字段列。如果 fieldlist 取两张表所有列,则可用“*”代替,此时会出现连接依据列重复,即 table1 表的 column1 与 table2 表的 column2 为重复列。
  • table1 [INNER]  JOIN  table2:将 table1 表与 table2 表进行内连接,INNER 可省略。
  • table1.column1=table2.column2:连接条件,其中 column1 和column2 为table1 表与table2 表的关联列,通常它们为外键列和主键列。
  • “inner”可省略。
  • “where condition”可省略,它为查询条件表达式。

注意:连接依据的列可能包含 null 值,null 值不与任何值匹配(甚至和它本身)。

7.1.3 内连接案例

示例:使用内连接获取所有的线路信息和车辆信息。

分析:
  • 车辆表 vehicle 与线路表 line 存在一个连接依据列——lineID。
  • 连接以上两张表,使用内连接并采用“*”作为字段列表
select * from line join vehicle on line.lineID=vehicle.lineID

说明:图中“lineID”和“lineID1”为重复列,它们是连接依据列。

说明:使用内连接获取不属于公交二公司的线路信息和车辆信息。

select * from line join vehicle on line.lineID=vehicle.lineID and company<>' 公交二公司 '

示例:使用内连接获取公交二公司的线路信息和车辆信息。

select * from line join vehicle on line.lineID=vehicle.lineID where company=' 公交二公司 '

说明:

连接查询的 where 条件表达式可以用 on 子句中的条件表达式进行替换,所以本例的 SQL 语句也可以如下:

select * from line join vehicle on line.lineID=vehicle.lineID and company=' 公交二公司 '

示例:使用内连接获取车辆型号含有“DD”字样的车辆信息和司机信息。

select * from vehicle join driver on vehicle.driverID=driver.driverID where model like '%DD%'

示例:使用内连接获取车辆型号含有“DD”字样的车辆信息和司机信息,要求车辆信息为全部列,司机信息中只需包含姓名和身份证。

select v.*, name, licenseNo from vehicle v join driver d on v.driverID=d.driverID where model like '%DD%'

说明:
  • 在连接查询中,为了简化字段列表的显示,一般需要为两张表分别取别名,如本例中分别为表“vehicle”和“driver”取别名“v”和“d”。
  • 如果字段列表中的字段在两张表中是唯一的,则该字段前面不需要加表名前缀,例如本列中的“name” 和“licenseNo”,否则需要加表名前缀,如本列中的“v.vehicleID” “d.vehicleID”等。

示例:使用内连接获取年龄大于 35 岁的司机信息和该司机所驾驶的车辆信息,要求车辆信息为全部列,司机信息中只需包含姓名、出生年月和电话。

select v.*, name,birthday,phone from vehicle v join driver d on v.driverID=d.driverID where CEIL(DATEDIFF(now(),birthday)/365)>35

7.1.4 自然连接

自然连接 (Natural Join) 是一种特殊的内连接,它要求相连接的两张表的连接依据列必须是相同的字段(字段名相同,字段属性相同)。

在自然连接中两张表的所有名称相同的列都将被比较,并且在结果集中把重复的列去掉, 结果集中两张表中名称相同的列仅出现一次。而普通的内连接并不去掉重复的列。

部分数据库不支持自然连接, 如 SQL Server 等。

语法:

SELECT fieldlist FROM table1 NATURAL JOIN table2
[where condition]

示例:使用自然连接获取所有的线路信息和车辆信息。

select * from line natural join vehicle

示例:用自然连接获取公交二公司的线路信息和车辆信息。

select * from line natural join vehicle where company=' 公交二公司 '

示例:使用自然连接获取车辆型号含有“DD”字样的车辆信息和司机信息,要求车辆信息为全部列,司机信息中只需包含姓名和身份证。

select v.*, name, licenseNo  from vehicle v natural join driver d where model like '%DD%'

7.2 多表连接查询

7.2.1 多表连接查询方法

如果查询的信息来源于多张表,则可通过两两相连的方式建立多表连接查询。

三表连接查询的语法:

SELECT fieldlist FROM table1 JOIN table2 ON table1.column1=table2.column2_1 JOIN table3 on
table2.column2_2=table3.column3 [where condition]

说明:

table2 与 table1 和 table3 两两相连。

三表以上连接查询的方法与三表连接查询的方法一样,均是通过两两相连的方式实现。

示例:获取所有非空调车的车牌号、型号和司机姓名、所属线路的线路号、起点站和终点站信息。

分析:车牌号和型号来源于车辆表;司机姓名来源于司机表;线路号、起点站和终点站来源于线路表,因而需要连接 3 张表:车辆表、司机表和线路表

select name 司机姓名 , plateNo 车牌号 , model 型号 , lineNo 线路号 , from_station 起点站 , end_station 终点站 from vehicle V join Driver D on V.driverID=D.driverID
join line L on V.lineID=L.lineID  where type=' 非空调车 ';

7.2.2 多表连接查询应用

示例:获取公交二公司所有司机信息。要求输出司机姓名、身份证、性别和电话。

分析:司机表与车辆表有关联,车辆表又与线路表有关联,线路表有所属公司信息,所以通过连接司机表、车辆表和线路表,可以获得公交二公司所有司机的相关信息。

select name 司机姓名 , licenseNo 身份证 , gender 性别 , phone 电话 from vehicle V join Driver D  on V.driverID=D.driverID  join line L on V.lineID=L.lineID
where company=' 公交二公司 '

7.2.3 简单多表连接查询

如果在 FROM 子句中,直接列出所有要连接的表,然后在 WHERE 子句中指定连接条件,此为简单多表查询, 它与内连接功能相同。

使用两表连接查询语法:

SELECT fieldlist FROM table1, table2
WHERE table1.column1=table2.column2 [and 其他条件]

使用三表连接查询语法:

SELECT fieldlist FROM table1,table2,table3
WHERE table1.column1=table2.column2_1 and table2.column2_2=table3.column3 [and 其他条件]

示例:获取所有非空调车的车牌号、型号和司机姓名、所属线路的线路号、起点站和终点站信息。

select name 司机姓名 , plateNo 车牌号 , model 型号 , lineNo 线路号 , from_station 起点站 , end_station 终点站 from vehicle V ,Driver D,line L where V.driverID=D.driverID
and V.lineID=L.lineID and type=' 非空调车 '

示例:获取公交二公司所有司机信息。要求输出司机姓名、身份证、性别和电话。

select name 司机姓名 , licenseNo 身份证 , gender 性别 , phone 电话
from vehicle V, Driver D, line L where V.driverID=D.driverID and V.lineID=L.lineID and company=' 公交二公司 '

7.3 外连接查询

7.3.1 外连接查询概念

在内连接查询中,只有满足连接条件的记录才能出现在查询结果中。但在实际应用中,如果希望不满足连接条件的记录也在查询结果中出现,这时需要使用外连接查询。

根据不同的外连接形式,外连接所生成的结果集中不仅包含符合条件的数据记录,还包含左表或右表或左右表中所有的数据记录。

语法:

SELECT 字段名称 FROM 表名 1 LEFT|RIGHT|FULL [OUTER] JOIN 表名 2
ON 表名 1. 字段名 1= 表名 2. 字段名 2

“outer”可省略

7.3.2 左外连接(LEFT JOIN)

左外连接的结果集包括左表的所有记录和右表中满足连接条件的记录,结果集中那些不符合连接条件的来源于右表的列值为 null。

示例:查询所有非空调车的车牌号、型号、线路号、起点站和终点站。

分析:由于需要显示所有的非空调车,所以只能外连接。如果将车辆表 vehicle 作为连接左表,线路表 line 作为右表, 则该连接为左外连接。

select plateNo 车牌号 , model 型号 , lineNo 线路号 , from_station 起点站 , end_station 终点站from vehicle V  left join line L on V.lineID=L.lineID where type=' 非空调车 ';

非匹配行。来源于右表列相应字段为空

示例:显示所有司机基本信息,并查询其所驾驶车辆和行驶线路的相关信息,要求输出司机姓名、性别、电话、车牌号、型号、线路号、起点站和终点站。

分析:连接表为司机表、车辆表和线路表。由于需要显示所有的司机信息,所以需要将司机表和车辆表作为左表(3 张表的连接次序为司机表、车辆表和线路表)。

select name 司机姓名 , gender 性别 , phone 电话 , plateNo 车牌号 , model 型号 , lineNo 线路号 , from_station 起点站 , end_station 终点站 from driver D left join vehicle V
on D.driverID=V.driverID left join line L on V.lineID=L.lineID

7.3.3 右外连接(RIGHT JOIN)

右外连接是左外连接的反向连接。右外连接的结果集包括右表的所有记录和左表中满足连接条件的记录,结果集中那些不符合连接条件的来源于左表的列值为 null。

示例:查询所有线路的车辆信息,要求显示车牌号、型号、线路号、起点站和终点站。

分析:由于需要显示所有的线路信息,所有只能外连接。如果车辆表 vehicle 作为连接左表,线路表 line 作为右表, 则该连接为右外连接。

select plateNo 车牌号 , model 型号 , lineNo 线路号 , from_station 起点站 , end_station 终点站from vehicle V  right join line L on V.lineID=L.lineID

非匹配行。来源于左表列相应字段为空

示例:显示所有线路及其所配车辆基本信息,并查询车辆所配司机相关信息,要求输出司机姓名、性别、电话、车牌号、型号、线路号、起点站和终点站。

分析:连接表为司机表、车辆表和线路表。由于需要显示所有线路及其所配车辆基本信息,所以需要将线路表和车辆表作为右表(三张表的连接次序为司机表、车辆表和线路表)。

select name 司机姓名 , gender 性别 , phone 电话 , plateNo 车牌号 , model 型号 , lineNo 线路号 , from_station 起点站 , end_station 终点站 from driver D right join vehicle V
on D.driverID=V.driverID right join line L on V.lineID=L.lineID

7.4 连接查询综合应用

7.4.1 连接查询中的分组统计

综合使用连接查询、聚合函数和分组查询可以实现很多复杂的查询需求。

公交线路站点表用于存储每条公交线路与其所属站点之间关联关系:

 字段名

说 明

类 型

长 度

约 束

lineStationID

公交线路站点编号

int

主键,自动增长

lineNo

线路号

varchar

20

外键,参照线路表线路号

station

公交站点

varchar

20

示例:统计每一家公交公司所属线路的站点总数。

分析:解决的关键是依据公交公司分组统计该公司所有线路的站点数量,但线路车站表 line_station 中仅有线路信息即线路号 lineNo,却没有该线路所属公司信息,而线路表 line 却有公司信息即公司名 company, 并且这两张表都有线路号 lineNo。所以,可以通过连接 line_station 表和 line 表,并根据 line 表的 company 列分组统计每一家公交公司所属线路的站点总数。

select company 公司 , count(*) 站点数 from line_station LS, line L where LS.lineNo=L.lineNo group by company order by count(*)

示例:计算经过站点“解放大道古田四路”的公交线路的数量以及营运车辆数量。

分析:连接线路站点表和线路表。

select count(*) 线路数 , sum(number) 营运车辆数 from line_station LS, Line L where LS.lineNo=L.lineNo and station=' 解放大道古田四路 '

示例:计算每条公交线路的司机人数,按司机人数逆序显示。

分析:连接驾驶员表、车辆表和线路表。

select lineNo 线路号 , count(*) 司机数 from driver D, vehicle V, line L
where D.driverID=V.driverID and V.lineID=L.lineID group by lineNo  order by 司机数 desc

示例:计算每条公交线路的司机人数,并显示司机人数大于 3 的分组信息,按司机人数逆序显示。

分析:仅需在前例的基础之上将司机人数大于 3 的分组数据过滤出来。

select lineNo 线路号 , count(*) 司机数 from driver D, vehicle V, line L where D.driverID=V.driverID and V.lineID=L.lineID group by lineNo having count(*)>3 order by 司机数 desc

总结:

  • 内连接的定义是什么?有哪几种类型的内连接?

内连接基于连接谓词,它将两张表(如 A 和 B)的列组合在一起,产生新的结果表。具体过程是将 A 表的每一行和 B 表的每一行进行比较,并找出满足连接谓词的组合,当连接谓词被满足,A 和 B 中匹配的行会按列组合(并排组合)成结果集中的一行。

内连接分 3 种:交叉连接、相等连接和自然连接。

  • 多表连接查询和简单多表连接查询的语法是什么?
SELECT fieldlist FROM table1 JOIN table2 ON table1.column1=table2.column2_1 JOIN table3 on table2.column2_2=table3.column3 [where condition]
SELECT fieldlist FROM table1,table2,table3 where table1.column1=table2.column2_1 and table2.column2_2=table3.column3 [and 其他条件]
  • 外连接查询的定义是什么?什么是左外连接?

在内连接查询中,只有满足连接条件的记录才能出现在查询结果中。但在实际应用中,如果希望不满足连接条件的记录也在查询结果中出现,这时需要使用外连接查询。根据不同的外连接形式,外连接所生成的结果集中不仅包含符合条件的数据记录,还包含左表、右表或左右表中所有的数据记录。

左外连接的结果集包括左表的所有记录和右表中满足连接条件的记录,结果集中那些不符合连接条件的来源于右表的列值为 null。

MySQL数据操作与查询笔记 • 【第7章 连接查询】相关推荐

  1. MYSQL数据操作(CRUD)(二):查询

    优化了一篇大佬的文章,但一直没有找到源地址,有人知道可以在评论区写上. 1.显示表中所有的数据 语法:SELECT * FROM 表名  Tips:SELECT可以当作输出语句来使用,语法: SELE ...

  2. 数据库原理与应用(SQL Server)笔记 第三章 连接查询

    目录 前言 一.连接谓词 二.JOIN连接 (一)内连接 (二)外连接 (三)交叉连接 总结 前言 本次内容,我们主要掌握数据库的多表查询,即通过两个表及两个以上的表之间的逻辑关系进行检索,将通过连接 ...

  3. MySQL数据操作与查询笔记 • 【目录】

    持续更新中- 我的大学笔记>>> 章节 内容 第1章 MySQL数据操作与查询笔记 • [第1章 MySQL数据库基础] 第2章 MySQL数据操作与查询笔记 • [第2章 表结构管 ...

  4. Mysql(软件安装、Mysql基本语法、Mysql数据操作、Mysql关键字、约束、多表查询、Mysql多表查询、数据备份、数据导入、视图)

    1.MySQL介绍 1.1数据库介绍 数据库概念 数据库就是用于存储数据的一个空间 数据存储方式的发展史 甲骨文(材料太昂贵) 竹简(太沉了,运输不方便) 纸(易损坏) 计算机(办公软件,传输不方便) ...

  5. MySQL 数据操作 DML细节

    MySQL 数据操作 DML DML(Data Manipulation Language 数据操纵语言) DML是用来对数据库里的数据进行操作的语言.DML需要 commit. 当使用 mysql ...

  6. 数据库系统原理与应用教程(066)—— MySQL 练习题:操作题 71-81(十):连接查询

    数据库系统原理与应用教程(066)-- MySQL 练习题:操作题 71-81(十):连接查询 71.连接查询(1) 数据表:Customers,包含顾客名称:cust_name.顾客 id:cust ...

  7. 8.MySQL 数据操作 DML

    8.MySQL 数据操作 DML 数据的DML操作:添加数据,修改数据,删除数据 添加数据 格式: insert into 表名[(字段列表)] values(值列表...); --标准添加(指定所有 ...

  8. Spring Boot + JPA +MySQL 数据操作及示例环境搭建(自动建表)

    JPA 是Java官方提供的数据持久的统一API , 是一个接口标准,并没有具体实现. JPA的实现常见的有: Hibernate TopLink (Eclipse Link) Spring Boot ...

  9. 小白终是踏上了这条不归路----小文的mysql学习笔记(6)----连接查询-----等值连接、非等值连接、自链接、外连接、交叉连接

    ** 小白终是踏上了这条不归路----小文的mysql学习笔记(1) 小白终是踏上了这条不归路----小文的mysql学习笔记(2)----条件查询 小白终是踏上了这条不归路----小文的mysql学 ...

最新文章

  1. nvm 解决nodejs无法全局/usr/bin/node问题
  2. Oracle学习笔记整理手册
  3. 【学术相关】RSPapers | 工业界推荐系统论文合集
  4. boost::callable_traits移除const成员的测试程序
  5. Java代码块的基本使用
  6. 将CSV文件写入到MySQL中(用Pandas库实现MySQL数据库的读写)
  7. Java之java.lang.CloneNotSupportedException,Java中bean的克隆报错
  8. 设为首页收藏本站js代码(引自ecshop模板堂(ecmoban.com)
  9. CUTE FTP 控制连接已关闭
  10. 分享5个国外较好的图片网站
  11. QT中双击mdiArea区域打开文件(监听双击事件)
  12. layui 模板引擎
  13. python模块cpca修改源码支持国外地址解析
  14. Caché 时间函数
  15. 人工智能时代,如何让机器狗听懂你说的话?
  16. 【软考 系统架构设计师】软件工程⑩ 系统运行与软件维护
  17. pdb断点命令_python的pdb调试命令的命令整理及实例
  18. 原生JS实现——flappy bird 像素小鸟 项目总结
  19. 现代优化算法(五): 蚁群算法
  20. android炉石解析包错误,炉石传说7月11日解析失败怎么回事 游戏出错解决方法介绍...

热门文章

  1. linux Deploy 安装debian
  2. 怎么知道自己的计算机成绩,小黑盒如何查看我的电脑 电脑查成绩方法
  3. 【很逗,很经典】【与靠谱IT男的浪漫闪婚记】——转个很可爱的帖子,貌似男女猪脚是咱IT人士呢
  4. 苹果手机怎么在照片上添加文字_给微信拍照的照片添加文字,调整后期效果,手机两步搞定!...
  5. android高仿京东快报(垂直循环滚动新闻栏)
  6. 55. Jump Game 解题记录
  7. android编辑框最大字数,(转)Android中EditText的输入字数限制
  8. ubuntu20.04安装ros2 foxy
  9. ROS2之OpenCV基础代码对比foxy~galactic~humble
  10. 2022-11-17 vue移动端卖座电影项目(一) 获取后台数据