MySQL内的连接查询(新手必知)

Posted 影之神

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL内的连接查询(新手必知)相关的知识,希望对你有一定的参考价值。

一、内连接查询

  1. 查询信息的来源如果来自多张表,则必须对这些表进行连接查询。
  2. 连接是把不同表的记录连到一起的最普遍的方法,通过连接查询可将多个表作为一个表进行处理。
  3. 连接查询分为内连接和外连接。
  4. 内连接基于连接谓词,它将两张表 ( 如A 和 B) 的列组合在一起,产生新的结果表。
  5. 内连接查询会将 A 表的每一行和 B 表的每一行进行比较,并找出满足连接谓词的组合。当连接谓词被满足,A 和 B 中匹配的行会按列组合(并排组合)成结果集中的一行。
  6. 内连接分 3 种:交叉连接、相等连接和自然连接。

 交叉连接(Cross Join),又称“笛卡尔连接(Cartesian Join)”或“叉乘(Product)”,它是所有类型的内连接的基础。 如果把表视为行记录的集合,那么交叉连接即返回这两个集合的笛卡尔积,返回到结果集合中的数据行数等于第一张表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。

 内连接的语法:

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 值不与任何值匹配(甚至和它本身)。

示例:

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

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

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

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

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

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

二、自然连接

  1. 自然连接 (Natural Join) 是一种特殊的内连接,它要求相连接的两张表的连接依据列必须是相同的字段(字段名相同,字段属性相同)。
  2. 在自然连接中两张表的所有名称相同的列都将被比较,并且在结果集中把重复的列去掉, 结果集中两张表中名称相同的列仅出现一次。而普通的内连接并不去掉重复的列。
  3. 部分数据库不支持自然连接, 如 SQL Server 等。

语法:SELECT fieldlist FROM table1 NATURAL JOIN table2 [where condition]

示例:

1.使用自然连接获取所有的线路信息和车辆信息。

select * from line natural join vehicle

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

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

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

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

三、多表连接查询

  1. 如果查询的信息来源于多张表,则可通过两两相连的方式建立多表连接查询。
  2. 如果在 FROM 子句中,直接列出所有要连接的表,然后在 WHERE 子句中指定连接条件,此为简单多表查询, 它与内连接功能相同。

三表连接查询的语法:

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 WHERE table1.column1=table2.column2 [and 其他条件]

示例:

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

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=' 非空调车 ';

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=' 公交二公司 '

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

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=' 非空调车 '

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

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

四、外连接查询

  1. 在内连接查询中,只有满足连接条件的记录才能出现在查询结果中。但在实际应用中,如果希望不满足连接条件的记录也在查询结果中出现,这时需要使用外连接查询。
  2. 根据不同的外连接形式,外连接所生成的结果集中不仅包含符合条件的数据记录,还包含左表或右表或左右表中所有的数据记录。
  3. 左外连接的结果集包括左表的所有记录和右表中满足连接条件的记录,结果集中那些不符合连接条件的来源于右表的列值为 null。
  4. 右外连接是左外连接的反向连接。右外连接的结果集包括右表的所有记录和左表中满足连接条件的记录,结果集中那些不符合连接条件的来源于左表的列值为 null。

语法:

示例:

1.左外连接

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

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

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

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

2.右外连接

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

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

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

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

总结:

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

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

2. 多表连接查询和简单多表连接查询的语法是什么?

  • 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 其他条件]

3. 外连接查询的定义是什么?什么是左外连接?

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

以上是关于MySQL内的连接查询(新手必知)的主要内容,如果未能解决你的问题,请参考以下文章

MySQL内的连接查询(新手必知)

mysql 必知必会整理—子查询与连接表[八]

MySQL 必知必会知识点总结

MySQL内的连接查询中的分组统计(内容补充)

MySQL内的连接查询中的分组统计(内容补充)

MySQL内的连接查询中的分组统计(内容补充)