PostgreSQL資料查詢--詳細速查手冊
**
宣告:
- 本文資料多整理自權威書籍,並且
- 所有SQL均在pgAdmin 4.1.6 + PostgreSQL 9.6.5 測試下執行通過!
- 請放心使用。
- (測試中表名存在模式限制,文中均已略去)
**
employee表:
eid [PK] | ename | eage | esalary | esex | eemail |
---|---|---|---|---|---|
integer | character varying(20) | integer | integer | character varying(1) | character varying(32) |
PostgreSQL資料查詢–詳細速查手冊
一、基本查詢語句
1.1 SELECT語句的基本格式:
SELECT
{* | <欄位列表>}
[
{FROM <表1>,<表2>..}
[WHERE <表示式>]
[GROUP BY <欄位名>]
[HAVING <表示式> [{<操作符1> <表示式1>}][..]]
[ORDER BY <欄位名> ASC | DESC ]
[LIMIT <行數> [ OFFSET <偏移量> ]]
]
約定:
- {} 內必選
- [] 內可選
- <> 內參數: 表示式、欄位、引數
- | 或者
二、單表查詢
2.01 查詢所有欄位
語法:
select * from 表名;
例:
select * from mytable;
2.02 查詢指定欄位
語法:
select 欄位名 from 表名;
例:
select id,name,age from employee;
2.03 查詢指定記錄
語法:
select *|欄位名 from 表名 where 欄位=值;
where支援的條件判斷符:
操作符 | 說明 |
---|---|
= | 等於 |
<> , != | 不等於 |
< | 小於 |
<= | 小於等於 |
> | 大於 |
>= | 大於等於 |
between A and B | 在A與B之間 |
例1:
select * from employee where age>=18;
例2:
select age,name from employee where salary between 2000 and 3000;
2.04 範圍查詢--IN 的用法
語法:
select *|欄位名 from 表名 where 欄位 in (列表);
例1: 本命年員工
select id,name from employee where age in (24,36,48,60);
例2: 某列表中員工 (char varing[]型別不支援)
select * from employee where name in ('張三','李四','王五');
2.05 範圍查詢--BETWEEN AND 的用法
語法:在值A到B之間(包括A,B)
select *|欄位名 from 表名 where 欄位 between A and B;
例1:
select name from employee where age between 18 and 20;
2.06 模糊查詢--LIKE 的用法
語法:欄位包含字串strA的記錄,一般搭配 % 匹配任意字元。
select *|欄位名 from 表名 where 欄位 like strA;
例1:所有姓張的,(char varing[]型別不支援)
select * from employee where name like '張%';
例2:所有山東人,(char varing[]型別不支援)
select * from employee where hometown like '%山東%';
2.07 多條件查詢--AND 、 OR 的用法
語法:and並且關係,or或者關係
select *|欄位名 from 表名 where 欄位1 條件1 and 欄位2 條件2;
select *|欄位名 from 表名 where 欄位1 條件1 or 欄位2 條件2;
例1: 四十歲以上(且)姓張的.
select * from employee where name like '張%' and age >=40;
例2: 四十歲以上或者薪水過萬的.
select * from employee where salary >=10000 or age >=40;
2.07x 多表查詢
語法:與條件聯合使用,否則將造成 m*n 倍增.m,n為記錄數.
select 表名1.欄位1,別名2.欄位2 from 表名1,表名2 [別名2] <條件>;
例:
select u.name,t.name from user u,team t where t.id=u.team_id;
2.08 空值查詢 IS NULL
語法: IS NULL
select *|欄位名 from 表名 where 欄位1 條件1 and 欄位2 條件2;
例2: 郵箱為空的.
select * from employee where email is null;
2.09 分組查詢:--GROUP BY的用法
GROUP BY 查詢分組情況
/不會——————————-
語法: GROUP BY 欄位1,按 欄位1 分組。HAVING+條件 可以對分組進行篩選。
select *|欄位名 from 表名 group by 欄位;
例1: 按性別分組.
select * from employee group by sexy;
例1: .
select id,name,age from employee group by age having count(age)>=10;
ERROR*
column “mytable.ename” must appear in the GROUP BY clause or be used in an aggregate function
——————————-不會/
添坑:
事實上group by 會將select <欄位1> 結果集中<欄位1>相同的記錄合併,
所以,select <欄位> 指定的欄位必須
1. 放入group by後,或者
2. 放入having後聚合函式中.
而且,group by 一般用來統計記錄的分組情況,比如:分組,種類,部門.
結合having 聚合
select esex,count(*) as total from employee group by esex order by esex DESC;
esex | total |
---|---|
F | 19 |
M | 23 |
2.10 查詢結果:去重複--DISTINCT的用法
DISTINCT <欄位> ,返回<欄位>不同的記錄
select distinct *|單欄位名 from 表名;
例1:
select distinct *|單欄位名 from 表名;
2.11 查詢結果:排序--ORDER BY 的用法
ORDER BY 對查詢結果排序
語法: ASC升序、DESC降序。[ASC|DESC]
select *|欄位名 from 表名 order by 欄位1 ASC|DESC;
例1:按年齡增排序;查詢所有員工.
select * from employee order by age ASC;
例2:與GROUP BY聯用;按性別分組,按年齡排序.
select * from employee group by sex order by age ASC;
2.12 查詢結果:限制數量--LIMIT 的用法
語法: LIMIT A [OFFSET B]; 限制查詢數量A個,偏移量B個.(從第B條往後A條資料)
select *|欄位名 from 表名 limit A offset B;
例1:每頁100條資料,偏移量300。(相當於第4頁)
select * from employee limit 100 offset 300;
三、聚合函式查詢
聚合函式
函式 | 描述 |
---|---|
COUNT() | 統計某列的行數,*則是表的欄位數,指定列某記錄為null時此條將被忽略 |
AVG() | 統計某列的平均值,多列需要多次使用avg() |
MAX() | 求某列的最大值,支援日期和字串比較 |
MIN() | 求某列的最小值,同max() |
SUM() | 求某列的和,指定列某記錄值為null時此條將被忽略 |
3.01 COUNT()函式
語法: [as str] 別名str (放到 str 列中)
select [<欄位>,]count(欄位) [as str] from 表名;
例1:統計所有資料數量
select count(*) as total from employee;
例2:按性別統計員工數量
select esex,count(*) as total from employee group by esex;
3.02 SUM()函式
語法: [as str] 別名str (放到 str 列中)
select [<欄位>,]sum(欄位) [as str] from 表名;
例1:統計薪水總和
select sum(salary) as total from employee;
例2:統計不同性別的薪水情況
select sex,sum(salary) as total from employee group by sex;
3.03 AVG()函式
語法: [as str] 別名str (放到 str 列中)
select [<欄位>,]avg(欄位) [as str] from 表名;
例1:統計年齡平均值
select avg(age) as average from employee;
例2:統計不同性別的年齡平均值
select sex,avg(age) as total from employee group by sex;
3.04 MAX()函式
語法: [as str] 別名str (放到 str 列中)
select [<欄位>,]max(欄位) [as str] from 表名;
例1:統計薪水最大值
select max(salary) as maximum from employee;
例2:統計不同性別的薪水最大值
select sex,max(salary) as maximum from employee group by sex;
3.05 MIN()函式
同MAX()的用法。
四、連線查詢
4.01 內連線查詢
4.02 外連線查詢
4.03 複合條件連線查詢
五、子查詢
5.01 ANY、SOME
滿足任意一個即可,any some 等價
where id > any (1,2,3)
where age > some (select age from table2…)
5.02 ALL
必須滿足所有
where age > all (1,2.3)
5.03 EXISTS
滿足exists子查詢不為空 時進行外圍查詢。
select * form table where exists (select c1 form table2)
5.04 IN
where id in (1,2,3);
where id in (select ..)
六、合併查詢結果--UNION [ALL]
union 將幾次查詢結果合併到一起,(從後面)連線起來。這就要求幾次查詢的欄位名(別名也可以)、資料型別全部一致。
ALL將不合並重復欄位。
select c1,c2 from table1
union
select c1,c2 from table2
select c3,c4 from table3
union all
select c1,c2 from table2
七、表和欄位的別名
7.01 表的別名
7.02 欄位的別名
八、正則表示式查詢
8.01 以特定字元(串)開頭、結尾的記錄
8.02 . 號代替一個字元
8.03 *、+ 匹配多個字元
8.04 匹配指定字串
8.05 匹配指定字元中的任意一個
8.06 匹配指定字元以外的字元
8.07 使用{M}、{M,N}指定字串連續出現的次數
九、FAQ
9.01 DISTINCT可以應用於所有的列嗎?
9.02 ORDER BY可以和LIMIT混用嗎?
9.03 單引號什麼時候用?
9.04 WHERE子句必須使用()嗎
9.05 為什麼萬用字元格式正確,卻沒有查出理想的資料?
參考資料:
- <<PostgresSQL 9 從零開始學>> ISBN 978-7-302-31673-2