mysql子查詢(單行子查詢,多行子查詢,多列子查詢)
子查詢使用規(guī)則:
- 子查詢放在圓括號(hào)中
- 子查詢放在比較條件右邊(非強(qiáng)制)
- 子查詢中不需要ORDER BY 子句
- 在單行子查詢中使用單行運(yùn)算符,在多行子查詢中用多行運(yùn)算符。
- 單行運(yùn)算符:子查詢結(jié)果只有一個(gè):< > = <= >= !=
- 多行子查詢:子查詢結(jié)果是單列多行:in , any,all
- 多列子查詢:子查詢?yōu)槎嗔校欢ㄒ贔ROM后作為表,且一定要取別名,否則無(wú)法訪問(wèn)這張表中的字段。
創(chuàng)建初始表
CREATE TABLE tbl1 (num1 INT NOT NULL); CREATE TABLE tbl2 (num2 INT NOT NULL); INSERT INTO tbl1 VALUES(1),(5),(13),(27); INSERT INTO tbl2 VALUES(6),(14),(11),(20);
ANY SOME 關(guān)鍵字的子查詢
返回tbl2的所有num2列,將tbl1中的num值與之進(jìn)行比較,只要大于num2的任意一值,即為符合條件的結(jié)果。
SELECT num1 FROM tbl1 WHERE num1 > SOME(SELECT num2 FROM tbl2);
SELECT num1 FROM tbl1 WHERE num1 > ANY (SELECT num2 FROM tbl2);
ALL 關(guān)鍵字
SELECT num1 FROM tbl1 WHERE num1 > ALL (SELECT num2 FROM tbl2);
新建一個(gè)orderitems表
CREATE TABLE orderitems( o_num INT NOT NULL, o_item INT NOT NULL, f_id CHAR(10) NOT NULL, quantity INT NOT NULL, item_price DECIMAL(8,2) NOT NULL, PRIMARY KEY(o_num,o_item) );
填入數(shù)據(jù)
INSERT INTO orderitems(o_num,o_item,f_id,quantity,item_price) VALUES(3001,1,'a1',10,5.2), (3001,2,'b2',3,7.6), (3001,3,'bs1',5,11.2), (3001,4,'bs2',15,9.2), (3002,1,'b3',2,20.0), (3003,1,'c0',100,10), (3004,1,'o2',50,2.50), (3005,1,'c0',5,10), (3005,2,'b1',10,8.99), (3005,3,'a2',10,2.2), (3005,4,'m1',5,14.99);
帶 IN 關(guān)鍵字 的子查詢
#在orderitem表中查詢f_id為c0 的訂單號(hào),并根據(jù)訂單號(hào)查詢具有訂單號(hào)的客戶c_id,SQL語(yǔ)句如下:
SELECT c_id FROM orders WHERE o_num IN (SELECT o_num FROM orderitems WHERE f_id = 'c0');
NOT IN
SELECT c_id FROM orders WHERE o_num NOT IN (SELECT o_num FROM orderitems WHERE f_id = 'c0');
連接查詢
(也可以解決這個(gè)問(wèn)題,但有空值,但子查詢更容易閱讀和編寫)
SELECT c_id FROM orderitems left JOIN orders ON orders.o_num = orderitems.o_num AND orderitems.f_id = 'c0';
多列子查詢
在 orderitems 表中查詢 f_id 為 c0 的訂單號(hào)的所有信息,并根據(jù)訂單號(hào)查詢具有訂單號(hào)的客戶的所有信息,SQL語(yǔ)句如下:
SELECT * FROM orders ord ,(SELECT * FROM orderitems AS o WHERE f_id='c0') ite WHERE ord.o_num=ite.o_num ;
*注意:子查詢結(jié)果為多列,一定在FROM后做為表,且一定要取別名,否則無(wú)法訪問(wèn)這張表中的字段。
帶比較運(yùn)算符的子查詢
#在suppliers表中查詢s_city等于‘tianjin’的供應(yīng)商s_id,然后在fruits表中,查詢所有非該供應(yīng)商供應(yīng)的水果種類名稱。
SELECT s_id,f_name FROM fruits f WHERE f.s_id != (SELECT s1.s_id FROM suppliers AS s1 WHERE s1.s_city = 'tianjin');
帶EXISTS 關(guān)鍵字的子查詢
EXISTS關(guān)鍵字后是任意一個(gè)子查詢:
若至少返回一行,則結(jié)果為True,此時(shí)外層將進(jìn)行查詢。
若沒(méi)有返回任何行,則返回的結(jié)果為false,此時(shí)外層語(yǔ)句將不進(jìn)行查詢。
NOT EXISTS 和 EXISTS 的使用方法相同,返回的結(jié)果相反。
查詢suppliers中是否存在s_id 的供應(yīng)商,若存在,則查詢fruits表中所有記錄:
SELECT * FROM fruits WHERE EXISTS (SELECT s.s_id FROM suppliers AS s WHERE s.s_id = 107);
返回結(jié)果:
EXISTS也可以和條件表達(dá)式一起使用:
例:查詢suppliers中是否存在s_id 的供應(yīng)商,若存在,則查詢fruits表中f_price>10.20的記錄:
SELECT * FROM fruits WHERE f_price >10.20 AND EXISTS (SELECT s.s_id FROM suppliers AS s WHERE s.s_id = 107);
到此這篇關(guān)于mysql子查詢(單行子查詢,多行子查詢,多列子查詢)的文章就介紹到這了,更多相關(guān)MySQL子查詢 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
mysql sql99語(yǔ)法 內(nèi)連接非等值連接詳解
在本篇文章里小編給大家整理的是一篇關(guān)于mysql sql99語(yǔ)法 內(nèi)連接非等值連接的相關(guān)知識(shí)點(diǎn)文章,有需要的朋友們可以學(xué)習(xí)下。2019-09-09mysql 從一個(gè)表中查數(shù)據(jù)并插入另一個(gè)表實(shí)現(xiàn)方法
這篇文章主要介紹了mysql 從一個(gè)表中查數(shù)據(jù)并插入另一個(gè)表實(shí)現(xiàn)方法的相關(guān)資料,需要的朋友可以參考下2017-05-05Mysql數(shù)據(jù)庫(kù)表定期備份的實(shí)現(xiàn)詳解
這篇文章主要介紹了Mysql數(shù)據(jù)庫(kù)表定期備份的實(shí)現(xiàn)詳解的相關(guān)資料,需要的朋友可以參考下2017-03-03MySQL數(shù)據(jù)庫(kù)函數(shù)之JSON_EXTRACT示例代碼
這篇文章主要介紹了MySQL數(shù)據(jù)庫(kù)函數(shù)之JSON_EXTRACT的相關(guān)資料,JSON_EXTRACT()函數(shù)用于從JSON文檔中提取值,支持對(duì)象屬性、數(shù)組元素和嵌套結(jié)構(gòu)的訪問(wèn),示例展示了如何提取簡(jiǎn)單值、嵌套值和數(shù)組中的值,需要的朋友可以參考下2025-02-02MySql分表、分庫(kù)、分片和分區(qū)知識(shí)點(diǎn)介紹
數(shù)據(jù)庫(kù)的數(shù)據(jù)量達(dá)到一定程度之后,為避免帶來(lái)系統(tǒng)性能上的瓶頸。需要進(jìn)行數(shù)據(jù)的處理,采用的手段是分區(qū)、分片、分庫(kù)、分表,這里就為大家介紹一下,需要的朋友可以參考下2020-02-02如何解決mysql的count()函數(shù)條件表達(dá)式不生效問(wèn)題
該文章總結(jié)了SQL查詢中`count`函數(shù)統(tǒng)計(jì)錯(cuò)誤的原因,以及三種解決方法:使用`ornull`方法、`IF()`函數(shù)和`casewhen`表達(dá)式,當(dāng)不滿足條件時(shí),表達(dá)式的值為NULL2024-11-11