重学MySql数据库(八) 子查询与分页查询

一. 子查询定义

1. 定义:

嵌套在其他语句内部的select语句称为子查询或内查询,
外面的语句可以是insert、update、delete、select等,一般select作为外面语句较多
外面如果为select语句,则此语句称为外查询或主查询

2. 分类:

1、按出现位置
select后面:
	仅仅支持标量子查询
from后面:
	表子查询
where或having后面:
	标量子查询
	列子查询
	行子查询
exists后面:
	标量子查询
	列子查询
	行子查询
	表子查询

2、按结果集的行列
标量子查询(单行子查询):结果集为一行一列
列子查询(多行子查询):结果集为多行一列
行子查询:结果集为多行多列
表子查询:结果集为多行多列

二. 子查询SQL代码演示

#案例一.	查询和 Zlotkey相同部门的员工姓名和工资
#第一步:查询 Zlotkey的部门
SELECT department_id
FROM employees
WHERE last_name = 'Zlotkey'
#第二步:查询部门号=第一步的姓名和工资
SELECT last_name,salary
FROM employees
WHERE department_id = (
	SELECT department_id
	FROM employees
	WHERE last_name = 'Zlotkey'
);

#2.查询工资比公司平均工资高的员工的员工号,姓名和工资。
#第一步:查询平均工资
SELECT AVG(salary)
FROM employees
#第二步:查询工资 >第一步的员工号,姓名和工资。
SELECT last_name,employee_id,salary
FROM employees
WHERE salary>(
	SELECT AVG(salary)
	FROM employees
);


#3.查询各部门中工资比本部门平均工资高的员工的员工号, 姓名和工资
#第一步:查询各部门的平均工资
SELECT AVG(salary),department_id
FROM employees
GROUP BY department_id
#第二步:连接第一步结果集和 employees表,进行筛选
SELECT employee_id,last_name,salary,e.department_id
FROM employees e
INNER JOIN (
	SELECT AVG(salary) ag,department_id
	FROM employees
	GROUP BY department_id
) ag_dep
ON e.department_id = ag_dep.department_id
WHERE salary>ag_dep.ag;

三. 分页查询定义

一、应用场景
当要查询的条目数太多,一页显示不全

二、语法
select 查询列表
from 表
limit 【offset】, size;
注意:
offset代表的是起始的条目索引,默认从0开始
size代表的是显示的条目数

公式:
假如要显示的页数为page,每一页条目数为size
select 查询列表
from 表
limit (page-1)*size,size;

四. 分页查询SQL代码演示

#案例 1:查询前五条员工信息
SELECT * FROM  employees LIMIT 0,5;
SELECT * FROM  employees LIMIT 5;


#案例 2:查询第11条——第25条
SELECT * FROM  employees LIMIT 10,15;

#案例 3:有奖金的员工信息,并且工资较高的前10名显示出来
SELECT 
    * 
FROM
    employees 
WHERE commission_pct IS NOT NULL 
ORDER BY salary DESC 
LIMIT 10 ;

总结:子查询多变,非常的灵活,哪里都可用,但是逻辑比较难,分页查询相对来说,比较简单,而且以后用处也不小。

猜你喜欢

转载自blog.csdn.net/w_x_A__l__l/article/details/107383672