mysql
子查詢的使用
什麼是子查詢
子查詢是將乙個 select 語句的查詢結果作為中間結果,供另乙個 sql 語句呼叫。
像這樣:
-- 我們將學生表中的所有班級id當做中間結果
select *from t_class where c_id in (select distinct c_id from t_student);
常用比較符
子查詢最常用的用法:
non_subquery_operand comparison_operator (subquery)
其中操作符通常為
其他的都不說了,這裡說下這個<=>,以前還真沒用過
<=>和=比較類似,也是判斷是否相等,相等返回1,不相等返回2
mysql> select 1<=>1,1<=>2;
| 1<=>1 | 1<=>2 |
| 1 | 0 |
1 row in set
mysql> select 1=1,1=2;
| 1=1 | 1=2 |
| 1 | 0 |
1 row in set
和=不一樣的地方,是對null的支援,用<=>可以判斷是否為null,而等號則是出現null,結果就為null
mysql> select 1<=>null,null<=>null,1=null,null=null;
| 1<=>null | null<=>null | 1=null | null=null |
| 0 | 1 | null | null |
1 row in set
any、in、some
在子查詢中,in平時用的比較多,這個any、some,這裡簡單說下any和some
operand comparison_operator any (subquery)
operand comparison_operator some (subquery)
comparison_operator 可以為 = > < >= <= <> !=
any表示任意乙個值,比如
> any () :表示大於any中任意乙個值,即》子查詢中最小值
< any(): 表示小於any中任意乙個值,即
= any(): 和in一樣
<> any():比較好玩兒,如果子查詢返回多個值,<> any會返回所有值
select *from t_student
where s_id > any(
select s_id from t_student where s_id in (105,109,111)
>any
select *from t_student
where s_id = any(
select s_id from t_student where s_id in (105,109,111)
=any
some 和any是一樣的就不多說了
all這個all我也沒咋用過,all表示所有值,和any有點兒相反的意思
operand comparison_operator all (subquery)
> all ():表示大於所有值,即》子查詢中最大值
< all() : 表示小於所有值,即< 子查詢中的最小值
= all(): 返回單個值時和=一樣,返回多個值時貌似沒啥用
<> all(): 和not in 一樣
select *from t_student
where s_id > all(
select s_id from t_student where s_id in (105,109)
>all
標量子查詢
這種情況下,子查詢返回單個值,可以在任何地方使用它。
select
c_id,
c_name,
(select max(s_id) from t_student) as max_s_id
from
t_class;
select
from
t_class
where
c_id = (select max(c_id) from t_class);
行子查詢
上面我們介紹的子查詢,都是返回1列多行,行子查詢的話,是返回1行多列
-- 查詢一班所有男生
select *from t_student
where (c_id,s_gender) = (901,0);
行子查詢
這裡也可以返回多行多列(也叫做錶子查詢)
select *from t_student
where (c_id,s_gender) in (select 901,0 union select 902,0);
多行多列
參考資料
My SQL 使用子查詢
在關係型資料庫中,關係表是把資訊分解成多個表,一類資料乙個表,各表通過某些常用的值互相關聯。在乙個表中通常有乙個外來鍵,包含了和他有關係的表的主鍵,定義了兩個表之間的關係。這裡我們使用兩個表orders和orderitems為例,內容如下 可以看到這兩張表有關聯的是列order item列。想要獲得...
mysql 使用子查詢
子查詢總是從內向外處理 書寫子查詢語句時盡量格式化,看起來易理解 使用子查詢的地方可以使用 表聯結 代替 對有歧義的列名進行完全限定,即 where orders.cust id customers.cust id 場景 1 利用子查詢進行過濾 列出訂購物品tnt2的所有客戶 第一步 從表 orde...
MySQL使用子查詢
子查詢 即巢狀在其他查詢中的查詢 把一條查詢語句的結果用於另一條查詢語句的where子句 select cust id from orders where order num in select order num from orderitems where prod id tnt2 把查詢語句的結...