)
DQL 介绍DQLData Query Language数据查询语言作用就是从数据库里查询、获取数据SELECT是核心语句。MySQL 语句不区分大小写select和SELECTfrom和FROM效果完全一样。基础语法select 查询的列 from 表名;查询结果是一张虚拟二维表第一行是列名后面各行是查询出来的数据。几种基础写法示例-- 查询指定的单个字段 select name from student; -- 查询多个字段逗号分隔 select id,name,age from student; -- 查询表中所有字段* 代表所有列 select * from student;查询常量不需要 from 表直接返回固定值-- 直接查询常量不需要from表 select 100,张三,3.14;执行后会直接返回一行结果100 | 张三 | 3.14小补充select *开发不推荐会查询所有字段消耗性能生产环境尽量写需要的字段名。SQL 关键字大小写不敏感但字符串内容是区分大小写的看数据库字符集排序规则。简单练习student 表有 id,name,age 三个字段查询所有学生姓名select name from student;查询 id 和 ageselect id,age from student;SELECT 查询表达式 查询函数1. 查询表达式语法select 表达式;表达式可以是加减乘除等数学运算不需要 from 表MySQL 直接计算返回结果。示例select 12,3*10,10/3;结果表格123*1010/33303.33332. 查询函数语法select 函数;MySQL 内置函数同样可以直接 select 调用不用查表。说明mod(a,b)取余求 a 除以 b 的余数select mod(10,4); -- 10 ÷4 余2结果是2isnull(值)判断是否为 NULL参数是 NULL → 返回 1参数不为 NULL → 返回 0select isnull(null); -- 返回1 select isnull(100); -- 返回0ifnull(表达式1,表达式2)空值替换高频逻辑如果表达式 1 是 NULL→ 返回表达式 2如果表达式 1 不为 NULL→ 返回表达式 1select ifnull(null,第一个参数为空返回这个值); -- 第一个参数是null返回后面字符串 select ifnull(1,第一个参数为空返回这个值否则返回第一个参数); -- 第一个参数不为null直接返回1实战场景举例student 表有 score 字段有些分数是 NULL想把 NULL 显示为 0select name, ifnull(score,0) from student;小结select后面不光可以写字段名还可以写数学表达式、内置函数这类语句不需要from表直接计算输出结果ifnull是重点处理数据库里的 NULL 空值非常常用SELECT 查询指定字段语法select 字段1,字段2,字段3 from 表名;只查询你写出来的字段字段之间用逗号分隔不会返回表中其他字段。示例-- 如果test1存在就删除 drop table if exists test1; -- 创建test1表 -- aint类型非空bvarchar(10)字符串非空默认空字符串 create table test1( a int not null comment 字段a, b varchar(10) not null default comment 字段b ); -- 插入3行数据 insert into test1 values(1,a),(2,b),(3,c); -- 查询a、b两个字段 select a,b from test1;查询结果表格ab1a2b3c知识点多字段查询字段名逗号隔开逗号是英文逗号不能写中文逗号comment xxx字段注释仅用于说明不影响数据存储not null该字段不能存入 NULL 空值default 插入数据不填 b 字段时自动填充为空字符串对比select * from test1;*代表查询全部字段开发推荐写具体字段名性能更好、更安全拓展小练习只查询字段 aselect a from test1;查询所有列select *语法select * from 表名;*是通配符代表表里面全部字段。示例沿用上面的 test1 表select * from test1;结果表格ab1a2b3c⚠️ 重点考点面试常问✅ 适用场景临时测试、快速查看表结构写小脚本。 ❌生产环境不推荐使用select *原因会取出所有字段可能查询很多不需要的列浪费网络和内存无法使用覆盖索引查询性能变差表结构变更新增字段时程序会拿到多余字段容易引发 bug。生产规范需要哪些字段就手动写哪些字段名例如select a,b from test1;对比小结select 字段1,字段2 from 表名;只查指定列推荐生产使用select * from 表名;查询全部列仅本地调试使用MySQL 列别名AS作用表字段一般是英文名字查询结果的表头默认就是字段名。列别名可以给查询出来的列起一个新名字方便阅读。AS关键字可以省略。语法select 列 [as] 别名 from 表;三种写法示例test1 表字段 a、b写法 1双引号别名select a 列1, b 列2 from test1;写法 2单引号别名select a 列1, b 列2 from test1;写法 3不加引号别名里面不能有空格select a 列1, b 列2 from test1;完整带 AS 关键字写法可读性更好推荐写 ASselect a as 列1, b as 列2 from test1;效果和上面完全一样。⚠️ 注意点如果别名包含空格、特殊字符必须加单 / 双引号-- 别名带空格必须引号包裹 select a as 序号 1 from test1;别名只在本次查询结果生效不会修改数据库里真实的字段名。MySQL 中as可以省略直接写字段 别名。实战例子student 表idnamescoreselect id as 编号, name as 姓名, ifnull(score,0) as 分数 from student;查询结果表头就变成编号姓名分数小练习给 test1 的 a 起别名编号b 起别名内容写出 SQLselect a as 编号, b as 内容 from test1;MySQL 表别名语法select 别名.字段,别名.* from 表名 [as] 别名;as可以省略表名 别名也可以表别名作用简化 SQL多表联查时区分不同表的同名字段使用方式别名.字段名来指定是哪个表的字段。示例 1查询 t 表的 a、b 字段select t.a,t.b from test1 as t;test1 起别名tt.a代表表 t 里面的 a 字段。示例 2表别名 列别名一起使用select t.a as 列1,t.b as 列2 from test1 as t;t表别名给 test1 表列1、列2列别名给查询出来的字段示例 3查询别名表的所有字段select t.* from test1 as t;t.*代表别名 t 对应的 test1 表全部字段。核心知识点表别名只在这条 SQL 内生效不会修改数据库真实表名单表查询时作用不大多表连接查询时是必须掌握的两张表如果有相同字段名不加表别名会歧义报错as可省略from test1 t和from test1 as t效果一样。多表简单演示提前感受用途test1 t1test2 t2两张表都有 a 字段select t1.a, t2.a from test1 t1, test2 t2 where t1.a t2.a;不加t1.、t2.MySQL 不知道你要哪个表的 a直接报错。对比总结列别名字段 as 别名→ 修改查询结果表头名字表别名表名 as 别名→ 给表起简称用来别名.字段DISTINCT 去重作用去掉查询结果里重复的行只保留唯一记录。ALL是默认返回全部行DISTINCT开启去重。语法select distinct 字段1,字段2 from 表名;⚠️ 重点distinct写在select后面、第一个字段前面。多字段时是所有字段组合起来一起判断是否重复不是单独对某一列去重示例 1单列去重假设有一张 student 表age 字段数据18,18,19,20,20,20select distinct age from student;结果表格age181920示例 2多字段组合去重高频考点select distinct age,name from student;判断规则age 和 name 两个字段的值同时一模一样才算重复行。 age 相同但 name 不同不会被去重。示例 3和 count 搭配面试常考统计一共有多少种不重复的年龄select count(distinct age) from student;注意事项distinct作用于它后面全部字段不能只单独给某一个字段去重去重只是查询结果过滤不会修改数据库表里原始数据distinct需要排序来去重大数据量查询性能会下降。小练习表 test1 数据表格ab1a1a2b写出 SQL查询 a、b去掉重复行select distinct a,b from test1;返回 2 条记录。select条件查询WHERE 条件查询总大纲WHERE 用来按条件过滤行只返回满足条件的数据语法select 字段 from 表名 where 条件;下面按顺序逐个梳理这 10 个知识点1. 条件查询语法select 字段 from 表 where 条件表达式;执行顺序先from找到表 →where筛选符合条件的行 → 再select取出字段。2. 比较运算符!表格运算符含义等于大于小于大于等于小于等于/!不等于两者等价示例select * from student where age 18; select * from student where age 20; -- age不等于20❗注意不能用来判断 NULLwhere score null查不出任何结果3. 逻辑运算符 and /orand并且两边条件同时满足or或者满足任意一个优先级andor复杂条件建议加括号()示例-- 年龄大于15 并且 性别为男 select * from student where age15 and gender男; -- 年龄18 或者 年龄20 select * from student where age18 or age20;4. like 模糊查询配合通配符%匹配任意多个字符0 个、1 个、多个_匹配单个字符-- 名字以张开头 select * from student where name like 张%; -- 名字第二个字是三 select * from student where name like _三;注意%前缀%无法走索引大数据慢。5. between and查询闭区间下限 and 上限-- age 在18 ~ 25之间包含18和25 select * from student where age between 18 and 25;6. in / not in匹配多个固定值-- age等于18 或 20 或 22 select * from student where age in (18,20,22); -- age不是这几个值 select * from student where age not in (18,20,22);⚠️坑not in的括号里如果存在 NULL查询结果直接为空7. NULL 值存在的坑NULL代表未知不是空字符串不是 0。任何和NULL做运算 / 比较结果都是未知不会匹配成功null null结果不为真查不到记录8. is null /is not null NULL 专用判断判断字段是不是空值不能用 -- 查询分数为null的记录 select * from student where score is null; -- 查询分数不为null select * from student where score is not null;9. 安全等于运算符可以用来比较 NULLnull null返回真普通值比较等价于select null null; -- 1 select 1 1; --1 select 1 null; --0日常写 SQL 很少用面试常考。10. 经典面试题常见考题where null null能查到数据吗为什么不能NULL 是未知未知 未知依然是未知要用is null。not in (1,2,null)查询为什么返回空not in 只要集合里有 null条件永远不成立无结果。like %abc和like abc%哪个能用到索引like abc%前缀固定可以走索引%abc前缀通配无法走索引。面试题解析select * from students;vsselect * from students where name like %;结论两条 SQL结果不一定相同关键点在于name字段有没有NULL。表中所有行的 name 都不为 NULL两条 SQL 查询结果完全一样。like %匹配任意非 NULL 字符串包括空字符串。表存在 name 为 NULL 的行结果不一样。like %无法匹配 NULL第二条 SQL 会把name is null的数据过滤掉不会返回。底层原理NULL代表未知值like是字符串匹配运算符NULL 不能参与字符串匹配任何like和 NULL 比较的结果都是未知不满足 where 条件直接被过滤。举个例子students 表表格idname1 张三23NULLselect * from students;→ 返回 3 条记录1、2、3select * from students where name like %;→ 返回 2 条1、2id3 namenull 被过滤补充空字符串≠NULL。空字符串属于字符串like %可以匹配到NULL 不是字符串匹配不到。拓展小考题想要查询所有 name包含 name 为 NULL 的行怎么写select * from students where name like % or name is null;知识点总结梳理1.like 通配符%匹配0 个、1 个或多个任意字符不是只能匹配 1 个以上可以匹配空字符串_匹配单个任意字符注意like只能匹配字符串NULL 无法被 like 匹配。2.NULL 空值查询判断字段是否为 NULL只能用is null/is not null。、!、like、、这些普通运算符遇到 NULL结果都是未知无法匹配到 NULL 行。3.建表最佳实践尽量把字段设置not null并且设置默认值。 好处避免 NULL 带来各种查询坑、索引失效、逻辑判断异常。 示例name varchar(20) not null default 用空字符串代替 NULL。4.安全等于运算符支持 NULL 比较null null返回 1普通值等价于。开发中尽量少用可读性差业务里优先用is null。快速小考题自测1.where name like _能匹配 abc 吗不能下划线只匹配单个字符。2.where score null能查到分数为空的数据吗不能必须写where score is null。3.建表时age int not null default 0插入数据不填 age字段是什么值自动填充 0不会出现 NULL。