欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

MySQL连接查询你真的学会了吗?

程序员文章站 2022-03-17 14:15:39
1.内连接查询概要内连接是应用程序中非常常见的连接操作,它一般都是默认的连接类型。内连接基于连接谓词,它将两张表(如a和b)的列组合在一起,产生新的结果表。内连接查询会将a表的每一行和b表的每一行进行...

1.内连接查询概要

       内连接是应用程序中非常常见的连接操作,它一般都是默认的连接类型。内连接基于连接谓词,它将两张表(如a和b)的列组合在一起,产生新的结果表。内连接查询会将a表的每一行和b表的每一行进行比较,并找出满足连接谓词的组合。当连接谓词被满足,a和b中匹配的行会按列组合(并排组合)成结果集中的一行。

       内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分3种:交叉连接相等连接和自然连接。

2.交叉连接(笛卡尔积)

       交叉连接(cross join) ,又称“笛卡尔连接(cartesian join) "或“叉乘(product) ",它是所有类型的内连接的基础。

       如果把表视为行记录的集合,那么交叉连接即返回这两个集合的笛卡尔积,返回到结果集合中的数据行数等于第一张表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。这其实等价于内连接的连接条件为“永真” ,或连接条件不存在。如果a和b是两个集合,它们的交叉连接就记为: a x b.

       定义线路表与车辆表的交叉连接(笛卡尔积) 。

示例:

实现线路表与车辆表笛卡尔积

select count(*)
from line 
cross join vehicle

3.内连接语法与示例

语法:

select fieldlist
from table1 [inner] join table2 
  on table1.column1=table2.column2
[where condition]

示例1:

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

select v.*,d.name,d.licenseno
from vehicle v join driver d
  on v.driverid=d.driverid
where model like '%dd%'

示例2:

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

select v.*,d.name,d.licenseno,d.phone
from vehicle v inner join driver d
  on v.driverid=d.driverid
where ceil(datediff(now(),birthday)/365)>35

4.自然连接

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

自然连接的语法如下:

select fieldlist
from table1 natural join table2
[where condition]

示例:

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

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

5.多表连接查询

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

以下为三表连接查询的语法:

select fieldlist 
from table1 join table2 
  on table1.column1=table2.column2_1
join table3
  on table2.column2_2=table3.column3
[where condition]

说明:

(1)table2与table1和table3两两相连。

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

示例1:

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

select d.name,v.plateno,v.model,l.lineno,l.from_station,l.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 d.name,d.licenseno,d.gender,d.phone
from vehicle v join driver d 
  on v.driverid 
join line l
  on v.lineid=l.lineid
where company='公交二公司'

6.简单多表连接查询

如果在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.colemn3
[and 其他条件]

示例:

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

select d.name,v.plateno,v.model,l.lineno,l.from_station,l.end_station
from vehicle v,driver d,line l
where v.driverid=d.driverid
  and v.lineid=l.lineid
and type='空调车'

总结

到此这篇关于mysql连接查询的文章就介绍到这了,更多相关mysql连接查询内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!