零基础学数据库 Day 3 - DQL 语句
在今天的博客中,我们将深入了解 DQL(数据查询语言)语句,这是数据库操作中至关重要的一部分。DQL 的主要任务是从数据库中查询数据,其基本语法和规则在 MySQL 中堪称经典。
一、DQL 语句是什么
DQL 语句主要用于从数据库中检索信息。通过 DQL,我们可以指定希望查看的数据以及返回这些数据的条件。最常用的 DQL 语句是 SELECT。
二、完整的 DQL 语句语法
完整的 DQL 语法通常遵循以下结构:
SELECT
字段列表
FROM
表名列表
WHERE
条件列表
GROUP BY
分组字段列表
HAVING
分组后条件列表
ORDER BY
排序字段列表
LIMIT
分页参数
三、DQL 的基本查询
- 查询多个字段
SELECT 字段1, 字段2, 字段3 FROM 表名;
- 查询所有字段(通配符)
SELECT * FROM 表名;
- 为查询字段设置别名
SELECT 字段1 AS 别名1, 字段2 AS 别名2 FROM 表名;
注意:AS 关键字可以省略,直接使用 SELECT 字段1 别名1 FROM 表名 也可以实现。
- 去除重复记录
SELECT DISTINCT 字段列表 FROM 表名;
四、条件查询
条件查询可以获取符合特定条件的数据:
SELECT 字段列表 FROM 表名 WHERE 条件列表;
常用的比较运算符:
=,!=,>,<,>=,<=- 逻辑运算符:
AND,OR,NOT
所有条件可以组合使用:
SELECT * FROM 表名 WHERE 字段1 = '值1' AND (字段2 < 值2 OR 字段3 IS NULL);
使用 IN、BETWEEN AND 和 LIKE
-
IN 运算符:用于指定多个可能的值,能够高效判断某个字段的值是否在给定的列表中。常用于替代多个
OR条件,使查询更简洁。语法:
SELECT * FROM 表名 WHERE 字段名 IN (值1, 值2, 值3); -
BETWEEN AND 运算符:用于筛选介于两个值之间的记录,包括边界值,适用于数值、日期等范围的查询。
语法:
SELECT * FROM 表名 WHERE 字段名 BETWEEN 值1 AND 值2; -
LIKE 运算符:用于匹配字符串模式,查找部分字符串。通常用于文本字段,适合通过模式匹配查找字符串。
语法:
SELECT * FROM 表名 WHERE 字段名 LIKE '模式';通配符:
%:表示任意数量的字符,包括零个字符。_:表示一个单独的字符。
五、分组查询
分组查询用于将结果集按某个字段进行汇总。我们利用聚合函数,例如:
-
COUNT():计数SELECT COUNT(*) FROM 表名; -
SUM():求和SELECT SUM(字段名) FROM 表名; -
AVG():平均值SELECT AVG(字段名) FROM 表名; -
MAX():最大值SELECT MAX(字段名) FROM 表名; -
MIN():最小值SELECT MIN(字段名) FROM 表名;
分组的基本语法:
SELECT 字段列表 FROM 表名 [WHERE 条件列表] GROUP BY 分组字段名 [HAVING 分组后过滤条件];
WHERE 和 HAVING 的区别:
WHERE在分组之前筛选记录,而HAVING在分组之后进行进一步的过滤。
六、排序查询
排序查询用于决定数据的显示顺序,基本语法如下:
SELECT 字段列表 FROM 表名 [WHERE 条件列表] [GROUP BY 分组字段名 HAVING 过滤条件] ORDER BY 排序字段 排序方式;
常用的排序方式:
ASC:升序(默认)DESC:降序
我们也可以对多个字段进行排序:
SELECT * FROM 表名 ORDER BY 字段1 ASC, 字段2 DESC;
七、分页查询
分页查询用于限制返回的记录数,便于处理大量数据。其基本语法如下:
SELECT 字段 FROM 表名 [WHERE 条件] [GROUP BY 分组字段 HAVING 过滤条件] [ORDER BY 排序字段] LIMIT 起始索引, 查询记录数;
这里的 LIMIT 语法可以写为 LIMIT 查询记录数 OFFSET 起始索引,以实现更灵活的分页控制。
八、具体实例
假设我们有一个名为 students 的表,结构和数据如下:
| id | name | age | major | gpa |
|---|---|---|---|---|
| 1 | Alice | 20 | Computer Science | 3.8 |
| 2 | Bob | 22 | Mathematics | 3.5 |
| 3 | Charlie | 21 | Physics | 3.9 |
| 4 | David | 23 | Computer Science | 3.2 |
| 5 | Eva | 19 | Mathematics | 3.6 |
创建 students 表
CREATE TABLE students (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
age INT NOT NULL,
major VARCHAR(50),
gpa DECIMAL(3, 2)
);
插入数据到 students 表
INSERT INTO students (name, age, major, gpa) VALUES
('Alice', 20, 'Computer Science', 3.8),
('Bob', 22, 'Mathematics', 3.5),
('Charlie', 21, 'Physics', 3.9),
('David', 23, 'Computer Science', 3.2),
('Eva', 19, 'Mathematics', 3.6);
查询示例
- 查询多个字段:
SELECT name, age, gpa FROM students;
- 查询所有字段(通配符):
SELECT * FROM students;
- 为查询字段设置别名:
SELECT name AS student_name, gpa AS student_gpa FROM students;
(注意:AS 关键字可以省略,直接使用 SELECT name student_name FROM students 也可以实现。)
- 去除重复记录:
SELECT DISTINCT major FROM students;
条件查询示例
假设我们要查询 students 表,使用不同的逻辑运算符,下面是每种运算符的示例:
1. =:等于
- 查询所有年龄为
20岁的学生:
SELECT * FROM students WHERE age = 20;
2. !=:不等于
- 查询所有 GPA 不等于
3.5的学生:
SELECT * FROM students WHERE gpa != 3.5;
3. >:大于
- 查询所有 GPA 大于
3.5的学生:
SELECT * FROM students WHERE gpa > 3.5;
4. <:小于
- 查询所有年龄小于
21岁的学生:
SELECT * FROM students WHERE age < 21;
5. >=:大于或等于
- 查询所有年龄大于或等于
22岁的学生:
SELECT * FROM students WHERE age >= 22;
6. <=:小于或等于
- 查询所有 GPA 小于或等于
3.6的学生:
SELECT * FROM students WHERE gpa <= 3.6;
逻辑运算符组合示例
组合使用逻辑运算符,使查询更具灵活性。例如,
- 查询年龄大于
20岁且 GPA 大于等于3.5的学生:
SELECT * FROM students WHERE age > 20 AND gpa >= 3.5;
- 查询年龄小于
22岁或专业是Computer Science的学生:
SELECT * FROM students WHERE age < 22 OR major = 'Computer Science';
- 查询 GPA 不小于
3.2且年龄不等于23岁的学生:
SELECT * FROM students WHERE gpa >= 3.2 AND age != 23;
- 查询专业是数学或物理的学生:
SELECT * FROM students WHERE major IN ('Mathematics', 'Physics');
- 查询 GPA 在 3.0 到 3.5 之间的学生:
SELECT * FROM students WHERE gpa BETWEEN 3.0 AND 3.5;
模糊查询示例
-
查找以 "A" 开头的学生名字:
SELECT * FROM students WHERE name LIKE 'A%'; -- 匹配以"A"开头的所有名字 -
查找名字中第二个字符是 "l" 的学生:
SELECT * FROM students WHERE name LIKE '_l%'; -- 匹配名字中第二个字符为"l"的所有名字
聚合函数示例
COUNT():计数
SELECT COUNT(*) FROM students;
AVG():平均值
SELECT AVG(gpa) FROM students;
MAX():最大值
SELECT MAX(gpa) FROM students;
MIN():最小值
SELECT MIN(gpa) FROM students;
分组的基本语法:
SELECT major, AVG(gpa) FROM students GROUP BY major;
使用 HAVING 过滤分组结果
SELECT major, COUNT(*) FROM students GROUP BY major HAVING COUNT(*) > 1; -- 只显示有多个学生的专业
排序查询示例
排序查询用于决定数据的显示顺序,其基本语法如下:
SELECT name, gpa FROM students ORDER BY gpa DESC;
多个字段排序示例:
SELECT * FROM students ORDER BY major ASC, gpa DESC;
分页查询示例
分页查询用于限制返回的记录数,便于处理大量数据。你可以使用 LIMIT 进行分页:
SELECT * FROM students ORDER BY id LIMIT 1, 3; -- 从第二条记录开始,返回三条记录
这里的 LIMIT 可以结合 OFFSET 来实现更灵活的分页控制:
SELECT * FROM students ORDER BY id LIMIT 3 OFFSET 1; -- 返回第二条到第四条记录