MySQL数据库第十一课---------SQl语句的拔高-------水平提升

作者前言

个人主页::小小页面

gitee页面:秦大大

一个爱分享的小博主 欢迎小可爱们前来借鉴


目录

SQL提高

日期函数

length

round

reverse

substring

ifnull

case when

cast

grouping sets

排序函数

开窗函数


内置函数

日期函数

now()

select now();

获取当前时间(获取到秒)

year()

select year(now());

获取当前的年,注意一下year()里的()要填now()

month()

select month(now());

获取当前月份

day()

select day(now());

获取当前的日期

length

select first_name, length(first_name) from new_employees limit 0,10;

查看字符长度

round

select round(1.22, 3)

注意一下,这里的保留小数不会自动补全,会四舍五入

reverse()

字符串翻转

select first_name, reverse(first_name) from new_employees limit 0,10;

substring()

截取字符串

-- 截取字符串
-- start开始的位置,如果没有则默认从第一位开始,length截取的长度
SUBSTRING(column, start, length)

column:字段

start:从哪一位开始

length:截取的长度

select first_name, substring(first_name,1,5) from new_employees limit 0,10;

ifnull()

判空

会把null(空)变成别名

select ifnull(`daa`, '111') from aaa;;

isnull

nvl

coalesce

这三个都是一样的效果

case when(当...)

这个函数一点特别,就拿python的if ...elif....else(或者C语言的if.....else if.....else)来说,我们只需写好条件和代码块就行了,但是这个函数的写法是这样的

select 
case when 条件
    then '运行内容1'
when 条件
    then '运行内容2'
else "运行内容"

end  as  别名

其实sql语句没有格式,这样写是为了让大家好看,when 相当于else if()

cast

以前的数据库的不同类型的数据不能相加和相减的,而现在的数据库有些可以,mysql就是之一

现在已经不支持了,这里演示不了

-- cast(column as data_type)
-- 更改字段类型
select cast(column as int(10)) from table
select cast(column as char(10)) from table

grouping sets

前面我们学过一个分组,group by,这个方法把所有的符合条件的分成一组,只显示出集体,不显示出个人,简单理解为分组加聚合

如图,而grouping sets

这个在mysql中也无法使用,但是我们可以做出这样的效果

select
depart
,gender
,count(id) cnt
from table
grouping sets(
(depart) -- 部门维度
,(gender) -- 性别维度
,(depart, gender) -- 部门及性别的维度
,() -- 不分组,全部人数
​​​​​​​)

但是我们可以分析一下 利用这个方法相对于进行了三次分组然后再利用union distinct连接起来

第一次是分组depart

第二次是分组gender

第三次分组depart, gender

代码:

select
coalesce(gender, '人和1')
, null `age`
, count(0)
from new_employees
group by `gender`
with rollup
union distinct
select
null `gender`
, coalesce(age, '人和2')
, count(0)
from new_employees
group by `age`
with rollup
union distinct
select
`gender`
, `age`
, count(0)
from new_employees
group by`gender`, `age`
with rollup;

结果:

排序函数

在前面中我们学过一个order by

​​​​​​​​​​​​​​

而这个排序函数起到的就是给个编号这样可以方便我们查找

分三类

row_number() over() as 别名 ====》从小到大,依次往下

rank() over() as 别名 ======》从小到大 相同数据位居一样,但是不同数据名次依旧

dense_rank() over() as 别名 =====》从小到大,相同数据位居一样 名次从1开始无断层

-- row_number() 根据选择字段排序,若存在相同数据,则随机排顺序
-- 根据年龄从大到小排序
select
row_number() over(order by age desc) rk
from table
-- rank() 根据选择字段排序,若存在相同数据,则并列名次,但是名次个数任然占用
-- 根据年龄从小到大排序
select
rank() over(order by age) rk
from table
-- dense_rank() 根据选择字段排序,若存在相同数据,则并列名次,但是名次个数不占用
-- 根据年龄从小到大排序
select
dense_rank() over(order by age) rk
from table

开窗函数

-- function([column]) OVER(partition by column [order by column])
-- function通常为聚合函数,也可以是排序的函数
-- 根据性别和年龄分组,对身高进行排序
select
row_number() over(partition by gender, age order by high) rk
from table
-- 根据性别和年龄分组,求出人数
select
count(id) over(partition by gender, age) cnt
from table
where id is not null

记住一定要有函数function,可以是avg() sum()等

partition by 是我们可以理解为是group by 的前半身,只分组不聚合,因为group by有有聚合的效果,而开窗函数缺少聚合效果,简单的说分组男女性别,就是会显示出哪个人是男性及相关信息

row_number() over () as 别名

select
emp_no
,age
,dept_no
,gender
,row_number() over(partition by dept_no,gender order by age desc) as kkk
from (
select
a.emp_no
,a.age
,a.gender
,b.dept_no
from new_employees as a join dept_emp as b on a.emp_no =b.emp_no
) as c
limit 30;

count(0)over()as 别名

select
emp_no
,age
,dept_no
,gender
,count(1) over(partition by dept_no,gender) as kkk
from (
select
a.emp_no
,a.age
,a.gender
,b.dept_no
from new_employees as a join dept_emp as b on a.emp_no =b.emp_no limit 30
) as c;

可以看出kkk有重复的数据,就拿第一条数据说 这条数据属于这19个数据,如果把count函数替换成avg(age)就可以明确哪个人超出平均值,哪些人没有超出

总结:

关于sql语句先介绍到这里,有不懂的小可爱可以私聊

相关推荐
JH307314 分钟前
Oracle与MySQL中CONCAT()函数的使用差异
数据库·mysql·oracle
蓝染-惣右介16 分钟前
【MyBatisPlus·最新教程】包含多个改造案例,常用注解、条件构造器、代码生成、静态工具、类型处理器、分页插件、自动填充字段
java·数据库·tomcat·mybatis
冷心笑看丽美人17 分钟前
Spring框架特性及包下载(Java EE 学习笔记04)
数据库
武子康1 小时前
Java-07 深入浅出 MyBatis - 一对多模型 SqlMapConfig 与 Mapper 详细讲解测试
java·开发语言·数据库·sql·mybatis·springboot
代码吐槽菌2 小时前
基于SSM的毕业论文管理系统【附源码】
java·开发语言·数据库·后端·ssm
路有瑶台2 小时前
MySQL数据库学习(持续更新ing)
数据库·学习·mysql
数字扫地僧2 小时前
WebLogic 版本升级的注意事项与流程
数据库
lwprain2 小时前
常用docker应用部署,wordpress、mysql、tomcat、nginx、redis
mysql·docker·tomcat
Viktor_Ye2 小时前
高效集成易快报与金蝶应付单的方案
java·前端·数据库
努力算法的小明3 小时前
SQL 复杂查询
数据库·sql