mysql子查詢(單行子查詢,多行子查詢,多列子查詢)
子查詢使用規(guī)則:
子查詢放在圓括號(hào)中子查詢放在比較條件右邊(非強(qiáng)制)子查詢中不需要ORDER BY 子句在單行子查詢中使用單行運(yùn)算符,在多行子查詢中用多行運(yùn)算符。單行運(yùn)算符:子查詢結(jié)果只有一個(gè):< > = <= >= !=多行子查詢:子查詢結(jié)果是單列多行:in , any,all多列子查詢:子查詢?yōu)槎嗔校欢ㄒ贔ROM后作為表,且一定要取別名,否則無法訪問這張表中的字段。創(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語句如下:
SELECT c_id FROM ordersWHERE o_num IN(SELECT o_num FROM orderitems WHERE f_id = 'c0');(也可以解決這個(gè)問題,但有空值,但子查詢更容易閱讀和編寫)
SELECT c_id FROM orderitems left JOIN ordersON orders.o_num = orderitems.o_num AND orderitems.f_id = 'c0';在 orderitems 表中查詢 f_id 為 c0 的訂單號(hào)的所有信息,并根據(jù)訂單號(hào)查詢具有訂單號(hào)的客戶的所有信息,SQL語句如下:
SELECT * FROM orders ord ,(SELECT * FROM orderitems AS o WHERE f_id='c0') ite WHERE ord.o_num=ite.o_num ;*注意:子查詢結(jié)果為多列,一定在FROM后做為表,且一定要取別名,否則無法訪問這張表中的字段。
#在suppliers表中查詢s_city等于‘tianjin’的供應(yīng)商s_id,然后在fruits表中,查詢所有非該供應(yīng)商供應(yīng)的水果種類名稱。
SELECT s_id,f_name FROM fruits fWHERE 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)行查詢。
若沒有返回任何行,則返回的結(jié)果為false,此時(shí)外層語句將不進(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)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!
相關(guān)文章:
