資料庫 創建資料庫: 指定用戶名創建資料庫: 刪除資料庫: 訪問資料庫: 互動式環境下資料庫內執行 會進入到一個新頁面,要返回按 退出資料庫: 、`exit quit` 表 創建表: 查看表結構: 創建表時 表示註釋, 到行尾的東西都會被忽略 刪除表: 表中增加行: 命令可以一次性向表中裝填大量數據 ...
資料庫
創建資料庫:
createdb dbname
指定用戶名創建資料庫:
createdb -U username dbname
刪除資料庫:
dropdb dbname
訪問資料庫:
psql [-U username] dbname
互動式環境下資料庫內執行
select version();
會進入到一個新頁面,要返回按q
退出資料庫:
\q
、exit
、quit
表
創建表:
CREATE TABLE weather (city varchar(80), temp_low int, temp_high int, date date);
查看表結構:
\d tablename;
創建表時
--
表示註釋,--
到行尾的東西都會被忽略刪除表:
drop table tablename;
表中增加行:
insert into weather values('San Francisco', 46, 50, 0.25, '1994-11-27');
COPY
命令可以一次性向表中裝填大量數據:COPY weather FROM '/home/user/weather.txt';
查詢表:
select city, (temp_lo+temp_hi)/2, date from weather;
查詢結果消除重覆行:
SELECT DISTINCT city FROM weather;
指定表的列查詢:
select weather.city, cities.location from weather, cities where cities.name = weather.city;
設置別名:
select * from weather w, cities c where w.city = c.name;
- 聚集函數:
最大值:
select max(temp_lo) from weather;
子查詢:
select city from weather where temp_lo = (select max(temp_lo) from weather);
組合:
select city, max(temp_lo) from weather group by city;
Having:
select city, max(temp_lo) from weather group by city having max(temp_lo) < 40;
like:
select city, max(temp_lo) from weather where city like 's%' group by city having max(temp_lo) < 40;
where 和 having:
WHERE在分組和聚集計算之前選取輸入行(因此,它控制哪些行進入聚集計算), 而HAVING在分組和聚集之後選取分組行。因此,WHERE子句不能包含聚集函數;因為試圖用聚集函數判斷哪些行應輸入給聚集運算是沒有意義的。相反,HAVING子句總是包含聚集函數(嚴格說來,你可以寫不使用聚集的HAVING子句, 但這樣做很少有用。同樣的條件用在WHERE階段會更有效)
更新行:
update weather set temp_hi = temp_hi - 2 where date > '1994-11-28';
刪除行:
delete from weather where city = 'Hayward';
- 註:
delete from tablename;
會直接刪除表中所有行而刪除之前系統不會請求確認
- 註:
增加主鍵:
alter table weather add primary key (city);
增加外鍵:
alter table weather add constraint foreignkeyName foreign key (city) references cities(name);
高級特性
視圖:
create view myview as select city, temo_lo, date, location from weather, cities where city = name;
select * from myview;
事務
開啟一個事務需要將SQL命令用
BEGIN
和COMMIT
命令包圍起來,如下:在事務中如果並不想提交,可以發出
ROLLBACK
命令而不是COMMIT
,這樣所有目前的更新將被取消
BEGIN;
UPDATE accounts SET balance = balance - 100.00
WHERE name = 'Alice';
-- etc etc
COMMIT;
- 保存點
在使用
SAVEPOINT
定義一個保存點後,我們可以在必要時利用ROLLBACK TO
回滾到該保存點。該事務中位於保存點和回滾點之間的資料庫修改都會被放棄,但是早於該保存點的修改則會被保存在回滾到保存點之後,它的定義依然存在,因此我們可以多次回滾到它。如果確定不再需要回滾到特定的保存點,它可以被釋放以便系統釋放一些資源。記住不管是釋放保存點還是回滾到保存點都會釋放定義在該保存點之後的所有其他保存點
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;
視窗函數
- 一個視窗函數調用總是包含一個直接跟在視窗函數名及其參數之後的
OVER
子句。這使得它從句法上和一個普通函數或非視窗函數區分開來。OVER
子句決定究竟查詢中的哪些行被分離出來由視窗函數處理。 OVER
子句中的PARTITION BY
子句指定了將具有相同PARTITION BY
表達式值的行分到組或者分區- eg:
SELECT depname, empno, salary, rank() OVER (PARTITION BY depname ORDER BY salary DESC) FROM empsalary;
- 視窗函數只允許出現在查詢的
SELECT
列表和ORDER BY
子句中。它們不允許出現在其他地方,例如GROUP BY
、HAVING
和WHERE
子句中。這是因為視窗函數的執行邏輯是在處理完這些子句之後
- 一個視窗函數調用總是包含一個直接跟在視窗函數名及其參數之後的
-- 展示如何將每一個員工的薪水與他/她所在部門的平均薪水進行比較
SELECT depname, empno, salary, avg(salary) OVER (PARTITION BY depname) FROM empsalary;
/* depname | empno | salary | avg
-----------+-------+--------+-----------------------
develop | 11 | 5200 | 5020.0000000000000000
develop | 7 | 4200 | 5020.0000000000000000
develop | 9 | 4500 | 5020.0000000000000000
develop | 8 | 6000 | 5020.0000000000000000
develop | 10 | 5200 | 5020.0000000000000000
personnel | 5 | 3500 | 3700.0000000000000000
personnel | 2 | 3900 | 3700.0000000000000000
sales | 3 | 4800 | 4866.6666666666666667
sales | 1 | 5000 | 4866.6666666666666667
sales | 4 | 4800 | 4866.6666666666666667
*/
--最開始的三個輸出列直接來自於表empsalary,並且表中每一行都有一個輸出行。第四列表示對與當前行具有相同depname值的所有表行取得平均值(這實際和非視窗avg聚集函數是相同的函數,但是OVER子句使得它被當做一個視窗函數處理併在一個合適的視窗幀上計算。)
- 繼承
--創建兩個表:cities、capitals。自然地,首都也是城市,所以我們需要有某種方式能夠在列舉所有城市的時候也隱式地包含首都。
CREATE TABLE cities (
name text,
population real,
altitude int -- (in ft)
);
CREATE TABLE capitals (
state char(2)
) INHERITS (cities);
--在這種情況下,一個capitals的行從它的父親cities繼承了所有列(name、population和altitude)
-- 查找所有海拔高於500尺且不是州首府的城市
SELECT name, altitude
FROM ONLY cities
WHERE altitude > 500;
-- ONLY用於指示查詢只在cities表上進行而不會涉及到繼承層次中位於cities之下的其他表。很多我們已經討論過的命令 — SELECT、UPDATE 和DELETE — 都支持這個ONLY記號
-- 儘管繼承很有用,但是它還未與唯一約束或外鍵集成,這也限制了它的可用性