多表查询
- 内联接(inner join)
- 外联接
- 左外联接(left join)
- 右外联接 (right join)
- 完整外联接 (full join)
- 交叉联结(cross join)
- 自然联结 (natural join)
1、内联接(inner join)
- **左表 — 右表 **
- 123 , 234 ——> 23
- 两个表公共的部分
- on 表1.公共字段=表2.公共字段
- 可以给表取别名
- 别名 –表名
- 左表 inner join 右表 等于 右表 i****nner join 左表
- 三表查询
![QQ截图20210918104004.png](resources/6A4365F5A65155EF9D0982C5B93C1BF1.png =1183x687)
语法:
1 | 语法一:select 列名 from 表1 inner join 表2 on 表1.公共字段=表2.公共字段; |
1 | 语法二:select 列名 from 表1,表2 where 表1.公共字段=表2.公共字段; |
1 | 语法三:select 列名 from 表1 inner join 表2 on 表1.公共字段=表2.公共字段 inner join 表3 on 表2.公共字段=表3.公共字段; #三表查询 |
例子:
1 | select * from stuInfo inner join stuMarks on stuInfo.stuNo=stuMarksstuNo; |
1 | select stuInfo.stuNo,stuName,stuSex,writtenExam,labExam from stuInfo inner join stuMarks on stuInfo.stuNo=stumarks.stuNo; # 语法一 |
1 | select stuInfo.stuNo,stuName,stuSex,writtenExam,labExam from sutInfo,stuMarks where stuInfo.stuNo=stumarks.stuNo; # 语法二 |
1 | select i.stuInfo.stuNo,stuName,stuSex,writtenExam,labExam from sutInfo i,stuMarks s where i.stuNo=s.stuNo; # 给表起别名 |
2、外联接(inner join)
左外连接 (left join)
- 以左边的表为标准,如果右边的表没有对应的记录,用null填充。
- 左表 —- 右表
- 1234 —2345 ——> 1234
- 左表 left join 右表 不等于 右表 left join 左表
- 哪个表写左边以哪个表为准。
![QQ截图20210918111352.png](resources/1B8C577CAA14658C76A605235C45AC8C.png =1362x795)
语法:
1 | select 列名 from 表1 left join 表2 on 表1.公共字段=表2.公共字段; |
例子:
1 | select stuName,writtenExam,labExam from stuInfo left join stuMarks on stuInfo.stuNo=stuMarks.stuNo; |
右外连接 (right join)
- 以右边的表为标准,如果左边的表没有对应的记录,用null填充。
- 左表 —- 右表
- 1234 —2345 ——> 2345
- 左表 left join 右表 不等于 右表 left join 左表
- 哪个表写左边以哪个表为准。
语法:
1 | select 列名 from 表1 right join 表2 on 表1.公共字段=表2.公共字段; |
案例:
1 | select stuName,writtenExam,labExam from stuInfo right join stuMarks on stuInfo.stuNo=stuMarks.stuNo; |
左连接和右连接可以互换:
1 | select 列名 from 表1 left join 表2 on 表1.公共字段=表2.公共字段; |
3、交叉联接(cross join)
- 如果没有连接表达式,返回的是笛卡尔积
- 如果有连接表达式 等价于 内联接
1 | insert into t1 values(1,'tom'),(2,'berry'); |
1 | insert into t2 values(1,88),(2,99); |
1 | select * from t1 cross join t2; # 返回的是笛卡尔积 |
1 | select * from t1 cross join t2 where t1.id=t2.id; # 相当于内联接的结果 |
3、自然联接(natural join)
自然联接本质:
- 自动判断连接条件,它是通过同名字字段来判断的
- 自然联接不属于新连接,只是简化上面的写法。
自然联接的分类:
- 自然内联接 natural join
- 自然左外联接 natural left join
- 自然右外连接 natural right join
自然联接结论:
- 表联接通过同名的字段联接的
- 如果没有同名的字段返回笛卡尔积
- 会对结果进行整理,整理规则如下
- 联接字段保留一个
- 联接字段放在最前面
- 左外联接左表在前,右外联接右表在前。
** 01、自然内联接 natural join**
1 | select * from stuInfo inner join stuMarks on stuinfo.stuNo=stuMarks.stuNo; |
1 | select * from stuInfo natural join stuMarks; |
** 02、自然左联接 natural left join**
1 | select * from stuInfo natural left join stuMarks; #自动左连接,以左表为准 |
****** 03、自然右联接 natural right join**
1 | select * from stuInfo natural right join stuMarks; #自动右连接,以右表为准 |
4、using
- 出现多个同名联接字段
- 用来指定联接字段
- using() 也会对联接字段进行整理,整理方式和自然联接一样。
1 | select * from stuInfo inner join stuMarks on stuinfo.stuNo=stuMarks.stuNo; # 原始写法 |
1 | select * from stuInfo inner join stuMarks using(stuNo); # using 也会帮忙整理字段,同名字段只会留下一个。natural自动找联接字段,using手动指定联接字段 |
- 本文作者: 梁俊可
- 本文链接: http://ljk3d.com/2021/10/19/mySqlNote/06_MySQL_第五课_数据库查询02_多表查询/
- 版权声明: 梁俊可工作室