插入数据

插入一行数据

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:限制返回的行数。

执行顺序如下:

  1. FROM

    • 首先,数据库从 FROM 子句中指定的表或视图中获取数据,它是查询的起始部分。

  2. WHERE

    • 接着,数据库根据 WHERE 子句中的条件过滤记录。

  3. GROUP BY

    • 然后,数据库根据 GROUP BY 子句中的列对结果进行分组。

  4. HAVING

    • 在分组完成后,数据库使用 HAVING 子句中的条件对分组进行过滤。注意,HAVING 是对分组的结果进行过滤,而不是对单个记录进行过滤(这是 WHERE 的工作)。

  5. SELECT

    • 在此阶段,数据库选择要在结果集中显示的列。尽管 SELECT 在 SQL 语句中通常出现在前面,但在逻辑执行顺序中,它是在上述步骤之后进行的。

  6. ORDER BY

    • 接着,数据库根据 ORDER BY 子句中的列对结果进行排序。

  7. 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操作符时,需要遵循一定的语法规则:

  1. 每个SELECT语句必须具有相同数量的列。

  2. 相应的列必须具有相似的数据类型。

  3. 列的顺序必须相同。

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_eastcustomers_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前面,ANDOR关键字通常在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 子句中未指定 ASCDESC,则默认是 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 名员工的信息

文章作者: Vsoapmac
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 soap的会员制餐厅
数据库 关系型数据库
喜欢就支持一下吧