MySQL嵌套查询(子查询)

目录

概述

 分类

标量子查询

列子查询

行子查询

表子查询

 总结


 

概述

(1)SQL中嵌套SELECT语句,称为嵌套查询或者子查询

select * from emp_4_15 where depno=(select depno from dep_4_15 where depname='财务部');

语法形式:

 分类

标量子查询

概念:子查询的结果返回的是单个值(数字,字符串,日期等)最简单的形式,这种查询叫做标量子查询

为了方便下面的查询操作举例,我在这里提供出表结构和插入的数据:

-- --------------员工表创建 --------------------------------
create table emp_4_15(
    id int primary key auto_increment comment'主键ID',
    name varchar(20) not null comment '姓名',
    gender char(5) not null comment '性别',
    depno int comment '工作部门号',
    age int not null check(age>0 && age<120) comment '年龄'
)comment '员工表';

alter table emp_4_15 add constraint foreign key(depno) references dep_4_15(depno);
-- ---------------部门表创建-------------------------------
create table dep_4_15(
    depno int primary key auto_increment comment '部门编号',
    depname varchar(20) not null unique comment '部门名称'
)comment '部门信息表';

-- 插入数据-----------------------------
INSERT INTO emp_4_15(name, gender, depno, age)
VALUES
    ('张三', '男', 1, 25),
    ('李四', '女', 2, 32),
    ('王五', '男', 3, 28),
    ('赵六', '女', 1, 22),
    ('刘七', '男', 2, 35),
    ('周八', '女', 3, 27),
    ('钱九', '男', 1, 29),
    ('孙十', '女', 2, 30),
    ('吴十一', '男', 3, 26),
    ('郑十二', '女', 1, 24);

-- 插入数据-------------------------------------
INSERT INTO dep_4_15(depname)
VALUES
    ('研发部'),
    ('市场部'),
    ('财务部');

create table test_emp(
    id int primary key auto_increment comment 'ID',
    name char(20) not null comment '姓名',
    age int check ( age>0 ) comment '年龄',
    job varchar(20) comment '工作',
    salary int comment '薪资',
    empdate date not null comment '入职日期',
    managerid int comment '上级ID',
    depid int comment '所属部门'
)comment '员工表';

-- 插入数据
INSERT INTO test_emp(name, age, job, salary, empdate, managerid, depid)
VALUES
('张三', 25, '程序员', 8000, '2020-01-01', 2, 1),
('李四', 30, '设计师', 10000, '2019-03-15', 1, 2),
('王五', 35, '项目经理', 15000, '2018-05-01', 2, 3),
('赵六', 28, '销售', 5000, '2021-02-01', 3, 4),
('钱七', 29, '人事', 6000, '2017-11-11', 2, 1),
('孙八', 27, '文员', 4000, '2018-08-08', 4, 2),
('周九', 32, '财务', 7000, '2019-06-01', 5, 3),
('吴十', 26, '行政', 5000, '2020-09-01', 6, 4),
('郑一', 24, '客服', 4500, '2021-04-01', 3, 1),
('王二', 28, '技术支持', 5500, '2018-12-01', 1, 2),
('李三', 31, '产品经理', 12000, '2017-04-01', 2, 3),
('张四', 29, '市场', 6000, '2019-08-01', 4, 4),
('陈五', 33, '研发', 10000, '2016-09-01', 5, 1),
('刘六', 27, '采购', 5500, '2020-02-01', 6, 2),
('黄七', 30, '测试', 8000, '2018-11-01', 3, 3);

emp:

 

dep:

 

test:

标量子查询案例1:

由于案例相对简单,大家通过阅读代码就可以看懂要做什么,所以不特意说明题目,大家可以通过这个来练习一下读代码的方式:

select depno from dep_4_15 where depname='财务部';
select * from emp_4_15 where depno=(select depno from dep_4_15 where depname='财务部');

 代码分析:
先查询了财务部的depno,然后通过depno从emp中查询等于depno的所有信息。这里的子查询返回值就是财务部的depno

 

列子查询

概念:列子查询的返回结果是一列(可以是多行),这种子查询是列子查询。

案例:

select depno from dep_4_15 where depname='财务部' or depname = '市场部';
select * from emp_4_15 where depno in (select depno from dep_4_15 where depname='财务部' or depname = '市场部');

select depno from dep_4_15 where depname='财务部';
select salary from test_emp where depid=(select depno from dep_4_15 where depname='财务部');
select * from test_emp where salary>all(select salary from test_emp where depid=(select depno from dep_4_15 where depname='财务部'));

select depno from dep_4_15 where depname='市场部';
select salary from test_emp where depid=(select depno from dep_4_15 where depname='市场部');
select * from test_emp where salary > any(select salary from test_emp where depid=(select depno from dep_4_15 where depname='市场部'));  #some any 一样

查询结果:

 

 第二个语句没有查询结果。

 

行子查询

概念:子查询返回的结果是一行(可以多列),这种子查询称为行子查询

案例:

-- 行子查询 -----------------------------------
select salary , managerid from test_emp where name='张三';
select * from test_emp where (salary,managerid) = (8000,2);
select * from test_emp where (salary,managerid) = (select salary , managerid from test_emp where name='张三');

 查询结果:

 

表子查询

概念:子查询返回的值是多行多列,这种子查询称为表子查询。

常用的操作符:IN

案例:

-- 表子查询---------------------------------------
select job,salary from test_emp where name='张三' or name ='李四';
select * from test_emp where (job,salary) in (select job,salary from test_emp where name='张三' or name ='李四');

select * from test_emp where empdate > '2020-01-01';
select e1.*,d1.* from (select * from test_emp where empdate > '2020-01-01') e1 left join dep_4_15 d1 on e1.depid=d1.depno;

查询结果: 

 总结

MySQL中子查询是比较常见的一种查询手段,希望大家可以看完本篇文章可以更好的掌握。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值