MySQL之多表操作

第一步:创表

# 建表
create table dep(
id int primary key auto_increment,
name varchar(20)
);
create table emp(
id int primary key auto_increment,
name varchar(20),
sex enum('male','female') not null default 'male',
age int,
dep_id int
);
# 插入数据
insert into dep values
(200,'技术部'),
(201,'销售'),
(202,'运营'),
(203,'人力资源');
insert into emp(name,sex,age,dep_id) values
('xiao','male',18,200),
('quan','female',78,200),
('zheng','male',58,201),
('zhang','male',48,202),
('xu','female',18,203),
('li','female',18,203),
('chen','male',18,203);

联表查询

笛卡尔积:

笛卡尔积为两个集合(两张表)中的每条数据进行两两组合的结果。

select * from dep,emp; # 结果叫笛卡尔积

在多表查询时会产生笛卡尔积,要通过添加条件消除笛卡尔积。

select * from emp,dep where emp.dep_id = dep.id;

通过上面添加条件进行查询可以去除笛卡尔积现象,这种查询也叫隐式内连接查询

联表查询的分类

  • inner join 内连接
  • left join 左连接
  • right join 右连接
  • union join 全连接
1. inner join 内连接
select * from emp inner join dep on emp.dep_id = dep.id;
# 内连接特点是只拼接两张表中共有的数据部分
2. left join 左连接
select * from emp left join dep on emp.dep_id = dep.id;
# 左连接特点是左表所有的数据都展示出来,没有对应的项就用NULL
3. right join 右连接
select * from emp right join dep on emp.dep_id = dep.id;
# 右连接特点是右表所有的数据都展示出来,没有对应的项就用NULL
4. union join 全连接
select * from emp left join dep on emp.dep_id = dep.id
union
select * from emp right join dep on emp.dep_id = dep.id;
# 全连接特点是左右表所有的数据都展示出来,没有对应的项就用NULL

子查询

思路:分步解决问题
将一个查询语句的结果当做另一个查询语句的调节去用

# 查询部门是技术或者人力资源的员工信息
1. 先获取部门的id号
2. 再去员工表里面筛选出对应的员工
select id from dep where name='技术' or name='人力资源';
select name from emp where dep_id in (200,201);
组合:
select name from emp where dep_id in (select id from dep where name='技术' or name='人力资源');

总结:

表的查询结果可以作为其他表的查询条件,

也可以通过起别名的方式把它作为一张虚拟表跟其他表关联。

多表查询就两种方式

1、先拼接表再查询

2、子查询,一步一步来

知识点补充

# 查询平均年龄在25岁以上的部门名称
"""
只要是多表查询,就有两种思路
联表和子查询
"""
# 联表操作
1. 先拿到部门和员工表,拼接之后的结果
2. 分析语义,得出需要再进行分组
select dep.name from emp inner join dep
on emp.dep_id = dep.id
group by dep.name
having avg(age) > 25;
"""涉及到多表操作的时候一定要加上表的前缀"""
# 子查询
select name from dep where id in
(select dep_id from emp group by dep_id
having avg(age) > 25);
# 关键字exists(了解)
只返回布尔值 True False
返回True的时候外层查询语句执行
返回False的时候外层查询语句不再执行
select * from emp where exists(select id from emp where id > 3);
select * from emp where exists(select id from emp where id > 30);
posted @   Xiao0101  阅读(14)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示