1. 程式人生 > >PostgreSQL資料查詢--詳細速查手冊

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 為什麼萬用字元格式正確,卻沒有查出理想的資料?

參考資料:

  1. <<PostgresSQL 9 從零開始學>> ISBN 978-7-302-31673-2