国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

MySQL必知必會:組合查詢(Union)

用戶83 / 3151人閱讀

摘要:本文參考必知必會工作實踐融合組合查詢定義在大多數開發中,使用一條查詢就會返回一個結果集。在查詢結果集中幫我們自動去除了重復的行重復的行是李四,把兩條李四合并了。注意由于在多表組合查詢時候,可能表字段并不相同。

本篇文章主要介紹使用Union操作符將多個SELECT查詢組合成一個結果集。本文參考《Mysql必知必會》+工作實踐融合

組合查詢 定義

在大多數開發中,使用一條SELECT查詢就會返回一個結果集。如果,我們想一次性查詢多條SQL語句,并將每一條SELECT查詢的結果合并成一個結果集返回。就需要用到Union操作符,將多個SELECT語句組合起來,這種查詢被稱為并(Union)或者復合查詢。

組合查詢適用于下面兩種情境中:

從多個表中查詢出相似結構的數據,并且返回一個結果集

從單個表中多次SELECT查詢,將結果合并成一個結果集返回。

演示

我們通過一個簡單的示例來認識一下Union組合查詢。

創建一個用戶表

首先分兩次查詢用戶表,然后再組合查詢

select user_id,user_nickname,user_status from yy_user where user_status = 1 // 第一次查詢

select user_id,user_nickname,user_status from yy_user where user_id > 3 // 第二次查詢

第一條SQL查詢了user_status=1的用戶,第二條查詢了user_id > 3的用戶

下面我們組合這兩條SQL語句:

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

這條語句由前面的兩條語句組成,通過Union組合了兩條SELECT,并且把結果集合并后輸出。這條組合查詢也可以使用同等where語句來替代:

select user_id,user_nickname,user_status from yy_user where user_status = 1 or user_id > 3;
組合查詢和Where

whereUnion在多數情況下都可以實現相同的結果集。where可以實現的語句一定可以使用Union語句來實現。但是反過來就不一定正確了,比如下面將會說到的去重和不去重。

另外,在單表中使用Unionwhere多條件查詢較為復雜。而從多張表中獲取數據,使用Union會相對于簡單些。

Union使用規則

Union有他的強大之處,詳細介紹之前,首先明確一下Union的使用注意規則。

Union必須由兩條或者兩條以上的SELECT語句組成,語句之間使用Union鏈接。

Union中的每個查詢必須包含相同的列、表達式或者聚合函數,他們出現的順序可以不一致(這里指查詢字段相同,表不一定一樣)

列的數據類型必須兼容,兼容的含義是必須是數據庫可以隱含的轉換他們的類型

包含重復、去除重復

我們觀察一下上面兩條語句,第一條SELECT返回了2條數據;第二條SELECT也返回了2條數據。

但是Union最終的結果返回了3條數據,而不是4條。mysql在查詢結果集中幫我們自動去除了重復的行(重復的行是李四),把兩條李四合并了。

一般情況下這樣結果是好的,但是如果需要的情況下,我們可以使用Union All操作符來取消自動合并功能。

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沒有幫我們去除重復,在查詢結果中,我們也看到了兩條重復的李四。

之前我們說過whereUnion的區別,這里Union All可以返回重復的數據,就是where子句完成不了的工作。

結果排序

使用Union組合查詢時,只能使用一條order by子句對結果集進行排序,而且必須出現在最后一條出現的SELECT語句之后。因為`Union不允許對于部分結果集進行排序,只能針對最終檢索出來的結果集進行排序。

注意:由于在多表組合查詢時候,可能表字段并不相同。所以,在對于結果集排序的時候需要使用檢索出來的共同字段。

(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必須存在于結果集中。

多表組合查詢

大型項目中數據經常分布在不同的表,檢索的時候需要組合查詢出來。多表查詢的時候,并不要求兩個表完全相同,只需要你檢索的字段結構相似就可以。

我們已經有一張user表,假設搜索時候我們需要將用戶昵稱和博客文章標題一同混合檢索。

看下上面的posts表,posts_nameuser_nickname類型相同,而posts_iduser_id類型相同,post_statususer_status類型相同。盡管他們的名稱不相同。

我們可以這么來檢索:

select posts_id,posts_name,posts_status from yy_posts
UNION
select user_id,user_nickname,user_status from yy_user

從上面的檢索結果能看出,我們將兩個表的數據組合了起來。Union檢索遇到不一致的字段名稱時候,會使用第一條SELECT的查詢字段名稱,或者你使用別名來改變查詢字段名稱。

區分多表

上一個例子中,我們組合查詢了user表和posts表。雖然結果混合在一起沒有任何問題,但是當顯示到頁面的時候,我們需要給用戶和文章不同的鏈接或者其他的區分。所以我們必須確定該條記錄來自于哪張表,我們可以添加一個別名來作為表名。

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語句中的"users" as table_name。對應的是圖片里的table_name,就是我們剛剛添加用于區別表的字段。

星空幻穎,嚴穎

個人主頁:segmentfault

個人博客:地址 不過好久沒有更新了,噗噗噗

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/22209.html

相關文章

  • Mysql必知必會(5):計算字段的使用

    摘要:計算字段是在檢索過程中建立的虛擬字段,他們并不實際存在于數據庫中。計算字段和程序處理之間關系數據庫這種臨時處理數據,格式化輸出的結果,都可以使用編程語言來實現。之間多個值使用逗號分割。過濾字段上面使用來組合字段。 本文主要介紹Mysql中計算字段的使用方法 我博客文章地址:http://weiya.me/item/60.html 簡介 在創建數據庫表的時候,往往為了數據庫的各種性能,我...

    高璐 評論0 收藏0

發表評論

0條評論

用戶83

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<