【你也能从零基础学会网站开发】 SQL Server结构化查询语言数据操作应用--DML篇 浅谈SQL JOIN多表查询之LEFT JOIN左外连接查询

🚀 个人主页 极客小俊
✍🏻 作者简介:程序猿、设计师、技术分享
🐋 希望大家多多支持, 我们一起学习和进步!
🏅 欢迎评论 ❤️点赞💬评论 📂收藏 📂加关注

多表查询

之前我们使用了inner join两张表进行的查询,

其实如果直接对多个表查询的时候,我们可以使用之间用逗号隔开进行查询!

语法结构

select * from1,2

举个栗子

这里我们简单的创建两张表Company和Employee

如下

CREATE TABLE Company(
  cid int PRIMARY KEY IDENTITY,
  cname VARCHAR(255) NOT NULL,
  cmsg VARCHAR(255),
  Address VARCHAR(255),
  NumberPeople INT
)

CREATE TABLE Employee(
  eid int PRIMARY KEY IDENTITY,
  ename VARCHAR(255) NOT NULL,
  eage TINYINT,
  esaley INT,
  epart VARCHAR(255) NOT NULL,
  ephone VARCHAR(255) NOT NULL,
  cid INT,
)

为了方便测试, 这里我就不再创建外键约束

然后插入一些数据进去!

插入公司信息

INSERT INTO Company(cname,cmsg,Address,NumberPeople) VALUES('重庆新俊方','科技企业','重庆市渝中区',5000);
INSERT INTO Company(cname,cmsg,Address,NumberPeople) VALUES('成都水刚','制造企业','成都庆阳',8000);
INSERT INTO Company(cname,cmsg,Address,NumberPeople) VALUES('重庆欧元','金融企业','重庆市杨家平',450);
INSERT INTO Company(cname,cmsg,Address,NumberPeople) VALUES('重庆万科集团','房地产企业','重庆市江北',876);
INSERT INTO Company(cname,cmsg,Address,NumberPeople) VALUES('香港时代证券','金融企业','香港九龙',100);
INSERT INTO Company(cname,cmsg,Address,NumberPeople) VALUES('贵州圣烟','烟草企业','贵州山脉',682);

插入员工信息

INSERT INTO Employee(ename,eage,esaley,epart,ephone,cid) VALUES('张军',26,3600,'开发部门','333-222-777',5);
INSERT INTO Employee(ename,eage,esaley,epart,ephone,cid) VALUES('王辉',30,5600,'技术部门','111-000-888',4);
INSERT INTO Employee(ename,eage,esaley,epart,ephone,cid) VALUES('张三进',21,2301,'市场部门','666-777-111',2);
INSERT INTO Employee(ename,eage,esaley,epart,ephone,cid) VALUES('杨小明',26,4520,'开发部门','888-999-000',3);
INSERT INTO Employee(ename,eage,esaley,epart,ephone,cid) VALUES('刘罗戈',19,7800,'新媒体部门','111-111-111',4);
INSERT INTO Employee(ename,eage,esaley,epart,ephone,cid) VALUES('毛利兰',22,3000,'市场部门','999-999-321',1);
INSERT INTO Employee(ename,eage,esaley,epart,ephone,cid) VALUES('詹华',22,8000,'运营部门','999-888-321',8);
INSERT INTO Employee(ename,eage,esaley,epart,ephone,cid) VALUES('何林',37,2500,'制造部门','100-888-321',9);

如图

准备好数据之后,我们现在来进行两表查询~

select * from Company,Employee

如果我们这样写查询,那么会返回以下结果集:

如图

从结果集可以,最终得到的数据量是两张表记录数的乘积,在数学里面叫迪卡尔积

所以说我们在进行多表查询的时候要注意了,不要把没有建立关系的多表放在一起进行查询,否则会出现过多的数据, 这些数据拿来也没什么意义!

我们主要还是要用到关联查询, 那么今天我们就来讨论一下外连接查询

外连接 OUTER JOIN

我们之前学的INNER JOIN内连接查询,在SQL中还有一个叫OUTER JOIN外连接的查询方式!

外连接又分为左连接(LEFT JOIN)右连接(RIGHT JOIN)全连接(FULL JOIN) 这三种!

那么今天主要我们要讲的就是LEFT JOIN !

LEFT JOIN 左外连接查询

左连接LEFT JOINSQL中一种常用的连接查询,它用于返回左表也就是连接语句中左边的表中的所有记录右表也就是连接语句中右边的表中满足连接条件的记录。

但是如果右表中没有满足连接条件的记录,那么结果集中对应的右表字段将显示为NULL值

原理图如下

也就是说LEFT JOIN是把左表全部查询出来,右表符合条件的查询出来,不符合条件补NULL

我们首先来看看这种查询的语法结构:

如下

SELECT [字段..*] FROM 表名称1 LEFT JOIN 表名2 ON 表名称1.关联字段=表名称2.关联字段;

或者写成一下方式

SELECT [字段..*] FROM 表名称1 LEFT OUTER JOIN 表名2 ON 表名称1.关联字段=表名称2.关联字段;

应用场景

按照我们刚刚上面创建的数据表,我们使用LEFT JOIN来查询一下!

比如说现在,我们想要查询所有公司的信息,并且公司下所对应的员工信息!
但是可能有些公司根本就没有员工, 也就是说在员工表中的公司ID关联字段中,并没有对应该公司的关联记录!

在这种情况下,我们希望结果集中仍然包含这些公司的信息
但是对于这些没有员工的公司,我们在右边进行补NULL显示!

SQL如下

SELECT * FROM Company AS c LEFT JOIN Employee AS e ON c.cid = e.cid

如图


看到了吧,这个结果集就是我们想要的!~

我们可以在测试一下,我们把员工表中的毛利兰删除,然后再查询试试看!

如图


很显然,没有员工的公司对应的右侧,就会补充NULL

我们可以把这个查询条件修改一下,比如我们现在要查询没有员工的公司,有哪些!

SQL Server 2000中,我们可以使用IS NULLIS NOT NULL来判断一个查询结果字段值是否为NULL

这里我们根据结果集中的命名别名字段来进行过滤!

SQL如下

SELECT c.cname FROM Company AS c LEFT JOIN Employee AS e ON c.cid = e.cid WHERE e.cid is NULL

结果如下

那现在就有人要问了,那如果我们把查询的左表右表位置对调,是什么结果呢?

呵呵,这个道理也是一样,总之左表会全部显示出来,右表 根据条件显示!

不满足条件依旧是补NULL

那现在我们对调一下,我们现在查询Employee员工表, 看看哪些员工没有对应的公司!

如下

SELECT * FROM Employee AS c LEFT JOIN Company AS e ON c.cid = e.cid 

如图


然后只需使用IS NULL要过滤一下,就可以拿到我们想要的数据记录了!

如下

SELECT e.ename FROM Employee AS e LEFT JOIN Company AS c ON c.cid = e.cid WHERE c.cname is NULL

如图


那么查询出来的结果集中,这两个人是没有对应的公司的!

所以,大家不要觉得LEFT JOIN中的左表右表 是不变的

在执行业务查询的时候,我们都是要根据需求和问题来灵活运用的!

"👍点赞" "✍️评论" "收藏❤️"

大家的支持就是我坚持下去的动力!

如果以上内容有任何错误或者不准确的地方,🤗🤗🤗欢迎在下面 👇👇👇 留个言指出、或者你有更好的想法,
欢迎一起交流学习❤️❤️💛💛💚💚

更多好玩 好用 好看的干货教程可以点击下方关注❤️微信公众号❤️
说不定有意料之外的收获哦..🤗嘿嘿嘿、嘻嘻嘻🤗!
🌽🍓🍎🍍🍉🍇

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值