多表查询
我们在查询表格的过程中,往往要将多个表组合查询使用,并且要实现多个表之间查询数据,例如,查询成绩,再将成绩和学生表连接起来
这个时候就要用到我们的多表查询了
交叉连接
不带WHERE条件子句,它将会返回被连接的两个表的笛卡尔积,返回结果的行数等于两个表行数的乘积,有where子句,往往会先生成两个表行数乘积的数据表,然后才根据where条件从中选择
交叉连接的语法格式
select <表名1.属性名1>...,
<表名n.属性名n>...,
from <表名1>,<表名2>
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 <表名1>
left join <表名2>
on 条件表达式;
2.右外连接(右连接)
是以右表为基准,显示右表查询字段所有记录,左表只显示和右表匹配的记录,没有匹配的用NULL代替。
关键字: right join
select <表名1.属性名1,……,表名n.属性名n>
from <表名1>
right join <表名2>
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 <表1> left join 表2
这里有用到union连接两个查询语句来实现全连接。
多表联查
可以连接查询多个表中的数据(一般最好不要超过4个表)
一般格式:
select <表名1.属性名1,……,表名n.属性名n>
from <表名1>
inner join <表名2> on <条件表达式>
inner join <表名3> on <条件表达式>
left join <表名n> 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 进行连接