高级数据查询
Mysql 數(shù)據(jù)庫的高級查詢
一般查詢功能的擴展
(一)使用limit限制結(jié)果集
m,n其中m是指記錄開始的index,從0開始,表示第一條記錄
n是指從第m+1條開始,取n條。
即取出第3條至第6條,4條記錄
(二)使用case函數(shù)
1.目的:達(dá)到分情況顯示不同類型的數(shù)據(jù)的目的。case函數(shù)是一種多分支的表達(dá)式,計算條件列表并返回多個可能的結(jié)果表達(dá)式中的一個。
2.讀取方式:
計算表達(dá)式從上到下的順序?qū)γ恳粋€when子句的簡單表達(dá)式進行計算。當(dāng)一個條件被滿足后,其他條件自動被忽略。選擇方式與c語言中的if語句類似
3.類型
(1)簡單case函數(shù):when后面是簡單表達(dá)式
select fname, (case fnamewhen 'tom' then '好孩子'when 'jack' then '壞孩子'else '普通孩子'end) as isgoodchildfrom T_person(2)搜索case函數(shù):when后面是布爾表達(dá)式
select 商品ID ,case when 單價>=18.6000 then '高檔' when 單價<18.6000 then '低檔' ELSE '無' end '檔次' from `售貨單明細(xì)`(三)將數(shù)據(jù)結(jié)果保存到新表中
1.當(dāng)使用select語句查詢語句時,產(chǎn)生的結(jié)果是保存在內(nèi)存中的。如果需要保存在一個表中,直接在select語句中使用into語句。
2.新表的類型
永久表:物理創(chuàng)建的表,儲存在磁盤上
graph LR 查詢結(jié)果-->永久表臨時表:生存期是有限的,根據(jù)其范圍可分為局部臨時表(#temp表)和全局臨時表(##temp表)。臨時表的生存期與創(chuàng)建臨時表的用戶的連接生存期有關(guān)。比如局部臨時表的生存期與創(chuàng)建此局部臨時表的用戶的連接生存期相同,它只能是在當(dāng)前連接中使用。
graph LR 查詢結(jié)果-->臨時表查詢結(jié)果的并、交、差運算
(一)注意點
1.select的列的個數(shù)必須是相同的,而且對應(yīng)列的語義是相同的。
2.各查詢語句中每個列的數(shù)據(jù)類型必須與其他查詢中對應(yīng)的數(shù)據(jù)類型是隱形兼容的(類似c語言中數(shù)據(jù)類型的隱式轉(zhuǎn)換一樣)
3.合并后的結(jié)果采用第一個select語句的列標(biāo)題
4.如果使用order by 排序應(yīng)該寫在最后一個查詢語句之后。排序的依據(jù)列是第一個查詢語句出現(xiàn)的列名。
(二)關(guān)鍵字及意義
關(guān)鍵字后面加all表示在結(jié)果集中包含所有查詢語句產(chǎn)生的全部記錄,包含重復(fù)的記錄。如果沒有指定all,則系統(tǒng)默認(rèn)是刪除合并后結(jié)果集中重復(fù)記錄。
并:union
將兩個或多個查詢語句的結(jié)果集合并成一個結(jié)果集
交:intersect
返回兩個結(jié)果集中各個列的值均相同的記錄,并將這些記錄構(gòu)成交運算的結(jié)果。
差:except
返回第一個集合中有但是第二個集合中沒有的數(shù)據(jù)。
select address from table_customer union/intersect/except select address from table_saleperson相關(guān)子查詢
1.基于集合的測試(in/not in)
先執(zhí)行子查詢,在子查詢的結(jié)果基礎(chǔ)上再進行外層查詢
2.進行比較測試(= > < <= >=)
通過比較符將一個表達(dá)式與子查詢返回的單值進行比較。返回為邏輯真值和邏輯假值
3.存在性查詢(exist/not exist)
先執(zhí)行外層的操作,再執(zhí)行內(nèi)層的操作。由外層查詢的值決定內(nèi)層查詢的結(jié)果,內(nèi)層查詢的次數(shù)由外層查詢的結(jié)果數(shù)決定。只產(chǎn)生邏輯真值和邏輯假值
其他一些查詢功能
(一)開窗函數(shù)(用于分區(qū)或者分組計算的函數(shù))
結(jié)合over子句對組內(nèi)的數(shù)據(jù)進行編號,并進行求和,計算平均值等統(tǒng)計。sum,avg,row_number等都可以稱為開窗函數(shù)。開窗函數(shù)必須放在Over之前
1.與聚合函數(shù)結(jié)合使用
select cno,sum(credit) over (pratition by semester) as total2.與排名函數(shù)結(jié)合使用
(1)四個排名函數(shù)的用法
rank():并不一定返回連續(xù)整數(shù)。比如兩個人的成績相同,那么返回的名次時并列的
dense_rank():返回的是一個連續(xù)的整數(shù)值。比如兩個人的成績相同,那么返回的名次一個高一個低。
ntile():將有序分區(qū)中的行劃分到指定數(shù)目的組中,每個組有一個編號,編號從1開始。對于每一行,Ntile()函數(shù)將返回此行所屬的組的編號。
row_number():返回結(jié)果集中每個分區(qū)內(nèi)行的序列號,每個分區(qū)的第一行從一開始。
(二)公用表達(dá)式(CTE)
1.將查詢語句產(chǎn)生的結(jié)果集指定一個臨時命名的名字,這些命名的結(jié)果集就稱為公用表達(dá)式,它可以被多次引用。可以包括對自身的引用,叫做遞歸公用表達(dá)式。
2.例子
with buyCount(CardId,Count) as (select * from table_saleBillgroup by cardId)select cardId ,counts from buyCountorder by counts轉(zhuǎn)載于:https://www.cnblogs.com/mengxiaoliaolianziguliang/p/8612897.html
總結(jié)
- 上一篇: Zygote和System进程的启动过程
- 下一篇: 冒泡、选择、插入排序算法