久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

MySQL數據查詢之子查詢的示例分析

126次閱讀
沒有評論

共計 5711 個字符,預計需要花費 15 分鐘才能閱讀完成。

自動寫代碼機器人,免費開通

這篇文章主要介紹了 MySQL 數據查詢之子查詢的示例分析,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓丸趣 TV 小編帶著大家一起了解一下。

子查詢是指一個查詢語句嵌套在另一個查詢語句內部的查詢。在 select 子句中先計算子查詢,子查詢結果作為外層另一個查詢的過濾條件,查詢可以基于一個表或者多個表。

子查詢中常用的操作符有 any(some)、all、in、exists。子查詢可以添加到 select、update 和 delete 語句中,而且可以進行多層嵌套。子查詢中也可以使用比較運算符,如,=,,=“和”!=。

(1)帶 any、some 關鍵字的子查詢
(2) 帶 all 關鍵字的子查詢
(3) 帶 exists 關鍵字的子查詢
(4) 帶 in 關鍵字的子查詢
(5) 帶比較運算符的子查詢

(免費學習推薦:mysql 視頻教程)

(1)、帶 any、some 關鍵字的子查詢

any 和 some 關鍵字是同義詞,表示滿足其中任一條件,允許創建一個表達式對子查詢的返回值列表進行比較,只要滿足內層子查詢中的任何一個比較條件,就返回一個結果作為外層查詢的條件。

下面定義兩個表 tbl1 和 tbl2,并向兩個表中插入數據:

mysql  create table tbl1( num1 int not null);Query OK, 0 rows affected (0.13 sec)mysql  create table tbl2(num2 int not null);Query OK, 0 rows affected (0.10 sec)mysql  insert into tbl1 values(1),(5),(13),(27);Query OK, 4 rows affected (0.05 sec)Records: 4 Duplicates: 0 Warnings: 0mysql  insert into tbl2 values(6),(14),(11),(20);Query OK, 4 rows affected (0.06 sec)Records: 4 Duplicates: 0 Warnings: 0

any 關鍵字接在一個比較操作符后面,表示若與子查詢返回的任何職比較為 true,則返回 true。

【例】返回 tbl2 表的所有 num2 列,然后將 tbl1 中的 num1 的值與之進行比較,只要大于 num2 的任何一個值,即為符合條件的結果。

mysql  select num1 from tbl1 where num1   any(select num2 from tbl2);+------+| num1 |+------+| 13 || 27 |+------+2 rows in set (0.00 sec)

(2)、帶 all 關鍵字的子查詢

all 關鍵字需要同時滿足所有內層查詢的條件。

all 關鍵字接在一個比較操作符后面,表示與子查詢返回的所有值比較為 true,則返回 true。

【例】返回 tbl1 表中比 tbl2 表 num2 列所有值都大的值,SQL 語句如下:

mysql  select num1 from tbl1 where num1   all(select num2 from tbl2);+------+| num1 |+------+| 27 |+------+1 row in set (0.00 sec)

(3)、帶 exists 關鍵字的子查詢

exists 關鍵字后面的參數是一個任意的子查詢,系統對子查詢進行運算以判斷它是否返回行,如果至少返回一行,那么 exists 的結果為 true,此時外層查詢語句將進行查詢;如果子查詢沒有返回任何行,那么 exists 返回的結果是 false,此時外層語句將不進行查詢。

【例 1】查詢 suppliers 表中是否存在 s_id=107 的的供應商,如果存在,則查詢 fruits 表中的記錄,SQL 語句如下:

mysql  select * from fruits -  where exists
 -  (select s_name from suppliers where s_id = 107);+------+------+------------+---------+| f_id | s_id | f_name | f_price |+------+------+------------+---------+| 12 | 104 | lemon | 6.40 || a1 | 101 | apple | 5.20 || a2 | 103 | apricot | 2.20 || b1 | 101 | blackberry | 10.20 || b2 | 104 | berry | 7.60 || b5 | 107 | xxxx | 3.60 || bs1 | 102 | orange | 11.20 || bs2 | 105 | melon | 8.20 || c0 | 101 | cherry | 3.20 || m1 | 106 | mango | 15.70 || m2 | 105 | xbabay | 2.60 || m3 | 105 | xxtt | 11.60 || o2 | 103 | coconut | 9.20 || t1 | 102 | banana | 10.30 || t2 | 102 | grape | 5.30 || t4 | 107 | xbabay | 3.60 |+------+------+------------+---------+16 rows in set (0.00 sec)

由結果可知,內層查詢結果表明 suppliers 表中存在 s_id=107 的記錄,因此 exists 表達式返回 true;外層查詢語句接收 true 之后對表 fruits 進行查詢,返回所有記錄。

【例 2】查詢 suppliers 表中是否存在 s_id=107 的供應商,如果存在,則查詢 fruits 表中的 f_price 大于 10.20 的記錄,SQL 語句如下:

mysql  select * from fruits -  where f_price   10.20 and exists
 -  (select s_name from suppliers where s_id = 107);+------+------+--------+---------+| f_id | s_id | f_name | f_price |+------+------+--------+---------+| bs1 | 102 | orange | 11.20 || m1 | 106 | mango | 15.70 || m3 | 105 | xxtt | 11.60 || t1 | 102 | banana | 10.30 |+------+------+--------+---------+4 rows in set (0.00 sec)

可以看到, 內層查詢表名 suppliers 表中存在 s_id=107 的記錄,因此 exists 表達式返回 true;外層查詢語句接收 true 之后根據查詢條件 f_price 10.20 對 fruits 表進行查詢,返回結果為 4 條 f_price 大于 10.20 的記錄。

not exists 與 exists 使用方法相同,返回的結果相反。子查詢如果至少返回一行,那么 not exists 的結果為 false,此時外層查詢語句將不進行查詢;如果子查詢沒有返回任何行,那么 not exists 返回的結果就是 true,此時外層語句將進行查詢。

【例 3】查詢 suppliers 表中是否存在 s_id =107 的供應商,如果不存在就查詢 fruits 表中的記錄,SQL 語句如下:

mysql  select * from fruits -  where not exists
 -  (select s_name from suppliers where s_id = 107);Empty set (0.00 sec)

可以看到,內層查詢返回結果為 false,外層表達式接收 false 將不再查詢 fruits 表中的記錄。

注意:exists 和 not exists 的結果只取決于是否會返回行,而不取決于這些行的內容,所以這個子查詢輸入列表通常是無關緊要的。

(4)、帶 in 關鍵字的子查詢

in 關鍵字進行子查詢時,內層查詢語句僅僅返回一個數據列,這個數據列里的值將提供給外層查詢語句進行比較操作。

【例 1】在 orderitems 表中查詢 f_id 為 c0 的訂單號,并根據訂單號查詢具有訂單號的客戶 c_id,SQL 語句如下:

mysql  select c_id from orders where o_num in
 -  (select o_num from orderitems where f_id =  c0 +-------+| c_id |+-------+| 10004 || 10001 |+-------+2 rows in set (0.00 sec)

上面的語句是下面查詢方式的簡寫:

mysql  select o_num from orderitems where f_id =  c0 +-------+| o_num |+-------+| 30003 || 30005 |+-------+2 rows in set (0.00 sec)mysql  select c_id from orders where o_num in (30003,30005);+-------+| c_id |+-------+| 10004 || 10001 |+-------+2 rows in set (0.00 sec)

下面介紹與 in 相反的 not in 關鍵字:

【例 2】與例 1 類似,但 select 語句中使用 not in 關鍵字。SQL 語句如下:

mysql  select c_id from orders where o_num not in
 -  (select o_num from orderitems where f_id = c0 +-------+| c_id |+-------+| 10001 || 10003 || 10005 |+-------+3 rows in set (0.00 sec)

可以看到返回了三個表, 查看 orders 中的記錄可知,c_id 等于 10001 的客戶的訂單不止一個:

mysql  select * from orders;+-------+---------------------+-------+| o_num | o_date | c_id |+-------+---------------------+-------+| 30001 | 2008-09-01 00:00:00 | 10001 || 30002 | 2008-09-12 00:00:00 | 10003 || 30003 | 2008-09-30 00:00:00 | 10004 || 30004 | 2008-10-03 00:00:00 | 10005 || 30005 | 2008-10-08 00:00:00 | 10001 |+-------+---------------------+-------+5 rows in set (0.00 sec)

結果只是排除了訂單號,但仍然有可能選擇同一個客戶。

子查詢的功能也可以通過連接查詢完成,但子查詢使得 MySQL 代碼更容易閱讀和編寫。

(5)、帶比較運算符的子查詢

【例 1】在 suppliers 表中查詢 s_city 等于 Tianjin 的供應商 s_id,然后在 fruits 表中查詢所有該供應商提供的水果的種類,SQL 語句如下:

mysql  select s_id,f_name from fruits -  where s_id =
 -  (select s1.s_id from suppliers as s1 where s1.s_city =  Tianjin +------+------------+| s_id | f_name |+------+------------+| 101 | apple || 101 | blackberry || 101 | cherry |+------+------------+3 rows in set (0.00 sec)

【例 2】在 suppliers 表中查詢 s_city 等于 Tianjin 的供應商,s_id,然后在 fruits 表中查詢所有非該供應商提供的水果的種類,SQL 語句如下:

mysql  select s_id , f_name from fruits -  where s_id  
 -  (select s1.s_id from suppliers as s1 where s1.s_city = Tianjin +------+---------+| s_id | f_name |+------+---------+| 104 | lemon || 103 | apricot || 104 | berry || 107 | xxxx || 102 | orange || 105 | melon || 106 | mango || 105 | xbabay || 105 | xxtt || 103 | coconut || 102 | banana || 102 | grape || 107 | xbabay |+------+---------+13 rows in set (0.00 sec)

感謝你能夠認真閱讀完這篇文章,希望丸趣 TV 小編分享的“MySQL 數據查詢之子查詢的示例分析”這篇文章對大家有幫助,同時也希望大家多多支持丸趣 TV,關注丸趣 TV 行業資訊頻道,更多相關知識等著你來學習!

向 AI 問一下細節

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-12-04發表,共計5711字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 咸丰县| 马关县| 资源县| 静海县| 加查县| 阜南县| 息烽县| 兰西县| 定远县| 会昌县| 漳平市| 赤峰市| 苗栗市| 浦北县| 天门市| 建宁县| 塔城市| 大新县| 尼玛县| 牡丹江市| 孙吴县| 旬邑县| 莫力| 博爱县| 阜康市| 外汇| 玉屏| 汉中市| 恭城| 禄劝| 平利县| 蛟河市| 科技| 奉化市| 阳城县| 长岛县| 黄山市| 阿拉善右旗| 积石山| 宜兰市| 洮南市|