PostgreSQL 常用函数
PostgreSQL 提供了许多内置函数,用于执行各种操作,包括数学运算、字符串操作、日期和时间操作等。以下是一些 PostgreSQL 中常用的函数:1. 数学函数: ABS(x): 返回 x 的绝对值。 SELECT ABS(-5) AS absolute_value; ROUND(x [, d]): 将 x 四舍五入为 d 位小数。 SELECT ROUND(123.456, 2) AS rounded_number; CEIL(x) 或 CEILING(x): 返回大于或等于 x 的最小整数。 SELECT CEIL(4.75) AS ceiling_value; FLOOR(x): 返回小于或等于 x 的最大整数。 SELECT FLOOR(4.75) AS floor_value;2. 字符串函数: CONCAT(string1, string2): 连接两个字符串。 SELECT CONCAT('Hello', ' ', 'World') AS result; LENGTH(string): 返回字符串的字符数。 ...
PostgreSQL 时间/日期
在 PostgreSQL 中,有多种用于处理时间和日期的数据类型和函数。以下是一些关于 PostgreSQL 时间和日期的基本概念和用法:1. 时间和日期数据类型: DATE: 表示日期。 CREATE TABLE my_table ( my_date DATE ); TIME: 表示时间。 CREATE TABLE my_table ( my_time TIME ); TIMESTAMP: 表示日期和时间。 CREATE TABLE my_table ( my_timestamp TIMESTAMP ); INTERVAL: 表示时间间隔。 CREATE TABLE my_table ( my_interval INTERVAL );2. 当前时间和日期: CURRENT_DATE: 获取当前日期。 SELECT CURRENT_DATE; CURRENT_TIME: 获取当前时间。 SELECT CURRENT_TIME; CURRENT_TIMESTAMP: 获取当前日期和时间。 SELECT CURRENT_TIME...
PostgreSQL 权限
在 PostgreSQL 中,权限用于控制用户或角色对数据库对象的访问和操作。权限包括对表、视图、数据库等对象的访问权限以及执行操作(如 SELECT、INSERT、UPDATE、DELETE 等)的权限。以下是 PostgreSQL 中权限管理的基本概念和用法:1. 用户和角色: 用户(User): 是数据库中的实际登录用户,拥有登录数据库的权限。 CREATE USER username WITH PASSWORD 'password'; 角色(Role): 是一组权限的集合,可以将多个用户分配给同一个角色。 CREATE ROLE rolename;2. 授权和撤销权限: GRANT: 赋予用户或角色权限。 GRANT permission(s) ON object TO user_or_role; 例如,赋予用户 user1 对表 my_table 的 SELECT 权限: GRANT SELECT ON TABLE my_table TO user1; REVOKE: 撤销用户或角色的权限。 REVOKE permission(s) ON ob...
PostgreSQL AUTO INCREMENT
在 PostgreSQL 中,使用序列(Sequence)来实现自动递增的列,而不像一些其他数据库系统使用 AUTO_INCREMENT 关键字。序列是一个数据库对象,生成唯一的数字序列,通常用于为表的主键列生成唯一标识符。以下是在 PostgreSQL 中创建带有自增列的表的基本步骤:1. 创建序列: CREATE SEQUENCE table_name_column_name_seq; 其中,table_name 是你的表名,column_name 是自增列的列名。2. 创建表并使用序列作为默认值: CREATE TABLE table_name ( column_name INTEGER DEFAULT nextval('table_name_column_name_seq') PRIMARY KEY, other_columns VARCHAR(255), -- 其他列的定义 ); 在这里,nextval('table_name_column_name_seq') 用于获取序列的下一个值,并...
PostgreSQL 子查询
在 PostgreSQL 中,子查询是指一个查询嵌套在另一个查询中的查询表达式。子查询可以出现在 SELECT、FROM、WHERE 或 HAVING 子句中,用于检索或操作数据。以下是一些 PostgreSQL 子查询的基本用法和示例:1. 在 SELECT 子句中使用子查询:-- 查询每个部门的平均工资SELECT department_id, AVG(salary) AS avg_salaryFROM employeesGROUP BY department_id;-- 在外部查询中使用子查询SELECT department_name, (SELECT AVG(salary) FROM employees WHERE department_id = d.department_id) AS avg_salaryFROM departments d;2. 在 FROM 子句中使用子查询:-- 使用子查询创建一个派生表SELECT *FROM ( SELECT department_id, AVG(salary) AS avg_salary FROM employees ...
PostgreSQL 锁
在 PostgreSQL 中,锁是一种用于协调多个事务对数据库资源的访问的机制。锁的目的是确保并发事务的一致性和隔离性。PostgreSQL 提供了多种类型的锁,包括共享锁和排他锁,以及不同的锁级别。1. 共享锁和排他锁: 共享锁(Shared Lock): 多个事务可以同时持有共享锁,这些事务之间不会相互阻塞。共享锁适用于读取操作,多个事务可以同时读取同一资源。 SELECT * FROM my_table FOR SHARE; 排他锁(Exclusive Lock): 一次只能有一个事务持有排他锁,其他事务无法同时持有共享锁或排他锁。排他锁适用于写入操作,确保对资源的独占访问。 SELECT * FROM my_table FOR UPDATE;2. 锁级别:在 PostgreSQL 中,事务可以使用 SET TRANSACTION 语句来设置锁级别。常见的锁级别包括: READ COMMITTED(默认): 每个查询只能看到已经提交的事务所做的更改。 SET TRANSACTION ISOLATION LEVEL READ COMMITTED; REPEATABLE REA...
PostgreSQL 事务
在 PostgreSQL 中,事务(Transaction)是一组 SQL 操作,这些操作要么全部执行成功,要么全部不执行。事务是数据库管理系统确保数据完整性和一致性的机制之一。基本概念:1. 事务的四个特性(ACID): - 原子性(Atomicity): 事务是一个原子操作,要么全部执行成功,要么全部回滚到事务开始前的状态。 - 一致性(Consistency): 事务开始前和结束后,数据库的完整性约束没有被破坏。 - 隔离性(Isolation): 事务的执行是相互隔离的,一个事务的执行不应影响其他事务。 - 持久性(Durability): 一旦事务被提交,它对数据库的修改应该是永久性的。2. 事务的开始和结束: - BEGIN;:开始一个事务。 - COMMIT;:提交一个事务,使对数据库的更改永久化。 - ROLLBACK;:回滚一个事务,撤销未提交的更改。示例:-- 开始事务BEGIN;-- 执行一些 SQL 操作UPDATE accounts SET balance = balance - 100 WHERE account_id = 123...
PostgreSQL 视图
在 PostgreSQL 中,视图(View)是一种虚拟的表,它是基于一个或多个表的查询结果构建的。视图并不存储实际的数据,而是在查询时动态生成结果。使用视图,你可以简化复杂的查询、隐藏底层表的结构,并提供一种安全的方式访问数据。以下是一些有关 PostgreSQL 视图的基本概念和用法:创建视图:CREATE VIEW view_name ASSELECT column1, column2, ...FROM table1WHERE condition;查看视图:SELECT * FROM view_name;修改视图:CREATE OR REPLACE VIEW view_name ASSELECT new_column1, new_column2, ...FROM new_tableWHERE new_condition;删除视图:DROP VIEW view_name;示例:假设有一个名为 employees 的表:CREATE TABLE employees ( employee_id serial PRIMARY KEY, first_name VARCHAR(1...
PostgreSQL TRUNCATE TABLE
在 PostgreSQL 中,TRUNCATE TABLE 用于快速删除表中的所有行,并释放存储空间,但保留表的结构(列、约束等)。相对于使用 DELETE FROM,TRUNCATE TABLE 是一个更快速且资源消耗更少的操作,因为它不会逐行删除数据,而是直接截断表。基本语法如下:TRUNCATE TABLE table_name;其中,table_name 是要截断的表的名称。请注意以下几点:1. TRUNCATE 与 DELETE 的区别: - DELETE FROM table_name; 将逐行删除表中的数据,会生成大量的日志,并且可能触发触发器等。 - TRUNCATE TABLE table_name; 以一种更高效的方式截断表,删除所有行,但不会逐行操作,因此速度更快。但要注意,TRUNCATE 不触发 ON DELETE 触发器,因此在需要触发器执行的情况下,可能需要使用 DELETE。2. 保留序列值: 默认情况下,TRUNCATE 会保留与序列相关联的序列值。这意味着下一次插入到表中时,序列将继续生成下一个值。如果要重置序列值,可以...
PostgreSQL ALTER TABLE 命令
在 PostgreSQL 中,ALTER TABLE 命令用于修改现有表的结构,包括添加、删除、修改列以及应用约束等。以下是一些常见的 ALTER TABLE 命令用法:1. 添加列: ALTER TABLE table_name ADD COLUMN new_column_name data_type; 例如: ALTER TABLE employees ADD COLUMN email VARCHAR(100);2. 删除列: ALTER TABLE table_name DROP COLUMN column_name; 例如: ALTER TABLE employees DROP COLUMN email;3. 修改列的数据类型: ALTER TABLE table_name ALTER COLUMN column_name TYPE new_data_type; 例如: ALTER TABLE employees ALTER COLUMN salary TYPE NUMERIC;4. 重命名列: ALTER TAB...
PostgreSQL 索引
在 PostgreSQL 中,索引是一种提高数据库查询性能的重要机制。索引可以被看作是数据库表的快速查找数据的数据结构,类似于书的目录。它可以加速查询操作,但也会增加插入、更新和删除等写操作的成本。以下是一些关于 PostgreSQL 索引的基本知识:1. 创建索引: 在 PostgreSQL 中,可以使用 CREATE INDEX 语句来创建索引。例如,为表中的某一列创建索引的语法如下: CREATE INDEX index_name ON table_name (column_name); 其中,index_name 是索引的名称,table_name 是表的名称,column_name 是要索引的列的名称。2. 删除索引: 可以使用 DROP INDEX 语句删除索引,例如: DROP INDEX index_name;3. 查看索引: 可以使用 \di 命令在 psql 命令行界面中查看当前数据库中的索引列表。4. 常见索引类型: - B-Tree 索引: 默认的索引类型,适用于大多数情况,特别是对于等值查询和范围查询。 CREATE IN...
PostgreSQL 触发器
在 PostgreSQL 中,触发器(Triggers)是与表相关联的数据库对象,它在特定的数据库事件发生时触发一些预定义的操作。这些事件可以是INSERT、UPDATE、DELETE等数据库操作。触发器可以用于在表上执行额外的自定义逻辑,例如数据验证、日志记录等。以下是一个简单的 PostgreSQL 触发器的创建和使用示例:-- 创建一个表CREATE TABLE my_table ( id serial PRIMARY KEY, name VARCHAR(100), age INTEGER);-- 创建一个函数,该函数将在触发器中调用CREATE OR REPLACE FUNCTION my_trigger_function()RETURNS TRIGGER AS $$BEGIN -- 在这里添加触发时要执行的逻辑 -- 例如,将触发的操作记录到日志表中 INSERT INTO log_table (event_description) VALUES ('Trigger event occurred'); RETURN N...
PostgreSQL 别名
在 PostgreSQL 中,使用别名是为表、列、或表达式赋予一个更具可读性或更容易记忆的名称。别名在查询结果中用于标识列名或计算字段的名称。以下是一些使用别名的例子:1. 为表使用别名: -- 使用别名给表起一个更简短的名字 SELECT * FROM employees AS e WHERE e.department_id = 1;2. 为列使用别名: -- 使用别名给列起一个更具描述性的名字 SELECT first_name AS "First Name", last_name AS "Last Name" FROM employees;3. 为计算字段使用别名: -- 使用别名给计算字段起一个有意义的名字 SELECT salary * 12 AS annual_salary FROM employees;4. 为子查询使用别名: -- 使用别名给子查询起一个简短的名字 SELECT * FROM (SELECT * FROM sales WHERE amount > 1000) AS high_s...
PostgreSQL NULL
在 PostgreSQL 中,NULL 用于表示一个缺失值或未知值。当某个列没有值时,该列将包含 NULL。NULL 不等于任何其他值,甚至不等于它本身。在 SQL 中,可以使用 IS NULL 或 IS NOT NULL 来检查列是否包含 NULL。以下是一些关于 NULL 的示例:1. 插入 NULL 值: -- 创建一个示例表 CREATE TABLE example ( id serial PRIMARY KEY, name VARCHAR (100), age INTEGER ); -- 插入包含 NULL 值的行 INSERT INTO example (name, age) VALUES ('John', 25); INSERT INTO example (name, age) VALUES ('Alice', NULL);2. 查询包含 NULL 的行: -- 查询包含 NULL 值的行 SELECT * FROM example WHERE age IS NULL...
PostgreSQL UNION
UNION 是 PostgreSQL 中用于合并两个或多个 SELECT 查询结果集的关键字。它返回所有唯一的行,消除了重复的行。以下是一个简单的例子:-- 创建两个示例表CREATE TABLE table1 ( id serial PRIMARY KEY, name VARCHAR (100));CREATE TABLE table2 ( id serial PRIMARY KEY, name VARCHAR (100));-- 向表中插入一些数据INSERT INTO table1 (name) VALUES ('John'), ('Alice'), ('Bob');INSERT INTO table2 (name) VALUES ('Alice'), ('Eve'), ('Bob');-- 使用 UNION 合并两个表的结果SELECT name FROM table1UNIONSELECT name FROM table2;在上面的例子中,UNION 合并了...
PostgreSQL JOIN
在 PostgreSQL 中,JOIN 用于从多个表格中联合检索数据,以便在一个查询中使用来自不同表格的列。通过使用 JOIN 操作,你可以将表格之间的关联关系合并起来,以便在一个查询中获取更完整的信息。以下是一些常见的 JOIN 类型:1. 内连接(INNER JOIN):内连接返回两个表格之间匹配的行,忽略不匹配的行。SELECT orders.order_id, customers.customer_nameFROM ordersINNER JOIN customers ON orders.customer_id = customers.customer_id;2. 左外连接(LEFT JOIN 或 LEFT OUTER JOIN):左外连接返回左表格中的所有行,以及右表格中匹配的行。如果右表格中没有匹配的行,将填充 NULL 值。SELECT customers.customer_name, orders.order_idFROM customersLEFT JOIN orders ON customers.customer_id = orders.customer_id;3....
PostgreSQL 约束
在 PostgreSQL 中,约束(Constraints)是用于定义表格中数据的有效性和完整性规则的规范。通过约束,你可以强制执行表格中数据的特定规则,以确保数据的一致性和正确性。以下是一些常见的约束类型:1. 主键约束(Primary Key Constraint):主键约束用于唯一标识表格中的每一行,并确保每个主键列中的值都是唯一的。主键列不能包含空值。CREATE TABLE employees ( employee_id SERIAL PRIMARY KEY, first_name VARCHAR(50), last_name VARCHAR(50));2. 唯一约束(Unique Constraint):唯一约束确保列中的所有值都是唯一的,但与主键不同,唯一约束允许列包含空值。CREATE TABLE departments ( department_id SERIAL PRIMARY KEY, department_name VARCHAR(50) UNIQUE);3. 检查约束(Check Constraint):检查约束用于限制列中的值的...
PostgreSQL DISTINCT
在 PostgreSQL 中,DISTINCT 关键字用于从查询结果中删除重复的行,仅保留唯一的行。它通常与 SELECT 语句一起使用,以确保返回的结果集中不包含重复的记录。以下是 DISTINCT 关键字的基本语法:SELECT DISTINCT column1, column2, ...FROM table_name;其中: column1, column2, ... 是要选择的列。 table_name 是要从中检索数据的表格的名称。以下是一些使用 DISTINCT 关键字的示例:1. 选择唯一的姓氏:SELECT DISTINCT last_nameFROM employees;在这个例子中,返回唯一的姓氏列表,去除了重复的姓氏。2. 选择唯一的部门:SELECT DISTINCT departmentFROM employees;在这个例子中,返回唯一的部门列表,去除了重复的部门。3. 选择多列的唯一组合:SELECT DISTINCT department, job_titleFROM employees;在这个例子中,返回唯一的部门和职位组合,去除了重复的组合。4. 结...
PostgreSQL HAVING
在 PostgreSQL 中,HAVING 子句用于在使用 GROUP BY 子句进行分组后,对分组的结果进行筛选。HAVING 子句通常与聚合函数一起使用,以过滤分组结果。以下是 HAVING 子句的基本语法:SELECT column1, column2, ..., aggregate_function(column)FROM table_nameGROUP BY column1, column2, ...HAVING condition;其中: column1, column2, ... 是要分组的列。 table_name 是要从中检索数据的表格的名称。 aggregate_function(column) 是应用于每个组的聚合函数。 HAVING condition 是用于筛选分组结果的条件。以下是一个简单的例子:SELECT department, AVG(salary) AS avg_salaryFROM employeesGROUP BY departmentHAVING AVG(salary) > 60000;在这个例子中,我们计算了每个部门的平均工资,并使用 ...
PostgreSQL WITH
在 PostgreSQL 中,WITH 语句(也称为 Common Table Expressions 或 CTEs)用于创建临时的、可被查询的结果集。WITH 语句通常与 SELECT、INSERT、UPDATE 或 DELETE 语句一起使用,以便将复杂的查询逻辑模块化,并提高查询的可读性和可维护性。以下是 WITH 语句的基本语法:WITH cte_name (column1, column2, ...) AS ( -- CTE query definition SELECT ...)-- Main query that references the CTESELECT ...FROM cte_name;其中: cte_name 是你为 CTE 分配的名称。 (column1, column2, ...) 是可选的,用于为 CTE 的列指定名称,这在 CTE 中定义了列的别名。 SELECT ... 是 CTE 的查询定义。以下是一个简单的例子:WITH department_avg_salary AS ( SELECT department, AVG(sala...