新聞中心
SELECT子查詢
嵌套在其他SELECT語(yǔ)句中的SELECT查詢叫做子查詢,為什么要這樣做呢?其實(shí)我們已經(jīng)學(xué)了多表查詢,很多時(shí)候多表查詢已經(jīng)夠用了?但是子查詢又有自身存在的地位和價(jià)值,還拿多表查詢那個(gè)例子來(lái)說(shuō)。

創(chuàng)新互聯(lián)從2013年開始,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元勐海做網(wǎng)站,已為上家服務(wù),為勐海各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:028-86922220
我們想知道某一城市所使用的語(yǔ)言,就可以分為兩個(gè)步驟:
1.在City表中查詢?cè)摮鞘械腃ountryCode。
2.使用查詢到的這個(gè)CountryCode在CountryLanguage表中查詢?cè)搰?guó)家所使用的語(yǔ)言。
雖然,可以分兩步完成,但是,需要兩次查詢和兩次傳輸,在帶寬和性能的對(duì)比下,我們更希望讓Mysql(MariaDB)來(lái)幫助我們完成這件事不是嗎?
看下用子查詢是什么樣的~
MariaDB [world]> SELECT Language FROM countrylanguage WHERE CountryCode = (SELECT CountryCode FROM city WHERE Name = 'Peking');
+-----------+
| Language |
+-----------+
| Chinese |
| Dong |
| Hui |
| Mant?u |
| Miao |
| Mongolian |
| Puyi |
| Tibetan |
| Tujia |
| Uighur |
| Yi |
| Zhuang |
+-----------+
12 rows in set (0.07 sec)
看到(SELECT CountryCode FROM city WHERE Name = ‘Peking’)這一坨了嗎?用括號(hào)括起來(lái)的這個(gè)查詢,他會(huì)得到北京的CountryCode,而這個(gè)CountryCode又作為外面SELECT的WHERE檢索條件。
所以,子查詢就是用括號(hào)括起來(lái)的查詢,而MariaDB會(huì)在進(jìn)行查詢時(shí)先進(jìn)行括號(hào)內(nèi)的查詢,得到一個(gè)值或一組值替換到相應(yīng)的位置。
ANY或SOME子查詢
其實(shí)ANY和SOME跟IN的意思是一樣的,只要滿足操作符對(duì)()內(nèi)的任一值的操作為TRUE即可,如下所示。
查詢所有技術(shù)部(Tech)和銷售部(Sales)的員工:
MariaDB [world]> SELECT * FROM user
-> WHERE deptid IN
-> (SELECT id FROM department WHERE name IN ('Sales','Tech'));
MariaDB [world]> SELECT * FROM user
-> WHERE deptid = ANY
-> (SELECT id FROM department WHERE name IN ('Sales','Tech'));
MariaDB [world]> SELECT * FROM user
-> WHERE deptid = SOME
-> (SELECT id FROM department WHERE name IN ('Sales','Tech'));
+----+-------+----------+---------------------+--------+
| id | name | password | regtime | deptid |
+----+-------+----------+---------------------+--------+
| 1 | test | test | 2018-03-05 17:25:26 | 1 |
| 2 | test1 | test1 | 2018-03-05 17:25:26 | 1 |
| 3 | lucy | lucy | 2018-03-05 17:25:26 | 2 |
+----+-------+----------+---------------------+--------+
3 rows in set (0.00 sec)
EXISTS存在判斷
只要子查詢返回的有值即為TRUE,否則即為FALSE,如下例展示:
MariaDB [world]> SELECT EXISTS( SELECT * FROM user WHERE deptid = (SELECT id FROM department WHERE name='Tech') ) AS dep_is_Exist;
+--------------+
| dep_is_Exist |
+--------------+
| 1 |
+--------------+
1 row in set (0.01 sec)
當(dāng)然EXISTS前可以加一個(gè)NOT,這樣就變成了當(dāng)子查詢沒(méi)有結(jié)果時(shí)為真了。
注意事項(xiàng)
-
作為子查詢的SELECT語(yǔ)句只能查詢單個(gè)列,企圖檢索多個(gè)列將返回錯(cuò)誤。
-
通常子查詢和表連接可以做相互轉(zhuǎn)換,而表連接相對(duì)而言會(huì)比子查詢獲得更好的效率。
UNION組合表
SQL允許執(zhí)行多個(gè)查詢(多條SELECT語(yǔ)句),并將結(jié)果作為一個(gè)查詢結(jié)果集返回,這些組合查詢通常稱為并(union)或復(fù)合查詢(compound query)。
需要注意如下幾點(diǎn):
-
UNION必須由兩條或兩條以上的SELECT語(yǔ)句組成,語(yǔ)句之間用關(guān)鍵字UNION分隔(因此,如果組合四條SELECT語(yǔ)句,將要使用三個(gè)UNION關(guān)鍵字)。
-
UNION中的每個(gè)查詢必須包含相同的列、表達(dá)式或聚集函數(shù)(不過(guò),各個(gè)列不需要以相同的次序列出)。
-
列數(shù)據(jù)類型必須兼容:類型不必完全相同,但必須是DBMS可以隱含轉(zhuǎn)換的類型(例如,不同的數(shù)值類型或不同的日期類型)。
語(yǔ)法如下:
SELECT column_name FROM table1
UNION
SELECT column_name FROM table2
看如下例子,檢索所有美國(guó)和中國(guó)的國(guó)家:
MariaDB [world]> SELECT * FROM city WHERE CountryCode = 'CHN'
-> UNION
-> SELECT * FROM city WHERE CountryCode ='USA';
+------+-------------------------+-------------+----------------------+------------+
| ID | Name | CountryCode | District | Population |
+------+-------------------------+-------------+----------------------+------------+
| 1890 | Shanghai | CHN | Shanghai | 9696300 |
| 1891 | Peking | CHN | Peking | 7472000 |
....................................................................................
| 4064 | Odessa | USA | Texas | 89293 |
| 4065 | Carson | USA | California | 89089 |
| 4066 | Charleston | USA | South Carolina | 89063 |
+------+-------------------------+-------------+----------------------+------------+
637 rows in set (0.01 sec)
//以下這條語(yǔ)句等同上方的SELECT查詢
SELECT * FROM city WHERE CountryCode ='USA' OR CountryCode = 'CHN';
統(tǒng)計(jì)美國(guó)和中國(guó)的城市數(shù):
MariaDB [world]> SELECT CountryCode,COUNT(id) AS city_nums FROM city WHERE CountryCode = 'CHN'
-> UNION
-> SELECT COUNT(id),CountryCode FROM city WHERE CountryCode = 'USA';
+-------------+-----------+
| CountryCode | city_nums |
+-------------+-----------+
| CHN | 363 |
| 274 | USA |
+-------------+-----------+
2 rows in set (0.00 sec)
所以只要列數(shù)相同,都是可以組合成同一個(gè)結(jié)果集的,以下例子第一行顯示了美國(guó)的城市數(shù),第二行顯示了美國(guó)的語(yǔ)言數(shù)量:
MariaDB [world]> SELECT COUNT(id),CountryCode FROM city WHERE CountryCode = 'USA' UNION SELECT COUNT(Language),CountryCode FROM countrylanguage WHERE CountryCode ='USA';
+-----------+-------------+
| COUNT(id) | CountryCode |
+-----------+-------------+
| 274 | USA |
| 12 | USA |
+-----------+-------------+
2 rows in set (0.00 sec)
文章標(biāo)題:詳解MariadbSELECT子查詢及UNION
分享路徑:http://m.5511xx.com/article/cccdecj.html


咨詢
建站咨詢
