這篇文章主要介紹“Mariadb SELECT子查詢及UNION怎么用”的相關(guān)知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“Mariadb SELECT子查詢及UNION怎么用”文章能幫助大家解決問題。
嵌套在其他SELECT語句中的SELECT查詢叫做子查詢,為什么要這樣做呢?其實我們已經(jīng)學了多表查詢,很多時候多表查詢已經(jīng)夠用了?但是子查詢又有自身存在的地位和價值,還拿多表查詢那個例子來說。
我們想知道某一城市所使用的語言,就可以分為兩個步驟:
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即可,如下所示。
查詢所有技術(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)
當然EXISTS前可以加一個NOT,這樣就變成了當子查詢沒有結(jié)果時為真了。
注意事項
SQL允許執(zhí)行多個查詢(多條SELECT語句),并將結(jié)果作為一個查詢結(jié)果集返回,這些組合查詢通常稱為并(union)或復合查詢(compound query)。
需要注意如下幾點:
語法如下:
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ù)相同,都是可以組合成同一個結(jié)果集的,以下例子第一行顯示了美國的城市數(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)
關(guān)于“Mariadb SELECT子查詢及UNION怎么用”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識,可以關(guān)注億速云行業(yè)資訊頻道,小編每天都會為大家更新不同的知識點。
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。