MySQL学习笔记(4)之多表查询(拼表与子查询)
多表查询:
1.拼表查询
2.子查询
1.联表操作
create table dep(
id int primary key auto_increment,
dep_name char (16),
dep_desc char(32)
);
create table emp(
id int primary key auto_increment,
name char(16),
gender enum('male','female','others') default 'male',
dep_id int,
foreign key(dep_id) references dep(id)
on delete cascade on update cascade
);
select * from dep,emp; # 结果 笛卡尔积 # 得到的不是想要的
select * from emp,dep where emp.dep_id = dep.id; #不建议使用 mysql开设了对应的方法
'''
### 拼表操作四种方法
inner join 内连接 # 只拼接两张表共有的数据 用的比较多
select * from emp inner join dep on emp.dep_id = dep.id;
left join 左连接 ## 左表所有的数据都展示出来 没有对应的项用null
select * from emp left join dep on emp.dep_id = dep.id;
right join 右连接 #右表所有的数据都展示出来 没有对应的项用null
select * from emp right join dep on emp.dep_id = dep.id;
union 全连接 ## 左右两张表所有数据都展示出来 没有的用null补全
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;
'''
## 查询平均年龄在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;
# 2.子查询
1. 先把平均年龄大于25 的id拿到
2. 以1.的id查询部门名字
select name from dep where id in (
slect dep_id from emp group by dep_id
having avg(age) > 25
);
2.子查询
'''
子查询就是我们平时解决问题的思路
分步骤解决问题
第一步
第二步
将一个查询语句的结果当做另外-一个 查询语句的条件去用
表的查询结果可以作为其他表的查询条件
也可以通过起别名的方式把它作为-个张虚拟表根其他表关联
'''
# 1.先获取部门的id号
# 2. 再去员工表里面筛选对应的员工
select * from emp where dep_id in (select id from dep where name = '技术' or name = '人力资源');