【数据库学习笔记】04 MySQL数据库的联表查询

2018.4.13

联表 查询

一:内连接

上面的连接语句就是内连接,但它不是SQL标准中的查询方式,可以理解为方言!
SQL标准的内连接为:


    SELECT *FROM emp e
    INNER JOIN dept d
    ON e.deptno=d.deptno;

内连接的特点:查询结果必须满足条件。

二:外连接

包括左外连接和右外连接,外连接的特点:查询出的结果存在不满足条件的可能。
a.左外连接
SELECT * FROM emp e
LEFT OUTER JOIN dept d
ON e.deptno=d.deptno;
        
左连接是先查询出左表(即以左表为主),然后查询右表,右表中满足条件的显示出来,不满足条件的显示NULL。
b.右外连接
右连接就是先把右表中所有记录都查询出来,然后左表满足条件的显示,不满足显示NULL     
        
连接不限与两张表,连接查询也可以是三张、四张,甚至N张表的连接查询。通常连接查询不可能需要整个笛卡尔积,而只是需要其中一部分,那么这时就需要使用条件来去除不需要的记录。这个条件大多数情况下都是使用主外键关系去除。
两张表的连接查询一定有一个主外键关系,三张表的连接查询就一定有两个主外键关系,所以在大家不是很熟悉连
接查询时,首先要学会去除无用笛卡尔积,那么就是用主外键关系作为条件来处理。如果两张表的查询,那么至少
有一个主外键条件,三张表连接至少有两个主外键条件。
    
--********关联查询**********

-- 交叉查询,这个结果是有问题的 笛卡尔乘积 存在重复数据 不推荐使用
select empName,deptName from employee,dept;

-- 需求: 查询员工及其所在目标,显示员工姓名和部门名称
-- 多表查询
-- 1.确定查询哪些表格 2.确定要查询的字段 3.表和表之间的关系


-- 内连接查询,只有满足条件的结果才会展示(使用最多的多表查询)
select empName,deptName 	-- 要查询的字段
from employee,dept 	-- 要查询的表格
where empName.deptID =dept.id; --表和表之间的关系

-- inner join 内连接的另一种语法,where查询的结果是一样
select empName,deptName
from employee	--主表
inner join dept --连接的哪一种表
on employee.deptID = dept.id;

-- 使用别名
select e.empName,d.deptName
from employee e
inner join dept d 
on e.deptID = dept.id;

-- 需求,查看每一个部门的员工
-- 预期结果
--	Javaee 张三
--	javaee 赵六
--	ios 王五
--	php 李四

-- A left/right outer join B

-- 左【外】连接查询: 使用左边表中的数据来匹配右边表的数据,如果有符合条件,
--展示数据格式:A表字段在左 B表字段在右,如果没有符合条件的连接数据,显示null
select d.deptName,e.empName
from dept d
left outer join employee e
on d.id = e.deptID;

-- 右【外】连接查询: 使用左边表中的数据来匹配左边表的数据,如果有符合条件,
-- 展示数据格式:A表字段在右,B表字段在左,如果没有符合条件的连接数据,显示null
select d.deptName,e.empName
from employee e
right outer join dept d
on d.id = e.deptID;

-- 自连接查询

-- 修改员工表结构,添加上司
alter table employee add bossId int;

update employee set bossId = 1 where id = 2;
update employee set bossId = 2 where id = 3;
update employee set bossId = 3 where id = 4;

-- 预期结果
	--张三 null
	--李四 张三
	--王五 李四
	--赵六 王五
select e.employee,b.employee
from employee e
left outer join employee b
on e.bossId = b.id;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值