跳转到内容

PostgreSQL Queries

INSERT INTO table_name (column1, column2, ...)
VALUES (value1, value2, ...);
  • table_name:要插入数据的表名。

  • column1, column2, …:要插入数据的列名。如果省略列名,默认会插入所有列的值。

  • value1, value2, …:对应列的新值。

假设你想插入一个新学生记录:

INSERT INTO students (first_name, last_name, class, email, phone_number, address)
VALUES ('', '', '一班', 'zhangsan@example.com', '13800138001', '北京市朝阳区');

假设你想一次性插入多条学生记录:

INSERT INTO students (first_name, last_name, class, email, phone_number, address)
VALUES
('', '', '二班', 'lisi@example.com', '13800138002', '上海市浦东新区'),
('', '', '三班', 'wangwu@example.com', '13800138003', '广州市天河区'),
('', '', '四班', 'zhaoliu@example.com', '13800138004', '深圳市南山区');

如果插入的值与表中列的顺序完全一致,并且没有遗漏任何列,可以省略列名:

INSERT INTO students
VALUES (DEFAULT, '', '', '五班', 'sunba@example.com', '13900139001', '成都市武侯区');
  • 这里使用了 DEFAULT 关键字,表示让 PostgreSQL 自动生成 id 的值(因为 idSERIAL 类型,会自动递增)。

你还可以使用子查询来插入数据。例如,假设你想将 students 表中 class'一班' 的学生复制到另一个表 students_backup 中:

INSERT INTO students_backup (first_name, last_name, class, email, phone_number, address)
SELECT first_name, last_name, class, email, phone_number, address
FROM students
WHERE class = '一班';

DELETE FROM table_name
WHERE condition;
  • table_name:要删除数据的表名。

  • condition:用于指定哪些行需要被删除的条件。如果省略 WHERE 子句,表中的所有行都会被删除。

假设你想删除 id 为 1 的学生记录:

DELETE FROM students
WHERE id = 1;

假设你想删除所有 class'一班' 的学生记录:

DELETE FROM students
WHERE class = '一班';

如果你想删除表中的所有记录(清空表):

DELETE FROM students;

SELECT column1, column2, ...
FROM table_name
WHERE condition;
  • column1, column2, …:要检索的列名。如果需要检索所有列,可以使用 *

  • table_name:要查询的表名。

  • condition:用于筛选数据的条件。

检索表中的所有列和所有行:

SELECT * FROM students;

查找 class'一班' 的学生:

SELECT * FROM students
WHERE class = '一班';

只检索 first_namelast_name 列:

SELECT first_name, last_name
FROM students
WHERE class = '一班';

查找年龄大于 18 的学生:

SELECT * FROM students
WHERE age > 18;

查找 class'一班' 且年龄大于 18 的学生:

SELECT * FROM students
WHERE class = '一班' AND age > 18;

查找 class'一班''二班' 的学生:

SELECT * FROM students
WHERE class = '一班' OR class = '二班';

查找 class'一班''二班''三班' 的学生:

SELECT * FROM students
WHERE class IN ('一班', '二班', '三班');

查找 email'example.com' 结尾的学生:

SELECT * FROM students
WHERE email LIKE '%example.com';

查找年龄在 18 到 25 之间的学生:

SELECT * FROM students
WHERE age BETWEEN 18 AND 25;

示例 9:使用 IS NULL 和 IS NOT NULL

Section titled “示例 9:使用 IS NULL 和 IS NOT NULL”

查找 phone_number 为空的学生:

SELECT * FROM students
WHERE phone_number IS NULL;

查找 phone_number 不为空的学生:

SELECT * FROM students
WHERE phone_number IS NOT NULL;

查找所有学生,并按 age 升序排序:

SELECT * FROM students
ORDER BY age ASC;

查找前 5 名学生:

SELECT * FROM students
LIMIT 5;

跳过前 5 名学生,查找接下来的 5 名学生:

SELECT * FROM students
OFFSET 5 LIMIT 5;

用于从查询结果中去除重复的行,只返回唯一的记录

去除重复的 class 列

SELECT DISTINCT class
FROM students;
  1. 索引优化:如果表中的数据量较大,且经常需要按某个条件查询,可以为该列创建索引以提高查询性能。例如:

    CREATE INDEX idx_students_class ON students (class);
  2. 使用别名:在复杂的查询中,可以为表和列使用别名,以简化查询语句。例如:

    SELECT s.first_name, s.last_name
    FROM students AS s
    WHERE s.class = '一班';
  3. 组合条件:可以使用括号来明确指定条件的优先级,避免歧义。例如:

    SELECT * FROM students
    WHERE (class = '一班' OR class = '二班') AND age > 18;
  4. 性能分析:如果查询性能不佳,可以使用 EXPLAINEXPLAIN ANALYZE 来分析查询计划,找出性能瓶颈。例如:

    EXPLAIN ANALYZE SELECT * FROM students WHERE class = '一班';

UPDATE table_name
SET column1 = value1, column2 = value2, ...
WHERE condition;
  • table_name:要更新的表名。

  • column1, column2, …:要更新的列名。

  • value1, value2, …:要设置的新值。

  • condition:用于指定哪些行需要更新的条件。如果省略 WHERE 子句,表中的所有行都会被更新。

假设你想更新 id 为 1 的学生的 emailphone_number

UPDATE students
SET email = 'newemail@example.com', phone_number = '13800138001'
WHERE id = 1;

假设你想将所有 class'一班' 的学生的 class 更新为 '一年级一班'

UPDATE students
SET class = '一年级一班'
WHERE class = '一班';

如果你想将所有学生的 address 设置为 '未知地址'

UPDATE students
SET address = '未知地址';