关联查询—自关联、外关联、内关联

关联查询: 原理是通过语句join、、on、、把多个表连接成一个表,然后查询
作用:可以跨越多表查询
语法:

select 列,列,列 from 表1
join 表2 on 表1.外键=表2.主键      // INNER JOIN 与 JOIN 是相同的。
where 条件;

如果关联多张表,继续join


案例:找出在 Asia 地区工作的员工(解析:涉及到员工表、地区表,一张中间表部门表)
select * from s_emp e
join s_dept d on e.dept_id = d.id
join s_s_region r on d.regin_id=r.id
where r.name='Asia';

练习:
--查询出客户名字叫unisports的订单信息
select * from s_ord o
join s_customer c on o.customer_id=c.id
where c.name='unisports'

--查询出设在北美的的部门名称
select d.name from s_dept d
join s_region r on d.region_id= r.id
where r.name='North America';
--查询出在北美工作的员工姓名、工资、入职日期和职位
select e.first_name,e.salary,e.start_date,e.title from s_emp e
join s_dept d on e.dept_id = d.id
join s_region r on d.region_id = r.id
where r.name='North America';
外关联:
左外联 [left outer join] left join
以关联的左边为准,即使右边没有与之匹配的记录,则左边的记录也要
出现在结果集中,右边全部以NULL值显示。
右外联 right outer join] right join
以关联的右边为准,即使左边没有与之匹配的记录,则右边的记录也要
出现在结果集中,左边全部以NULL值显示。
示例:
--查询出所有客户名,及其订单号
select o.id,c.name from s_ord o
right join s_customer c on o.customer_id=c.id;

-找出Operations部门工作的员工名,工资,并且按照工资降序排列
select e.first_name,e.salary from s_emp e
left join s_dept d on e.dept_id = d.id
where d.name='Operations'
order by e.salary desc;
第一步查询员工表和部门表,然后查看员工人数和部门个数
第二步如果存在员工没有部门的,以员工表为主表
第三步如果有部门没有员工,以部门表为主

全关联+交叉关联

自关联:
-- 查询出所有的员工名以及员工的上司名
最大的员工没有上级,所以以员工表为主表,
join 一个跟自己一样的表。
select e.first_name,m.first_name from s_emp e
left join s_emp m on e.manager_id = m.id;

posted @ 2017-11-11 09:57  沃泽法克  阅读(2822)  评论(0)    收藏  举报