数据准备
在学习DQL之前,导入SQL脚本,准备如下所示 四张表
DQL 查询表中的数据
DQL就是数据查询语言,只是一种显示数据的方式。数据库执行DQL语句不会对数据进行改变,而是让数据库发送结果集给客户端。每执行完一个子句就会产生一个虚拟的表,后续子句都是在前面产生的虚拟表上操作
简单查询
查询表中列的数据 , 如果查询所有字段,则可以使用*来替代字段列表。(不建议使用)语法:select 查询列表 from 表名;
特点:
- select 后面的查询列表是需要显示的列表,查询的结果集 是一个虚拟表
- select后面跟的查询列表,可以有多个部分组成,中间用逗号隔开。例如:select 字段1,字段2,表达式 from 表;
执行顺序
- 首先定位表是否存在(from子句) ,如果表存在则 显示出要查询的查询列表 (select子句)
查询列表可以是:字段、表达式、常量、函数等
如果查询的数据不是来自表中,则可以不要写from 表名
查询表中的指定列
清除重复值
查询指定列并且结果不出现重复数据 。distinct关键字只能出现在所有字段之前,并且把后面的出现的字段当做一个整体
语法:SELECT DISTINCT 字段名 FROM 表名;
查询结果拼接算
mysql中+的作用:
- 两个操作数都是数值型,正常运算 例如:100+1.5
- 其中一个操作数为字符型:将字符型数据强制转换成数值型,如果无法转换,则直接当做0处理例如:'张无忌'+100结果为100
- 如果操作数有一个为null:null参与的运算,计算结果都为null。
-
解决方法:使用函数ifnull(表达式1,表达式2)
- 表达式1:可能为null的字段或表达式
- 表达式2:如果表达式1为null,则最终结果显示的值
- 功能:如果表达式1为null,则显示表达式2,否则显示表达式1
指定列的别名进行查询,
好处: 显示的时候使用新的名字,并不修改表的结构。 我们使用as关键字给表起别名AS也可以使用空格代替,如果别名中间存在空格就必须使用双引号引起来
- 对列指定别名 语法:SELECT 字段名 1 AS 别名, 字段名 2 AS 别名... FROM 表名;
- 对列和表同时指定别名 语法:SELECT 字段名 1 AS 别名, 字段名 2 AS 别名... FROM 表名 AS 表别名;
条件查询
如果没有查询条件,则每次查询所有的行。实际应用中,一般要指定查询的条件。对记录进行过滤。
语法: select 查询列表 from 表名 where 筛选条件;
执行顺序
- from子句 :定位到具体的表
- where子句 :查询到符合where要求的数据
- select子句 :在符合where要求的的基础上,显示出select 后面的查询列表
按照关系表达式筛选
按逻辑表达式筛选
按模糊查询筛选
in 关键字
in 里面的每个数据都会作为一次条件,只要满足条件的就会显示
范围查询
判断是否为null
排序查询
通过 ORDER BY 子句,可以将查询出的结果进行排序(排序只是显示方式,不会影响数据库中数据的顺序)。
语法:
- select 查询列表 from 表名 【where 筛选条件】 order by 排序列表
特点:
- 排序列表可以是单个字段、多个字段、表达式、函数、列数、以及以上的组合
- 升序 ,通过 asc ,默认行为
- 降序 ,通过 desc,
- where 筛选条件 这个语句是可选项
执行顺序
- 先执行from子句
- 在执行where子句
- 之后执行select子句
- 最后执行order by 子句
单列排序
- 只按某一个字段进行排序,单列排序。
语法:SELECT 字段名 FROM 表名 WHERE 字段=值 ORDER BY 字段名 [ASC|DESC];
组合排序
- 同时对多个字段进行排序,如果第 1 个字段相等,则按第 2 个字段排序,依次类推。
组合排序的语法: SELECT 字段名 FROM 表名 WHERE 字段=值 ORDER BY 字段名 1 [ASC|DESC], 字段名 2 [ASC|DESC];