首页 > 代码库 > 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 多表查询