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。
