首先我们来了解一下表与表之间的关系:一对一、一对多、多对多。

这里我们把多表查询分为四个学习模块:连接查询、合并结果集、子查询和自然连接

一、连接查询

交叉连接:又名笛卡尔积,使用交叉连接会产生笛卡尔积

假设集合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,如果有两个相同的字段名,其中一个相同的字段内容不同,则查询的数据是空的;