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 = '人力资源');
 

 

posted @ 2021-04-16 18:55  一米八大高个  阅读(193)  评论(0编辑  收藏  举报