PostgreSQL SELECT 语句详解
                           
天天向上
发布: 2025-03-11 23:28:24

原创
413 人浏览过

SELECT 语句用于从 PostgreSQL 数据库中查询数据,是 SQL 中最常用的查询语句。PostgreSQL 提供了强大的 SELECT 功能,包括基础查询、条件过滤、排序、分组、连接、多表查询、子查询等。


1. SELECT 语法

1.1 基本语法

SELECT column1, column2, ... 
FROM table_name;
  • column1, column2, ...:要查询的列。
  • table_name:查询的数据表。

如果要查询表中的所有列,可以使用 *

SELECT * FROM table_name;

2. 基础查询示例

假设有一个 employees 表:

CREATE TABLE employees (
    id SERIAL PRIMARY KEY,
    name VARCHAR(100),
    age INT,
    department VARCHAR(50),
    salary DECIMAL(10,2)
);

插入示例数据:

INSERT INTO employees (name, age, department, salary) VALUES
('Alice', 30, 'HR', 5000.00),
('Bob', 25, 'IT', 6000.00),
('Charlie', 35, 'Finance', 7000.00);

执行查询:

SELECT * FROM employees;

结果:

 id |  name   | age | department | salary
----+---------+-----+------------+--------
  1 | Alice   |  30 | HR         | 5000.00
  2 | Bob     |  25 | IT         | 6000.00
  3 | Charlie |  35 | Finance    | 7000.00

3. 条件查询 (WHERE 子句)

WHERE 语句用于过滤数据:

SELECT * FROM employees WHERE age > 30;

查询 age > 30 的员工:

 id |  name   | age | department | salary
----+---------+-----+------------+--------
  3 | Charlie |  35 | Finance    | 7000.00

3.1 结合 ANDOR

SELECT * FROM employees WHERE age > 25 AND department = 'IT';

4. 排序查询 (ORDER BY)

ORDER BY 用于对结果进行排序:

SELECT * FROM employees ORDER BY salary DESC;

salary 降序排序:

 id |  name   | age | department | salary
----+---------+-----+------------+--------
  3 | Charlie |  35 | Finance    | 7000.00
  2 | Bob     |  25 | IT         | 6000.00
  1 | Alice   |  30 | HR         | 5000.00

5. 限制查询结果 (LIMITOFFSET)

5.1 限制返回的行数

SELECT * FROM employees LIMIT 2;

返回前 2 行数据。

5.2 跳过前几行

SELECT * FROM employees ORDER BY salary DESC LIMIT 2 OFFSET 1;

跳过 1 行,返回 2 行数据。


6. 计算总数 (COUNT)

查询员工总数:

SELECT COUNT(*) FROM employees;
 count
-------
     3

7. 分组查询 (GROUP BYHAVING)

GROUP BY 用于按某列分组,HAVING 过滤分组后的结果。

统计每个部门的平均工资:

SELECT department, AVG(salary) FROM employees GROUP BY department;
 department |  avg  
------------+-------
 HR         | 5000.00
 IT         | 6000.00
 Finance    | 7000.00

查询平均工资大于 5500 的部门:

SELECT department, AVG(salary) AS avg_salary
FROM employees 
GROUP BY department 
HAVING AVG(salary) > 5500;

8. 连接查询 (JOIN)

JOIN 用于连接多个表。假设有一个 departments 表:

CREATE TABLE departments (
    id SERIAL PRIMARY KEY,
    name VARCHAR(50)
);
INSERT INTO departments (name) VALUES ('HR'), ('IT'), ('Finance');

employees 表新增 department_id

ALTER TABLE employees ADD COLUMN department_id INT;
UPDATE employees SET department_id = 1 WHERE department = 'HR';
UPDATE employees SET department_id = 2 WHERE department = 'IT';
UPDATE employees SET department_id = 3 WHERE department = 'Finance';

8.1 内连接 (INNER JOIN)

查询员工和部门信息:

SELECT employees.name, employees.age, departments.name AS department 
FROM employees 
INNER JOIN departments ON employees.department_id = departments.id;

9. 子查询

查询比所有 HR 员工工资高的员工:

SELECT * FROM employees WHERE salary > (SELECT MAX(salary) FROM employees WHERE department = 'HR');

10. DISTINCT 去重

查询不同的部门:

SELECT DISTINCT department FROM employees;

11. CASE 语句

为员工分类:

SELECT name, age, 
    CASE 
        WHEN age < 30 THEN 'Young'
        WHEN age BETWEEN 30 AND 40 THEN 'Middle-aged'
        ELSE 'Senior'
    END AS age_group
FROM employees;

12. SELECT INTO 复制表

创建 backup_employees 并复制数据:

SELECT * INTO backup_employees FROM employees;

13. WITH 公用表表达式 (CTE)

查询薪资高于平均工资的员工:

WITH high_salary_employees AS (
    SELECT * FROM employees WHERE salary > (SELECT AVG(salary) FROM employees)
)
SELECT * FROM high_salary_employees;

14. UNION 合并多个查询结果

查询所有员工的 namedepartment

SELECT name, department FROM employees
UNION
SELECT 'John Doe', 'Admin';

15. 总结

SQL 语法说明
SELECT * FROM table;查询所有数据
SELECT column1, column2 FROM table;查询指定列
SELECT * FROM table WHERE condition;条件查询
SELECT * FROM table ORDER BY column ASC/DESC;排序
SELECT * FROM table LIMIT n OFFSET m;分页
SELECT COUNT(*) FROM table;统计总数
SELECT column, AVG(value) FROM table GROUP BY column;分组聚合
SELECT * FROM table1 INNER JOIN table2 ON condition;连接查询
SELECT * FROM table WHERE column > (SELECT MAX(column) FROM table2);子查询
SELECT DISTINCT column FROM table;去重查询
WITH cte AS (...) SELECT * FROM cte;公用表表达式

PostgreSQL SELECT 语句功能强大,适用于多种查询需求。更多详细内容请关注其他相关文章!

发表回复 0

Your email address will not be published. Required fields are marked *