作者前言
????????????????????????????????
? ? ? ? ?????????個人主頁::小小頁面
?????????????????gitee頁面:秦大大
? ? ? ? ? ? ? ? 一個愛分享的小博主?歡迎小可愛們前來借鑒
______________________________________________________? ?
目錄
SQL提高
?日期函數(shù)
????????length
????????round
????????reverse
????????substring
????????ifnull
????????case when
????????cast
????????grouping sets
排序函數(shù)
?開窗函數(shù)
?
?____________________________________________________________________
??
內(nèi)置函數(shù)
日期函數(shù)
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)
注意一下,這里的保留小數(shù)不會自動補全,會四舍五入
reverse()?
字符串翻轉(zhuǎn)
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(當...)
這個函數(shù)一點特別,就拿python的if ...elif....else(或者C語言的if.....else if.....else)來說,我們只需寫好條件和代碼塊就行了,但是這個函數(shù)的寫法是這樣的
select
case when 條件
then '運行內(nèi)容1'
when 條件
then '運行內(nèi)容2'
else "運行內(nèi)容"
end as 別名
其實sql語句沒有格式,這樣寫是為了讓大家好看,when 相當于else if()??
cast
以前的數(shù)據(jù)庫的不同類型的數(shù)據(jù)不能相加和相減的,而現(xiàn)在的數(shù)據(jù)庫有些可以,mysql就是之一
?現(xiàn)在已經(jīng)不支持了,這里演示不了
-- 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) -- 部門及性別的維度
,() -- 不分組,全部人數(shù)
???????)
但是我們可以分析一下 利用這個方法相對于進行了三次分組然后再利用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;
結(jié)果:
?排序函數(shù)
在前面中我們學過一個order by
??????????????
?而這個排序函數(shù)起到的就是給個編號這樣可以方便我們查找
分三類
row_number() over()? as 別名? ?====》從小到大,依次往下
rank() over() as 別名? ?======》從小到大 相同數(shù)據(jù)位居一樣,但是不同數(shù)據(jù)名次依舊
dense_rank()? over() as 別名? =====》從小到大,相同數(shù)據(jù)位居一樣? 名次從1開始無斷層
-- row_number() 根據(jù)選擇字段排序,若存在相同數(shù)據(jù),則隨機排順序
-- 根據(jù)年齡從大到小排序
select
row_number() over(order by age desc) rk
from table
-- rank() 根據(jù)選擇字段排序,若存在相同數(shù)據(jù),則并列名次,但是名次個數(shù)任然占用
-- 根據(jù)年齡從小到大排序
select
rank() over(order by age) rk
from table
-- dense_rank() 根據(jù)選擇字段排序,若存在相同數(shù)據(jù),則并列名次,但是名次個數(shù)不占用
-- 根據(jù)年齡從小到大排序
select
dense_rank() over(order by age) rk
from table
? ? ? ? ? ? ? ? ? ? ? ? ? ??
? ?
?開窗函數(shù)
-- function([column]) OVER(partition by column [order by column])
-- function通常為聚合函數(shù),也可以是排序的函數(shù)
-- 根據(jù)性別和年齡分組,對身高進行排序
select
row_number() over(partition by gender, age order by high) rk
from table
-- 根據(jù)性別和年齡分組,求出人數(shù)
select
count(id) over(partition by gender, age) cnt
from table
where id is not null
記住一定要有函數(shù)function,可以是avg() sum()等
partition by 是我們可以理解為是group by 的前半身,只分組不聚合,因為group by有有聚合的效果,而開窗函數(shù)缺少聚合效果,簡單的說分組男女性別,就是會顯示出哪個人是男性及相關(guān)信息
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有重復的數(shù)據(jù),就拿第一條數(shù)據(jù)說 這條數(shù)據(jù)屬于這19個數(shù)據(jù),如果把count函數(shù)替換成avg(age)就可以明確哪個人超出平均值,哪些人沒有超出文章來源:http://www.zghlxwxcb.cn/news/detail-603300.html
總結(jié):
關(guān)于sql語句先介紹到這里,有不懂的小可愛可以私聊文章來源地址http://www.zghlxwxcb.cn/news/detail-603300.html
到了這里,關(guān)于MySQL數(shù)據(jù)庫第十一課---------SQl語句的拔高-------水平提升的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!