第三章 修改
查询去重
条件查询
查询时候排序
分页查询
文章目录
- [第三章 修改](#第三章 修改)
- 前言
- 一、全列查询
- 二、指定列查询
- 三、表达式查询
- 四、查询指定别名
- 五、查询表起别名
- 六、结果去重查询
- 七、Where条件查询
- 八、模糊查询
- 九、结果查询排序
- 十、分页查询
- 十一、聚合查询
- [1. count函数](#1. count函数)
- 2.sum函数
- [3. avg函数](#3. avg函数)
- 4.max、min函数
- [5.group by分组](#5.group by分组)
-
- [1. 聚合查询分组](#1. 聚合查询分组)
- [2. 分组筛选](#2. 分组筛选)
- 十二、内置函数
- 十三、字符串处理函数
- 十四、数学函数
- 十五、其他常用函数
- 总结
前言
续上一期增删改 , 本期将讲解数据库操作之查~~
一、全列查询
创建表后,如何查看表内结构以及数据呢?
select * from 表名;
这里面 * 称为通配符,代指一系类其他内容。
示例:

而在公司的生产环境中,select* 是个危险操作。
环境分为
- 线下环境
办公环境:入职会发一个电脑,用电脑进行办公
开发环境:配一个服务器,用电脑连接服务器
测试环境:测试验证程序效果环境- 线上环境
生产环境:可以被用户访问到
select* 针对自己的数据库无所谓。
可公司中,在生产环境上执行这句话,如果表非常大,这个请求就会把服务器的带宽吃满,导致其他客户端无法响应。
因此,我们可以指定列查询,来降低查询风险。
二、指定列查询
指定列查询可以降低硬盘和网卡的io开销,那如何实现这一操作?
select 列名,列名 from 表名;
指定列查询可以是多个列。
示例:

三、表达式查询
针对一份成绩表,怎么将语文及数学成绩的和统计后查询出来?
select 表达式 from 表名;
该操作得到的结果是一个临时表。
select操作没有修改数据库服务器上的原始数据,当客户端收到这个数据之后临时表就无了。
示例:

四、查询指定别名
由上面示例图可知,表达式查询结果的那一列,是由表达式命名的,能否起个别名呢?
select 表达式 as 别名 from 表名;
as可以省略,但容易看错,因此不推荐省略
示例:

五、查询表起别名
既然查询的列能起别名,那么表能吗?
select 表达式 from 表名 as 别名;
这个在将来多表查询的时候会用到。
六、结果去重查询
两条相同数据,能否在查询的时候只显示其中一条呢?
select distinct 列名 from 表名;
去重的依据是两行数据完全相同。
示例:

七、Where条件查询
能否通过指定条件来查询到结果呢?
select 列名 from 表名 where 条件;
条件中,我们会使用到运算符。
| 运算符 | 说明 |
|---|---|
| >, >=, <, <= | ⼤于,⼤于等于,⼩于,⼩于等于 |
| = | 等于,对于NULL的⽐较不安全,⽐如NULL = NULL结果还是NULL |
| <=> | 等于,对于NULL的⽐较j是安全的,⽐如NULL <=> NULL结果是TRUE(1) |
| !=, <> | 不等于 |
| value between a0 and a1 | 范围匹配,a0, a1,如果a0 <= value <= a1,返回TRUE或1,NOT BETWEEN则取反 |
| value in (option, ...) | 如果value 在optoin列表中,则返回TRUE(1),NOT IN则取反 |
| is null | 是NULL |
| is not null | 不是NULL |
| like | 模糊匹配,% 表⽰任意多个(包括0个)字符;_ 表⽰任意⼀个字符,NOT LIKE则取反 |
注意:
- 条件查询会隐式将null转变为false
null = null 结果为null
null<=>null 这个符号对null做了处理,结果为true - between and 区间是闭区间,其他时候大部分是前闭后开,这里特殊记一下
条件中写的列和select查询的列可以没有关系。
示例 :

提问 :
select name,chinese+math as total from exam where total<100;
这句命令会报错吗?
会。
执行顺序是 (1)遍历这一行数据 (2)把这一行数据代入条件当中 (3)条件城里加入结果集,不成立直接跳过 (4)所有遍历之后,有了结果集,还需要跟据select指定的列/表达式/别名/去重操作进行进一步处理
and 示例:

or示例:

and的优先级大于or;但也可以用括号来干扰优先级。
优先级不要背,应手动加()来干预优先级
示例:

between and 示例:

用>=与<=效果是一样的~
示例:

where in示例:

用where or是一样的~
示例:

查询为空的数据
select * from 表名 where 列明 <=> null ;
或者
select * from 表名 where 列名 is null ;
不要写 列名 = null ,null相当于false.

<=>叫潜水艇运算符,可以进行两个列之间的比较,is不行.
示例:

null与其他运算值运算结果为null

八、模糊查询
根据一个字,查询出所有与这个字相关的语句,怎么做?
select 列名 from 表名 where 列名 like '关键字+通配符语句'
like 需要搭配通配符 : % 或 _ ( 注意是下划线!!! ) ,相当于赖子.
| 通配符 | 功能 |
|---|---|
| % | 0个或任意个任意字符 |
| _ | 1个任意字符 |
示例 :
关键字+%

% + 关键字

% + 关键字 +%

关键字 + _

关键字 + 多个_

SQL用like进行模糊匹配,通常是一个低效操作
如果需求中需要进行模糊匹配
- 应用程序中 (JAVA代码中) 进行实现
- 搭配一些中间插件,比如ES这种,更适合完成上述要求
- 对于模糊匹配,有一套成熟的解决方案,正则表达式
九、结果查询排序
数据库对执行结果得到的顺序是不做保证的,因此不能依赖默认顺序.
那怎么在查询的时候保证查询顺序呢?
select 列名 from 表名 order by 列名 排序关键字;
关键字:不写默认升序
desc 降序,asc是升序
示例 :

注意 :
如果其他的列没有被写出排序规则来 , 其他列会按照被写出列的排序关键字来进行排序.
多个列排序:
select 列名 from 表名 order by 列名 desc ,列名 ,列名 desc;
示例 :

注意 :
- 空在排序中视为最小值
- 如果对应列后面没有排序关键字 , 就是默认的升序.
表达式排序 :
order by指定的列名也可以是表达式,甚至可以是别名
select 列名 as 别名 from 表名 order by 别名;
注意 :where不可以这样用别名
示例:

注意:
- 存在多行相等的情况下,那么它们之间的顺序也是没有任何规律的
- order by 的排序是根据临时表展开,和数据库的原始数据无关
十、分页查询
前面提到过 , Select * 是危险操作,而指定列查询在数据较多的情况下其实也是有隐患的
分页查询是解决问题的核心手段
select * from 表名 limit 数字;
即从0下表返回num条数据.

select * from 表名 limit num1 , num2;
即以num1为开始下标 , 返回num2条数据.

select * from 表名 limit num2 offset num1;
即以num1为开始下标 , 向下返回num2条数据.
和上一个是等价写法 , 这一种比上一个号 , 可读性高.

十一、聚合查询
前面都是简单查询,这里要针对查询结果进行一些统计,行级别的,表达式查询是列和列,这里需要依赖一些聚合函数
聚合函数,属于SQL自带的函数,也就是库函数
| 函数 | 说明 |
|---|---|
| count | 返回查询到的数据的数量 |
| sum | 返回查询到的数据的总和,不是数字没有意义 |
| avg | 返回查询到的数据的平均值,不是数字没有意义 |
| max | 返回查询到的数据的最小值,不是数字没有意义 |
1. count函数
全部数据条数:
Select count(* ) from exam;
先执行select * from exam,然后针对上述的查询结果,应用整合函数,注意count和括号之间不能有空格,括号里可以有空格

指定列数据条数:
Select count (列名) from exam;
当指定列的时候 , 为空值的地方不会被计算,当然 , 上面弄全部的时候不会讲究这些.
注意 : Count里面不能写多个列

count(数字/常量)和count(*)是一个意思

2.sum函数
统计这一列的个数 , 会直接排除null
select sum( 列名 ) from 表名;
如果括号里面的对应列的数据不是数字 ,
在客户端可能会显示0 , 在命令行的话,会有警告warning ,
但如果是类似于 " 100张三 " 这样的 , 最终会提取100.
示例 :

3. avg函数
算平均值的 , 同样会把null剔除
Select AVG(列名) From exam;
示例 :

4.max、min函数
求最大最小值
Select max(列名),min(列名) from 表名;
示例 :

以上操作很少会对数据整体进行,最常用的是分组查询,把整个查询结果,分成若干组,针对每个组,分别应用上述的聚合函数~~.
5.group by分组
1. 聚合查询分组
把这一列相同的行组分到一个组中 , 并计算总个数
select 列名,count(*) from 表名 group by 列名;
这样不同的列名和对应的个数都能显示出来
示例 :

提问 :
select 列名a,列名b , 列名c from 表名 group by 列名b ; 可以吗?
答 :
会报错 , 因为每一类只能显示一行,不知道显示哪一行,这些非group by的列,不能直接作为被查询的列
但可以通过聚合函数,来进行一些分组统计,比如select 列名,avg(列名),max(列名)

2. 分组筛选
select avg(列名) from 表名 group by 列名 having avg(列名)<数;

where可以使用,where的条件是在聚合之前使用的条件,having的条件是聚合之后使用的条件
select avg(列名) from 表名 where 列名!="什么" group by 列名 having avg(列名)<数;
示例 :

十二、内置函数
内置函数不要记,有印象就可以,使用的时候就查
| 日期函数 | 函数说明 |
|---|---|
| CURDATE() | 返回当前日期,同义词 CURRENT_DATE |
| CURTIME() | 返回当前时间,同义词 CURRENT_TIME, CURRENT_TIME(fsp) |
| DATE(data) | 提取date或datetime表达式的日期部分 |
| ADDDATE(date,INTERVAL exprunit) | 向日期值添加时间值(间隔),同义词DATE_ADD() |
| SUBDATE(date,INTRVAL exprunit) | 向日期值减去时间值(间隔),同义词 DATE_SUB() |
| DATEDIFF(expr1,expr2) | 两个日期的差,以天为单位,expr1-expr2 |
十三、字符串处理函数
| 函数 | 说明 |
|---|---|
| char_length(str) | 返回给定字符串的长度,同义词CHARACTER_LENGTH() |
| length(str) | 返回给定字符串的字节数,与当前使用的字符编码集有关 |
| conect(str1,str2,...) | 返回拼接后的字符串 |
| conect_ws (separator,str1,str2,...) | 返回拼接后带分隔符的字符串 |
| lcase (str) | 将给定字符串转换成小写,同义词LOWER() |
| ucase(str) | 将给定字符串转换成大写,同义词UPPER() |
| hex(str),hex(N) | 对于字符串参数str,HEX()返回str的十六进制字符串表示形式,对于数字参数N,HEX()返回一个十六进制字符串表示形式 |
| INSTR(str,substr) | 返回substring第一次出现的索引 |
| INSERT(str,pos,len,newstr) | 在指定位置插入子字符串,最多不超过指定的字符数 |
| SUBSTR(str,pos)SUBSTR(str FROM pOS FOR | 返回指定的子字符串,同义词SUBSTRING(str,pos)len)SUBSTRING(str FROM pos FOR len) |
| REPLACE(str,from_str,to_str) | 把字符串str中所有的from_str替换为to_str,区分大小写 |
| STRCMP(expr1,expr2) | 逐个字符比较两个字符串,返回-1,0,1 |
| LEFT(str ,len),RIGHT(str,len) | 返回字符串str中最左/最右边的len个字符 |
| LTRIM(str),TRIM(str)RTRIM(str) | 删除给定字符串的前导、末尾、前导和末尾的空格 |
| TRIM({LEADING TRAILINGBOTH }\[remstr FROM] | 删除给定符串的前导、末尾或前导和末尾的指定字符串str) |
十四、数学函数
| 函数 | 说明 |
|---|---|
| ABS(X) | 返回X的绝对值 |
| CEIL(X) | 返回不小于X的最小整数值,同义词是CEILING(X) |
| FLOOR(X) | 返回不大于X的最大整数值 |
| CONV(N,from_base,to_base) | 不同进制之间的转换 |
| FORMAT(X,D) | 将数字X格式化为"#,并林#,井样#"的格式。##",四舍五入到小数点后D位,并以字符串形式返回 |
| RAND(N) | 返回一个随机浮点值,取值范围[0.0,1.0) |
| ROUND(X),ROUND(X,D) | 将参数X舍入到小数点后D位 |
| CRC32(expr) | 计算指定字符串的循环冗余校验值并返回一个32位无符号整数 |
十五、其他常用函数
| 函数 | 说明 |
|---|---|
| version() | 显示当前数据库版本 |
| database() | 显示当前正在使用的数据库 |
| user() | 显示当前用户 |
| md5(str) | 对一个字符串进行md5摘要,摘要后得到一个32位字符串 |
| ifnull(vall, val2) | 如果val1为NULL,返回val2,否则返回val1 |
总结
本期讲了数据库的查操作 , 以及分组查询 , where语句 , 聚合函数等内容.
晚安,下期见~~