PostgreSQL:高階 SQL
RETURNING
pg 中支援 returning 子句,可以實現相應的功能。目前 PostgreSQL 支援 insert、delete、update 的 returning。
-
insert returning 返回的是新插入的值。
-
delete returning 返回的是被刪除的值。
-
update returning 返回的是更新後的值,不能返回更新前的值。
示例
-- 建立示例表 CREATE TABLE test(id serial, name varchar(20)); -- 插入 insert into test(name) values('aa') returning name; -- 修改 update test set name='bb' where id=1 returning name; -- 刪除 DELETE FROM test_re WHERE id = 1 RETURNING name;
UPSERT
支援 INSERT 語句定義 ON CONFLICT DO UPDATE/IGNORE 屬性,當插入 SQL 違反約束的情況下定義動作,而不丟擲錯誤
示例
-- 建立測試資料表 create table t (id int constraint idx_t_id primary key,name varchar(20) constraint cst_name not null); insert into t values(1,'rudy'); -- 根據欄位,當 id 衝突時更新 name 值 insert into t values(1,'rudy1') ON CONFLICT(id) do update set name=EXCLUDED.name; postgres=# select * from t; id | name ----+------- 1 | rudy1 2 | rudy3 -- 也可以直接指定約束名,此時不需要欄位,在實際應用中,最好使用欄位名 insert into t values(2,'rudy3') ON CONFLICT ON CONSTRAINT idx_t_id do update set name=EXCLUDED.name ; postgres=# select * from t; id | name ----+------- 1 | rudy1 2 | rudy3 (2 rows) -- 根據where條件選擇性更新,由於id沒有大於10的資料,故更新0條資料 insert into t values(2,'rudy4') ON CONFLICT ON CONSTRAINT idx_t_id do update set name=EXCLUDED.name where t.id>10 ; postgres=# select * from t; id | name ----+------- 1 | rudy1 2 | rudy3 -- 只插入滿足條件的資料行 insert into t values(2,'rudy4'),(3,'rudy3') ON CONFLICT(id) do nothing ; postgres=# select * from t; id | name ----+------- 1 | rudy1 2 | rudy3 3 | rudy3
TABLESAMPLE
語法
SELECT * FROM tablename [ TABLESAMPLE sampling_method ( argument [, …] ) [ REPEATABLE ( seed ) ] ]
TABLESAMPLE 子句表示應該用指定的 sampling_method 來檢索表中行的子集。主要包括兩種取樣 方法:BERNOULLI 和 SYSTEM。
原始抽樣方式
select * from test01 order by random() limit 2;
SYSTEM 抽樣方式
SYSTEM 抽樣方式為隨機抽取表上資料塊上的資料,理論上每個塊被檢索的機率是相同的,被選中塊中的所有行都會被返回。
-- 抽樣銀子為 0.01,返回 1% 的資料 -- ctid 第一位表示邏輯資料塊編號,第二位表示邏輯塊上的資料的邏輯編號 SELECT ctid,* FROM test01 TABLESAMPLE SYSTEM(0.01); -- 驗證 -- 檢視塊數量 SELECT relname, relpages FROM pg_class WHERE relname='test01'; -- 資料量/relpages = 每個塊記錄數 -- 返回量:每個記錄數*塊數
BERNOULLI
BERNOULLI 為隨機抽取表的資料行資料,抽樣級別為資料行級別。比 SYSTEM 數量更準確,但效能上低很多
-- 抽樣銀子為 0.01,返回 1% 的資料 -- ctid 第一位表示邏輯資料塊編號,第二位表示邏輯塊上的資料的邏輯編號 SELECT ctid,* FROM test01 TABLESAMPLE BERNOULLI(0.01); -- 驗證 -- ctid 顯示資料位於不同塊上
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31490526/viewspace-2738613/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- [MS SQL]高階SQL總結SQL
- SQL高階查詢SQL
- oracle sql 高階連線OracleSQL
- postgresql高階應用之合併單元格SQL
- sql-server高階查詢SQLServer
- sql之20高階查詢SQL
- postgresql高階應用之行轉列&彙總求和SQL
- SQL語言基礎(高階查詢)SQL
- 10箇中級到高階的SQL概念SQL
- 效能優化部分——高階SQL優化2優化SQL
- 15 個常用的 SQL Server 高階語法SQLServer
- PostgreSQL資料庫PGCM高階認證考試經驗分享SQL資料庫GC
- Apache Spark SQL的高階Join連線技術ApacheSparkSQL
- .NET高階工程師面試題之SQL篇工程師面試題SQL
- 從高階函式--->高階元件函式元件
- oracle學習筆記(十七) PL/SQL高階應用Oracle筆記SQL
- Oracle與Mysql的高階查詢與難點sqlOracleMySql
- CSS高階進階CSS
- “高階”的程式語言是否真的高階?
- SQL Server 2008 高階查詢優化概念SQLServer優化
- 操作vs中sql資料來源的高階選項SQL
- MYSQL 高階MySql
- MySQL高階MySql
- 高階元件元件
- js高階JS
- java高階Java
- 高階前端進階(五)前端
- 高階前端進階(七)前端
- 高階前端進階(三)前端
- postgresql定位top cpu sqlSQL
- PostgreSQL SQL執行流程SQL
- PostgreSQL patroni高可用叢集SQL
- PostgreSQL repmgr高可用叢集+keepalived高可用SQL
- 《MSSQL2008高階教程》之四“SQL優化”SQL優化
- SQL Server 2005資料頁讀取--高階掃描SQLServer
- SQL的order by 高階使用·指定一條資訊排列第一條SQL
- Typescript 高階語法進階TypeScript
- React 進階(三) 高階元件React元件