🚀 个人主页 极客小俊
✍🏻 作者简介:程序猿、设计师、技术分享
🐋 希望大家多多支持, 我们一起学习和进步!
🏅 欢迎评论 ❤️点赞💬评论 📂收藏 📂加关注
多表查询
之前我们使用了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
中的左表
和右表
是不变的
在执行业务查询的时候,我们都是要根据需求和问题来灵活运用的!
"👍点赞" "✍️评论" "收藏❤️"
欢迎一起交流学习❤️❤️💛💛💚💚
好玩 好用 好看
的干货教程可以点击下方关注❤️微信公众号❤️
说不定有意料之外的收获哦..🤗嘿嘿嘿、嘻嘻嘻🤗!
🌽🍓🍎🍍🍉🍇