• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 众包
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
LOFLY
终其一生,编织快乐
博客园    首页    新随笔    联系   管理    订阅  订阅

SQLite Join

SQLite Join

在本教程中,您将了解各种 SQLite 连接以从两个或多个表中查询数据。
image

一名艺术家(artist) 可以有多张专辑(album).一张专辑属于一名艺术家。

要查询艺术家和专辑表中的数据,您可以使用 INNER JOIN、LEFT JOIN 或 CROSS JOIN 子句。每个连接子句决定 SQLite 如何使用一个表中的数据与另一个表中的行进行匹配。

SQLite INNER JOIN 内连接

以下语句返回专辑标题和相应的艺术家姓名:

SELECT
  Title,
  Name
FROM
  albums
  INNER JOIN artists ON artists.ArtistId = albums.ArtistId;

在此示例中,INNER JOIN 子句根据 ON 关键字后指定的连接条件 (artists.ArtistId = albums.ArtistId) 将 albums 表中的每一行与 artist 表中的每一行进行匹配。

如果连接表的列名相同(例如 ArtistId),则可以使用 USING 语法,如下所示:

SELECT
  Title,
  Name
FROM
  albums
  INNER JOIN artists USING (ArtistId);

子句 USING(ArtistId) 相当于子句 ON arts.ArtistId = albums.ArtistId。

SQLite Left join 左连接

此语句使用带有 LEFT JOIN 子句的 SELECT 语句从艺术家和专辑表中检索艺术家姓名和专辑标题:

SELECT
  Name,
  Title
FROM
  artists
  LEFT JOIN albums ON artists.ArtistId = albums.ArtistId
ORDER BY
  Name;

image

LEFT JOIN 子句根据连接条件 (artists.ArtistId = albums.ArtistId) 从左表(艺术家)开始选择数据,并匹配右表(专辑)中的行。

左连接返回艺术家表(或左表)中的所有行以及专辑表(或右表)中的匹配行。

如果左表中的某一行在右表中没有匹配的行,则 SQLite 将包含左表中该行的列,并将右表的列包含 NULL。

与 INNER JOIN 子句类似,可以使用 USING 语法来定义连接条件,如下所示:

SELECT
  Name,
  Title
FROM
  artists
  LEFT JOIN albums USING (ArtistId)
ORDER BY
  Name;

如果要查找没有任何专辑的艺术家,可以添加 WHERE 子句,如以下查询所示:

SELECT
  Name,
  Title
FROM
  artists
  LEFT JOIN albums ON artists.ArtistId = albums.ArtistId
WHERE
  Title IS NULL
ORDER BY
  Name;

image

通常,这种类型的查询允许您找到左表中有但在右表中没有对应行的行。

SQLite CROSS JOIN

CROSS JOIN用于创建连接表中的笛卡尔积。与 INNER JOIN 和 LEFT JOIN 子句不同,CROSS JOIN 没有连接条件。以下是 CROSS JOIN 子句的基本语法:

SELECT
  select_list
FROM
  table1
  CROSS JOIN table2;

CROSS JOIN 将第一个表(table1)中的每一行与第二个表(table2)中的每一行组合起来形成结果集。

如果第一个表有n行,第二个表有m行,则最终的结果有n*m行。

CROSS JOIN 子句的一个实际示例是将两组数据组合起来形成初始数据集以供进一步处理。例如,您有一个产品和月份列表,并且想要制定一个计划,确定何时可以销售哪些产品

以下脚本创建产品和日历表:

CREATE TABLE products (
   product text NOT NULL
);

INSERT INTO
  products (product)
VALUES
  ('P1'),
  ('P2'),
  ('P3');

CREATE TABLE
  calendars (y INT NOT NULL, m INT NOT NULL);

INSERT INTO
  calendars (y, m)
VALUES
  (2019, 1),
  (2019, 2),
  (2019, 3),
  (2019, 4),
  (2019, 5),
  (2019, 6),
  (2019, 7),
  (2019, 8),
  (2019, 9),
  (2019, 10),
  (2019, 11),
  (2019, 12);

此查询使用 CROSS JOIN 子句将产品与月份组合:

SELECT
  *
FROM
  products
  CROSS JOIN calendars;
product  y     m
-------  ----  --
P1       2019  1
P1       2019  2
P1       2019  3
P1       2019  4
P1       2019  5
P1       2019  6
P1       2019  7
P1       2019  8
P1       2019  9
P1       2019  10
P1       2019  11
P1       2019  12
P2       2019  1
P2       2019  2
P2       2019  3
P2       2019  4
P2       2019  5
P2       2019  6
P2       2019  7
P2       2019  8
P2       2019  9
P2       2019  10
P2       2019  11
P2       2019  12
P3       2019  1
P3       2019  2
P3       2019  3
P3       2019  4
P3       2019  5
P3       2019  6
P3       2019  7
P3       2019  8
P3       2019  9
P3       2019  10
P3       2019  11
P3       2019  12

posted @ 2024-07-22 11:17  编织快乐  阅读(88)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3