通常sql
在不同的表間進行連線運算,如內連線、外連線、交叉連線等,但是也可以在相同的表進行自連線
運算。
使用場景
問題描述:
分別查詢出指定表中可重排列、排列、組合的結果
資料**:product
name(商品名稱)
price(**)
蘋果50
橘子100
香蕉80
統計結果:可重排列
name_1
name_2
蘋果蘋果
蘋果橘子
蘋果香蕉
橘子蘋果
橘子橘子
橘子香蕉
香蕉蘋果
香蕉橘子
香蕉香蕉
分析
通過交叉連線
生成笛卡爾積,就可以得到以上結果。因為是可重排序,結果行數為 32=9。
select p1.name as name_1, p2.name as name_2
from product p1 cross
join product p2;
也可通過另一種常見的寫法,來實現這個結果。
select p1.name as name_1, p2.name as name_2
from product p1, product p2;
統計結果:排列
name_1
name_2
蘋果橘子
蘋果香蕉
橘子蘋果
橘子香蕉
香蕉蘋果
香蕉橘子
分析
排列
不同於可重排序
,排列
是不包含由相同元素構成的有序對。為了去掉這種由相同元素構成的對,需要加上乙個條件,然後再進行連線運算。由於排除了相同的對,因此它的行數為 p2
3 = 6。
select p1.name as name_1, p2.name as name_2
from product p1 cross
join product p2
where p1.name <> p2.name;
統計結果:組合
name_1
name_2
蘋果橘子
香蕉蘋果
香蕉橘子
分析
組合其實就是無序對,通過使用字元順序進行排列,只與字元順序比自己靠前
的商品進行配對。這種方式結合了非等值連線和
自連線`,結果行數為c2
3 = 3。
select p1.name as name_1, p2.name as name_2
from product p1 cross
join product p2
where p1.name > p2.name;
問題描述:
查詢出指定表中的重複資料
資料**:product
rowid(行id)
name(商品名稱)
price(**)1蘋果
502橘子1003橘子
1004
橘子1005香蕉
80統計結果
rowid
name3橘子
4橘子分析
重複的資料表示為商品名稱和**相同,但行id不同。通過使用非等值連線,便可以查詢出來。
select
*from product p1
where
exists
(select
*from product p2
where p1.name = p2.name
and p2.price = p2.price
and p1.id > p2.id)
;
問題描述:
將以下商品按照**從高到底排序,針對**相同的商品位次, `rank_1` 為 `跳過之後的位次`,`rank_2` 為 `不跳過之後的位次`。
資料**:product
name(商品名稱)
price(**)
蘋果50
橘子100
葡萄50
西瓜80
檸檬30
香蕉50
統計結果
name
price
rank_1
rank_2
橘子10011
西瓜8022
葡萄5033
香蕉5033
蘋果5033
檸檬3064
分析
為了獲取到**從高到低名次,就需要計算出**比自己高的記錄條數,並將其作為自己的位次。
首先是**最高的100,因為不存在比它高的**,所以記錄為0。加下來是**第二高的80,比它高的**只有100,所以記錄為1。同樣地,**為50的時候返回2,為30的時候返回3。
集合**
比自己高的**
比自己高的**的個數
s0100-0
s180
1001
s250
100,802s3
30100,80,50,50,50
5
select p1.name, p1.price,
count
(p2.price)+1
as rank_1,
-- 跳過之後的位次
count
(distinct p2.price)+1
as rank_2 -- 不跳過之後的位次
from product p1 left
outer
join product p2
on p1.price < p2.price
group
by p1.name
order
bycount
(p2.price)
;
以上的sql
中通過使用distinct
關鍵字,當存在相同位次的記錄時,就可以不跳過之後的位次。 《SQL高階教程》 1 2 自連線的用法
自連線技術充分體現了sql面向集合的特性 組合分為型別 一種是有順序的有序對,另一種是無順序的無序對。使用交叉連線生成笛卡爾積就是有序對 select p1.name as name 1,p2.name as name 2 from products p1,products p2 有序對可以通過加w...
SQL自連線查詢
問題 表testcolor title color sign a 紅 111 b 紅 222 a 綠 333 c 紅 444 轉檢視 title 紅 綠 a 111 333 b 222 null c 444 null 解答 declare sql nvarchar 1000 set sql sele...
SQL語言 自連線
自連線意思就是表與其自身進行連線。雖然自連線並不是必須的,可以通過其他方式來完成,但是在某些情況下,使用自連線就比較方便。比如一張員工資訊表,這張表上有該員工的基本資訊,還有指明了他的上司的id號。但是同時他的上司也是員工,在這張表上也有他的資訊。如果我們需要顯示出所有員工的姓名和他上司的姓名,雖然...