摘要:本文參考必知必會(huì)工作實(shí)踐融合組合查詢(xún)定義在大多數(shù)開(kāi)發(fā)中,使用一條查詢(xún)就會(huì)返回一個(gè)結(jié)果集。在查詢(xún)結(jié)果集中幫我們自動(dòng)去除了重復(fù)的行重復(fù)的行是李四,把兩條李四合并了。注意由于在多表組合查詢(xún)時(shí)候,可能表字段并不相同。
本篇文章主要介紹使用Union操作符將多個(gè)SELECT查詢(xún)組合成一個(gè)結(jié)果集。本文參考《Mysql必知必會(huì)》+工作實(shí)踐融合
組合查詢(xún) 定義在大多數(shù)開(kāi)發(fā)中,使用一條SELECT查詢(xún)就會(huì)返回一個(gè)結(jié)果集。如果,我們想一次性查詢(xún)多條SQL語(yǔ)句,并將每一條SELECT查詢(xún)的結(jié)果合并成一個(gè)結(jié)果集返回。就需要用到Union操作符,將多個(gè)SELECT語(yǔ)句組合起來(lái),這種查詢(xún)被稱(chēng)為并(Union)或者復(fù)合查詢(xún)。
組合查詢(xún)適用于下面兩種情境中:
從多個(gè)表中查詢(xún)出相似結(jié)構(gòu)的數(shù)據(jù),并且返回一個(gè)結(jié)果集
從單個(gè)表中多次SELECT查詢(xún),將結(jié)果合并成一個(gè)結(jié)果集返回。
演示我們通過(guò)一個(gè)簡(jiǎn)單的示例來(lái)認(rèn)識(shí)一下Union組合查詢(xún)。
創(chuàng)建一個(gè)用戶(hù)表
首先分兩次查詢(xún)用戶(hù)表,然后再組合查詢(xún)
select user_id,user_nickname,user_status from yy_user where user_status = 1 // 第一次查詢(xún)
select user_id,user_nickname,user_status from yy_user where user_id > 3 // 第二次查詢(xún)
第一條SQL查詢(xún)了user_status=1的用戶(hù),第二條查詢(xún)了user_id > 3的用戶(hù)
下面我們組合這兩條SQL語(yǔ)句:
select user_id,user_nickname,user_status from yy_user where user_status = 1 UNION select user_id,user_nickname,user_status from yy_user where user_id > 3
這條語(yǔ)句由前面的兩條語(yǔ)句組成,通過(guò)Union組合了兩條SELECT,并且把結(jié)果集合并后輸出。這條組合查詢(xún)也可以使用同等where語(yǔ)句來(lái)替代:
select user_id,user_nickname,user_status from yy_user where user_status = 1 or user_id > 3;組合查詢(xún)和Where
where和Union在多數(shù)情況下都可以實(shí)現(xiàn)相同的結(jié)果集。where可以實(shí)現(xiàn)的語(yǔ)句一定可以使用Union語(yǔ)句來(lái)實(shí)現(xiàn)。但是反過(guò)來(lái)就不一定正確了,比如下面將會(huì)說(shuō)到的去重和不去重。
另外,在單表中使用Union比where多條件查詢(xún)較為復(fù)雜。而從多張表中獲取數(shù)據(jù),使用Union會(huì)相對(duì)于簡(jiǎn)單些。
Union使用規(guī)則Union有他的強(qiáng)大之處,詳細(xì)介紹之前,首先明確一下Union的使用注意規(guī)則。
Union必須由兩條或者兩條以上的SELECT語(yǔ)句組成,語(yǔ)句之間使用Union鏈接。
Union中的每個(gè)查詢(xún)必須包含相同的列、表達(dá)式或者聚合函數(shù),他們出現(xiàn)的順序可以不一致(這里指查詢(xún)字段相同,表不一定一樣)
列的數(shù)據(jù)類(lèi)型必須兼容,兼容的含義是必須是數(shù)據(jù)庫(kù)可以隱含的轉(zhuǎn)換他們的類(lèi)型
包含重復(fù)、去除重復(fù)我們觀(guān)察一下上面兩條語(yǔ)句,第一條SELECT返回了2條數(shù)據(jù);第二條SELECT也返回了2條數(shù)據(jù)。
但是Union最終的結(jié)果返回了3條數(shù)據(jù),而不是4條。mysql在查詢(xún)結(jié)果集中幫我們自動(dòng)去除了重復(fù)的行(重復(fù)的行是李四),把兩條李四合并了。
一般情況下這樣結(jié)果是好的,但是如果需要的情況下,我們可以使用Union All操作符來(lái)取消自動(dòng)合并功能。
select user_id,user_nickname,user_status from yy_user where user_status = 1 UNION ALL select user_id,user_nickname,user_status from yy_user where user_id > 3
這一次mysql沒(méi)有幫我們?nèi)コ貜?fù),在查詢(xún)結(jié)果中,我們也看到了兩條重復(fù)的李四。
之前我們說(shuō)過(guò)where和Union的區(qū)別,這里Union All可以返回重復(fù)的數(shù)據(jù),就是where子句完成不了的工作。
結(jié)果排序使用Union組合查詢(xún)時(shí),只能使用一條order by子句對(duì)結(jié)果集進(jìn)行排序,而且必須出現(xiàn)在最后一條出現(xiàn)的SELECT語(yǔ)句之后。因?yàn)?b>`Union不允許對(duì)于部分結(jié)果集進(jìn)行排序,只能針對(duì)最終檢索出來(lái)的結(jié)果集進(jìn)行排序。
注意:由于在多表組合查詢(xún)時(shí)候,可能表字段并不相同。所以,在對(duì)于結(jié)果集排序的時(shí)候需要使用檢索出來(lái)的共同字段。
(select user_id,user_nickname,user_status from yy_user where user_status = 1) UNION ALL (select user_id,user_nickname,user_status from yy_user where user_id > 3) order by user_id desc
上面檢索的字段user_id必須存在于結(jié)果集中。
多表組合查詢(xún)大型項(xiàng)目中數(shù)據(jù)經(jīng)常分布在不同的表,檢索的時(shí)候需要組合查詢(xún)出來(lái)。多表查詢(xún)的時(shí)候,并不要求兩個(gè)表完全相同,只需要你檢索的字段結(jié)構(gòu)相似就可以。
我們已經(jīng)有一張user表,假設(shè)搜索時(shí)候我們需要將用戶(hù)昵稱(chēng)和博客文章標(biāo)題一同混合檢索。
看下上面的posts表,posts_name和user_nickname類(lèi)型相同,而posts_id和user_id類(lèi)型相同,post_status和user_status類(lèi)型相同。盡管他們的名稱(chēng)不相同。
我們可以這么來(lái)檢索:
select posts_id,posts_name,posts_status from yy_posts UNION select user_id,user_nickname,user_status from yy_user
從上面的檢索結(jié)果能看出,我們將兩個(gè)表的數(shù)據(jù)組合了起來(lái)。Union檢索遇到不一致的字段名稱(chēng)時(shí)候,會(huì)使用第一條SELECT的查詢(xún)字段名稱(chēng),或者你使用別名來(lái)改變查詢(xún)字段名稱(chēng)。
區(qū)分多表上一個(gè)例子中,我們組合查詢(xún)了user表和posts表。雖然結(jié)果混合在一起沒(méi)有任何問(wèn)題,但是當(dāng)顯示到頁(yè)面的時(shí)候,我們需要給用戶(hù)和文章不同的鏈接或者其他的區(qū)分。所以我們必須確定該條記錄來(lái)自于哪張表,我們可以添加一個(gè)別名來(lái)作為表名。
select posts_id,posts_name,posts_status,"users" as table_name from yy_posts UNION select user_id,user_nickname,user_status,"posts" as table_name from yy_user
注意SQL語(yǔ)句中的"users" as table_name。對(duì)應(yīng)的是圖片里的table_name,就是我們剛剛添加用于區(qū)別表的字段。
星空幻穎,嚴(yán)穎
個(gè)人主頁(yè):segmentfault
個(gè)人博客:地址 不過(guò)好久沒(méi)有更新了,噗噗噗
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/22209.html
摘要:計(jì)算字段是在檢索過(guò)程中建立的虛擬字段,他們并不實(shí)際存在于數(shù)據(jù)庫(kù)中。計(jì)算字段和程序處理之間關(guān)系數(shù)據(jù)庫(kù)這種臨時(shí)處理數(shù)據(jù),格式化輸出的結(jié)果,都可以使用編程語(yǔ)言來(lái)實(shí)現(xiàn)。之間多個(gè)值使用逗號(hào)分割。過(guò)濾字段上面使用來(lái)組合字段。 本文主要介紹Mysql中計(jì)算字段的使用方法 我博客文章地址:http://weiya.me/item/60.html 簡(jiǎn)介 在創(chuàng)建數(shù)據(jù)庫(kù)表的時(shí)候,往往為了數(shù)據(jù)庫(kù)的各種性能,我...
閱讀 755·2021-07-25 21:37
閱讀 3668·2019-08-30 15:55
閱讀 2583·2019-08-30 15:54
閱讀 1745·2019-08-30 15:44
閱讀 3137·2019-08-30 15:44
閱讀 874·2019-08-30 15:43
閱讀 1038·2019-08-29 15:36
閱讀 3051·2019-08-29 10:58