# 语法

SELECT
    字段列表
FROM
    表名列表
WHERE
    条件列表
GROUP BY
    分组字段
HAVING
    分组之后的条件
ORDER BY
    排序
LIMIT
    分页限定;
1
2
3
4
5
6
7
8
9
10
11
12
13
14

# 基础查询

  1. 查询多个字段
  2. 去除重复结果集
  3. 计算列
  4. 起别名
/* 以student表为例
 * 字段: id, name, age, sex, address, math, english
 */

# 1. 查询多个字段
SELECT name,age FROM student; -- 查询姓名和年龄

# 2. 去除重复结果集
SELECT DISTINCT address FROM student;
SELECT DISTINCT name, address FROM student; -- 两条结果name和adress值完全一样才算重复

# 3. 计算列
SELECT 
    name, 
    math, 
    english, 
    math + IFNULL(english, 0) -- 有NULL参与计算,运算结果都为NULL
FROM student;

# 4. 起别名 使用AS或者使用空格代替AS
SELECT 
    name, 
    math, 
    english, 
    math + IFNULL(english, 0) AS 总分 
FROM student;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

# 条件查询

  1. WHERE语句后跟条件
  2. 运算符
    • >, <, >=, <=, =, <>
    • BETWEEN...AND
    • IN (集合)
    • LIKE
    • IS NULL
  3. 逻辑运算符
    • AND&&
    • OR||
    • NOT!

AND 和 OR 同时存在时,AND 执行的优先级会更高,即 SQL 会优先处理 AND 操作符,再处理 OR

同样可以通过 () 明确指定优先级

# 1. 运算符使用
SELECT * FROM student WHERE age > 20;    -- 大于20
SELECT * FROM student WHERE age = 20;    -- 等于20
SELECT * FROM student WHERE age != 20;   -- 不等于20
SELECT * FROM student WHERE age <> 20;   -- 不等于20

# 2. 逻辑运算符使用
SELECT * FROM student WHERE age >= 20 && age <= 30;
SELECT * FROM student WHERE age >= 20 AND age <= 30;  -- 更推荐
SELECT * FROM student WHERE age BETWEEN 20 AND 30;    -- 包含20和30

SELECT * FROM student WHERE age = 20 OR age = 19;
SELECT * FROM student WHERE age IN (20,19);

# 3. 查询NULL,NULL值不能使用运算符判断
SELECT * FROM student WHERE english IS NULL;
SELECT * FROM student WHERE english IS NOT NULL;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

# 模糊查询

模糊查询使用关键字LIKE

占位符

  • _ 只代表一个字符
  • % 零个或多个任意字符
SELECT * FROM student WHERE name LIKE '马%';   -- 查询姓为马的学生
SELECT * FROM student WHERE name LIKE '%马%';  -- 查询姓名包含马的学生
1
2

# 排序查询

# 语法
ORDER BY 排序字段1 排序方式1, 排序字段2 排序方式2, ...;

# 1. 升序ASC,降序DESC
SELECT * FROM student ORDER BY math;    -- 默认升序
SELECT * FROM student ORDER BY math DESC;

# 2. 多个排序条件,当第一排序条件值相等时,才使用第二排序条件
SELECT * FROM student ORDER BY math ASC, english ASC;
1
2
3
4
5
6
7
8
9

# 聚合函数

将一列数据作为一个整体,进行纵向计算

注意

聚合函数的计算会排除NULL值,解决

  • 选择不包含不包含NULL的列进行计算
  • IFNULL()函数
# 1. 计算个数,一般选择非空的列(主键)
SELECT COUNT(name) FROM student;
SELECT COUNT(IFNULL(english, 0)) FROM student;

# 2. 计算最大值/最小值
SELECT MAX(math) FROM student;
SELECT MIN(math) FROM student;

# 3. 计算和
SELECT SUM(math) FROM student;

# 4. 计算平均数
SELECT AVG(math) FROM student;
1
2
3
4
5
6
7
8
9
10
11
12
13

# 分组查询

分组既然是以组为单位,因此查询的字段只有两类:分组字段和聚合函数

# 语法
GROUP BY 分组字段;

# 1. 基本分组用法
SELECT sex, AVG(math) FROM student GROUP BY sex; -- 以性别为组,查看数学平均分
SELECT sex, AVG(math), COUNT(id) FROM student GROUP BY sex; -- 同时统计各组人数

# 2. 与WHERE配合使用
SELECT sex, AVG(math) FROM student WHERE math > 70 GROUP BY sex; -- 大于70分才参与分组

# 3. 分组之后的条件 HAVING
-- 只有分组后,人数大于2的组才出现
SELECT sex, AVG(math), COUNT(id) FROM student GROUP BY sex HAVING COUNT(id) > 2;
1
2
3
4
5
6
7
8
9
10
11
12
13

WHERE和HAVING区别

  • WHERE是在分组之前进行限定,如果不满足条件,则不参与分组;HAVING是在分组之后进行限定,如果不满足条件,则不会出现在查询结果中
  • WHERE后不可使用聚合函数,HAVING可以进行聚合函数的判断

# 分页查询

LIMIT是一个MySQL「方言」

第一个参数表示从该参数的下一条数据开始,第二个参数表示每次返回的数据条数

# 语法
LIMIT 开始的索引,每页查询的条数;

# 每页显示3条记录
SELECT * FROM student LIMIT 0,3;    -- 第1页,返回 1,2,3
SELECT * FROM student LIMIT 3,3;    -- 第2页,返回 4,5,6
1
2
3
4
5
6

# CASE

SELECT name,
 CASE
  WHEN imdb_rating > 8 THEN 'Fantastic'
  WHEN imdb_rating > 6 THEN 'Poorly Received'
  ELSE 'Avoid at All Costs'
 END AS 'Review'
FROM movies;

1
2
3
4
5
6
7
8
Last Updated: 9/29/2020, 9:20:43 AM