mysql多表查询

外连接

左外连接的会将左表的信息进行全部展示,同理右外连接会将右表的信息进行全部展示

#查询1:查询员工表所有员工的姓名,对应的部门名称(左连接)
select tb_emp.name, tb_dept.name
from tb_emp
         LEFT OUTER JOIN tb_dept ON tb_emp.dept_id = tb_dept.id;
#查询2=查询3
#查询2:查询员工表所有员工的姓名,对应的部门名称(右连接)
select tb_emp.name, tb_dept.name
from tb_dept
         LEFT OUTER JOIN tb_emp ON tb_emp.dept_id = tb_dept.id;


#查询3:部门表,所有部门的名称,和对应的员工名称(右连接)
SELECT tb_dept.NAME,tb_emp.NAME FROM tb_emp RIGHT OUTER JOIN tb_dept ON tb_emp.dept_id = tb_dept.id;

#查询3=查询4

#查询4:部门表,所有部门的名称,和对应的员工名称(左连接)
SELECT tb_dept.NAME,tb_emp.NAME FROM tb_dept left OUTER JOIN tb_emp ON tb_emp.dept_id = tb_dept.id;

嵌套查询

标量子查询


#查询1:查询教研部的所有员工信息
#1.查询dept_id = 2 的员工信息
select *
from tb_emp
where dept_id = 2;
#2.查询教研部的id
select id
from tb_dept
where name = '教研部';
#得到完整式子
select *
from tb_emp
where tb_emp.dept_id = (select id from tb_dept where name = '教研部');

#查询2:查询在半无忌入职时间2000-01-02之后的员工信息
#1 查询在2000-01-02时间之后入职的员工
select *
from tb_emp
where entrydate > 2000 - 01 - 02;
#2 查询半无忌的入职时间
select entrydate
from tb_emp
where name = '半无忌';

#3 合并
select *
from tb_emp
where entrydate > (select entrydate from tb_emp where name = '半无忌');

列子查询


#查询1:查询教研部和咨询部的所有员工信息
select *
from tb_emp
where dept_id = (select tb_dept.id from tb_dept where name = '咨询部')
   OR dept_id = (select tb_dept.id from tb_dept where name = '教研部');

行子查询


#查询1:查询与“鹤驰客”入职日期、职位都相同的员工信息
select *
from tb_emp
where entrydate = (select entrydate from tb_emp where name = '鹤驰客')
  AND job = (select job from tb_emp where name = '鹤驰客')
  AND name != '鹤驰客';

#优化后版本
select *
from tb_emp
where (entrydate, job) = (select entrydate, job from tb_emp where name = '鹤驰客')
  AND name != '鹤驰客';

表子查询


#查询1:查询入职日期是“2013-09-05”之后的员工信息,及其部门名称
#步骤1:查询入职日期是“2013-09-05”之后的员工信息
select *
from tb_emp
where entrydate >= '2013-09-05';
#步骤2:查询员工对应的部门名称
select tb_dept.name
from tb_dept,
     tb_emp
where tb_dept.id = tb_emp.dept_id;
#组合方式1:未使用嵌套
select tb_emp.*, tb_dept.name
from tb_dept,
     tb_emp
where entrydate >= '2013-09-05'
  AND tb_dept.id = tb_emp.dept_id;
#组合方式2:使用嵌套
select e.*, tb_dept.name
from (select *
      from tb_emp
      where entrydate >= '2013-09-05') as e,
     tb_dept
where tb_dept.id = e.dept_id;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值