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

SQLite FULL OUTER JOIN

SQLite 全外连接

在 SQLite 中,FULL OUTER JOIN 子句允许您根据相关列合并两个表中的行。

FULL OUTER JOIN 子句返回第一张表和第二张表中的所有行。如果其中一个表中没有匹配的行,则使用 NULL 来表示缺失的值。

请注意,FULL OUTER JOIN 的结果是 LEFT JOIN 和 RIGHT JOIN 的结果的组合。

全外连接子句:

SELECT select_list
FROM table1
FULL OUTER JOIN table2 ON table2.column2 = table2.column1;

如果column1和column2的名称相同,你可以使用USING syntax.

SELECT select_list
FROM table1
FULL OUTER JOIN table2 USING (column_name);

如果要从 table1 中查找在 table2 中没有匹配行的行,可以使用以下语句:

SELECT
  select_list
FROM
  table1
  FULL OUTER JOIN table2 USING (column_name)
WHERE
  table2.column_name IS NULL;

类似地,您可以使用以下查询从 table2 中查找在 table1 中没有匹配行的行:


SELECT
  select_list
FROM
  table1
  FULL OUTER JOIN table2 USING (column_name)
WHERE
  table1.column_name IS NULL;

SQLite FULL OUTER JOIN 例子

首先,创建3个表 students, courses和enrollments.

CREATE TABLE students (
    student_id INTEGER PRIMARY KEY,
    student_name TEXT NOT NULL
);

CREATE TABLE courses (
    course_id INTEGER PRIMARY KEY,
    course_name TEXT NOT NULL
);

CREATE TABLE enrollments (
    enrollment_id INTEGER PRIMARY KEY,
    student_id INTEGER,
    course_id INTEGER,
    FOREIGN KEY(student_id) REFERENCES students(student_id),
    FOREIGN KEY(course_id) REFERENCES courses(course_id)
);

向表中插入行:

INSERT INTO
  students (student_name)
VALUES
  ('John'),
  ('Jane'),
  ('Doe'),
  ('Alice'),
  ('Bob');

INSERT INTO
  courses (course_name)
VALUES
  ('Math'),
  ('Science'),
  ('History');

INSERT INTO
  enrollments (student_id, course_id)
VALUES
  (1, 1),
  (2, 2),
  (3, 3),
  (4, NULL),
  (NULL, 3);

使用全外连接来找学生选课:


SELECT
  s.student_name,
  c.course_name
FROM
  students s
  FULL OUTER JOIN enrollments e ON s.student_id = e.student_id
  FULL OUTER JOIN courses c ON e.course_id = c.course_id;
  

输出:

student_name  course_name
------------  -----------
John          Math
Jane          Science
Doe           History
Alice         null
Bob           null
null          History

输出显示 Alice 和 Bob 没有选修任何课程,并且没有学生选修历史课程。

由于表共享相同的列名,因此可以使用 USING 语法:

SELECT
  student_name,
  course_name
FROM
  students
  FULL OUTER JOIN enrollments USING(student_id)
  FULL OUTER JOIN courses USING (course_id);
  

查找没有选任何课的学生:


SELECT
  student_name,
  course_name
FROM
  students
  FULL OUTER JOIN enrollments USING (student_id)
  FULL OUTER JOIN courses USING (course_id)
WHERE
  course_name IS NULL;
  

最后,找出还没有任何学生选修的课程:

SELECT
  student_name,
  course_name
FROM
  students
  FULL OUTER JOIN enrollments USING (student_id)
  FULL OUTER JOIN courses USING (course_id)
WHERE
  student_name IS NULL;

输出:

student_name  course_name
------------  -----------
null          History

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