首页 > 代码库 > MySql 多表查询

MySql 多表查询

多表查询必然要用到多表关联

多表关联 分三类:

A:内部连接  join  或inner join

B:外部链接  外部连接又分为两类   :左外连接 left join 和右外连接 right join

C:交叉连接 cross  join 

以下 举例说明  有两张表

格 一张学生的   一张老师的  一张中间表的

技术分享

技术分享

 

技术分享

 

 

一、内部链接 应用场景 

技术分享

 

 

 这种条件下是得到 A B  共同的数据 同时满足AB 的条件   称之为内部连接

代码 是 :

SELECT *FROM stu_tea st JOIN student s ON st.学生=s.name

结果是:

 

技术分享   

 

从表中清楚 看出,studnet表中的信息会按照规定的规则(中间表中的“学生字段”=student表中的name 字段)拼接在关联的后面,并且仔细看 可以发现 少了学生陈建和李涛的信息,因为陈建和李涛这两个学生在两个表中并不同时存在

 

如果要对结果表中的学生和name重复的 只显示一行,可以对代码以下处理

SELECT st.`学生`,st.`老师`,s.`birth`FROM stu_tea st JOIN student s ON st.学生=s.name

结果如下:

技术分享

还可以对s.birth中文化处理,在后面加上别名显示:

SELECT st.`学生`,st.`老师`,s.`birth` ‘生日‘ FROM stu_tea st JOIN student s ON st.学生=s.name

结果如下:

技术分享

注意:以上代码中的中文字段,加不加引号都可以,系统一般默认加单引号;

 

二、外部链接 应用场景 

左外连接

技术分享

这种场景是得到A的所有数据和B满足一定条件的部分数据

 

代码是:SELECT *FROM stu_tea st LEFT JOIN student s ON st.`学生`=s.`name`

结果为:

技术分享  技术分享  技术分享

从表中可以看出,左外连接完全以左边的中间表为模板,学生表接在中间标的后面,,没有数据用null补齐,学生表有的而中间表没有的数据则不会显示

 对以上结果,还可以用where 从句 进一步筛选

 比如要去掉没有学生信息的数据:SELECT *FROM stu_tea st LEFT JOIN student s ON st.`学生`=s.`name` WHERE s.`name`IS NOT NULL 

结果是:

技术分享

我们还查询一下,去掉了哪些学生信息:SELECT *FROM stu_tea st LEFT JOIN student s ON st.`学生`=s.`name` WHERE s.`name`IS NULL 

结果是:

技术分享

注意:MySQL 只能用 is 不能用”=“

右外连接

技术分享

这种场景是得到B的所有数据和A满足一定条件的部分数据

 右外部连接与左外部连接 完全相反,不具体介绍

 

 

三、交叉连接

 实际应用中还有这样一种情形,想得到A,B记录的排列组合,即笛卡儿积,这个就不好用集合和元素来表示了。需要用到cross join

代码是:SELECT *FROM stu_tea st CROSS JOIN student

结果是:

技术分享

 

 可以发现student表中一共有5行数据 ,stu_tea表中 有12行数据,60=12*5;

此代码也可以写成SELECT *FROM stu_tea st  JOIN student

 

注意事项:

1.连接表格使用的是逗号,会被解释为交叉连接;

即SELECT *FROM stu_tea st,student   SELECT *FROM stu_tea st  JOIN student      SELECT *FROM stu_tea st CROSS JOIN student  是等价的

2.一般内连接都需要加上on限定条件,如果不加会被解释为交叉连接

3.一般交叉连接(, cross join join 都可以)后面加上where条件,也可以写成on

MySql 多表查询