菜鸟教程/在线api文档
数值类型:和mysql类似,叫法不同
名字 | 存储长度 | 描述 | 范围 |
---|---|---|---|
smallint | 2 字节 | 小范围整数 | -32768 到 +32767 |
integer | 4 字节 | 常用的整数 | -2147483648 到 +2147483647 |
bigint | 8 字节 | 大范围整数 | -9223372036854775808 到 +9223372036854775807 |
decimal | 可变长 | 用户指定的精度,精确 | 小数点前 131072 位;小数点后 16383 位 |
numeric | 可变长 | 用户指定的精度,精确 | 小数点前 131072 位;小数点后 16383 位 |
real | 4 字节 | 可变精度,不精确 | 6 位十进制数字精度 |
double precision | 8 字节 | 可变精度,不精确 | 15 位十进制数字精度 |
smallserial | 2 字节 | 自增的小范围整数 | 1 到 32767 |
serial | 4 字节 | 自增整数 | 1 到 2147483647 |
bigserial | 8 字节 | 自增的大范围整数 | 1 到 9223372036854775807 |
money 类型存储带有固定小数精度的货币金额。
类似decimal
numeric、int 和 bigint 类型的值可以转换为 money
不建议使用浮点数来处理处理货币类型
类似mysql,有区分定长和变长
序号 | 名字 & 描述 |
---|---|
1 | **character varying(n), varchar(n)**变长,有长度限制 |
2 | **character(n), char(n)**f定长,不足补空白 |
3 | text变长,无长度限制 |
支持
pgsql相比于mysql的强大之处,适用于GIS开发
熟悉一下表现形式,后续可以设置对应的结构来存储地图信息
名字 | 存储空间 | 说明 | 表现形式 |
---|---|---|---|
point | 16 字节 | 平面中的点 | (x,y) |
line | 32 字节 | (无穷)直线(未完全实现) | ((x1,y1),(x2,y2)) |
lseg | 32 字节 | (有限)线段 | ((x1,y1),(x2,y2)) |
box | 32 字节 | 矩形 | ((x1,y1),(x2,y2)) |
path | 16+16n 字节 | 闭合路径(与多边形类似) | ((x1,y1),…) |
path | 16+16n 字节 | 开放路径 | [(x1,y1),…] |
polygon | 40+16n 字节 | 多边形(与闭合路径相似) | ((x1,y1),…) |
circle | 24 字节 | 圆 | <(x,y),r> (圆心和半径) |
json 数据类型可以用来存储 JSON(JavaScript Object Notation)数据, 这样的数据也可以存储为 text,但是 json 数据类型更有利于检查每个存储的数值是可用的 JSON 值。
此外还有相关的函数来处理 json 数据:
实例 | 实例结果 |
---|---|
array_to_json(‘{{1,5},{99,100}}’::int[]) | [[1,5],[99,100]] |
row_to_json(row(1,‘foo’)) | {“f1”:1,“f2”:“foo”} |
PostgreSQL 允许将字段定义成变长的多维数组。
数组类型可以是任何基本类型或用户定义类型,枚举类型或复合类型。
CREATE TABLE sal_emp (
name text,
pay_by_quarter integer[],
schedule text[][]
);
## 也可以用ARRAY关键字 用法如下
CREATE TABLE sal_emp (
name text,
pay_by_quarter integer ARRAY[4],
schedule text[][]
);
用花括号包裹,再用逗号隔开
INSERT INTO sal_emp
VALUES ('Bill',
'{10000, 10000, 10000, 10000}',
'{{"meeting", "lunch"}, {"training", "presentation"}}');
用中括号加数字就可以访问对应的值
SELECT name FROM sal_emp WHERE pay_by_quarter[1] <> pay_by_quarter[2];
## 这个查询检索在第二季度薪水变化的雇员名
name
-------
Carol
(1 row)
同时检索数组中的值,就必须检查每一个值。也可以用函数ALL表示
## 找出数组中所有元素值都等于 10000 的行
SELECT * FROM sal_emp WHERE pay_by_quarter[1] = 10000 OR
pay_by_quarter[2] = 10000 OR
pay_by_quarter[3] = 10000 OR
pay_by_quarter[4] = 10000;
SELECT * FROM sal_emp WHERE 10000 = ALL (pay_by_quarter);
UPDATE sal_emp SET pay_by_quarter = '{25000,25000,27000,27000}'
WHERE name = 'Carol';
## 或者使用 ARRAY 构造器语法:
UPDATE sal_emp SET pay_by_quarter = ARRAY[25000,25000,27000,27000]
WHERE name = 'Carol';
和mysql类似的SQL语法就不做赘述了,主要找一下特殊一些不同之处
创建数据库:基本类似,支持命令行创建
使用 \l
用于查看已经存在的数据库:
进入数据库,不一样 —— 为\c + 数据库名
postgres=# \c gis_db
您现在已经连接到数据库 "gis_db",用户 "postgres".
DROP DATABASE [ IF EXISTS ] name
PostgreSQL 模式(SCHEMA)可以看着是一个表的集合。
一个模式可以包含视图、索引、数据类型、函数和操作符等。
相同的对象名称可以被用于不同的模式中而不会出现冲突,例如 schema1 和 myschema 都可以包含名为 mytable 的表。
删除一个为空的模式(其中的所有对象已经被删除):
DROP SCHEMA myschema;
删除一个模式以及其中包含的所有对象:
DROP SCHEMA myschema CASCADE;
SELECT
支持数学表达式 avg/sum/count
查询条件支持
在 PostgreSQL 中,WITH 子句提供了一种编写辅助语句的方法,以便在更大的查询中使用。
WITH 子句有助于将复杂的大型查询分解为更简单的表单,便于阅读。这些语句通常称为通用表表达式(Common Table Express, CTE),也可以当做一个为查询而存在的临时表。
WITH 子句是在多次执行子查询时特别有用,允许我们在查询中通过它的名称(可能是多次)引用它。
WITH 子句在使用前必须先定义。
WITH
表名A AS
(
子查询
)
SELECT *
FROM 表名A
接下来让我们使用 RECURSIVE 关键字和 WITH 子句编写一个查询,查找 SALARY(工资) 字段小于 20000 的数据并计算它们的和:
WITH RECURSIVE t(n) AS (
VALUES (0)
UNION ALL
SELECT SALARY FROM COMPANY WHERE SALARY < 20000
)
SELECT sum(n) FROM t;
得到结果如下:
sum
-------
25000
(1 row)
创建:CREATE TABLE
在 PostgreSQL 中,ALTER TABLE 命令用于添加,修改,删除一张已经存在表的列。
另外你也可以用 ALTER TABLE 命令添加和删除约束。
用 ALTER TABLE 在一张已存在的表上添加列的语法如下:
ALTER TABLE + ADD
ALTER TABLE table_name ADD column_name datatype;
在一张已存在的表上 DROP COLUMN(删除列),语法如下:
ALTER TABLE + DROP
ALTER TABLE table_name DROP COLUMN column_name;
修改表中某列的 DATA TYPE(数据类型),语法如下:
ALTER TABLE table_name ALTER COLUMN column_name TYPE datatype;
给表中某列添加 NOT NULL 约束,语法如下:
ALTER TABLE table_name ALTER column_name datatype NOT NULL;
清空表:TRUNCATE TABLE
假设变量 a 为 2,变量 b 为 3,则:
运算符 | 描述 | 实例 |
---|---|---|
+ | 加 | a + b 结果为 5 |
- | 减 | a - b 结果为 -1 |
* | 乘 | a * b 结果为 6 |
/ | 除 | b / a 结果为 1 |
% | 模(取余) | b % a 结果为 1 |
^ | 指数 | a ^ b 结果为 8 |
|/ | 平方根 | |/ 25.0 结果为 5 |
||/ | 立方根 | ||/ 27.0 结果为 3 |
! | 阶乘 | 5 ! 结果为 120 |
!! | 阶乘(前缀操作符) | !! 5 结果为 120 |
sql的基础语法,没有特殊语法,略
sql的基础,参考菜鸟的注释,看起来用法和mysql一样
序号 | 运算符 & 描述 |
---|---|
1 | AND逻辑与运算符。如果两个操作数都非零,则条件为真。PostgresSQL 中的 WHERE 语句可以用 AND 包含多个过滤条件。 |
2 | NOT逻辑非运算符。用来逆转操作数的逻辑状态。如果条件为真则逻辑非运算符将使其为假。PostgresSQL 有 NOT EXISTS, NOT BETWEEN, NOT IN 等运算符。 |
3 | OR逻辑或运算符。如果两个操作数中有任意一个非零,则条件为真。PostgresSQL 中的 WHERE 语句可以用 OR 包含多个过滤条件。 |
位运算符 ,用的比较少 略
以下是在 PostgreSQL 中常用的约束。
SQL 标准定义了三种类型的外部连接: LEFT、RIGHT 和 FULL, PostgreSQL 支持所有这些。
在 PostgreSQL 中,JOIN 有五种连接类型:
PostgreSQL UNION 操作符合并两个或多个 SELECT 语句的结果。
UNION 操作符用于合并两个或多个 SELECT 语句的结果集。
请注意,UNION 内部的每个 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每个 SELECT 语句中的列的顺序必须相同。
SELECT column1 [, column2 ]
FROM table1 [, table2 ]
[WHERE condition]
UNION
SELECT column1 [, column2 ]
FROM table1 [, table2 ]
[WHERE condition]
允许存在重复!
和mysql一样
as关键字,和mysql一样可以省略
和mysql类型, 语法如下:
CREATE INDEX index_name ON table_name;
## 删除
DROP INDEX index_name;
CREATE INDEX index_name on table_name (conditional_expression);
和mysql一样,语法:
CREATE VIEW 视图名 AS
SELECT 字段1,字段2...
FROM 表名
WHERE 条件;
## 删除
DROP VIEW 视图名;
和mysql一样,语法:
BEGIN; ## 开启事务
## 。。。执行语句
COMMIT; ## 提交事务
ROLLBACK; ##回滚
不同于mysql,pgsql提供了对应的数据类型来表示自增id
SMALLSERIAL、SERIAL 和 BIGSERIAL 范围:
伪类型 | 存储大小 | 范围 |
---|---|---|
SMALLSERIAL |
2字节 | 1 到 32,767 |
SERIAL |
4字节 | 1 到 2,147,483,647 |
BIGSERIAL |
8字节 | 1 到 922,337,2036,854,775,807 |