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语句先介绍到这里,有不懂的小可爱可以私聊

相关推荐
叁沐14 分钟前
MySQL 06 全局锁和表锁:给表加个字段怎么有这么多阻碍?
mysql
小马哥编程35 分钟前
【iSAQB软件架构】架构决策记录-ADR
数据库·架构·系统架构·设计规范
萧鼎1 小时前
深度探索 Py2neo:用 Python 玩转图数据库 Neo4j
数据库·python·neo4j
m0_653031361 小时前
腾讯云认证考试报名 - TDSQL数据库交付运维专家(TCCE MySQL版)
运维·数据库·腾讯云
power 雀儿2 小时前
集群聊天服务器---MySQL数据库的建立
服务器·数据库·mysql
骑着王八撵玉兔3 小时前
【性能优化与架构调优(二)】高性能数据库设计与优化
数据库·性能优化·架构
Edingbrugh.南空4 小时前
Flink MySQL CDC 环境配置与验证
mysql·adb·flink
BD_Marathon4 小时前
Ubuntu:Mysql服务器
服务器·mysql·ubuntu
想要入门的程序猿4 小时前
Qt写入excel
数据库·qt·excel
Q_970956395 小时前
java+vue+SpringBoo校园失物招领网站(程序+数据库+报告+部署教程+答辩指导)
java·数据库·vue.js