sql语句子查询(标量子查询,列子查询,行子查询),分页查询,联合查询

出现在其他语句中的select 语句,称为子查询或者内查询
外部的查询语句,称为主查询或外查询
分类: 按子查询出现的位置
select 后面
from 后面
where 或having 后面
exists 后面(相关的子查询)
按结果集的行列数不同
标量子查询(结果集只有一行一列)
列子查询(结果集只有一列多行
行子查询(结果集有一行多列)
表字查询 (结果集一般为多行多列)

1.where 或having后面

  1. 标量子查询(单行子查询)
    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;

联合查询

union 联合合并:将多条查询语句的结果合并成一个结果
语法:
查询语句1
UNION
查询语句2
UNION
应用场景:
要查询的结果来自多个表,且多个表没有直接的连接关系,但查询的信息一致时
特点:
1.要求多条查询语句的查询列数是一致的
2.要求多条查询语句的查询的每一列的类型和顺序最好一致
3.UNION关键字默认去重,如果使用union all 可以包含重复项

#案例: 查询部门编号>90或邮箱包含a的员工信息
SELECT * FROM employees WHERE email LIKE  '%a%'
UNION
SELECT * FROM employees WHERE department_id>90;

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