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

創(chuàng)新互聯(lián)從2013年開始,是專業(yè)互聯(lián)網(wǎng)技術服務公司,擁有項目網(wǎng)站設計、成都網(wǎng)站制作網(wǎng)站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元勐海做網(wǎng)站,已為上家服務,為勐海各地企業(yè)和個人服務,聯(lián)系電話:028-86922220
我們想知道某一城市所使用的語言,就可以分為兩個步驟:
1.在City表中查詢該城市的CountryCode。
2.使用查詢到的這個CountryCode在CountryLanguage表中查詢該國家所使用的語言。
雖然,可以分兩步完成,但是,需要兩次查詢和兩次傳輸,在帶寬和性能的對比下,我們更希望讓Mysql(MariaDB)來幫助我們完成這件事不是嗎?
看下用子查詢是什么樣的~
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’)這一坨了嗎?用括號括起來的這個查詢,他會得到北京的CountryCode,而這個CountryCode又作為外面SELECT的WHERE檢索條件。
所以,子查詢就是用括號括起來的查詢,而MariaDB會在進行查詢時先進行括號內(nèi)的查詢,得到一個值或一組值替換到相應的位置。
ANY或SOME子查詢
其實ANY和SOME跟IN的意思是一樣的,只要滿足操作符對()內(nèi)的任一值的操作為TRUE即可,如下所示。
查詢所有技術部(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)
當然EXISTS前可以加一個NOT,這樣就變成了當子查詢沒有結果時為真了。
注意事項
-
作為子查詢的SELECT語句只能查詢單個列,企圖檢索多個列將返回錯誤。
-
通常子查詢和表連接可以做相互轉(zhuǎn)換,而表連接相對而言會比子查詢獲得更好的效率。
UNION組合表
SQL允許執(zhí)行多個查詢(多條SELECT語句),并將結果作為一個查詢結果集返回,這些組合查詢通常稱為并(union)或復合查詢(compound query)。
需要注意如下幾點:
-
UNION必須由兩條或兩條以上的SELECT語句組成,語句之間用關鍵字UNION分隔(因此,如果組合四條SELECT語句,將要使用三個UNION關鍵字)。
-
UNION中的每個查詢必須包含相同的列、表達式或聚集函數(shù)(不過,各個列不需要以相同的次序列出)。
-
列數(shù)據(jù)類型必須兼容:類型不必完全相同,但必須是DBMS可以隱含轉(zhuǎn)換的類型(例如,不同的數(shù)值類型或不同的日期類型)。
語法如下:
SELECT column_name FROM table1
UNION
SELECT column_name FROM table2
看如下例子,檢索所有美國和中國的國家:
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)
//以下這條語句等同上方的SELECT查詢
SELECT * FROM city WHERE CountryCode ='USA' OR CountryCode = 'CHN';
統(tǒng)計美國和中國的城市數(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ù)相同,都是可以組合成同一個結果集的,以下例子第一行顯示了美國的城市數(shù),第二行顯示了美國的語言數(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)
新聞名稱:詳解MariadbSELECT子查詢及UNION
地址分享:http://m.5511xx.com/article/cccdecj.html


咨詢
建站咨詢
