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

日常使用数据库查询语句时,单表查询尝尝不能满足项目的业务需求,在项目开发过程中,有很多需求都是要涉及到多表的连接查询,这篇文章主要给大家介绍了关于MySQL连接查询的相关资料,需要的朋友可以参考下

1.内连接查询概要

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

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

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

交叉连接(CrossJoin),又称“笛卡尔连接(CartesianJoin)"或“叉乘(Product)",它是所有类型的内连接的基础。

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

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

示例:

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

?

1

2

3

SELECT COUNT(*)

FROM line

CROSS JOIN vehicle

3.内连接语法与示例

语法:

?

1

2

3

4

SELECT fieldlist

FROM table1 [INNER] JOIN table2

ON table1.column1=table2.column2

[WHERE condition]

示例1:

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

?

1

2

3

4

SELECT v.*,d.name,d.licenseNo

FROM vehicle v JOIN driver d

ON v.driverID=d.driverID

WHERE model LIKE '%DD%'

示例2:

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

?

1

2

3

4

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等。)

自然连接的语法如下:

?

1

2

3

SELECT fieldlist

FROM table1 NATURAL JOIN table2

[WHERE condition]

示例:

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

?

1

2

3

SELECT v.*,d.name,d.licenseNo

FROM vehicle v NATURAL JOIN driver d

WHERE model LIKE '%DD%'

5.多表连接查询

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

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

?

1

2

3

4

5

6

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:

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

?

1

2

3

4

5

6

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:

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

?

1

2

3

4

5

6

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子句中指定连接条件,此为简单多表查询,它与内连接功能相同

使用两表连接查询语法格式如下:

?

1

2

3

4

SELECT fieldlist

FROM table1,table2

WHERE table1.column1=table2.column2

[AND 其他条件]

使用三表连接查询语法格式如下:

?

1

2

3

4

5

SELECT fieldlist

FROM table1,table2,table3

WHERE table1.column1=table2.column2_1

AND table2.column2_2=table3.colemn3

[AND 其他条件]

示例:

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

?

1

2

3

4

5

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连接查询内容请搜索钦钦技术栈以前的文章或继续浏览下面的相关文章希望大家以后多多支持钦钦技术栈!

原文链接:https://blog.csdn.net/m0_57779406/article/details/117427823

版权声明:本文(即:原文链接:https://www.qin1qin.com/catagory/7171/)内容由互联网用户自发投稿贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 630367839@qq.com 举报,一经查实,本站将立刻删除。

(0)
上一篇 2022年 7月 31日 3:34:41
下一篇 2022年 7月 31日 3:34:57

软件定制开发公司

相关阅读

发表回复

登录后才能评论
通知:禁止投稿所有关于虚拟货币,币圈类相关文章,发现立即永久封锁账户ID!