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