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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- SQL高階查詢SQL
- SQL 高階語法 MERGE INTOSQL
- sql-server高階查詢SQLServer
- postgresql高階應用之合併單元格SQL
- 10箇中級到高階的SQL概念SQL
- SQL語言基礎(高階查詢)SQL
- postgresql高階應用之行轉列&彙總求和SQL
- Apache Spark SQL的高階Join連線技術ApacheSparkSQL
- 《MSSQL2008高階教程》之四“SQL優化”SQL優化
- PostgreSQL資料庫PGCM高階認證考試經驗分享SQL資料庫GC
- oracle學習筆記(十七) PL/SQL高階應用Oracle筆記SQL
- postgresql定位top cpu sqlSQL
- PostgreSQL DBA(186) - SQL Group BySQL
- SQL進階SQL
- 資料庫_SQL-PostgreSQL資料庫SQL
- postgresql怎麼執行sqlSQL
- 從高階函式--->高階元件函式元件
- PostgreSQL與Oracle的sql差異SQLOracle
- PostgreSQL repmgr高可用叢集+keepalived高可用SQL
- Flowable 6.6.0 BPMN使用者指南 - 17 高階用例 - 17.5 執行自定義SQL(Execute custom SQL)SQL
- 高階前端進階(三)前端
- 高階前端進階(七)前端
- 高階前端進階(五)前端
- PostgreSQL patroni高可用叢集SQL
- 【SQL】SQL表連線方法方式介紹(Oracle/Postgresql)SQLOracle
- 高階元件元件
- js高階JS
- MYSQL 高階MySql
- Sentinel高階
- MySQL高階MySql
- React 高階應用 -- 高階元件 Heigher Order ComponentReact元件
- postgresql dba常用sql查詢語句SQL
- 神奇的 SQL ,高階處理之 Window Functions → 打破我們的侷限!SQLFunction
- Kotlin——高階篇(二):高階函式詳解與標準的高階函式使用Kotlin函式
- React 進階(三) 高階元件React元件
- React高階指南之高階元件React元件
- Typescript 高階語法進階TypeScript
- 高階前端進階系列 - webview前端WebView