SQL高階(二)自連線

2021-10-09 14:36:54 字數 3451 閱讀 8066

通常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號。但是同時他的上司也是員工,在這張表上也有他的資訊。如果我們需要顯示出所有員工的姓名和他上司的姓名,雖然...