【SQL從一點一滴分析系列文章】為實際開發(fā)中的點點滴滴的總結(jié)曲横,從最最簡單的SQL 查詢 到 綜合分析查詢
在分析 SQL 時生年,也會同時分析 mybatis 榨乎、Hibernate 中的相關(guān)操作
點擊查看詳情
本節(jié)講述 基本的 select 查詢單表數(shù)據(jù)語句
1 對查詢數(shù)據(jù)結(jié)果集的組合(并集)
有這樣的需求棋嘲,要交來自多個表的數(shù)據(jù)組織到一起抵知,就像是一個結(jié)果集疊加到另一個上頁面一樣县爬,例如有兩個表
表一 用戶 t_user 表
表二 部門 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
查詢結(jié)果如下
我們可以看到有兩條重復(fù) 張三 數(shù)據(jù),如果要去重财喳,我們可以使用 union 運算符
select user_name,user_age
from t_user
union
select dep_user_name,dep_user_age
from t_dep
UNION 操作符用于合并兩個或多個 SELECT 語句的結(jié)果集
UNION ALL 命令和 UNION 命令幾乎是等效的察迟,不過 UNION ALL 命令會列出所有的值
Union:對兩個結(jié)果集進行并集操作斩狱,不包括重復(fù)行,同時進行默認規(guī)則的排序扎瓶;
Union All:對兩個結(jié)果集進行并集操作所踊,包括重復(fù)行,不進行排序概荷;
2 組合兩個表中相關(guān)的行
例如這種情況秕岛,要顯示用戶表中所有用戶的姓名,以及每個員工的心情日志误证,這些數(shù)據(jù)存儲在兩個獨立的表中
select u.user_name,d.dep_user_flag
from t_user u,t_dep d
where u.user_id = d.dep_user_id
這兩個表中通過 用戶的 id 來關(guān)聯(lián)继薛,用戶表中 user_id ,部門表中愈捅,dep_user_id 為用戶在用戶表中對應(yīng)的id.
3 對查詢數(shù)據(jù)結(jié)果集的組合(交集)
需要查找兩個表中共同的行遏考,但是有多個列可以用來聯(lián)接這兩個表,如下
在 MySql 和 SQL Server 中蓝谨,可使用多個聯(lián)接條件灌具,將 user 表 與 dep 表中聯(lián)接起來
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 子句聯(lián)接
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 表中查找 子查詢結(jié)果中沒有的行
Oracle 中
select u.user_name from t_user u
minus
select d.dep_user_name from t_dep d
minus指令是運用在兩個 SQL 語句上。它先找出第一個 SQL 語句所產(chǎn)生的結(jié)果像棘,然后看這些結(jié)果有沒有在第二個 SQL 語句的結(jié)果中稽亏。如果有的話,那這一筆資料就被去除缕题,而不會在最后的結(jié)果中出現(xiàn)
DB2 和 PostgreSQL 中使用集合操作 except
select u.user_name from t_user u
except
select d.dep_user_name from t_dep d
5 向查詢中增加聯(lián)接而不影響其他聯(lián)接
例如 用戶信息表 user ,部門信息工作表 dep 截歉,員工獎勵表 bonus 表,我們需要返回所有的員工信息烟零、他們工作部門的心情信息瘪松、以及所獲得的獎勵,在這里锨阿,并不是每個員工都有部門心情信息宵睦,也并不是每個員工有獎勵信息,但是我們希望把所有的信息查詢出來墅诡,這時我們可以這樣來寫
在 MySQL 壳嚎、DB2、 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 來關(guān)聯(lián)
完結(jié)