📌  相关文章
📜  SQL |从多个表中选择数据(1)

📅  最后修改于: 2023-12-03 15:05:18.132000             🧑  作者: Mango

SQL | 从多个表中选择数据

在关系型数据库中,通常数据分散在多个表中。因此,当需要获取某些数据时,需要从多个表中进行查询。在 SQL 中,可以通过多种方式从多个表中选择数据。下面将介绍一些常用的方法。

基本语法

在 SQL 中,使用 SELECT 语句来选择数据。从多个表中选择数据的基本语法如下:

SELECT 列名列表
FROM 表1
JOIN 表2
ON 连接条件
[WHERE 筛选条件]
[GROUP BY 分组列]
[HAVING 分组筛选条件]
[ORDER BY 排序列]

该语法中,涉及到 several keywords:

  • SELECT: 指定要显示的列。
  • FROM: 指定要查询的表。
  • JOIN: 将多个表连接起来。
  • ON: 指定连接条件。
  • WHERE: 过滤不符合条件的记录。
  • GROUP BY: 将结果分组。
  • HAVING: 对分组后的结果进行筛选。
  • ORDER BY: 按指定顺序对结果进行排序。

各个关键字的详细说明如下。

JOIN 语句

JOIN 语句用于将多个表连接起来。JOIN 有多种类型,包括:

  • INNER JOIN: 获取两个表中的相匹配的行。
  • LEFT JOIN: 获取左侧表中的所有行以及匹配的右侧表中的行。
  • RIGHT JOIN: 获取右侧表中所有的行以及匹配的左侧表中的行。
  • FULL JOIN: 获取两个表中所有的行。

JOIN 语句的基本语法如下:

SELECT 列名列表
FROM 表1
JOIN 表2
ON 连接条件

连接条件通常是两个表中的某些列。

以下是 INNER JOIN 的示例:

SELECT t1.id AS book_id, t1.name AS book_name, t2.name AS author_name
FROM books t1
INNER JOIN authors t2
ON t1.author_id = t2.id

以上语句查询了两个表:booksauthors。其中,books 表包含所有的书籍信息,authors 表包含所有的作者信息。INNER JOIN 语句将两个表连接起来,连接条件是书籍的作者 ID 与作者的 ID 相等。结果中包含了书籍的 ID、书名以及作者的名字。

WHERE 语句

WHERE 语句用于筛选不符合条件的记录。在 JOINWHERE 语句中,可以使用多种符号:

  • =: 判断两个列是否相等。
  • <: 判断某列是否小于另一个列。
  • >: 判断某列是否大于另一个列。
  • <=: 判断某列是否小于等于另一个列。
  • >=: 判断某列是否大于等于另一个列。
  • <>!=: 判断两个列是否不相等。
  • LIKE: 判断某列是否与指定模式匹配。
  • BETWEEN: 判断某列是否在指定的两个值之间。
  • IN: 判断某列是否在指定的值列表中。
  • AND: 判断两个条件是否都为真。
  • OR: 判断两个条件是否至少有一个为真。

以下是 WHERE 的示例:

SELECT t1.id AS book_id, t1.name AS book_name, t2.name AS author_name
FROM books t1
INNER JOIN authors t2
ON t1.author_id = t2.id
WHERE t1.publish_year > 2010

以上语句查询了所有发行日期在 2010 年后的书籍,并且将结果按照书籍 ID、书名以及作者名字的顺序排列。

GROUP BY 语句

GROUP BY 语句用于将结果分组。通常与聚合函数(如 COUNTSUMAVG 等)一起使用。以下是 GROUP BY 语句的示例:

SELECT t2.name AS author_name, COUNT(*) as book_count
FROM books t1
INNER JOIN authors t2
ON t1.author_id = t2.id
WHERE t1.publish_year > 2010
GROUP BY t2.name

以上语句查询了所有发行日期在 2010 年后的书籍,并且统计了每位作者所创作的书籍数量。结果按照作者名字进行分组,并按照作者名字的顺序排列。

HAVING 语句

HAVING 语句用于对分组后的结果进行筛选。通常与聚合函数一起使用。以下是 HAVING 语句的示例:

SELECT t2.name AS author_name, COUNT(*) as book_count
FROM books t1
INNER JOIN authors t2
ON t1.author_id = t2.id
WHERE t1.publish_year > 2010
GROUP BY t2.name
HAVING COUNT(*) > 3

以上语句查询了所有发行日期在 2010 年后的书籍,并且统计了每位作者所创作的书籍数量。结果按照作者名字进行分组,并筛选出创作数量大于 3 本的作者。最终的结果按照作者名字的顺序排列。