自連線技術充分體現了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...