多表查询
我们在查询表格的过程中,往往要将多个表组合查询使用,并且要实现多个表之间查询数据,例如,查询成绩,再将成绩和学生表连接起来
这个时候就要用到我们的多表查询了
交叉连接
不带WHERE条件子句,它将会返回被连接的两个表的笛卡尔积,返回结果的行数等于两个表行数的乘积,有where子句,往往会先生成两个表行数乘积的数据表,然后才根据where条件从中选择
交叉连接的语法格式
select ...,
...,
from ,
where ;
这里有涉及到一个笛卡尔积的概念,也就是多个表中所有数据都相互匹配一次
两个集合X和Y,又称直积,即将所有可以匹配的行数据都匹配上了一次
内连接
交叉连接产生的笛卡尔积的产生的额外的判断和消耗,如果要查询比较大的数据的话查,询的效率相当低下,所以需求一个更高效的一个查询范式,内连接比交叉连接更省空间,并且效率更高
使用比较运算符,根据表中匹配的属性,列出与连接条件相匹配的数据,
内连接关键字: inner join on
select [表名1.属性名1,...][表名n.属性名n,...]
from [数据库名1.表名1]
inner join [数据库名2.表名2]
on 条件表达式;
外连接
外连接就是把内连接再进行筛选再添加进来,会保留一部分的数据又分为左外连接、右外连接和全外连接
1.左外连接(左连接)
是以左表为基准,显示左表查询字段所有记录,右表只显示和左表匹配的记录,没有匹配的用NULL代替。
关键字: left join
select [表名1.属性名1,...,表名n.属性名n.]
from
left join
on 条件表达式;
2.右外连接(右连接)
是以右表为基准,显示右表查询字段所有记录,左表只显示和右表匹配的记录,没有匹配的用NULL代替。
关键字: right join
select
from
right join
on 条件表达式; 等于
select 表名1.属性名1,……, 表名n.属性名n
from 表名2
left join 表名1
on 条件表达式;
3.全外连接(全连接)
全连接的左右表不做限制,显示全部数据,没有匹配的数据用NULL代替。
关键字: full join
注意: mysql 不支持全连接
使用左连接和右连接加上 union 合并实现全连接
取别名
在查询时可以给属性取别名,使得读取出的数据更直观。
语句:as
select as from as ;
其中语句as可以省略
合并的使用
1.合并: union
MySQL UNION 操作符用于连接两个以上的 SELECT 语句的结果组合到一个结果集合中。多个 SELECT语句会删除重复的数据。
select
from
union select
from ;
2.合并查询结果
关键字
UNION 语句:用于将不同表中相同列中查询的数据展示出来;(不包括重复数据)
ALL: 可选,包含重复数据。
使用形式如下:
select
FROM
union (all) select
from
用于合并多个select语句的结果,要求第一个sql语句返回的列与第二个sql语句返回的列相同
3.通过查询的结果集向表中插入数据
insert into select union all
利用左连接和右链接实现全连接
select 表1.属性1,表2.属性2,..., 表n.属性n
from 表1 right join 表2
union
select 表1.属性1,表2.属性2... 表n.属性n
from left join 表2
这里有用到union连接两个查询语句来实现全连接。
多表联查
可以连接查询多个表中的数据(一般最好不要超过4个表)
一般格式:
select
from
inner join on
inner join on
left join on
right join ......
多表联查的两种格式的区别及表取别名的使用:
##将员工和部门已经薪资都查询出来
select e.e_name as 姓名,enter_date as 入职日期,d_name as 部门,
s_number as 薪资,m_name as 职位
from employee_tb as e
inner join department_tb as d on e.department_id=d.d_id
inner join salary_tb as s on s.employee_id=e.e_id
left join management_tb as m on m.employee_id=e.e_id;
总结
交叉连接
交叉连接连接的效率过低,不推荐使用(会产生n1*n2)
内连接
找到两张表相符合条件的数据,进行筛选连接
外连接
外连接会保留一张表的数据,将另外一张表的数据进行条件筛选连接,没有符合连接条件将另外一张表用null填充
多表连接
连续使用多个 inner join 进行连接