出现在其他语句中的select 语句,称为子查询或者内查询
外部的查询语句,称为主查询或外查询
分类: 按子查询出现的位置
select 后面
from 后面
where 或having 后面
exists 后面(相关的子查询)
按结果集的行列数不同
标量子查询(结果集只有一行一列)
列子查询(结果集只有一列多行
行子查询(结果集有一行多列)
表字查询 (结果集一般为多行多列)
)
1.where 或having后面
- 标量子查询(单行子查询)
2.列子查询(多行子查询)
3.行子查询(多列多行)
特点:
子查询放在小括号内
子查询一般放在条件的右侧
标量子查询,一般搭配着单行操作符使用
列子查询,一般搭配着多行操作符是使用
in ,any/SOME,all
# 案例一,谁的工资比abel高
#1.查询abel的工资
SELECT salary
FROM employees
WHERE last_name ='Abel';
#2.查询员工的信息,满足1结果
SELECT *
FROM employees
WHERE salary >(
SELECT salary
FROM employees
WHERE last_name ='Abel'
);
# 案例二,返回job_id与141号员工相同,
# salary比143号员工多的员工,姓名,job_id和工资
#1.查询141号员工的job_id
SELECT job_id
FROM employees
WHERE employee_id =141;
#2.查询143号员工的salary
SELECT salary
FROM employees
WHERE employee_id=143;
#3.查询员工的姓名,job_id和工资,要求job_id =1并且salary>2
SELECT last_name,job_id,salary
FROM employees
WHERE job_id =(
SELECT job_id
FROM employees
WHERE employee_id =141
) AND salary>(
SELECT salary
FROM employees
WHERE employee_id=143
);
# 案例1 返回location_id是1400或者1700的部门中的所有员工姓名
#1 查询location_id是1400或者1700的部门编号
SELECT DISTINCT department_id
FROM departments
WHERE location_id IN(1400,1700)
#2 查询员工姓名,要求部门号是1列表中的某一个
SELECT last_name
FROM employees
WHERE department_id IN(
SELECT DISTINCT department_id
FROM departments
WHERE location_id IN(1400,1700)
);
# 案例:查询员工编号最小的并且工资最高的员工信息
#1.查询最小的员工编号
SELECT MIN(employee_id)
FROM employees
#2.查询最高工资的
SELECT MAX(salary)
FROM employees
#3. 查询员工信息
SELECT *
FROM employees
WHERE employee_id = (
SELECT MIN(employee_id)
FROM employees
) AND salary =(
SELECT MAX(salary)
FROM employees
);
应用场景,当要显示的数据,一页显示不全,需要分页提交sql的请求
语法:select 查询列表
form 表
【join type】 join 表2
ON 连接条件
WHERE 帅选条件
grounp by 分组字段
having 分组后的帅选
order by 排序的字段
limit offset,size;
offer要显示条目的起始索引(起始索引从0开始)
size 要显示的条目个数
特点:
1.limit 语句放在查询语句的最后
2.公式
要显示的页数page,每页的条目数size
select 查询列表
from 表
limit (page-1)*size,size;
size=10
page
1 0
2 10
3 20
#案例1: 查询前五条员工信息
SELECT * FROM employees LIMIT 0,5;
#案列2: 查询第11条-第25条
SELECT * FROM employees LIMIT 10,20;
# 案列3:有奖金的员工信息,并且工资较高的前10名显示出来
SELECT
*
FROM
employees
WHERE commission_pct IS NOT NULL
ORDER BY salary DESC
LIMIT 10;