首先我们来了解一下表与表之间的关系:一对一、一对多、多对多。
这里我们把多表查询分为四个学习模块:连接查询、合并结果集、子查询和自然连接
一、连表查询
-
交叉连接:又名笛卡尔积,使用交叉连接会产生笛卡尔积
假设集合A={a, b},集合B={0, 1, 2},则两个集合的笛卡尔积为{(a, 0), (a, 1), (a, 2), (b, 0), (b, 1), (b, 2)
同时查询到两个表就是笛卡尔积:select * from 表1,表2 ; - 给查询结果器取别名:select * from 表1 别名1;(取了别名后,要查询表的字段需要用 别名.字段 来查询)
- 如何保证多表联查时数据正确:在查询时要把主键和外键保持一致
- 内连接:查询两个表的交集,解决笛卡尔积现象,查询正确需要的数据
# 隐式内连接,使用where条件消除笛卡尔积,多个表在后面加and
select * from 表1,表2 WHERE 表1.字段 = 表2.字段;
# 显示内连接,多个表在JOIN ...ON 后面添加 JOIN ... ON,如果还有条件,直接在后面写where、and
select * from 表1 JOIN 表2 ON 表1.字段 = 表2.字段;
# 以下是三个表student 、score 、course 的两种方法的查询例子
select st.name,sc.score,c.name from student st, score sc, course c WHERE st.id= sc.sid AND sc.cid=c.cid;
select st.name,sc.score,c.name from student st JOIN score sc ON st.id=sc.sid JOIN course c ON sc.cid=c.cid;
- 外连接之左外连接:左边表中的数据全部查出来,右表当中,只查满足条件的数据
select * from 表1 LEFT OUTER JOIN 表2 ON 表1.字段 = 表2.字段; #OUTER 可省略
select * from student st LEFT OUTER JOIN score sc ON st.sid=sc.sid;
- 外连接之右外连接:右边表中的数据全部查出来,左边表中,只查满足条件的数据
select * from 表1 RIGHT OUTER JOIN 表2 ON 表1.字段=表2.字段; #OUTER 可省略
select * from student st RIGHT OUTER JOIN score sc ON st.sid=sc.sid;
二、子查询
- 什么是子查询:将一个查询结果作为另一个查询的对象,即两个以上的select语句。也就是SQL语句嵌套
select * from (select * from 表名) as 别名
select * from where 带select语句的条件
-
出现位置和注意事项
1,where后,把select查询出来的结果当做另一个select的条件值
2,from后,把查询出的结果当做一个新表
3,注意,查询的虚拟表必须要取别名
三、合并结果集
- 什么是合并结果集:把两个select语句的查询结果合并到一起
- 注意事项:被合并的两个结果:列数、列类型必须相同
- 合并结果集的两种方式
# UNION,合并时去除重复的记录
select * from 表1 UNION select * from 表2;
# UNION ALL,合并时不去除重复记录
select * from 表1 UNION ALL select * from 表2;
四、自然连接
释义:
1,连接查询会产生无用笛卡尔集,我们通常使用主外键关系来去除它,而自然连接无需你去给出主外键等式,他会自动找到这一等式。也就是说不用去写条件。
select * from 表1 NATURAL JOIN 表2;
要求:
1,两张连接的表中列名称和类型完全一致的列作为条件;
2,会去除相同的列;
3,如果有两个相同的字段名,其中一个相同的字段内容不同,则查询的数据是空的;
网友评论