目录
前言:
本文为在霍格沃兹测试开发学社中学习到的一些技术写出来分享给大家,希望有志同道合的小伙伴可以一起交流技术,一起进步~ 😘
所有SQL语法中符号含义:
- { }:必选项;
- [ ]:可选项;
- |:或,多选一
1. 单表查询
1.1 单表查询语法
- 查询部门表中的信息
SELECT * FROM departments;
- 单表查询:从一张表中查询所需要的数据,所有查询操作都比较简单
*
代表所有的列- 语法:
SELECT * FROM 表名;
1.2 字段查询
-- 查询部门的名称
SELECT dept_name FROM departments;
- 查询多个字段(列),可以使用
,
对字段进行分隔 - 语法:
SELECT 列名 FROM 表名;
1.3 起别名
- 为表起别名:
SELECT 列名 FROM 表名 表别名;
- 为字段起别名:
SELECT 列名 AS 别名 FROM 表名;
-- 查询员工信息,并将列名改为中文
SELECT
emp_no AS '编号',
first_name AS '名',
last_name AS '姓',
gender AS '性别',
hire_date AS '入职时间'
FROM
employees emp;
1.4 去重
-- 去掉重复职级信息
SELECT DISTINCT title FROM titles;
- DISTINCT 关键字:去掉重复信息
- 语法:
SELECT DISTINCT 列名 FROM 表名;
2. 条件查询
2.1 条件查询语法
-- 条件查询
SELECT 列名 FROM 表名 WHERE 条件表达式
2.2 比较运算符
运算符 | 说明 |
---|---|
> < <= >= = <> != | 大于、小于、小于等于、大于等于、等于、不等于 |
BETWEEN...AND... | 范围限定 |
IN | 子集限定 |
LIKE '%or%' | 模糊查询 |
IS NULL | 为空 |
2.2.1 比较大小
- 查询出生日期晚于 1965-01-01 的员工编号、姓名和生日
SELECT
emp_no, first_name, last_name, birth_date
FROM
employees
WHERE
birth_date > '1965-01-01';
- 语法:
WHERE <列名> [> < <= >= = <> !=] <值>
2.2.2 使用 BETWEEN 进行模糊查询
-- 查询年薪介于 70000 到 70003 之间的员工编号和年薪
SELECT
emp_no, salary
FROM
salaries
WHERE
salary BETWEEN 70000 AND 70003;
- 语法:
WHERE <列名> [NOT] BETWEEN <起始表达式> AND <结束表达式>
<起始表达式>
和<结束表达式>
的顺序不能颠倒
2.2.3 使用 IN 进行模糊查询
-- 查询入职日期为 1995-01-27 和 1995-03-20 日的员工信息
SELECT
*
FROM
employees
WHERE
hire_date IN ('1995-01-27', '1995-03-20');
2.2.4 判断是否为空
-- 选择 hog_demo 为当前数据库
USE hog_demo;
-- 更新 student 表中 id 为 2 的 age 值为 NULL
UPDATE student SET age = NULL WHERE id = 2;
-- 查询学生表中年龄为 NULL 的学生信息
SELECT
*
FROM
student
WHERE
age IS NULL;
- 语法:
WHERE <列名> IS [NOT] NULL
2.3 逻辑运算符
运算符 | 说明 |
---|---|
AND && | 多个条件同时成立 |
OR || | 多个条件任一成立 |
NOT | 不成立 |
-- 1.查询名字为 Lillian 并且姓氏为 Haddadi 的员工信息
SELECT
*
FROM
employees
WHERE
first_name = 'Lillian'
AND last_name = 'Haddadi';
-- 2.查询名字为 Lillian 或者姓氏为 Terkki 的员工信息
SELECT
*
FROM
employees
WHERE
first_name = 'Lillian'
OR last_name = 'Terkki';
-- 3.查询名字为 Lillian 并且性别不是女的员工信息
SELECT
*
FROM
employees
WHERE
first_name = 'Lillian'
and not gender='F';
2.4 通配符
运算符 | 说明 |
---|---|
% | 匹配任意多个字符 |
- | 匹配一个字符 |
-- 1. 查询名字中包含 fai 的员工的信息
SELECT
*
FROM
employees
WHERE
first_name LIKE '%fai%';
-- 2. 查询名字中 fa 开头的名字长度为 3 位的员工信息
SELECT
*
FROM
employees
WHERE
first_name LIKE 'fa_';
3. 排序
3.1 排序语法
-- 对查询结果进行排序
SELECT 列名 FROM 表名
[WHERE 条件表达式]
ORDER BY 列名1 [ASC / DESC],
列名2 [ASC / DESC]
- ASC 表示升序排序(默认)
- DESC 表示降序排序
3.2 单列排序
只按照某一个列进行排序, 就是单列排序
-- 使用 salary 字段,对 salaries 表数据进行升序排序
SELECT * FROM salaries ORDER BY salary;
-- 使用 salary 字段,对 salaries 表数据进行降序排序
SELECT * FROM salaries ORDER BY salary DESC;
-- 查询员工的编号和入职日期,按照员工入职日期从晚到早排序
SELECT
emp_no, hire_date
FROM
employees
ORDER BY hire_date DESC;
3.3 组合排序
-- 在入职时间排序的基础上,再使用 emp_no 进行排序
-- 组合排序
SELECT
emp_no, hire_date
FROM
employees
ORDER BY hire_date DESC, emp_no DESC;
- 同时对多个字段进行排序
- 如果第一个字段相同,就按照第二个字段进行排序
4. 聚合函数
4.1 聚合函数
COUNT()
:统计指定列不为 NULL 的记录行数MAX()
:计算指定列的最大值MIN()
:计算指定列的最小值SUM()
:计算指定列的数值和AVG()
:计算指定列的平均值
4.2 聚合查询
-- 查询职级名称为 Senior Engineer 的员工数量
SELECT
COUNT(*)
FROM
titles
WHERE
title = 'Senior Engineer';
-- 查询员工编号为 10002 的员工的最高年薪
SELECT
MAX(salary)
FROM
salaries
WHERE
emp_no = 10002;
-- 查询员工编号为 10002 的员工的最低年薪
SELECT
MIN(salary)
FROM
salaries
WHERE
emp_no = 10002;
-- 查询员工编号为 10002 的员工的薪水总和
SELECT
SUM(salary)
FROM
salaries
WHERE
emp_no = 10002;
-- 查询员工编号为 10002 的员工的平均年薪
SELECT
AVG(salary)
FROM
salaries
WHERE
emp_no = 10002;
- 语法:
SELECT 聚合函数(列名) FROM 表名;
5. 分组
5.1 分组查询语法
-- 分组查询
SELECT 分组列/聚合函数 FROM 表名
GROUP BY 分组列
[HAVING 条件];
- 分组列:按哪些列进行分组
- HAVING:对分组结果再次过滤
5.2 示例
-- 查询每个员工的薪资和
SELECT
emp_no, SUM(salary)
FROM
salaries
GROUP BY emp_no;
-- 查询员工编号小于 10010 的,薪资和小于 400000 的员工的薪资和
SELECT
emp_no, SUM(salary)
FROM
salaries
WHERE
emp_no < 10010
GROUP BY emp_no
HAVING SUM(salary) < 400000;
5.3 子句区别
- WHERE 子句:从数据源中去掉不符合其搜索条件的数据
- GROUP BY 子句:搜集数据行到各个组中,统计函数为各个组计算统计值
- HAVING 子句:去掉不符合其组搜索条件的各行数据行
6. limit关键字
6.1 LIMIT 关键字
-- 限制查询结果行数
SELECT 列名1, 列名2...
FROM 表名
LIMIT [开始的行数], <查询记录的条数>
-- 使用 OFFSET 关键字指定开始的行数
SELECT 列名1, 列名2...
FROM 表名
LIMIT <查询记录的条数> OFFSET <开始的行数>
限制查询结果的数量:
- 开始的行数:从 0 开始记数, 如果省略则默认为 0
- 查询记录的条数:返回的行数
6.2 示例
-- 展示前 10 条员工信息
SELECT * FROM employees LIMIT 10;
SELECT * FROM employees LIMIT 0, 10;
SELECT * FROM employees LIMIT 10 OFFSET 0;
-- 显示年薪从高到低排序,第 15 位到第 20 位员工的编号和年薪
--方式一
SELECT
emp_no, salary
FROM
salaries
ORDER BY salary DESC
LIMIT 14, 6;
--方式二
SELECT
emp_no, salary
FROM
salaries
ORDER BY salary DESC
LIMIT 6 OFFSET 14;
7. SQL 语句执行顺序
-- 基础查询语法
SELECT DISTINCT <列名>
FROM <表名>
WHERE <查询条件表达式>
GROUP BY <分组的列名>
HAVING <分组后的查询条件表达式>
ORDER BY <排序的列名> [ASC / DESC]
LIMIT [开始的行数], <查询记录的条数>
单表查询也是有自己的执行顺序的,通过图示的,我们可以知道,当进行单表查询的时候,查询会先执行where
条件,然后是group by
,然后是having
条件,接着是order by
最后才会执行limit
。
这个顺序我们必须了解,尤其当后面学习到多表查询或者复杂的查询语句时,熟知查询执行的顺序在一定程序上会帮助我们减少sql的错误。
文末说明:
接口测试中我们很容易混淆Session、cookie和token,你知道他们有什么区别吗?快来跟我一起看,一篇文章让你了解三者的区别。😎
⬇⬇⬇⬇⬇⬇⬇
👍👍👍:接口测试经典面试题:Session、cookie、token有什么区别?