SQL语句中嵌套select语句,称为嵌套查询,又称子查询,它可以在查询过程中使用其他查询的结果。
select * from t1 where column1 = ( select column1 from t2 );
子查询外部的语句可以是insert/ update/ delete/ select的任何一个(实现更精确的操作)。
1. 标量子查询(子查询结果为单个值)
2. 列子查询(子查询结果为一列)
3. 行子查询(子查询结果为一行)
4. 表子查询(子查询结果为多行多列)
1. where之后
2. from之后
3. select之后
子查询返回的结果是单个值(数字、字符串、日期等),最简单的形式,这种子查询称为标量子查询。
常用的操作符:= <>(不等于符号) > >= < <=
基本语法:
- select 列名
- from 表名
- where 列名 操作符 (子查询语句);
示例:
- -- 查询员工表中年龄最大的员工的姓名和年龄。
- select name, age
- from employees
- where age = (select max(age) from employees);
- -- 根据 "销售部" 部门id, 查询员工信息
- select name 员工姓名,department_id 归属部门
- from employees
- where department_id = (select id from departments where name = '销售部');
子查询返回的结果是一列(可以是多行),这种子查询称为列子查询。
常用的操作符:
操作符 | 作用 |
in | 在指定的集合范围之内,多选一 |
not in | 不在指定的集合范围之内 |
any | 子查询返回列表中,有任意一个满足即可(任一) |
some | 与any等同,使用some的地方都可以使用any |
all | 子查询返回列表的所有值都必须满足(所有) |
in、not in与any、some、all的使用区别:
in操作符本身就表示等值比较,不能加上"="之类的操作符使用
any操作符本身没有比较,需要加上" < "之类的操作符才能使用
基本语法:
- select 列名
- from 表名
- where 列名 操作符 (子查询语句);
示例:
操作一般分为两步:先列出子查询,然后添加到外部操作内部(这样无论是编写,还是查错都十分方便)
- -- 1.先建立子查询:查询两个部门id
- select id
- from departments
- where name = '销售部' or name = '市场部';
- -- 2.再将子查询添加到外部操作:根据部门id查询员工
- select *
- from employees
- where department_id in (select id from departments where name = '销售部' or name = '市场部');
- -- 1.查询各个部门平均年龄
- select department_id 部门, avg(age) 平均年龄
- from employees
- group by department_id;
- -- 2.查询员工表中年龄大于 所有部门 平均年龄的员工的姓名和年龄
- select name,age
- from employees
- where age > all (select avg(age) from employees group by department_id);
子查询返回的结果是一行(可以是多列),这种子查询称为行子查询。
常用的操作符:= 、<> 、in、not in
基本语法:
- select 列名
- from 表名
- where (列1, 列2, ...) 操作符 (子查询语句);
示例
- -- 查询员工表中与某个员工年龄和性别完全相同的员工的姓名和邮箱
- select name, email
- from employees
- where (age, gender) = (select age, gender from employees where name = '李白');
子查询返回的结果是多行多列,这种子查询称为表子查询。
常用的操作符:in
基本语法
- select 列名
- from 表名
- where (列1, 列2, ...) 操作符 (子查询语句);
示例
- -- 1.查询两个员工年龄和部门
- select age, department_id
- from employees
- where name = '李白' or name = '张三';
-
- -- 2.查询员工中哪些人年龄和部门与这两个之一相同
- select *
- from employees
- where (age,department_id) in
- ( select age, department_id from employees where name = '李白' or name = '张三' );
下一篇: