当前位置:   article > 正文

SQL联表查询

sql联表查询

表1学生信息表
在这里插入图片描述
表二专业信息表
在这里插入图片描述
– join on 连接查询
– where 等值查询

1、内连接

在这里插入图片描述

分为两种
等值连接: 查找两个表中连接字段相等的记录。

--查询每个学生的(学生表)学号、姓名、籍贯、年龄、(专业表)专业、班级
--涉及到student和major两张表,用共有字段“学号”为连接字段

--写法1:使用INNER JOIN
SELECT A.学号, A.姓名, A.籍贯, A.年龄, B.专业, B.班级
FROM student A
INNER JOIN major B   
ON  A.学号=B.学号

--写法2:--省去了INNER,直接写JOIN,与INNER JOIN没有区别
SELECT A.学号, A.姓名, A.籍贯, A.年龄, B.专业, B.班级
FROM student A
JOIN major B  
ON  A.学号=B.学号

--写法3: --使用WHERE,已经逐渐被淘汰
SELECT A.学号, A.姓名, A.籍贯, A.年龄, B.专业, B.班级
FROM student A, major B
WHERE A.学号=B.学号 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

自身连接: 就是和自己进行连接查询,给一张表取两个不同的别名,然后附上连接条件。

--要在学生表里查询与 HH 同龄且籍贯也相同的学生信息

SELECT B.学号, B.姓名, B.性别, B.籍贯, B.年龄
FROM student A 
JOIN student B
ON A.年龄=B.年龄 AND A.籍贯=B.籍贯 AND A.姓名='HH'
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

我自己对于自身连接的理解:首先要查询B表中的数据,将A表的姓名的条件用完,A表只剩下了一HH相关的数据。接着执行AB的等值条件并从B表中筛选出数据。

2、左连接

获取左表中的所有记录,即使在右表没有对应匹配的记录。

--左连接:显示左表student所有记录,如右表中没有与之
--匹配的项则以NULL值代替。

SELECT A.学号, A.姓名, A.籍贯, A.年龄, B.专业, B.班级
FROM student A LEFT JOIN major B  
ON  A.学号=B.学号
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

在这里插入图片描述
左连接(以左边的记录为基准)个人理解:
左表student右表major
上述要查询AB表中的信息,条件为学号
首先先找出AB中学号相同的记录

SELECT A.学号, A.姓名, A.籍贯, A.年龄, B.专业, B.班级
FROM student A, `master` B  
WHERE  A.学号=B.学号
  • 1
  • 2
  • 3

在这里插入图片描述
由于是左连接,A表中还剩下几条数据,而这几条数据在B表中没有相应的数据,那么补NULL即可

3、右连接

在这里插入图片描述

--右连接:显示右表major所有记录,如左表中没有与之
--匹配的项则以NULL值代替。

SELECT A.学号, A.姓名, A.籍贯, A.年龄, B.专业, B.班级
FROM student A RIGHT JOIN major B  
ON  A.学号=B.学号
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

在这里插入图片描述
个人理解:现根据条件进行等值连接,再右表中的数据补上,没有的值补上NULL

4、完全连接

返回两个表的所有行
在这里插入图片描述

--完全连接:显示两张表的并集,如果其中一张表的记录
--在另一张表中没有匹配的行,则对应的数据项填充NULL

SELECT A.学号, A.姓名, A.籍贯, A.年龄, B.专业, B.班级
FROM student A FULL JOIN major B  
ON  A.学号=B.学号
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

在这里插入图片描述
个人理解:有点像是左右连接的结合体。

5、交叉连接

结果是笛卡尔积,就是第一个表的行数乘以第二个表的行数。
在这里插入图片描述

--交叉连接:一张表中的数据依次取出分别与另一张表中的
--每条数据挨个组合,最后记录数量为两张表记录数的乘积

SELECT * FROM student CROSS JOIN major

--本例student和major都为7条记录,所以结果为7*7=49条记录
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

在这里插入图片描述
个人理解:左表中的每一条数据都和右表中的每一条数据进行匹配
左表7条
右表7条
那么查询出的结果就是49条

6、左表唯一

返回左表有但右表没有关联数据的记录。
在这里插入图片描述

--左表唯一:将右表B以及两张表交集的部分过滤掉,
--得到的记录是左表中唯一存在的。

SELECT A.学号, A.姓名, A.籍贯, A.年龄, B.专业, B.班级
FROM student A LEFT JOIN major B  
ON  A.学号=B.学号
WHERE B.学号 IS NULL
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

在这里插入图片描述

7、右表唯一

--右表唯一:将左表A以及两张表交集的部分过滤掉,
--得到的记录是右表中唯一存在的。

SELECT A.学号, A.姓名, A.籍贯, A.年龄, B.专业, B.班级
FROM student A RIGHT JOIN major B  
ON  A.学号=B.学号
WHERE A.学号 IS NULL
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

在这里插入图片描述

8、非交集连接

在这里插入图片描述

--非交集连接:查找两张表中没有关联的记录项。

SELECT A.学号, A.姓名, A.籍贯, A.年龄, B.专业, B.班级
FROM student A FULL JOIN major B  
ON  A.学号=B.学号
WHERE A.学号 IS NULL OR B.学号 IS NULL
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

在这里插入图片描述
相当于左右表唯一的结合体

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/189045
推荐阅读
相关标签
  

闽ICP备14008679号