MySQL 子查询(多表查询 三)

概念

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 = '销售部');

MySQL 子查询(多表查询 三)_第1张图片

列子查询

子查询返回的结果是一列(可以是多行),这种子查询称为列子查询。
常用的操作符:

操作符 作用
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 = '张三' );

上一篇:MySQL 连接查询(多表查询 二)

下一篇:

你可能感兴趣的:(MySQL数据库,mysql,数据库)