多表查询
为了消除数据的冗余,我们存数据的时候,会把完整的数据信息,分散到多张表来存储。但是,用户通常需要的是一个完整的全面的信息,那么在查询的时候,就需要把这些分散的信息 拼接 。——多表查询
“拼接” 《=》 连接
连接查询
交叉连接:(笛卡尔积)
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;
where 子句的工作模式:
作用:筛选和过滤;筛选的对象:表 中的每一行数据。
遍历表中的每一行数据,然后根据过滤条件,对每一行数据记录进行判断(true/false)
如果过滤结果为true,就加入结果集中。
*****在关系数据库中,所有的数据都存在一张二维表中;所以表的 拼接 、 查询的结果都是一张二维表。
(所以where 就能够作用在 所有的二维表中,只要where前面的代码 表示的是一张二维表。)
嵌套查询(子查询):详见后面
概述:是指在 where 子句 或 from 子句中 又嵌入 select。分类:
相关子查询 : 依赖于所生成的父表。
不相关子查询 : 不依赖与所生成的父表。
select * from orders where customer_id={select id from customer where name like '%郭靖%'};
{}中得到的就是符合条件的另一张表的id属性。
相当于在两张表中分别进行查询。
SQL 注释:
单行注释:-- 这里写注释 --
多行注释: /* */
联合查询:
关键字:union求两张表的 并集。ÿ