1,、IN的用法 在where條件中,用于限定查詢范圍,。 SELECT t.* FROM tablename t WHERE t.name IN ('張三','李四'); 2,、UNION,UNINALL的用法 UNION和UNION ALL都是將兩個(gè)SQL語(yǔ)句輸出結(jié)果合并,區(qū)別在于,,UNION會(huì)將輸出結(jié)果中的重復(fù)數(shù)據(jù)去重,,UNION ALL則顯示全部查詢結(jié)果,不去重,。 SELECT t.* FROM table1 t WHEREt.id IN ('822','237') UNION ALL SELECT t.* FROM table2 t WHEREt.id IN ('822'); 3,、MINUS的用法 第一條查詢SQL的輸出結(jié)果 減去 第二條查詢SQL的輸出結(jié)果,即顯示在第一條查詢記錄中,,但不在第二條查詢記錄中的數(shù)據(jù),。 SELECT t.* FROM table1 t WHEREt.id IN ('822','237') MINUS SELECT t.* FROM table2 t WHEREt.id IN ('822'); 4、JOIN((INNERJOIN),LEFT JOIN,RIGHT JOIN,FULL JOIN 兩個(gè)表使用直接關(guān)聯(lián)方式,,不會(huì)列出關(guān)聯(lián)不上的數(shù)據(jù),。使用LEFT JOIN或RIGHT JOIN則可顯示關(guān)聯(lián)不上的數(shù)據(jù)。 不管是左連接,,還是右連接,,都以左邊的表為基礎(chǔ)表,基礎(chǔ)表顯示所有數(shù)據(jù),,右邊的表如有關(guān)聯(lián)不上的數(shù)據(jù),,則顯示為空。 1) INNER JOIN(等值連接) 只返回兩個(gè)表中連接字段相等的行,。 2) LEFT JOIN(左外連接) A LEFT JOIN B(也可寫(xiě)成A LEFT OUTER JOIN B):A加入到B的左邊,,以A表為基礎(chǔ)表。 3) RIGHT JOIN(右外連接) A RIGHT JOIN B(也可寫(xiě)成A RIGHT OUTER JOIN B):A加入到B的右邊,,以B表為基礎(chǔ)表,。 4)FULL JOIN(全連接) 經(jīng)過(guò)測(cè)試此語(yǔ)句在MySQL 5.1.25-rc-win32 這個(gè)版本中不能執(zhí)行。MYSQL 中的FULL JOIN 可以用LEFT JOIN UNION RIGHTJOIN 來(lái)模擬,。 FULL JOIN 會(huì)把關(guān)聯(lián)的兩個(gè)表中沒(méi)有連接上的數(shù)據(jù)都顯示出來(lái),。 例如原始表有如下兩個(gè)表: Persons表:
Orders 表:
現(xiàn)在,我們希望列出所有的人,,以及他們的定單,,以及所有的定單,以及定購(gòu)它們的人,??梢允褂孟旅娴?SELECT 語(yǔ)句: SELECT Persons.LastName,Persons.FirstName, Orders.OrderNo FROM Persons FULL JOIN Orders ON P=Id_P ORDERBY Persons.LastName 結(jié)果集:
FULL JOIN 關(guān)鍵字會(huì)從左表 (Persons) 和右表 (Orders) 那里返回所有的行。如果 'Persons' 中的行在表 'Orders' 中沒(méi)有匹配,,或者如果'Orders' 中的行在表 'Persons' 中沒(méi)有匹配,,這些行同樣會(huì)列出。 5,、EXISTS IN,,EXISTS只顯示單表數(shù)據(jù),當(dāng)需要顯示兩個(gè)表的數(shù)據(jù)時(shí),,使用IN,,EXISTS都不合適,要使用連接查詢,。 EXISTS指定一個(gè)關(guān)聯(lián)子查詢,,檢測(cè)行的存在,用于檢查子查詢是否至少會(huì)返回一行數(shù)據(jù),,該子查詢實(shí)際上并不返回任何數(shù)據(jù),,而是返回值True或False,所以EXISTS()中的子句SELECT后寫(xiě)*或任何有效字段名都可以,,例如:
IN和EXISTS哪個(gè)效率高: EXISTS是用LOOP的方式,,循環(huán)的次數(shù)對(duì)于速度影響大,外表記錄數(shù)少則速度快,。 IN,,內(nèi)表如果小,整個(gè)查詢的范圍都會(huì)很小,,如果內(nèi)表很大,,外表如果也很大就很慢了,EXISTS相反,。 所以,,IN適合于外表大而內(nèi)表小的情況;EXISTS適合于外表小而內(nèi)表大的情況,。 NOT IN和NOTEXISTS哪個(gè)效率高: NOT IN內(nèi)外表都進(jìn)行全表掃描,,沒(méi)有用到索引。NOT EXISTS的子查詢能用到表上的索引,。所以通常NOT EXISTS要比NOT IN 要快,,推薦用NOT EXISTS代替NOT IN。 6,、GROUP BY SELECT… FROM … WHERE … GROUPBY … HAVING… SELECT t.key,COUNT(*) FROM table t GROUP BY t.key HAVING COUNT(*) < 100; 7,、關(guān)聯(lián)UPDATE UPDATE T1 SET COLUMNNAME1 = (SELECT COLUMNNAME2 FROM T2 WHERE T1.XXXID = T2.XXXID);
|
|