PostgreSQL入门:安装与基础使用(二)
插入数据
插入一行数据
INSERT INTO students (name, age) VALUES ('Alice', 25);
插入多行数据
INSERT INTO students (name, age) VALUES ('Charlie', 23), ('David', 24), ('Eve', 20);
修改数据
修改特定行的数据
UPDATE employees SET salary = 5000 WHERE id = 1;
更新多列的数据
UPDATE employees SET salary = 6000, name = 'New Name' WHERE id = 2;
使用表达式更新数据
UPDATE employees SET salary = salary * 1.10 WHERE department = 'IT';
更新所有行的数据(谨慎操作,会覆盖掉数据表中的所有数据)
UPDATE employees SET salary = 5500;
删除数据
删除特定行的数据
DELETE FROM students WHERE id = 1;
删除满足条件的多行数据
DELETE FROM students WHERE age < 20;
删除满足多个条件的数据
DELETE FROM students WHERE age > 20 AND name = 'John';
DELETE FROM students WHERE age < 18 OR name = 'Alice';
DELETE FROM students WHERE age > 20 AND (name = 'John' OR name = 'Jane');
查找数据
在PostgreSQL中,SELECT
语句用于从数据库表中查找数据。你可以指定要返回的列、设置过滤条件以及排序结果。下面是SELECT
语句的基本语法和一些示例。
SELECT column1, column2 FROM table_name
WHERE condition
GROUP BY column1, column2, ...
HAVING condition
ORDER BY column1, column2, ... ASC|DESC
LIMIT number;
SELECT
:指定要检索的列。FROM
:指定要从中检索数据的表。WHERE
:过滤要检索的行。GROUP BY
:根据一个或多个列对结果集进行分组。HAVING
:在分组后对组进行过滤。ORDER BY
:对结果集进行排序。LIMIT
:限制返回的行数。
执行顺序如下:
FROM
首先,数据库从 FROM 子句中指定的表或视图中获取数据,它是查询的起始部分。
WHERE
接着,数据库根据 WHERE 子句中的条件过滤记录。
GROUP BY
然后,数据库根据 GROUP BY 子句中的列对结果进行分组。
HAVING
在分组完成后,数据库使用 HAVING 子句中的条件对分组进行过滤。注意,HAVING 是对分组的结果进行过滤,而不是对单个记录进行过滤(这是 WHERE 的工作)。
SELECT
在此阶段,数据库选择要在结果集中显示的列。尽管 SELECT 在 SQL 语句中通常出现在前面,但在逻辑执行顺序中,它是在上述步骤之后进行的。
ORDER BY
接着,数据库根据 ORDER BY 子句中的列对结果进行排序。
LIMIT
最后,如果指定了 LIMIT 子句,数据库将限制返回的记录数。
普通查找
选择所有列
SELECT * FROM employees;
选择特定列
SELECT first_name, last_name FROM employees;
去除重复数据
SELECT DISTINCT name FROM employees;
连接查询(JOIN)
在数据库查询中,我们经常需要从多个表中检索数据,并将这些数据以有意义的方式组合起来。JOIN操作就是用来实现这一目标的。它通过指定表之间的关联条件,将来自不同表的数据行连接起来,形成一个新的结果集。
PostgreSQL支持多种类型的JOIN,每种类型都有其特定的用途和语法。以下是常见的几种JOIN类型:
INNER JOIN(内连接)
INNER JOIN是最常用的JOIN类型,它返回两个表中满足关联条件的行。换句话说,它只返回两个表中有匹配关系的行。
SELECT * FROM table1 INNER JOIN table2 ON table1.id = table2.id;
LEFT JOIN(左连接)
LEFT JOIN返回左表(LEFT JOIN关键字左边的表)中的所有行,以及右表中满足关联条件的行。如果右表中没有匹配的行,则结果集中对应的列将包含空值。
SELECT * FROM table1 LEFT JOIN table2 ON table1.id = table2.id;
RIGHT JOIN(右连接)
RIGHT JOIN与LEFT JOIN相反,它返回右表(RIGHT JOIN关键字右边的表)中的所有行,以及左表中满足关联条件的行。如果左表中没有匹配的行,则结果集中对应的列将包含空值。
SELECT * FROM table1 RIGHT JOIN table2 ON table1.id = table2.id;
注意:尽管RIGHT JOIN在语法上是支持的,但在实际应用中较少使用,因为它可以通过调整LEFT JOIN中表的顺序来实现相同的效果。
FULL JOIN(全连接)
FULL JOIN返回左表和右表中满足关联条件的行。如果某一边没有匹配的行,则结果集中对应的列将包含空值。
SELECT * FROM table1 FULL JOIN table2 ON table1.id = table2.id;
CROSS JOIN(交叉连接)
CROSS JOIN返回左表中的每一行与右表中的每一行的组合,即笛卡尔积。它不依赖于任何关联条件。
SELECT * FROM table1 CROSS JOIN table2;
合并查询(UNION)
在数据库查询中,有时我们需要将来自多个查询的结果组合成一个单一的结果集。PostgreSQL中的UNION操作符就是为此目的而设计的,它允许我们将两个或多个SELECT语句的结果合并成一个结果集。
使用UNION操作符时,需要遵循一定的语法规则:
每个SELECT语句必须具有相同数量的列。
相应的列必须具有相似的数据类型。
列的顺序必须相同。
UNION操作符的基本语法如下:
SELECT column1, column2, ... FROM table1
UNION
SELECT column1, column2, ... FROM table2;
与UNION不同,UNION ALL操作符不会删除重复的数据行,而是将来自所有SELECT语句的结果集直接合并在一起。如果两个表中有重复的数据行,那么它们在最终的结果集中都会出现。使用UNION ALL的示例如下:
SELECT customer_id, customer_name, region FROM customers_east
UNION ALL
SELECT customer_id, customer_name, region FROM customers_west;
这个查询将返回一个结果集,其中包含来自customers_east
和customers_west
两个表的所有客户记录,包括重复的客户记录。
条件查找(WHERE)
精确条件
SELECT * FROM employees WHERE department = 'IT';
同时满足多个条件
SELECT * FROM employees WHERE age >= 25 AND department = 'IT';
满足多个条件中的其中一个
SELECT * FROM employees WHERE age >= 25 OR department = 'IT';
不为空
SELECT * FROM employees WHERE department IS NOT NULL;
逗号,
通常在WHERE
前面,AND
和OR
关键字通常在WHERE
后面
模糊条件
查询以某字符为开头、结尾或包含该字符的条件
SELECT fruit_name FROM fruits WHERE fruit_name LIKE 'apple%'; # 查询所有以“apple”开头的水果
SELECT fruit_name FROM fruits WHERE fruit_name LIKE '%apple%'; # 查询所有包含“apple”的水果
SELECT fruit_name FROM fruits WHERE fruit_name LIKE '%apple'; # 查询所有以“apple”结尾的水果
SELECT fruit_name FROM fruits WHERE fruit_name ILIKE '%apple%'; # 查询所有不区分大小写的包含“apple”或“Apple”的水果
注意:
%
是一个通配符,代表零个、一个或多个字符。_
也是一个通配符,代表一个字符。例如,LIKE 'a_ple'
会匹配 "aple", "apple", "axle" 等。
查询特定条中在某个数列中的数据
SELECT * FROM employees WHERE age IN (25, 27); # 查询所有年龄为25和27的员工
查询特定条中不在某个数列中的数据
SELECT * FROM employees WHERE age NOT IN (25, 27); # 查询所有年龄不为25和27的员工
区间条件
查询在X到Y区间的数据
SELECT * FROM employees WHERE age BETWEEN 25 AND 27;
分组查询(GROUP BY)
GROUP BY
是 SQL 语言中用来将查询结果按照一个或多个列进行分组的子句。通过 GROUP BY
,你可以对每个分组应用聚合函数,如 COUNT()
, SUM()
, AVG()
, MAX()
, MIN()
等,从而得到每个分组的汇总信息。
GROUP BY 子句必须放在 WHERE 子句中的条件之后,必须放在 ORDER BY 子句之前。
SELECT year, month, SUM(amount) AS total_sales FROM sales GROUP BY year, month; # 按年份和月份分组,计算每个月的总销售额
SELECT salesperson, SUM(amount) AS total_sales FROM sales GROUP BY salesperson; # 按销售员分组,计算每个销售员的总销售额
过滤查询(HAVING)
HAVING
是 SQL 语言中的一个子句,用于在 GROUP BY
子句后对分组的结果进行过滤。它类似于 WHERE
子句,但WHERE
子句在所选列上设置条件,而HAVING
子句则在由GROUP BY
子句创建的分组上设置条件。
SELECT year, SUM(amount) AS total_sales FROM sales GROUP BY year HAVING total_sales > 10000; # 按年份分组,计算每年的总销售额,并只显示总销售额超过某个值的年份
排序查询(ORDER BY)
在PostgreSQL中,ORDER BY
用于对一列或者多列数据进行升序(ASC)或者降序(DESC)排列。如果在 ORDER BY
子句中未指定 ASC
或 DESC
,则默认是 ASC
(升序)。
SELECT * FROM employees ORDER BY last_name; # 按单个列升序排序
SELECT * FROM employees ORDER BY salary DESC; # 按单个列降序排序
SELECT * FROM employees ORDER BY last_name DESC, first_name; # 按多个列排序
限制查询数量(LIMIT)
LIMIT
是PostgreSQL中用来限制查询结果返回记录数的一个子句。通过 LIMIT
子句,你可以指定查询返回的记录行的最大数目。这在处理大量数据时特别有用,因为它可以提高查询性能并减少网络传输的数据量。
SELECT * FROM employees LIMIT 10; # 选择前 10 名员工的信息
SELECT * FROM employees LIMIT 20, 10; # 跳过前 20 名员工,然后选择接下来的 10 名员工的信息