零基础学数据库 Day 3 - DQL 语句

90 阅读6分钟

零基础学数据库 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 字段名 BETWEEN1 AND2;
    
  • 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 的表,结构和数据如下:

idnameagemajorgpa
1Alice20Computer Science3.8
2Bob22Mathematics3.5
3Charlie21Physics3.9
4David23Computer Science3.2
5Eva19Mathematics3.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;  -- 返回第二条到第四条记录

在这里插入图片描述