多表查询
为了消除数据的冗余,我们存数据的时候,会把完整的数据信息,分散到多张表来存储。但是,用户通常需要的是一个完整的全面的信息,那么在查询的时候,就需要把这些分散的信息 拼接 。——多表查询
“拼接” 《=》 连接
连接查询
交叉连接:(笛卡尔积)
cross join将两张表的信息结合在一起(表1 | 表2 ):
select * from 表1 cross join 表2(on );
或者隐式的写法 : select * from 表1,表2;
笛卡尔积:
实现两张表的拼接,并不确保数据的正确性。
拼接过程:
1.对于两张表中的数据,不管有没有关系, 全部 两两组合。
内连接:
概述:
返回连接表中 符合连接条件 及 查询条件的 数据行。比之于交叉连接,更加关注参与连接的数据的内容。
显式内连接: inner join + on
select * from + 表1重命名 + inner join关键字 + 表2重命名 + on 判断条件select * from customer c inner join orders o on c.id=o.customer_id;
customer c : 给customer 表重命名 / orders o :给orders 表重命名为o
inner join : 内连接方式拼接左右两表。
on : 判断连接条件 (重命名的 c 表的id属性,是否等于 重命名的o表的customer_id)
这里的 on 的判断条件需要在两个表中对应好。
(这里重命名的 c 和 o 可以看成是对表的引用)
隐式内连接: inner join + where
select * from customer c,orders o where c.id=o.customer_id;外链接:
概述:
会将 所有人的 情况 都会显式出来,如果不满足条件,就会以null的形式显式比之于内连接:内连接只返回符合条件的数据行,而外链接,就会将以基准表的所有信息都显示出来
左外链接:
left outer join 关键字,在 on 子句中设定连接条件。select * from customer c left outer join orders o on c.id=o.customer_id;
效果:以左边为基准表,左表的每一行数据都必须出现在结果集当中,
1.如果满足连接条件,就正常拼接;
2.如果不满足连接条件,那么左边的不满足连接条件的数据记录就会放在结果集的最后,并且左表数据放入其中,右表数据全为NULL;
右外链接:
right outer join 关键字(连接两表),在 on 子句中设定连接条件。效果:以右表为基准表,右表的每一行数据都必须出现在结果集中。
与左外连接只是表的基准不一样。
在连接之后还可以 + where 来进行新表的条件过滤。
eg. select * from customer c left outer join orders o on c.id=o.customer_id where price>200;