关联查询—自关联、外关联、内关联
关联查询: 原理是通过语句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;

 
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号