多表查询:当查询结果来自多张数据表的时,就需要用到连接查询。
多表连接查询:会出现笛卡尔积的现象:a表有m行,b表有n行,查询结果=m*n行,消除笛卡尔积现象就必须加上关联条件,关联条件的个数=n个表-1。
多表连接查询按照能分类为: 1、内连接:等值连接:表之间连接条件用 = 连接 非等值连接:表之间连接条件用非等号 自连接:相当于等值连接,只不过是自己连接自己,不像等值连接是两个不同的表
语法格式:
select
查询列表
from
表1 别名1,
表2 别名2,
......
where
关联条件 and
筛选条件(针对表的所有记录)
group by
分组字段列表
having(只能配合group by使用)
与分组有关的筛选条件(针对分组后的每组内记录)
order by
排序
后面的关键字查询条件可根据需求进行选择,
自连接 eg:
select
e.name,m.salary
from
employees e, employees m #把同一张表当成两张不同表
where
e.manager_id = m.employee_id
order 不要
m.salary DESC;
2、外连接:
左外连接:查询结果以左表为主表查询所有记录,从表无记录数据时为 null 右外连接:查询结果以右表为主表查询所有记录,从表无记录数据时为 null 全外连接:Mysql不支持 交叉连接:就两个记录做笛卡尔积,不加关联条件
语法格式:
select
查询列表
from
表1 别名1
【链接类型】 join 表2 别名2
on 关联条件
【链接类型】 join 表3 别名3
on 关联条件
where
筛选条件(针对表的所有记录)
group by
分组字段列表
having(只能配合group by使用)
与分组有关的筛选条件(针对分组后的每组内记录)
order by
排序
1)【链接类型】的关键字:
内连接:inner (还可以省略) 外连接: 左外连接 left 【outer】 (outer可以省略) 右外连接 right 【outer】 全外连接 full 【outer】(Mysql不支持) 交叉连接 cross 【outer】(不常用)
2)外连接知识点:1、外连接的查询结果为主表中有的所有记录 外表有对应数据,结果记录上显示对应数据 外表中没有对应的数据,结果记录上填充null
2、外链接与连接的区别: 内连接:当从表没有记录的时候,主、从表的记录都丢掉! 外连接:当从表没有记录的时候,会保留主表的记录,对应从表null
3、左外连接:left join左边的是主表, 右外连接:right join 右边的是主表
4、左外连接和右外连接上是互通的,掌握一个就好啦!
内连接 eg:
select
e.name,j.job_title,d.department_name
from
employees e
inner join departments d
on e.department_id = d.department_id
inner join jobs j
on e.job_id=j.job_id
where e.salary >5000
order by d.department_name;
左连接 eg:
SELECT
d.department_id,d.department_name,e.employee_id
FROM
departments d
LEFT JOIN employees e
ON d.department_id = e.department_id
WHERE
e.employee_id IS NULL;
全外连接查询:
FULL OUTER JOIN 中会返回所有右边表中的行和所有左边表的行。
## mysql不支持
SELECT
d.department_id,d.department_name,e.employee_id
FROM
departments d
FULL OUTER JOIN employees e
ON d.department_id = e.department_id
WHERE
e.employee_id IS NULL;
MYSQL中暂时不支持全外连接,但是可以通过 union+左右连接来完成,感觉不常用
ends ~