SQL连接查询

SQL连接查询

No.1 【INNER JOIN】内连接

最常用的连接方式,获取两个表中指定字段满足匹配关系的记录。

img

从一张表中取出所有的记录去另外一张表中匹配,利用匹配条件进行匹配,超过了则保留,失败了则放弃

原理
(1)、从第一张表中取出一条记录,然后去另外一张表中进行匹配。
(2)、利用匹配条件进行匹配:
匹配到:保留,继续向下匹配;
匹配失败:向下继续,如果全表匹配失败,结束

内连接通常有两种情况:

  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.学号 
    
    --上面三种写法的结果都是一样的,推荐使用写法2
    
  2. 自身连接:就是和自己进行连接查询,给一张表取两个不同的别名,然后附上连接条件。

    --要在学生表里查询与 姓名为 'HH' 同龄且籍贯也相同的学生信息
    
    SELECT B.学号, B.姓名, B.性别, B.籍贯, B.年龄
    FROM student A 
    JOIN student B
    ON A.年龄=B.年龄 AND A.籍贯=B.籍贯 AND A.姓名='HH'
    

No.2 【OUTER JOIN】外连接

按照某一张表作为主表(表中所有记录在最后都会保留),根据条件去连接另外一张表,从而得到目标数据。

外连接分为左外连接(left join)和右外连接(right join)2种

左外连接(left join):左边是主表
右外连接(left join):右边是主表

【LEFT JOIN】左外连接

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

img

原理
(1)、确定连接主表:左连接就是left join 左边的表为主表;right join就是右边为主表
(2)、拿主表的每一条记录,去匹配另外一张表(从表)的每一条记录
(3)、如果满足匹配条件:保留;不满足即不保留
(4)、如果主表记录在从表中一条都没有匹配成功,也要保留该记录,但是从表对应的字段值都为null;

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

SELECT A.学号, A.姓名, A.籍贯, A.年龄, B.专业, B.班级
FROM student A LEFT JOIN major B  
ON  A.学号=B.学号
【RIGHT JOIN】右外连接

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

img

原理

与左连接相同

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

SELECT A.学号, A.姓名, A.籍贯, A.年龄, B.专业, B.班级
FROM student A RIGHT JOIN major B  
ON  A.学号=B.学号

No.3 【FULL JOIN】 完全连接

返回两个表中的所有行。

img

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

SELECT A.学号, A.姓名, A.籍贯, A.年龄, B.专业, B.班级
FROM student A FULL JOIN major B  
ON  A.学号=B.学号

No.4 【CROSS JOIN】交叉连接

结果是笛卡尔积,就是第一个表的行数乘以第二个表的行数。

img

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

SELECT * FROM student CROSS JOIN major

--本例student和major都为7条记录,所以结果为7*7=49条记录

No.5 延伸【Left Excluding JOIN】左表唯一

返回左表有但右表没有关联数据的记录。

img

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

SELECT A.学号, A.姓名, A.籍贯, A.年龄, B.专业, B.班级
FROM student A LEFT JOIN major B  
ON  A.学号=B.学号
WHERE B.学号 IS NULL

No.6 延伸【Right Excluding JOIN】右表唯一

返回右表有但左表没有关联数据的记录。

img

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

SELECT A.学号, A.姓名, A.籍贯, A.年龄, B.专业, B.班级
FROM student A RIGHT JOIN major B  
ON  A.学号=B.学号
WHERE A.学号 IS NULL

No.7 延伸【Outer Excluding JOIN】非交集连接

返回左表和右表里没有相互关联的记录。

img

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

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

88361804)]

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

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
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值