公司决定使用PostgreSQL进行新项目的开发,所以到网上找资料学习学习。
基于两点选择:
一、它是开源的关系型数据库
二、它支持阿里云部署
当然开源的还有MySql、MariaDB,开源不表示完全免费,我想主要它是云端最便宜的吧。
数据库的创建与删除
createdb 数据库名 ---创建数据库
dropdb 数据库名 ---删除数据库
psql 数据库名 ---进入数据库
SELECT current_date; ---查询当前数据库
\h ---帮助语法
\q ---退出psql
表的创建和编辑
---创建表
PostgreSQL支持标准的SQL类型int、smallint、real、double precision、char(N)、varchar(N)、date、time、timestamp和interval,还支持其他的通用功能的类型和丰富的几何类型。
CREATE TABLE 表名(
city varchar(80),
date date
);
---删除表
DROP TABLE tablename;
---向表中增加行postgreSQL支持的方式
INSERT INTO weather VALUES('San Francisco', 46, 50, 0.25, '1994-11-27');---记住列的顺序
INSERT INTO cities VALUES ('San Francisco', '(-194.0, 53.0)');---记住列的顺序
INSERT INTO weather (city, temp_lo, temp_hi, prcp, date)
VALUES ('San Francisco', 43, 57, 0.0, '1994-11-29');---明确地列出列
COPY weather FROM '/home/user/weather.txt';
与一般查询语句一致
SELECT city, temp_lo, temp_hi, prcp, date FROM weather;
你可以组合使用DISTINCT和ORDER BY来保证获取一致的结果:
SELECT DISTINCT city FROM weater ORDER BY city;
SELECT city, temp_lo, temp_hi, prcp, date, location
FROM weather, cities
WHERE city = name;
外连接:除关联字段,其他行没有数据,用空值代替
左连接:已左边的表为主,左侧表中存在数据就输出
SELECT *FROM weather LEFT OUTER JOIN cities ON (weather.city = cities.name);
聚集函数
count(计数)、sum(和)、avg(均值)、max(最大值)和min(最小值)的函数
聚集函数不能在where中直接被引用
SELECT city, max(temp_lo)
FROM weather
GROUP BY city
HAVING max(temp_lo) < 40;
SELECT city, max(temp_lo)
FROM weather
WHERE city LIKE 'S%' -- (1)
GROUP BY city
HAVING max(temp_lo) < 40;
更新
UPDATE weather
SET temp_hi = temp_hi - 2, temp_lo = temp_lo - 2
WHERE date > '1994-11-28';
删除
DELETE FROM weather WHERE city = 'Hayward';
视图
视图:将多个表的数据聚合起来一起展示
CREATE VIEW myview AS
SELECT city, temp_lo, temp_hi, prcp, date, location
FROM weather, cities
WHERE city = name;
SELECT * FROM myview;
外键
外键:cities中没有这个城市,weather不能非法插入数据
CREATE TABLE cities (
city varchar(80) primary key,
location point
);
CREATE TABLE weather (
city varchar(80) references cities(city),
temp_lo int,
temp_hi int,
prcp real,
date date
);
事务
事务:所有操作的集合,要么全部完成要么全部不完成;具有原子性和持久存储。
BEGIN;
UPDATE accounts SET balance = balance - 100.00
WHERE name = 'Alice';
-- etc etc
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;
窗口函数
窗口函数:不是将所有数据聚集到一行展示;根据depname分区或分组
使用注意点:窗口函数只允许出现在查询的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
(10 rows)
SELECT depname, empno, salary,
rank() OVER (PARTITION BY depname ORDER BY salary DESC) FROM empsalary;
继承
继承:可以有0个或多个表的继承
CREATE TABLE cities (
name text,
population real,
altitude int -- (in ft)
);
CREATE TABLE capitals (
state char(2)
) INHERITS (cities);
初级使用一般跟其他sql体系一样,这里最重要的特性是窗口函数和继承。