mysql多表查询,子查询,合并查询,自查询
一、笛卡尔积
笛卡尔乘积是指在数学中,两个集合X和Y的笛卡尔积(Cartesian product),又称直积,
表示为X × Y,第一个对象是X的成员而第二个对象是Y的所有可能有序对的其中一个成员
– 引用
在mysql中查询两张表,分别为a表,b表,表中都有名为id的字段:
select * from a,b
查询结果为a表中每一行中的数据与b表中所有行的数据进行拼接,就是说,
假如a表有x行数据,而b表有y行数据,那么查询结果中有x*y行数据
二、多表查询本质
多表查询的本质就是单表查询
查询出的笛卡尔积为一张表,多表查询其实就是把几张表变为
笛卡尔积,然后把笛卡尔积形成的表作为查询的目标
三、多表查询操作
1、内连接查询
从笛卡尔积中,查询满足条件的数据行
写法一:
select *
from 表1 , 表2
where 连接条件;
如:select * from a,b where a.id=b.id
写法二:
select *
from 表1 inner join 表2 on 连接条件;
如 select * from a inner join b on a.id=b.id
2、外连接查询
从笛卡尔积中,查询满足条件的数据行
外连接分为:左外连接,右外连接
2、1 左外连接
select *
from 表1 left join 表2 on 连接条件;
从笛卡尔积中,查询满足连接条件的行,和左表中不满足连接条件的行
比如a.id=(1,2)即a表中id这一列有1,2两个值
而b.id=(1)只有1这一个值,于是
select * from a left join b on a.id=b.id;
结果有两行,b表所在列的那一行为null;
2、2 右外连接
select *
from 表1 right join 表2 on 连接条件;
把表2 换到表1位置就等于左外连接了
四、子查询
即一条查询语句作为另一条查询语句的一部分
1、单行单列
select * from 表1 where
a.id=(select b.id from 表2 where b.name=“三子”)
即将表2查询结果作为表一的查询条件
2、多行单列
select * from 表1 where
a.id in(select b.id from 表2 )
3、单行多列
select * from 表1 where
(a.id,a.name) =(select b.id,b.name from 表2 b.name=“三子”)
4、多行多列
select * from 表1 where
(a.id,a.name) in(select b.id,b.name from 表2 )
五、合并查询
1、union
将两个查询结果合并到一起。
select 1 union select 2
合并的前提条件是:
两个查询语句的结果集中,列数相同,对应顺序的列的数据类型相同。
比如查询id<1003 和id>1008的所有人
select name,sex from user id<1003
union
select name,sex from user id>1008
2、实现mysql全外连接
select *
from 表1 right join 表2 on 连接条件;
union
select *
from 表1 left join 表2 on 连接条件;
可以查询两张表中满足连接条件的行,不满足的两张表中的信息也都能显示出来
六、自查询
一个员工表,查询员工对应的上司姓名
但是员工的上司也是员工,都在员工表中,使用自查询
员工表属性:员工id,员工姓名name,员工上司sid
select e.name,s.name from user e ,user s where e.sid=s.id;
连接条件为员工的上司sid=上司的id;
通过别名实现自我连接
|