【原創】復雜sql語句


參考:

https://www.cnblogs.com/zhangkaimin/p/11386732.html

一,理解:

1,復雜sql語句,一般是用 子查詢嵌套 和 join 連接導致的,結合in, not in, any, all, exists,  not exists;

2,子查詢是分為關聯子查詢非關聯子查詢,子查詢的where是否與外部查詢的表字段有關聯;

3,子查詢的返回有4種情況(單一值,一行,一列,多行多列的子表)對應不同的查詢條件

(1)單一值可以用在where子句中的 =、 >、>=、<、<=、!=查詢條件,select 子句中作為一個字段返回,order by子句中作為排序條件

(2)一列用在where子句中的 in,any,all等查詢條件

(3)一行的時候,可以當做批量單一值來用,只能使用 = 條件。

SELECT * FROM t1 WHERE (1,2) = (SELECT column1, column2 FROM t2);//不支持!=,<,<=,>,>=
SELECT * FROM t1 WHERE ROW(1,2) = (SELECT column1, column2 FROM t2);

(4)子表可以用在where子句中的 exists,not exists的查詢條件;或者from子句后面(此時子表必須命名,並且不能為有關聯的子查詢)

4,join的使用:

(1)mysql中沒有full outer join;只有left outer join或者right outer join

(2)mysql中left join和left outer join效果一樣,right也是;left 或 right的作用是連接字段可以在另一個表中不存在

(3)mysql有一個cross join ,相當於inner join 不加on,或者 from兩個表的效果:from A, B

(4)join都是笛卡爾積,關鍵是要理解連接字段在表中的存在情況

(5)join和group by一起使用作用會大增

//1
select * from A inner join B on A.key_a = B.key_b;//AB交集的笛卡爾積,可能比A或B的行數還多
//2
select * from A left join B on A.key_a = B.key_b;//A全部的笛卡爾積
//3
select * from A right join B on A.key_a = B.key_b;//B全部的笛卡爾積
//4
select * from A left join B on A.key_a = B.key_b where B.key_b is null;//在A中不在B中的行數,笛卡爾積//此時left join可以替換為left outer
//5
select * from A right join B on A.key_a = B.key_b where A.key_a is null;//在B中不在A中的行數,笛卡爾積
//6:結合4和5
select * from A left join B on A.key_a = B.key_b where B.key_b is null;
union
select * from A right join B on A.key_a = B.key_b where A.key_a is null;//要么在A中要么在B中,這個說法也不具體,具體是連接的字段的值要么在A中存在,要么在B中存在
//7:
select * from A inner join B;//不加on條件, 就是A表行數和B表行數的笛卡爾乘積多個結果

5,union和union all的使用

(1)用於合並兩個或多個 SELECT 語句的結果集

(2)每個 SELECT 語句必須擁有相同數量的列

(3)列也必須擁有相似的數據類型

(4)每個 SELECT 語句中的列的順序必須相同

(5)union會去重,union all不會去重,去重的規則是一行中所有列都對應相同才去重

6,復雜sql語句可能有多種實現寫法;

二,實戰舉例

參考:https://www.cnblogs.com/tkzc2013/p/9962363.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM