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

多表查询
之前我们使用了inner join对两张表进行的查询,
其实如果直接对多个表查询的时候,我们可以使用表与表之间用逗号隔开进行查询!
语法结构
select * from 表1,表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 JOIN是SQL中一种常用的连接查询,它用于返回左表也就是连接语句中左边的表中的所有记录和右表也就是连接语句中右边的表中满足连接条件的记录。
但是如果右表中没有满足连接条件的记录,那么结果集中对应的右表字段将显示为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 NULL或IS 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中的左表和右表 是不变的
在执行业务查询的时候,我们都是要根据需求和问题来灵活运用的!


"👍点赞" "✍️评论" "收藏❤️"欢迎一起交流学习❤️❤️💛💛💚💚

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


1012

被折叠的 条评论
为什么被折叠?



