SQL研习录(13)——多表连接查询


版权声明

  • 本文原创作者:清风不渡
  • 博客地址:https://blog.csdn.net/WXKKang

一、测试数据解释

  为了更好的学习连接查询,我们以知识带示例的方式讲解,首先让我们创建测试数据:student表与family表,其中,family表的s_id为student表的主键(s_id)的外键,代码如下:

-- 学生表
CREATE TABLE student(
	s_id varchar(50) NOT NULL PRIMARY KEY,
	s_name varchar(50),
	s_gender varchar(50)
)

-- 插入数据
INSERT INTO student (s_id,s_name,s_gender) VALUES ('S101','Lucy','female');
INSERT INTO student (s_id,s_name,s_gender) VALUES ('S102','Jack','male');
INSERT INTO student (s_id,s_name,s_gender) VALUES ('S103','Bruce','male');
INSERT INTO student (s_id,s_name,s_gender) VALUES ('S104','Tom','male');
INSERT INTO student (s_id,s_name,s_gender) VALUES ('S105','Jayce','male');

-- 家庭表
CREATE TABLE family(
	f_id varchar(50) NOT NULL PRIMARY KEY,
	f_name varchar(50),
	f_relationship varchar(50),
	s_id varchar(50) FOREIGN KEY REFERENCES student(s_id)
)

-- 插入数据
INSERT INTO family (f_id,s_id,f_name,f_relationship) VALUES('F101','S101','老张','父子');
INSERT INTO family (f_id,s_id,f_name,f_relationship) VALUES('F102','S101','翠花','母子');
INSERT INTO family (f_id,s_id,f_name,f_relationship) VALUES('F103','S104','老李','父子');
INSERT INTO family (f_id,s_id,f_name,f_relationship) VALUES('F104','S104','赵刚','母子');
INSERT INTO family (f_id,s_id,f_name,f_relationship) VALUES('F105','S105','熏悟空','父子');
INSERT INTO family (f_id,s_id,f_name,f_relationship) VALUES('F106','S105','举八戒','母子');

二、Join连接

  Join连接用于把来自两个或多个表的行结合起来,基于这些表之间的共同字段,下面我们列举一下不同的Join类型后再进行详解

  • INNER JOIN :内部连接,如果表中有至少一个匹配,则返回行
  • LEFT JOIN :左连接,即使右表中没有匹配,也从左表返回所有的行
  • RIGHT JOIN :右连接,即使左表中没有匹配,也从右表返回所有的行
  • FULL JOIN :全连接,只要其中一个表中存在匹配,则返回行

三、内部连接(INNER JOIN)

  内部链接INNER JOIN关键字选择两个表中具有匹配值的记录,注意:使用INNER JOIN和单独使用JOIN意义是相同的,示图如下:
在这里插入图片描述

1、基本语法

  INNER JOIN的基本如下:

SELECT column_name(s)
FROM table1
INNER JOIN table2 ON table1.column_name = table2.column_name;

2、示例

  例如我们需要查询上面测试表中登记了家庭信息的学生与家人信息,可使用如下语句:

SELECT a.f_name,b.s_name,a.f_relationship FROM family a INNER JOIN student b ON a.s_id=b.s_id;

  执行结果如下:
在这里插入图片描述

四、左连接(LEFT JOIN)

  SQL左链接LEFT JOIN关键字返回左表(表1)中的所有行,即使在右表(表2)中没有匹配;如果在正确的表中没有匹配,结果是NULL,示图如下:
在这里插入图片描述

1、基本语法

  LEFT JOIN的基本如下:

SELECT _column_name(s)_  
FROM _table1_  
LEFT JOIN _table2_  
ON _table1.column_name_ = _table2.column_name_ ;

  或者,在一些数据库中LEFT JOIN被称之为LEFT OUTER JOIN:

扫描二维码关注公众号,回复: 8708468 查看本文章
SELECT _column_name(s)_  
FROM _table1_  
LEFT OUTER JOIN _table2_  
ON _table1.column_name_ = _table2.column_name_ ;

2、示例

  我们可以在上面的测试数据库中使用左连接查询来查询所有学生及他的家庭信息,没有填写的显示为NULL,代码如下:

SELECT a.f_name,b.s_name,a.f_relationship FROM student b LEFT JOIN family a ON a.s_id=b.s_id;

  执行结果如下:
在这里插入图片描述

五、右连接(RIGHT JOIN)

  SQL右链接 RIGHT JOIN 关键字返回右表(table2)的所有行,即使在左表(table1)上没有匹配;如果左表没有匹配,则结果为NULL;正好和左连接呈对称关系,示图如下:
在这里插入图片描述

1、基本语法

  RIGHT JOIN的基本如下:

SELECT column_name(s)
FROM table1
RIGHT JOIN table2 ON table1.column_name = table2.column_name;

  或者,在一些数据库中RIGHT JOIN被称之为RIGHT OUTER JOIN:

SELECT column_name(s)
FROM table1
RIGHT OUTER JOIN table2 ON table1.column_name = table2.column_name;

2、示例

  例如,我们可以在上面的测试数据中使用右连接,代码如下:

SELECT a.f_name,b.s_name,a.f_relationship FROM family a RIGHT JOIN student b ON a.s_id=b.s_id;

  执行结果如下:
在这里插入图片描述

五、全连接(FULL JOIN)

  当左(表1)或右(表2)表记录匹配时,FULL JOIN关键字将返回所有记录
  注意: FULL JOIN可能会返回非常大的结果集!示图如下:
在这里插入图片描述

1、基本语法

  FULL JOIN的基本如下:

SELECT column_name(s)
FROM table1
FULL JOIN table2 ON table1.column_name = table2.column_name;

  或者,在一些数据库中FULL JOIN被称之为FULL OUTER JOIN:

SELECT column_name(s)
FROM table1
FULL OUTER JOIN table2 ON table1.column_name = table2.column_name;

2、示例

  例如,我们可以在上面的测试数据中使用全连接,代码如下:

SELECT a.f_id,b.s_id,a.f_name,b.s_name,a.f_relationship FROM family a FULL JOIN student b ON a.s_id=b.s_id;

  执行结果如下:
在这里插入图片描述

六、自连接

  自连接顾名思义也就是不用关键字也可以连接查询,单前提是表的本身是连接的,效果与内连接(INNER JOIN)相同,基本语法如下:

SELECT column_name(s)
FROM table1 T1, table1 T2
WHERE condition;

  例如,在上面的测试数据中我们如果使用自连接则代码是这样的:

SELECT a.f_id,b.s_id,a.f_name,b.s_name,a.f_relationship FROM family a , student b WHERE a.s_id=b.s_id;

  执行结果如下:
在这里插入图片描述

发布了81 篇原创文章 · 获赞 36 · 访问量 3355

猜你喜欢

转载自blog.csdn.net/WXKKang/article/details/103804894