SQL查詢單表數據之組合(三)

【SQL從一點一滴分析系列文章】爲實際開發中的點點滴滴的總結,從最最簡單的SQL 查詢 到 綜合分析查詢 在分析 SQL 時,也會同時分析 mybatis 、Hibernate 中的相關操做 點擊查看詳情sql

本節講述 基本的 select 查詢單表數據語句mybatis

1 對查詢數據結果集的組合(並集)

有這樣的需求,要交來自多個表的數據組織到一塊兒,就像是一個結果集疊加到另外一個上頁面同樣,例若有兩個表spa

表一 用戶 t_user 表 .net

在這裏插入圖片描述
表二 部門 t_dep 表
在這裏插入圖片描述
咱們要顯示 t_user 表中的用戶的 名字和年齡以及 t_dep 表中用戶的名字年齡,咱們可使用 union all 來把多個表中的行組合到一塊兒

select user_name,user_age 
    from t_user 
    union all 
select dep_user_name,dep_user_age 
    from t_dep
複製代碼

查詢結果以下 3d

在這裏插入圖片描述
咱們能夠看到有兩條重複 張三 數據,若是要去重,咱們可使用 union 運算符

select user_name,user_age 
    from t_user 
    union  
select dep_user_name,dep_user_age 
    from t_dep
複製代碼

UNION 操做符用於合併兩個或多個 SELECT 語句的結果集 UNION ALL 命令和 UNION 命令幾乎是等效的,不過 UNION ALL 命令會列出全部的值日誌

Union:對兩個結果集進行並集操做,不包括重複行,同時進行默認規則的排序; Union All:對兩個結果集進行並集操做,包括重複行,不進行排序;code

2 組合兩個表中相關的行

例如這種狀況,要顯示用戶表中全部用戶的姓名,以及每一個員工的心情日誌,這些數據存儲在兩個獨立的表中cdn

select u.user_name,d.dep_user_flag
     from t_user u,t_dep d
where u.user_id = d.dep_user_id
複製代碼

這兩個表中經過 用戶的 id 來關聯,用戶表中 user_id ,部門表中,dep_user_id 爲用戶在用戶表中對應的id.blog

3 對查詢數據結果集的組合(交集)

須要查找兩個表中共同的行,可是有多個列能夠用來聯接這兩個表,以下排序

在 MySql 和 SQL Server 中,可以使用多個聯接條件,將 user 表 與 dep 表中聯接起來

select u.user_name as userName,d.dep_user_flag userFlag,d.dep_user_age as age
    from t_user u,t_dep d
where 
    u.user_name = d.dep_user_name 
    and 
    u.user_age = d.dep_user_age
複製代碼

或者使用 join on 子句聯接

select u.user_name as userName,d.dep_user_flag userFlag,d.dep_user_age as age
    from t_user u 
	join t_dep d
	on  (
		u.user_name = d.dep_user_name 
		and 
		u.user_age = d.dep_user_age)
複製代碼
4 從一個表中查詢另外一個表沒有的值(兩個表的補集)

MySQL 和 SQL Server 中

select u.user_name as userName,u.user_age as age
    from t_user u
where  u.user_name not in (select dep_user_name from t_dep)
複製代碼

使用子名查出 dep 表中全部的 user_name,而後外層查詢則從 user 表中查找 子查詢結果中沒有的行

Oracle 中

select u.user_name from t_user u
minus 
select d.dep_user_name from t_dep d
複製代碼

minus指令是運用在兩個 SQL 語句上。它先找出第一個 SQL 語句所產生的結果,而後看這些結果有沒有在第二個 SQL 語句的結果中。若是有的話,那這一筆資料就被去除,而不會在最後的結果中出現

DB2 和 PostgreSQL 中使用集合操做 except

select u.user_name from t_user u
except 
select d.dep_user_name from t_dep d
複製代碼
5 向查詢中增長聯接而不影響其餘聯接

例如 用戶信息表 user ,部門信息工做表 dep ,員工獎勵表 bonus 表,咱們須要返回全部的員工信息、他們工做部門的心情信息、以及所得到的獎勵,在這裏,並非每一個員工都有部門心情信息,也並非每一個員工有獎勵信息,可是咱們但願把全部的信息查詢出來,這時咱們能夠這樣來寫

在 MySQL 、DB二、 PostgreSQL 和SQL Server 中

select u.user_name,u.user_age,d.dep_user_flag,b.bonus_count
from t_user u 

left join t_dep d on d.dep_user_id = u.user_id 
left join t_bonus b on b.bonus_user_id = u.user_id 


複製代碼

在這裏插入圖片描述
這三個表中 分別經過 user_id 來關聯


完結

相關文章
相關標籤/搜索