MySQL数据库(五)连表、子与组合查询

1.连表查询

为什么需要连表查询

1.如果查询的结果在一张表中无法获取,需要关联多张表,那么这时就需要连表查询。

2.连表查询大多数都作用在外键的基础上。--- 表与表之间有关联。

1.1.表与表存在的关系

  1. 一对多: 在多得一方添加外键列

  2. 多对多: 需要在创建一个中间表,该表中至少有两个外键列。

1.2.连表查询

1.2.1.内连接

 隐式与显式没什么区别---结果都是一样,只是语法不同。看个人习惯用哪个

-- 内连接
-- 隐式查询 select 列名.... from 表1,表2 where 连表得条件。
-- 连表查询时,如果不使用连表条件则出现笛卡尔集。
-- 所谓笛卡尔集 就是A表中每一条记录关联B中中得每条记录
1.查询每一个员工的姓名,及关联的部门的名称〔隐式内连接实现)
select e.name 姓名,d.name 部门 from tb_emp e,tb_dept d where e.dept_id=d.id;
-- 显示连接: A表 inner join B表 on 连表条件。inner可以省略 
2.查询每一个员工的姓名,及关联的部门的名称〔显式内连接实现) inner可以省略
select e.name 姓名,d.name 部门 from tb_emp e inner join tb_dept d where e.dept_id=d.id;

1.2.2.外连接

-- 外连接
-- 1.查询emp表的所有数据, 和对应的部门信息(左外连接)
-- 语法: select 查询列集 from A表 left join B表 on 连表条件
select * from tb_emp e left join tb_dept d on e.dept_id=d.id;
-- 2.查询dept表的所有数据,和对应的员工信息(右外连接)
-- 语法: select 查询列集 from A表 right join B表 on 连表条件
select * from tb_dept d right join tb_emp e on d.id=e.dept_id;

 1.2.3.自联连接

自己和自己相连接查询。
select * from A表 join A表 on 连表条件。

-- 自连接
-- 1.查询员工及其所属领导的名字。你要查询的结果再一张表中,但是还不能使用单表查询得到结果。
select a.name 姓名,b.name 领导 from tb_emp a join tb_emp b on a.managerid=b.id;
-- 2.查询所有员工 emp及其领导的名字emp ,如果员工没有领导,也需要查询出来
select a.name 姓名,b.name 领导 from tb_emp a left join tb_emp b on a.managerid=b.id;

2.子查询---嵌套查询

一个查询的结果 作为另一个查询的条件 或者 临时表。

-- 子连接  嵌套查询
-- 查询市场部的员工信息-----
select id from tb_dept where name='市场部';
-- 子查询返回的结果一列一条记录。 这个时候可以用=
select * from tb_emp where dept_id=(select id from tb_dept where name='市场部');

-- 查询市场部和研发部员工的信息。in 
 -- -- 查询市场部和研发部员工的信息。
   -- a) 查询市场部和研发部的编号
select id from tb_dept where name in('市场部','研发部');
   -- b) 再员工表中根据部门编号查询员工信息
select * from tb_emp where dept_id in(select id from tb_dept where name in('市场部','研发部'));

-- 查询在“方东白”入职之后的员工信息
select entrydate from tb_emp where name='方东白';
select * from tb_emp where entrydate>(select entrydate from tb_emp where name='方东白');
-- -- 查询比财务部所有人工资都高的员工信息。
  a)求出财务部中最高的工资。
select max(salary) from tb_emp e join tb_dept d on e.dept_id=d.id where d.name='财务部';
	
	b) 根据财务部最高工资查询其他员工信息
select * from tb_emp where salary>(select max(salary) from tb_emp e join tb_dept d on e.dept_id=d.id where d.name='财务部');

3.组合查询

多个查询的结果 组合到一起。
sql union sql --->把这两条sql查询的结果组合到一起。如果有重复记录则合并成一条。
sql union all sql--->把这两条sql查询的结果组合到一起。如果有重复记录,不合并。 

注意: 这两条sql返回的字段必须一样。

select * from tb_emp where salary>10000
union
select * from tb_emp where age>50;

select * from tb_emp where salary>10000
union all
select * from tb_emp where age>50;

4.总结

1.内连接---inner join  on
2.外连接---left join   on     right join  on
3.自连接---
4.子查询-- 嵌套
5.组合查询---sql union  sql     union all   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Naaaaa.a

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值