【数据库】CRUD--查

第三章 修改

查询去重

条件查询

查询时候排序

分页查询


文章目录


前言

续上一期增删改 , 本期将讲解数据库操作之查~~

一、全列查询

创建表后,如何查看表内结构以及数据呢?

select * from 表名;

这里面 * 称为通配符,代指一系类其他内容。

示例:


而在公司的生产环境中,select* 是个危险操作。

环境分为

  1. 线下环境
    办公环境:入职会发一个电脑,用电脑进行办公
    开发环境:配一个服务器,用电脑连接服务器
    测试环境:测试验证程序效果环境
  2. 线上环境
    生产环境:可以被用户访问到

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则取反

注意:

  1. 条件查询会隐式将null转变为false
    null = null 结果为null
    null<=>null 这个符号对null做了处理,结果为true
  2. 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进行模糊匹配,通常是一个低效操作

如果需求中需要进行模糊匹配

  1. 应用程序中 (JAVA代码中) 进行实现
  2. 搭配一些中间插件,比如ES这种,更适合完成上述要求
  3. 对于模糊匹配,有一套成熟的解决方案,正则表达式

九、结果查询排序

数据库对执行结果得到的顺序是不做保证的,因此不能依赖默认顺序.

那怎么在查询的时候保证查询顺序呢?

select 列名 from 表名 order by 列名 排序关键字;

关键字:不写默认升序

desc 降序,asc是升序

示例 :

注意 :

如果其他的列没有被写出排序规则来 , 其他列会按照被写出列的排序关键字来进行排序.


多个列排序:

select 列名 from 表名 order by 列名 desc ,列名 ,列名 desc;

示例 :

注意 :

  1. 空在排序中视为最小值
  2. 如果对应列后面没有排序关键字 , 就是默认的升序.

表达式排序 :

order by指定的列名也可以是表达式,甚至可以是别名

select 列名 as 别名 from 表名 order by 别名;

注意 :where不可以这样用别名

示例:


注意:

  1. 存在多行相等的情况下,那么它们之间的顺序也是没有任何规律的
  2. 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语句 , 聚合函数等内容.

晚安,下期见~~

相关推荐
gwf2161 小时前
磨损均衡算法(Wear Leveling)——SSD如何让每块闪存“公平退休“?
运维·数据库·人工智能·python·嵌入式硬件·算法·智能硬件
码智社1 小时前
Java实现RSA密钥生成、加密解密、加签验签
java
AAA@峥1 小时前
CentOS7 源码编译安装 MySQL5.7|SQL 基础操作 + 备份恢复完整实战
运维·数据库·sql·centos
xixingzhe21 小时前
spring ai简单使用skills
数据库·人工智能·spring
wear工程师1 小时前
ThreadLocal 在线程池里为什么会串数据:别只会答内存泄漏
java·后端
Iruoyaoxh1 小时前
栈和队列~
java·开发语言
审小匠OpenCPAi1 小时前
银行流水核查怎么自动化?单边匹配、双向勾稽与图聚类异常检测的工程对比
java·前端·人工智能·python·审计
码上上班2 小时前
docker课程
java·docker·容器
腻害兔2 小时前
【若依项目-产品经理视角】RuoYi-Vue-Pro 源码拆解:CRM 客户关系模块深度解析——从线索到回款,一套完整的 B2B 销售闭环是怎么搭的?
java·前端·javascript·vue.js·产品经理·ai编程
Fu2067212 小时前
数据库第三次作业
数据库