MySQL 系统学习 第二阶段 第三章 DQL(Data Query Language)第一节:SELECT 基础查询

MySQL 系统学习 第二阶段 第三章 DQL(Data Query Language)第一节:SELECT 基础查询
第一节 什么是 DQLDQLData 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);现在studentidnameagegenderscore1Tom20M88.52Jack22M91.03Lucy19F95.54Rose21F86.05Mike20M78.5第三节 查询所有数据这是最简单的。SELECT * FROM student;结果idnameagegenderscore1Tom20M88.52Jack22M91.03Lucy19F95.54Rose21F86.05Mike20M78.5*是什么意思很多新人不知道。*代表所有列例如studentid name age gender score全部查询。第四节 查询指定字段很多时候并不需要全部字段。例如只需要姓名。SELECT name FROM student;结果nameTomJackLucyRoseMike查询姓名年龄。SELECT name, age FROM student;结果nameageTom20Jack22Lucy19Rose21Mike20查询成绩。SELECT score FROM student;为什么企业不推荐SELECT *这是一个非常重要的面试题。很多初学者喜欢SELECT * FROM student;但是企业一般不推荐。原因有四个。原因一浪费网络带宽假设user有50 个字段。你登录只需要用户名 头像结果SELECT *数据库把50 个字段全部返回。浪费。原因二影响性能字段越多读取越慢。特别TEXTBLOB图片。更明显。原因三影响索引优化以后学习覆盖索引。你会知道很多时候SELECT *不能走最佳索引。而SELECT name可以。原因四代码维护困难今天user10 个字段。以后增加20 个字段。所有SELECT *都会返回新增字段。程序可能出问题。企业规范推荐SELECT name, age FROM student;而不是SELECT *第五节 给字段起别名AS例如查询姓名。SELECT name AS 姓名 FROM student;结果姓名TomJack英文SELECT name AS username FROM student;结果usernameTomJackAS可以省略。例如SELECT name username FROM student;也是正确。但是企业一般建议写AS可读性更好。第六节 查询常量SQL不仅查询字段。还可以查询常量。例如SELECT 100;结果100100查询字符串。SELECT Hello MySQL;结果Hello MySQLHello MySQL这在后续学习函数、表达式时会很有用。第七节 查询表达式SQL还能计算。例如SELECT 12;结果123查询成绩加10。SELECT name, score, score10 AS new_score FROM student;结果namescorenew_scoreTom88.598.5Jack91.0101.0Lucy95.5105.5注意这里只是查询结果变化。数据库里面没有修改。第八节 DQL 执行顺序初步认识很多人认为SQL从上往下执行。其实不是。例如SELECT name FROM student;真正MySQL大概执行FROM student ↓ 读取表 ↓ SELECT name ↓ 返回结果以后我们学习WHEREGROUP BYHAVINGORDER 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 的书写顺序和执行顺序不一样目前这条 SQLSELECT name FROM student;MySQL 实际会先做什么SQL 的书写顺序是为了符合人类阅读习惯而数据库为了完成查询会按照逻辑执行顺序处理。以SELECT name FROM student为例MySQL 会先定位student表FROM再读取name字段SELECT最后返回结果。⑤ 如果以后使用 NestJS 的 TypeORMawait userRepository.find({ select: [name, age] });你觉得它最终可能生成什么 SQLTypeORM 的find()本质上会根据配置生成对应的SELECT语句。例如find({ select: [name, age] })通常会生成类似SELECT name, age FROM user;的 SQL。ORM 只是 SQL 的封装最终仍由数据库执行 SQL。