目錄
一、前言
二、GaussDB? UNION/UNION ALL
1、GaussDB UNION 操作符
2、語法定義
三、GaussDB實驗示例
1、創(chuàng)建實驗表
2、合并且除重(UNION)
3、合并不除重(UNION ALL)
4、合并帶有WHERE子句SQL結(jié)果集(UNION ALL)
5、業(yè)務(wù)邏輯除重后合并(UNION ALL)
四、GaussDB UNION常見錯誤
1、“each UNION query must have the same number of columns”
2、“UNION types timestamp without time zone and text cannot be matched”
五、小結(jié)
一、前言
SQL(結(jié)構(gòu)化查詢語言)是一種用于管理關(guān)系型數(shù)據(jù)庫的標(biāo)準(zhǔn)語言。它允許用戶通過使用SQL語言來操作數(shù)據(jù)庫中的數(shù)據(jù)。而在SQL中,UNION是一個非常強大的功能,它可以將多個SELECT語句的結(jié)果合并成一個結(jié)果集。本文將以GaussDB數(shù)據(jù)庫為例,介紹一下UNION操作符的使用。
二、GaussDB? UNION/UNION ALL
1、GaussDB UNION 操作符
GaussDB UNION 操作符用于合并兩個或多個 SELECT 語句的結(jié)果集。請注意,UNION 內(nèi)部的每個 SELECT 語句必須擁有相同數(shù)量的列。列也必須擁有相似的數(shù)據(jù)類型。同時,每個 SELECT 語句中的列的順序必須相同。
2、語法定義
1)UNION語法
SELECT column1
,column2
,……
FROM table1
[WHERE condition]
UNION
SELECT column1
,column2
,……
FROM table2
[WHERE condition]
2)UNION ALL 語法
SELECT column1
,column2
,……
FROM table1
[WHERE condition]
UNION ALL
SELECT column1
,column2
,……
FROM table2
[WHERE condition]
說明:UNION在合并兩個或多個集合時會執(zhí)行去重操作,而UNION ALL則直接將兩個或者多個結(jié)果集合并,不執(zhí)行去重。 另外,執(zhí)行去重會消耗大量的時間,因此,在一些實際應(yīng)用場景中,如果通過業(yè)務(wù)邏輯已確認(rèn)了兩個集合不存在重重復(fù)數(shù)據(jù)時,可直接用UNION ALL? 替代UNION,以便提升性能。
三、GaussDB實驗示例
本文以GaussDB數(shù)據(jù)庫為實驗平臺,
1、創(chuàng)建實驗表并初始化
1)學(xué)生信息表student(ID、姓名、性別、城市)
--創(chuàng)建學(xué)生信息表
CREATE table student(
sId VARCHAR(10) NOT NULL
,sname VARCHAR(10) NOT NULL
,ssex VARCHAR(10) NOT NULl
,scity VARCHAR(10) NOT NULl
);
--初識化實驗數(shù)據(jù)
INSERT INTO student VALUES('s01' , '趙雷' , '男', 'XIAN');
INSERT INTO student VALUES('s02' , '錢電' , '男', 'YUNNAN');
INSERT INTO student VALUES('s03' , '孫風(fēng)' , '男', 'NIXIA');
INSERT INTO student VALUES('s04' , '李云' , '男', 'XIZANG');
INSERT INTO student VALUES('s05' , '周梅' , '女', 'XINJIANG');
INSERT INTO student VALUES('s06' , '吳蘭' , '女', 'CHENGDU');
INSERT INTO student VALUES('s07' , '鄭竹' , '女', 'XIAN');
INSERT INTO student VALUES('s08' , '張三' , '女', 'CHENGDU');
--查看結(jié)果集
SELECT * FROM student;
2)教師信息表teacher(ID、姓名、性別、城市)?
--創(chuàng)建教師信息表
CREATE table teacher(
teid VARCHAR(10) NOT NULL
,tname VARCHAR(10) NOT NULL
,tsex VARCHAR(10) NOT NULL
,tcity VARCHAR(10) NOT NULL
);
--初始化實驗數(shù)據(jù)
INSERT INTO teacher VALUES('t01' , '張磊', '男', 'XIAN');
INSERT INTO teacher VALUES('t02' , '李強', '男', 'BEIJING');
INSERT INTO teacher VALUES('t03' , '王剛', '男', 'XINJIANG');
--查看結(jié)果集
SELECT * FROM teacher;
2、合并且除重(UNION)
--獲取學(xué)生和教師所屬的城市,并按城市名稱首字母升序排序。
SELECT t.city
FROM (
SELECT scity AS city
FROM student
UNION
SELECT tcity AS city
FROM teacher
) t
ORDER BY t.city ASC;
結(jié)果集如下截圖,且城市數(shù)據(jù)不存在重復(fù):
3、合并不除重(UNION ALL)
--獲取所有學(xué)生和教師所屬的城市,并按城市名稱首字母升序排序。
SELECT t.city
FROM (
SELECT scity AS city
FROM student
UNION ALL
SELECT tcity AS city
FROM teacher
) t
ORDER BY t.city ASC;
結(jié)果集如下截圖,羅列了所有城市數(shù)據(jù):
4、合并帶有WHERE子句SQL結(jié)果集(UNION ALL)
--獲取來自'XIAN'的學(xué)生和教師的所有信息,并按學(xué)生和教師的編號升序排序。
SELECT t.*
FROM
(SELECT Sid AS id
,Sname AS name
,Ssex AS sex
,Scity AS city
FROM student WHERE Scity='XIAN'
UNION ALL
SELECT Tid AS id
,Tname AS name
,Tsex AS sex
,Tcity AS city
FROM teacher WHERE Tcity='XIAN') t
ORDER BY t.id ASC;
結(jié)果集如下截圖,羅列了'XIAN'的學(xué)生和教師的所有信息:
5、業(yè)務(wù)邏輯除重后合并(UNION ALL)
在一些業(yè)務(wù)場景下,比如上游系統(tǒng)提供的兩張表或者多張表之間互相不會存重復(fù)數(shù)據(jù),且自身也不存在重復(fù)數(shù)據(jù),則為了提升合并時SQL性能、減少SQL執(zhí)行時間,則選擇UNION ALL操作符。
四、GaussDB UNION常見錯誤
1、“each UNION query must have the same number of columns”
解決思路:根據(jù)提示查看兩個表的表結(jié)構(gòu),看字段數(shù)量是否一支。
2、“UNION types timestamp without time zone and text cannot be matched”
解決思路:根據(jù)提示查看兩個表的表結(jié)構(gòu),看字段類型是否一致。
?
五、小結(jié)
在實際業(yè)務(wù)場景中,無論選擇GaussDB數(shù)據(jù)庫,還是其他關(guān)系型數(shù)據(jù)庫,在使用UNION和UNION ALL 時,都需要注意以下幾點:文章來源:http://www.zghlxwxcb.cn/news/detail-660673.html
- 左右兩側(cè)的SQL字段數(shù)量和字段類型需要保持一致;
- 業(yè)務(wù)需求是否需要考慮數(shù)據(jù)除重(合并前除重還是合并時除重);
- 根據(jù)表中數(shù)據(jù)量的大小,需要對SQL的執(zhí)行效率進行評估,從而考慮是否需要選擇臨時表進行過渡后再合并;
- 需要考慮SQL編寫的復(fù)雜度,不能為了寫SQL而寫SQL,需要結(jié)合業(yè)務(wù)需求進行選擇。
——結(jié)束文章來源地址http://www.zghlxwxcb.cn/news/detail-660673.html
到了這里,關(guān)于GaussDB數(shù)據(jù)庫SQL系列-UNION & UNION ALL的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!