Postgresql高级特性

1.多次使用到的查询 可以存为视图,方便下次查看,当然也可以直接保存查询
CREATE VIEW myview AS
SELECT city, temp_lo, temp_hi, prcp, date, location
FROM weather, cities
WHERE city = name;
SELECT * FROM myview;
视图允许用户通过始终如一的接口封装表的结构细节,这样可以避免表结构随着应用的进化而改变。
2.外键
3.事务
原始代码
UPDATE accounts SET balance = balance - 100.00
WHERE name = ‘Alice’;
UPDATE branches SET balance = balance - 100.00
WHERE name = (SELECT branch_name FROM accounts WHERE name = ‘Alice’);
UPDATE accounts SET balance = balance + 100.00
WHERE name = ‘Bob’;
UPDATE branches SET balance = balance + 100.00
WHERE name = (SELECT branch_name FROM accounts WHERE name = ‘Bob’);
开启一个事务需要将SQL命令用BEGIN和COMMIT命令包围起来
BEGIN;
UPDATE accounts SET balance = balance - 100.00
WHERE name = ‘Alice’;
– etc etc
COMMIT;
在事务执行中不想提交(或许是我们注意到Alice的余额不足),发出ROLLBACK命令而不是COMMIT命令,这样所有目前的更新将会被取消。
BEGIN;
UPDATE accounts SET balance = balance - 100.00
WHERE name = ‘Alice’;
SAVEPOINT my_savepoint;
UPDATE accounts SET balance = balance + 100.00
WHERE name = ‘Bob’;
– oops … forget that and use Wally’s account
ROLLBACK TO my_savepoint;
UPDATE accounts SET balance = balance + 100.00
WHERE name = ‘Wally’;
COMMIT;
也可以利用保存点来以更细的粒度来控制一个事务中的语句。保存点允许我们有选择性地放弃事务的一部分而提交剩下的部分。在使用SAVEPOINT定义一个保存点后,我们可以在必要时利用ROLLBACK TO回滚到该保存点。该事务中位于保存点和回滚点之间的数据库修改都会被放弃,但是早于该保存点的修改则会被保存。
ROLLBACK TO是唯一的途径来重新控制一个由于错误被系统置为中断状态的事务块,而不是完全回滚它并重新启动。
4. 窗口函数
一个窗口函数在一系列与当前行有某种关联的表行上执行一种计算。这与一个聚集函数所完成的计算有可比之处。但是窗口函数并不会使多行被聚集成一个单独的输出行,这与通常的非窗口聚集函数不同。取而代之,行保留它们独立的标识。在这些现象背后,窗口函数可以访问的不仅仅是查询结果的当前行。
SELECT depname, empno, salary, avg(salary) OVER (PARTITION BY depname) FROM empsalary;
5.继承
示例1
CREATE TABLE capitals (
name text,
population real,
altitude int, – (in ft)
state char(2)
);

CREATE TABLE non_capitals (
name text,
population real,
altitude int – (in ft)
);

CREATE VIEW cities AS
SELECT name, population, altitude FROM capitals
UNION
更好的方案是:

CREATE TABLE cities (
name text,
population real,
altitude int – (in ft)
);

CREATE TABLE capitals (
state char(2)
) INHERITS (cities);
尽管继承很有用,但是它还未与唯一约束或外键集成,这也限制了它的可用性。
SELECT name, altitude
FROM ONLY cities
WHERE altitude > 500;
其中cities之前的ONLY用于指示查询只在cities表上进行而不会涉及到继承层次中位于cities之下的其他表。很多我们已经讨论过的命令 — SELECT、UPDATE 和DELETE — 都支持这个ONLY记号。

猜你喜欢

转载自blog.csdn.net/BeA_Trader/article/details/80910395