连接查询
又叫多表查询,查询的字段来自多个表
笛卡尔乘积现象:表一m行,表二n行,结果m*n行。
出现原因:没有有效的连接条件。
分类
1.按年份分类:sql92(仅支持内连接),sql99(推荐,支持内连接、外连接【左右】、交叉连接)
2.按功能分类:
内连接:
等值连接;
非等值连接;
自连接;
外连接:
左外连接;
右外连接;
全外连接;
交叉连接:
sql92标准
1.等值连接
select last_name,department_name ,d.department_id
from employees e,departments d
where e.department_id = d.department_id
两表有相同字段查询时加个表限定,不然有歧义;
可以给表起别名,起别名则字段不能用原来的表名限定;
两表顺序可以调换;
可以加筛选条件,AND;
可以加分组;
可以加排序;
可以三表连接;
特点:
①多表等值连接的结果是交集部分;
②n表连接至少n-1个连接条件;
③多表顺序无影响;
④给表起别名;
⑤之前的子句都可以使用。
2.非等值连接
不是等于的,例如
#查询员工工资和对应级别
select salary , grade_level
from employees e,job_grades j
where e.salary between j.min and j.max;
3.自连接
把一张表当做两张或者多张表来查询,例如
select e.employee_id,e.last_name , m.employee_id,m.last_name
from employees e,employees m
where e.manager_id = m.employee_id;
sql99标准
语法:
select 【查询列表】
from 表1 别名【连接类型】
join 表2
on 【连接条件】
where 【筛选条件】
group by 【分组条件】
having 【筛选条件】
order by 【排序列表】
inner left right full cross
1.等值连接
select last_name,department_name,job_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
order by department_name
注意多表的连接条件
inner可以省略
和sql92都是多表交集
2.非等值连接
select count() , grade_level
from employees e
join job_grades j
on e.salary between j.min and j.max
group by count(**)>2
order by grade_level desc
3.自连接
select e.employee_id,e.last_name , m.employee_id,m.last_name
from employees e
join employees m
on e.manager_id = m.employee_id;
4.外连接
特点
用于查询一个表中有数据,一个表中没有
①外连接查询的结果为主表中的全部数据,
如果从表中有匹配的值,则显示匹配的值,
如果从表中没有匹配的值,则显示null,
外连接查询结果 = 内连接查询结果+主表中有的值而从表中没有的
②主表判断:left join 左侧的表,right join 右侧的表
③左外右外交换两表可以实现同样的效果
④全外连接 = 内连接结果+表一中有而表二中没有+表二中有而表一中没有(MySQL不支持)
⑤交叉连接 A cross join B 产生笛卡尔乘积。
举例:
左外连接:
select b.name ,bo.
from boys bo
left outer join beauty b
on b.boyfriend_id = bo.id
where b.id is null;
右外连接:
select b.name ,bo.*
from beauty b
right outer join boys bo
on b.boyfriend_id = bo.id
where b.id is null;
上面两条语句实现同样的查询效果。
学习整理于MySQL 基础+高级篇.