小记
今日主要学习了DQL(Data Query Language,数据查询语言)的相关知识。DQL是SQL语言的核心部分,主要用于从数据库中查询所需的数据。在软测中经常用到,为数据库部分的核心知识。
一、查询的基本语法
用法:select 查询内容 from 表名 [where 限定条件] [group by 分组条件] [having 分组后再次限定] [order by 排序条件 排序方式] [limit 偏移量,返回数量];
查询的基础语法为:select 字段1,字段2,字段3,...,字段n from 表名;
在进行查询时,需要注意以下:
1.表名必须存在
2.字段必须在表中存在,或者必须是一个常量或函数
3.可使用“*”来替代需返回的字段,它是一个通配符,表示返回所有字段
4.在进行查询操作时,必须弄清楚表结构
5.任何的查询操作不会改变源表中的任何数据
二、where限定条件
用法:select 查询内容 from 表名 where 限定条件;
表示:如果满足给定的限定条件,则返回相应的数据
符号 | 含义 |
---|---|
= | 等于 |
> | 大于 |
>= | 大于等于 |
< | 小于 |
<= | 小于等于 |
!= | 不等于 |
注意:在实际查询的过程中,不管where后面的判断条件有多复杂,它最终返回的是1或0,是1返回该数据,是0则过滤掉该条数据
三、特殊的比较运算符
-
在两个数值之间 between …… and ……
用法:select 查询内容 from 表名 where 字段 between 值1 and 值2 ;
需要注意的是:
在使用between and 的时候,值1要小于等于值2,否则这样会导致查询结果为空。 -
在给定的集合之中 in(set)
用法:select 查询内容 from 表名 where 字段 in(值1,值2,值3,...,值n);
需要注意的是:select * from 表名 where 10000 <= sal <=20000;
这个写法是错误的,无论10000<=sal 返回的结果是0或1,都是小于20000的。 -
模糊查询 like
用法:select 查询内容 from 表名 where 字段 like '%关键字%';
表示:如果字段中包含了给定的关键字,则返回该条数据在使用模糊查询的时候需注意:
(1)百分号%是一个通配符,匹配任意长度的内容
(2)下划线_也是一个通配符,匹配一个长度的内容
(3)'%关键字%'称为完全模糊查询,表示只要包含该关键字即可
(4)‘关键字%‘或者’’%关键字称为半模糊查询,分别表示查询以关键字开头和结尾的数据
(5)对于百分号%和下划线_,只有当他们跟在like后面时才是通配符,否则是一个普通字符
(6)在实际工作中,除非是产品需求规格说明书中明确要求我们觉得合理,否则输入框查询的功能默认是完全模糊查询 -
空值判断 is null
用法:select 查询内容 from 表名 where 字段 is null;
表示:如果字段的值为空(null),则返回该条数据null 和’ ‘的区别:
(1)null表示该字段没有值
(2)’ '为空字符串,表示该字段有值,值的长度为0
四、逻辑运算符
-
逻辑与 and &&
用法:select 查询内容 from 表名 where 表达式1 and 表达式2 and ... and 表达式n;
表示:如果给定的表达式1,表达式2,…都成立,则返回符合的数据,若有一个表达式不成立,则过滤该数据 -
逻辑或 or ||
用法:select 查询内容 from 表名 where 表达式1 or 表达式2 or ... or 表达式n;
表示:如果给定的表达式1,表达式2,…有一条成立,则返回符合的数据,若表达式都不成立,则过滤该数据
注意:在使用逻辑或的时候需要注意:如果一个where限定语句中同时存在逻辑与和逻辑或运算时,会先进行逻辑与的运算,再进行逻辑或的运算 -
逻辑非 not !
用法:select 查询内容 from 表名 where not 表达式;
表示:如果表达式不成立,则返回该条数据,如果表达式成立,则过滤该条数据
注意:如果要使用!进行逻辑非判断的话,需要将表达式使用括号括起来
五、去重 DISTINCT
使用 DISTINCT 关键字确实可以在查询结果中去掉重复的记录。DISTINCT 关键字是 SQL 中用于返回唯一不同值的命令。
用法:select DISTINCT column1, column2, ...FROM table_name;
注意事项:
(1)DISTINCT 关键字作用于所有列,而不是单独的某一列。
(2)如果你对多个列使用 DISTINCT,那么数据库会基于这些列的组合值来判断重复性。
(3)使用 DISTINCT 时,不能使用 * 来选择所有列,必须明确指定列名。
六、设置别名 as
使用as关键字可以给查询返回的字段以及查询的表设置一个临时的别名
用法:select 字段1 as 别名,字段2 as 别名 from emp;
在设置别名的时候需注意:
(1)as可以缺失,但建议写上
(2)给表和字段起的别名只在本次查询中生效
(3)给字段起的别名不能直接跟在where后做判断使用
(4)如果给表设置了别名,那么本次查询中,只能使用别名
七、排序 order by
可以将select查询到的结果按照指定字段进行排序
用法:select 查询内容 from 表名 where 限定条件order by 排序1,排序2,...,排序方式
两种排序方式:升序 asc(排序方式默认为升序) 降序 desc
在使用order by 进行排序的是时候需要注意:
(1)排序方式默认为升序,可以缺失,但是建议写上
(2)当同时存在多个排序条件时,按照从左到右的顺序,会优先按照第一个条件进行排序,在满足第一个判断条件的基础上,再按照第二个排序条件进行排序,依次类推
(3)给字段起的别名可以直接跟在order by后面进行使用
(4)养成好习惯,将排序条件放置在select后,结果体现出该字段,提高可读性
(5)在实际工作中,如果要对中文的内容按照汉语拼音内容进行排序,需确保字段的字符集是gbk,如果不是,需要使用类型转换函数将其转换成gbk
语法:convert(字段 using gbk)
(6)在实际工作方式中,除非是产品需求规格说明中明确要求并且我们觉得合理,否则所有的信息展示功能,数据的默认排序方式必须是按照创建时间倒序
例子:查询会员信息,并按照会员名字汉语拼音进行升序展示 (面试点,印象深刻的bug)
select * from user_name order by uname asc;
通常用汉语进行排序时,若数据库以utf8字符集时,排序会混乱,所以得转给gbk
select * from user_name order by convert(uname using gbk) asc;
九、分组 GROUP BY
使用 GROUP BY 子句可以对查询结果按照指定的一个或多个字段进行分组统计,它是 SQL 中进行数据分组和聚合操作的强大工具。目前还未学到聚合函数,相关知识后续再补充。
用法:select 查询内容 from 表名 where 限定条件 group by 分组条件1,分组条件2,...,order by 字段;
在分组的时候注意;
(1)如果只是单纯的分组,其实就是一个去重的作用(和distinct的作用一样)
(2)如果存在分组的话,select后面只能跟分组的条件字段以及聚合函数使用
(3)给字段设置的别名可以直接跟在group by 后面使用
(4)一般情况下,group by都是配合聚合函数来一起使用的
(5)一般情况下,只要题目(需求)中要求返回"各什么什么"的时候,只要这个“什么什么”不是这个表中的最小粒度,那么就会按照这个“什么什么”近些年进行分组
例子:查询会员信息,并按照会员性别进行分组
select gender from litemall_user group by gender;
mysql另一个版本运行:select *from emp group by deptno;
这个用法即使能够运行,也没有实际意义,只是返回了个分组下的第一条数据,如果sql_mode里有only_full_group_by限制的话,该sql是无法运行的,可以在my.ini查看only_full_group_by
总结
以上就是今天所作的笔记,本文仅仅简单DQL基础简单的用法,后续将继续学习相关知识。