07【连接查询】(1)

insert into s2 values(1,‘小明’);
insert into s2 values(2,‘小龙’);
insert into s2 values(3,‘小红’);

– 小明的年龄为23岁,籍贯为江西
insert into info values(1,23,‘江西’);

– 小龙的年龄为25岁,籍贯为广西
insert into info values(2,25,‘广西’);

– 小红的年龄为34岁,籍贯为山西
insert into info values(3,34,‘山西’);


#### 7.1.4 表关系小结




| 表与表的关系 | 关系的维护 |
| --- | --- |
| 一对多 | 通过从表中外键来维护 |
| 多对多 | 通过中间表,将两个一对多加到一起变成了一个多对多 |
| 一对一 | 1. 外键添加约束 2. 从表的主键又是外键 可以简化成一张表 |


### 7.2 笛卡尔积


* 数据准备



create database db03;

use db03;

– 创建部门表
create table dept(
id int primary key auto_increment,
name varchar(20)
);

insert into dept(name) values (‘研发部’),(‘销售部’),(‘财务部’);

– 创建员工表
create table emp (
id int primary key auto_increment,
name varchar(10),
addr varchar(30),
age int,
sex char(1),
dept_id int,
foreign key (dept_id) references dept(id) – 外键,关联部门表(部门表的主键)
);

INSERT INTO emp VALUES (1, ‘小明’, ‘南昌’, 24, ‘男’, 1);
INSERT INTO emp VALUES (2, ‘小红’, ‘九江’, 20, ‘女’, 1);
INSERT INTO emp VALUES (3, ‘小兰’, ‘抚州’, 19, ‘女’, 2);
INSERT INTO emp VALUES (4, ‘小龙’, ‘宜春’, 18, ‘男’, 2);
INSERT INTO emp VALUES (5, ‘小军’, ‘赣州’, 23, ‘男’, 3);


#### 7.2.1 什么是笛卡尔积现象


* 什么是笛卡尔积:



– 需求:查询所有的员工和所有的部门
select * from dept,emp;


结果如下:


![在这里插入图片描述](https://img-blog.csdnimg.cn/0e7bd65f0da640298e0cd7c01e2f37c1.png#pic_center)


如果左表是部门表,右表是员工表,左表中每一行记录与右表中的每一行记录全都匹配一次。


结果的行数=左表中行数x右表中行数


* 结果分析:


![在这里插入图片描述](https://img-blog.csdnimg.cn/359d73581d3e4268ba9cc51f8653cd95.png#pic_center)


#### 7.2.2 如何清除笛卡尔积现象的影响


![在这里插入图片描述](https://img-blog.csdnimg.cn/e5eb3becb9c649aea20c909643a26155.png#pic_center)


我们发现不是所有的数据组合都是有用的,只有**员工表.dept\_id = 部门表.id**


的数据才是有用的。所以需要通过条件过滤掉没用的数据。



– 设置过滤条件
– 指定过滤条件 主表.主键=从表.外键
select * from dept,emp where dept.id = emp.dept_id;

– 可以给表起别名
select * from dept d,emp e where d.id = e.dept_id;


![在这里插入图片描述](https://img-blog.csdnimg.cn/ba4428df0b084b5fb18c7131b8b40db7.png#pic_center)



> 
> Tips:以上过滤以后的结果称为**隐式内连接**
> 
> 
> 


### 7.3 内连接


用左边表的记录去匹配右边表的记录,如果符合条件的则显示


#### 7.3.1 隐式内连接


* 隐式内连接:看不到JOIN关键字,条件使用WHERE指定



select 列名 from 左表, 右表 where 主表.主键=从表.外键

select * from dept,emp where dept.id=emp.dept_id;


* 上面的案例是就隐式内连接


#### 7.3.2 显式内连接


无论是显示内连接还是隐式内连接查询结果是一样的,只是写法不同。


* 显式内连接:使用`INNER JOIN ... ON`语句, 可以省略INNER



select 列名 from 左表 inner join 右表 on 主表.主键=从表.外键



> 
> Tips:隐式内连接只能使用where来进行表的关联;显示内连接可以使用on和where来关联,推荐使用on
> 
> 
> 


案例:查询小龙的信息,显示员工id,姓名,地址,年龄和所在的部门名称,我们发现需要联合2张表同时才能查询出需要的数据,使用内连接


* 1)确定需要查询的表(dept、emp表)


![在这里插入图片描述](https://img-blog.csdnimg.cn/e4c0af80a3c04cc591e8bf598f4d2341.png#pic_center)


2)确定连接条件(过滤掉不需要的数据,消除笛卡尔积)


3)确定查询条件,我们查询的是小龙的信息,员工表.name=‘小龙’


4)确定查询的列名(员工id,姓名,地址,年龄,部门名称)



– 查询小龙的信息,显示员工id,姓名,地址,年龄和所在的部门名称

– 我们发现需要联合2张表同时才能查询出需要的数据,使用内连接
– 1. 确定查询哪些表,得到笛卡尔积
select * from dept inner join emp;

– 2. 设置表连接的条件
select * from dept d inner join emp e on d.id = e.dept_id;

– 3. 确定查询条件,我们查询的是小龙的信息,员工表.name=‘小龙’
select * from dept d inner join emp e on d.id = e.dept_id where e.name=‘小龙’;

– 4. 员工id,姓名,地址,年龄,部门名称
select
e.id 员工id,
e.name 姓名,
e.addr 地址,
e.age 年龄,
d.name 部门名称 – 部门名称是dept表的
from dept d
inner join emp e
on d.id = e.dept_id
where e.name=‘小龙’;


![在这里插入图片描述](https://img-blog.csdnimg.cn/b2bd3516f929479a933c7dbb6a6d463e.png#pic_center)


#### 7.3.3 内连接查询步骤:


1. 确定查询哪些表
2. 确定表连接的条件,通常是 主表.主键=从表.外键(消除笛卡尔积)
3. 确定查询条件
4. 确定查询的列


### 7.4 左外连接


#### 7.4.1 左连接的语法:


* 左外连接:使用`LEFT OUTER JOIN ... ON`,`OUTER`可以省略



select 列名 from 左表 left join 右表 on 表连接条件


#### 7.4.2 左连接的案例:


需求:在部门表中增加一个行政部,需要查询所有的部门和员工,将部门表设置成左表,员工表设置成右表



select * from dept;

insert into dept (name) values (‘行政部’);

– 使用内连接查询

– 需要查询所有的部门和员工,无论这个部门下有没有员工
select * from dept inner join emp on dept.id = emp.dept_id;


结果如下:


![在这里插入图片描述](https://img-blog.csdnimg.cn/aabdb58aeb6a4ed8a8a4a1f68d92a7f0.png#pic_center)


使用左外连接查询:



select * from dept left join emp on dept.id = emp.dept_id;


![在这里插入图片描述](https://img-blog.csdnimg.cn/2db6fa970f6043d9a0aa6d8a9a787930.png#pic_center)


**左连接的概念:查询的数据以左表为准,即使在其他表中没有匹配的记录也会显示出来;**


### 7.5 右外连接


#### 7.5.1 右连接的语法:


* 右外连接:使用`RIGHT OUTER JOIN ... ON`,`OUTER`可以省略


语法:



select 列名 from 左表 right join 右表 on 表连接条件


#### 7.5.2 右连接的案例:


需求:在员工表中增加一个员工,但该员工还未分配部门



select * from emp;

– 不在任何一个部门
INSERT INTO emp VALUES (6, ‘小赵’, ‘吉安’, 26, ‘男’, null);

– 希望员工的信息全部显示出来

– 使用内连接查询
select * from dept inner join emp on dept.id = emp.dept_id;


内连接查询结果:


![在这里插入图片描述](https://img-blog.csdnimg.cn/4a65d703c1314d12b0684756e47b3213.png#pic_center)


使用右外连接查询:



– 使用右外连接查询
select * from dept right join emp on dept.id = emp.dept_id;


![在这里插入图片描述](https://img-blog.csdnimg.cn/fb84fe1a846345848e972526cb393a5c.png#pic_center)


**右连接的概念:查询的数据以右表为准,即使在其他表中没有匹配的记录也会显示出来;**


### 7.6 全连接



## 写在最后

**在结束之际,我想重申的是,学习并非如攀登险峻高峰,而是如滴水穿石般的持久累积。尤其当我们步入工作岗位之后,持之以恒的学习变得愈发不易,如同在茫茫大海中独自划舟,稍有松懈便可能被巨浪吞噬。然而,对于我们程序员而言,学习是生存之本,是我们在激烈市场竞争中立于不败之地的关键。一旦停止学习,我们便如同逆水行舟,不进则退,终将被时代的洪流所淘汰。因此,不断汲取新知识,不仅是对自己的提升,更是对自己的一份珍贵投资。让我们不断磨砺自己,与时代共同进步,书写属于我们的辉煌篇章。**


需要完整版PDF学习资源私我



  • 11
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值