数据库基础Ⅳ(关联查询)

当我们查询如课程信息的时候往往需要连同课程的学业导师一同查询出来,最原始的方法自然是将学业导师的信息单独添加在课程数据内,但在数据复用率高的情况下显然需要将导师信息单独放置在一张表中,这是我们就需要进行多表数据查询就是关联查询。

左连接

SELECT
  *
FROM
  TableA LEFT  JOIN
  TableB
  ON condition;
  • JOIN 是关联查询的关键词,基础的结构是 TableA JOIN TableB,即表 A 和表 B 关联查询。
  • LEFT 表示是左连接
  • ON 是关联查询的条件。
  • 左连接就是返回左表的所有数据,即使右表没有匹配的数据(此时右表会以 NULL 的形式匹配数据)。

SELECT
  *
FROM
  ykd_teacher
  LEFT JOIN ykd_course ON ykd_teacher.id = ykd_course.teacher_id;
  • ykd_teacher 是表 A,ykd_course 是表 B
  • ykd_teacher.id 是指这张表的 id 字段,同理 ykd_course.teacher_id 是指这张表的 teacher_id 这个字段
  • 我们的查询条件,让上面 2 个字段相等并匹配

右连接

右连接与左连接相似,即返回右表所有的数据即使左表没有匹配的数据

SELECT
  *
FROM
  TableA RIGHT JOIN 
  TableB 
  ON condition;

多表关联查询

在实际应用中,我们有时候会对三张表以上进行关联查询,在这种情况下,我们往往会选中一张表作为主表,以它为基准,进行 LEFT JOIN 或 RIGHT JOIN 查询。如:

SELECT
  *
FROM
  TableA 
  LEFT JOIN TableB ON conditionA
  LEFT JOIN TableC ON conditionB;

即在三者中找到中间值进行查询。

内连接

假设我们是大学某门课的老师,我们需要查询班级A中参与B考试的学生,(A,B同时符合某一个条件的数据),得到的数据是内部共有的数据,所以连接方式称为内连接(INNER JOIN):

SELECT
  *
FROM
  Table_A
  INNER JOIN Table_B
ON
  Table_A.id = Table_B.student_id;

外连接拓展

之前我外连接,我们所查询的是单独A或者B表内的数据

但我们有时候需要查询不与B所关联的A表内数据:

我们可以使用

SELECT
  *
FROM
  Table_A
  LEFT JOIN Table_B ON Table_A.id = Table_B.student_id
WHERE
  Table_B.student_id IS NULL;

即查询到不包含B表所拥有的 student_id

UNION关键词

有时候我们需要查询两张表里所有的数据,这时我们就需要 union 关键词

SELECT
  *
FROM
  Table_A
  LEFT JOIN Table_B
ON
  Table_A.id = Table_B.student_id
UNION DISTINCT
SELECT
  *
FROM
  Table_A
  RIGHT JOIN Table_B ON Table_A.id=Table_B.student_id;

这句话相当于同时执行了A、B表的左右连接。

UNION关键字可以将两个查询语句的结果合并,并去除重复数据,UNION DISTINCT 和 UNION 的效果一样,所以我们一般直接使用UNION。

一般来说数据都是需要去重的,但有时候我们需要展示不去重的数据,此时可以吧 DISTINCT 关键词换成 ALL。

笛卡尔积

在实际应用场景中,我们可能需要查询可能出现的所有结果,即A、B两表内数据两两组合全排,这时,我们可以使用 cross join 关键词来完成。

当然在实际使用中,我们应该尽可能避免这种情况。