《SQL高階教程》 1 2 自連線的用法

2022-05-17 09:39:13 字數 1691 閱讀 2168

自連線技術充分體現了sql面向集合的特性

​ 組合分為型別:一種是有順序的有序對,另一種是無順序的無序對

使用交叉連線生成笛卡爾積就是有序對

select p1.name as name_1, p2.name as name_2

from products p1, products p2;

有序對可以通過加where過濾來去重:

select p1.name as name_1, p2.name as name_2

from products p1, products p2;

where p1.name <> p2.name;

無序對也稱作組合:

select p1.name as name_1, p2.name as name_2

from products p1, products p2;

where p1.name > p2.name;

​ 如果從物理表的層面來理解sql語句,抽象度是非常低的。「表」「檢視」這樣的名稱只反映了不同的儲存方法,而儲存方法並不會影響到sql語句的執行和結果。無論表還是檢視,本質上都是集合——集合是sql能處理的唯一的資料結構。

--使用非等值自連線

select distinct a1.name, a1.address

from addersses a1, addersses a2

where a1.family_id = a2.family_id

and a1.address <> a2.address;

​ 排序一般分為兩種方式,一種是跳過相同值,另一種則不跳過。

現在大多數dbms都提供了olap函式來進行排序。如使用rank函式:

select name, price,

-- 實現跳過的排序

rank() over (order by price desc) as rank_1,

-- 實現不跳過的排序

dense_rank() over (order by price desc) as rank_2

from products;

也可以使用非等值自連線實現:

select p1.name,

p1.price,

-- 實現跳過的排序

(select count(p2.price)

from products p2

where p2.price > p1.price) + 1 as rank_1,

-- 實現不跳過的排序

(select count(distinct p2.price)

from products p2

where p2.price > p1.price) + 1 as rank_2

from products p1

order by rank_1;

應把錶看作行的集合,用面向集合的方法來思考。

自連線和group by結合使用可以生成遞迴集合

SQL高階(二)自連線

通常sql在不同的表間進行連線運算,如內連線 外連線 交叉連線等,但是也可以在相同的表進行自連線運算。使用場景 問題描述 分別查詢出指定表中可重排列 排列 組合的結果資料 product name 商品名稱 price 蘋果50 橘子100 香蕉80 統計結果 可重排列 name 1 name 2 ...

SQL學習筆記 《SQL高階教程》1 2

自連線 非等值連線 自連線 group by 遞迴集合 表是行的集合,面向集合 開銷較大 唯二重要的方法 case 自連線 sql語言 面向集合的特性 有序對 無序對 獲取可重排列 交叉連線 笛卡爾積 3 3 select p1.name as name 1,p2.name as name 2 fr...

mysql學習 自連線的用法

應用場景 假設一張存放了商品名稱及 的表,表裡有 蘋果 橘子 香蕉 三條記錄。在生成用於查詢銷售額的報表時,需要獲取這些商品的組合。組合 分為有順序的有序對 1,2 和 無順序的無序對 分別對應 排列 和 組合 1 可重排列 通過交叉連線生成笛卡爾積,可以得到有序對 用於獲取可重排列的sql語句 s...