MySQL 系统学习 第二阶段 第三章 DQL(Data Query Language)第一节:SELECT 基础查询
第一节 什么是 DQL?
DQL:
Data Query Language
中文:
数据查询语言
整个 DQL:
实际上只有一个命令:
SELECT
以后:
所有查询:
都是:
SELECT ...
例如:
查询:
学生。
SELECT *
FROM student;
查询:
姓名。
SELECT name
FROM student;
查询:
年龄。
SELECT age
FROM student;
查询:
姓名和年龄。
SELECT name, age
FROM student;
所以:
DQL 的核心就是 SELECT。
第二节 准备数据
后面所有例子都使用这张表。
CREATE TABLE student(
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50),
age INT,
gender CHAR(1),
score DECIMAL(5,2)
);
插入数据:
INSERT INTO student(name, age, gender, score)
VALUES
('Tom',20,'M',88.5),
('Jack',22,'M',91.0),
('Lucy',19,'F',95.5),
('Rose',21,'F',86.0),
('Mike',20,'M',78.5);
现在:
student
| id | name | age | gender | score |
|---|---|---|---|---|
| 1 | Tom | 20 | M | 88.5 |
| 2 | Jack | 22 | M | 91.0 |
| 3 | Lucy | 19 | F | 95.5 |
| 4 | Rose | 21 | F | 86.0 |
| 5 | Mike | 20 | M | 78.5 |
第三节 查询所有数据
这是最简单的。
SELECT *
FROM student;
结果:
| id | name | age | gender | score |
|---|---|---|---|---|
| 1 | Tom | 20 | M | 88.5 |
| 2 | Jack | 22 | M | 91.0 |
| 3 | Lucy | 19 | F | 95.5 |
| 4 | Rose | 21 | F | 86.0 |
| 5 | Mike | 20 | M | 78.5 |
* 是什么意思?
很多新人不知道。
*
代表:
所有列
例如:
student:
id
name
age
gender
score
全部查询。
第四节 查询指定字段
很多时候:
并不需要:
全部字段。
例如:
只需要:
姓名。
SELECT name
FROM student;
结果:
| name |
|---|
| Tom |
| Jack |
| Lucy |
| Rose |
| Mike |
查询:
姓名:
年龄。
SELECT name, age
FROM student;
结果:
| name | age |
|---|---|
| Tom | 20 |
| Jack | 22 |
| Lucy | 19 |
| Rose | 21 |
| Mike | 20 |
查询:
成绩。
SELECT score
FROM student;
为什么企业不推荐 SELECT *?
这是一个非常重要的面试题。
很多初学者喜欢:
SELECT *
FROM student;
但是企业一般不推荐。
原因有四个。
原因一:浪费网络带宽
假设:
user:
有:
50 个字段。
你:
登录:
只需要:
用户名
头像
结果:
SELECT *
数据库:
把:
50 个字段:
全部返回。
浪费。
原因二:影响性能
字段越多:
读取:
越慢。
特别:
TEXT
BLOB
图片。
更明显。
原因三:影响索引优化
以后:
学习:
覆盖索引。
你会知道:
很多时候:
SELECT *
不能:
走:
最佳索引。
而:
SELECT name
可以。
原因四:代码维护困难
今天:
user:
10 个字段。
以后:
增加:
20 个字段。
所有:
SELECT *
都会:
返回:
新增字段。
程序:
可能:
出问题。
企业规范
推荐:
SELECT
name,
age
FROM student;
而不是:
SELECT *
第五节 给字段起别名(AS)
例如:
查询:
姓名。
SELECT
name AS 姓名
FROM student;
结果:
| 姓名 |
|---|
| Tom |
| Jack |
英文:
SELECT
name AS username
FROM student;
结果:
| username |
|---|
| Tom |
| Jack |
AS 可以省略。
例如:
SELECT
name username
FROM student;
也是:
正确。
但是:
企业:
一般:
建议:
写:
AS
可读性:
更好。
第六节 查询常量
SQL:
不仅:
查询:
字段。
还可以:
查询:
常量。
例如:
SELECT 100;
结果:
| 100 |
|---|
| 100 |
查询:
字符串。
SELECT 'Hello MySQL';
结果:
| Hello MySQL |
|---|
| Hello MySQL |
这在后续学习函数、表达式时会很有用。
第七节 查询表达式
SQL:
还能:
计算。
例如:
SELECT
1+2;
结果:
| 1+2 |
|---|
| 3 |
查询:
成绩:
加:
10。
SELECT
name,
score,
score+10 AS new_score
FROM student;
结果:
| name | score | new_score |
|---|---|---|
| Tom | 88.5 | 98.5 |
| Jack | 91.0 | 101.0 |
| Lucy | 95.5 | 105.5 |
注意:
这里只是:
查询结果:
变化。
数据库:
里面:
没有:
修改。
第八节 DQL 执行顺序(初步认识)
很多人认为:
SQL:
从上往下:
执行。
其实:
不是。
例如:
SELECT
name
FROM student;
真正:
MySQL:
大概:
执行:
FROM student
↓
读取表
↓
SELECT name
↓
返回结果
以后:
我们学习:
WHERE
GROUP BY
HAVING
ORDER BY
你会发现:
SQL 的书写顺序和执行顺序并不完全一致。
本章知识总结
| SQL | 作用 |
|---|---|
SELECT * FROM student; | 查询所有字段 |
SELECT name FROM student; | 查询指定字段 |
SELECT name, age FROM student; | 查询多个字段 |
SELECT name AS username FROM student; | 字段别名 |
SELECT 100; | 查询常量 |
SELECT score + 10 FROM student; | 查询表达式 |
本章思考题
请先思考,再回答:
① SELECT * 和 SELECT name, age 有什么区别?为什么企业不推荐 SELECT *?
SELECT * 会返回所有字段,而 SELECT name, age 只返回指定字段。企业通常不推荐使用 SELECT *,因为它会增加网络传输、降低查询效率、不利于索引优化,并且在字段变更时容易引发维护和安全问题。
② AS 的作用是什么?为什么很多公司仍然建议保留 AS,而不是省略?
AS 用于给字段、表或计算结果设置别名,方便阅读和使用。虽然 MySQL 允许省略 AS,但保留 AS 能提高 SQL 的可读性,减少歧义,因此企业开发通常建议显式写出。
③ 为什么 SELECT score + 10 并不会真正修改数据库中的数据?
SELECT score + 10 只是对查询结果进行计算,并不会修改表中的实际数据。因为 SELECT 属于 DQL,只负责读取数据;真正修改数据需要使用 UPDATE 等 DML 语句。
④ 为什么说 SQL 的书写顺序和执行顺序不一样?目前这条 SQL:
SELECT name
FROM student;
MySQL 实际会先做什么?
SQL 的书写顺序是为了符合人类阅读习惯,而数据库为了完成查询,会按照逻辑执行顺序处理。以 SELECT name FROM student 为例,MySQL 会先定位 student 表(FROM),再读取 name 字段(SELECT),最后返回结果。
⑤ 如果以后使用 NestJS 的 TypeORM:
await userRepository.find({
select: ['name', 'age']
});
你觉得它最终可能生成什么 SQL?
TypeORM 的 find() 本质上会根据配置生成对应的 SELECT 语句。例如 find({ select: ['name', 'age'] }) 通常会生成类似 SELECT name, age FROM user; 的 SQL。ORM 只是 SQL 的封装,最终仍由数据库执行 SQL。
更多推荐



所有评论(0)