多表连接SQL知识点回顾

本文回顾了SQL中的多种连接查询原理,包括内连接、左连接、右连接和笛卡尔积连接。重点阐述了连接查询的方向性、主附关系和对应关系,以及如何设置连接条件。在实际应用中,应根据需求选择合适的连接类型,确保维度完整性和度量准确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

几种连接查询原理回顾

多表连接的结果通过三个属性决定:

  • 方向性:在外连接中写在前边的表为左表、写在后边的表为右表。
  • 主附关系:主表要出所有的数据范围,附表与主表无匹配项时标记为null,内连接时无主附表之
  • 对应关系:关键字段中有重复值的表为多表,没有重复值的表为一表。

对应关系:一对一、一对多或多对一、多对多
连接方式:
内连接:
在这里插入图片描述

select ename,job,hiredate,sal,dname
from emp
inner join dept
on emp.deptno=dept.deptno;
+--------+-----------+------------+------+------------+
| ename | job    | hiredate  | sal | dname   |
+--------+-----------+------------+------+------------+
| clark | manager  | 1981-06-09 | 2450 | accounting |
| king  | persident | 1981-11-17 | 5000 | accounting |
| miller | clerk   | 1982-01-23 | 1300 | accounting |
| smith | clerk   | 1980-12-17 |  800 | research  |
| jones | manager  | 1981-04-02 | 2975 | research  |
| scott | analyst  | 1987-04-19 | 3000 | research  |
| adams | clerk   | 1987-05-23 | 1100 | research  |
| ford  | analyst  | 1981-12-03 | 3000 | research  |
| allen | salesman | 1981-02-20 | 1600 | sales   |
| ward  | salesman | 1981-02-22 | 1250 | sales   |
| martin | salesman | 1981-09-28 | 1250 | sales   |
| blake | manager  | 1981-05-01 | 2850 | sales   |
| turner | salesman | 1981-09-08 | 1500 | sales   |
| james | clerk   | 1981-12-03 |  950 | sales   |
+--------+-----------+------------+------+------------+

左连接
在这里插入图片描述

select dept.deptno,dname,count(empid)
from dept
left join emp
on dept.deptno=emp.deptno
group by dept.deptno;
+--------+------------+--------------+
| deptno | dname   | count(empid) |
+--------+------------+--------------+
|   10 | accounting |       3 |
|   20 | research  |       5 |
|   30 | sales   |       6 |
|   40 | operations |       0 |
+--------+------------+--------------+

右连接按照连接条件,返回两张表中满足条件的记录,以及右表中的所有记录,左表匹配不到显
示为null。
在这里插入图片描述

笛卡尔积连接

两张表中的每一条记录进行笛卡尔积组合,然后根据where条件过滤虚拟结果集中
的记录。

select ename,job,hiredate,sal,dname
from emp,dept
where emp.deptno=dept.deptno;
+--------+-----------+------------+------+------------+
| ename | job    | hiredate  | sal | dname   |
+--------+-----------+------------+------+------------+
| clark | manager  | 1981-06-09 | 2450 | accounting |
| king  | persident | 1981-11-17 | 5000 | accounting |
| miller | clerk   | 1982-01-23 | 1300 | accounting |
| smith | clerk   | 1980-12-17 |  800 | research  |
| jones | manager  | 1981-04-02 | 2975 | research  |
| scott | analyst  | 1987-04-19 | 3000 | research  |
| adams | clerk   | 1987-05-23 | 1100 | research  |
| ford  | analyst  | 1981-12-03 | 3000 | research  |
| allen | salesman | 1981-02-20 | 1600 | sales   |
| ward  | salesman | 1981-02-22 | 1250 | sales   |
| martin | salesman | 1981-09-28 | 1250 | sales   |
| blake | manager  | 1981-05-01 | 2850 | sales   |
| turner | salesman | 1981-09-08 | 1500 | sales   |
| james | clerk   | 1981-12-03 |  950 | sales   |
+--------+-----------+------------+------+------------+

自连接:通过设置表别名,将一张表虚拟成多张表。

等值连接与非等值连接

上述都是等值连接
那么非等值连接则:
不等值连接:连接条件是两张表中的关键字段取值满足非等值比较运算

select ename,job,hiredate,sal,grade
from emp
inner join salgrade
on sal between losal and hisal;
+--------+-----------+------------+------+-------+
| ename | job    | hiredate  | sal | grade |
+--------+-----------+------------+------+-------+
| smith | clerk   | 1980-12-17 |  800 |   1 |
| allen | salesman | 1981-02-20 | 1600 |   3 |
| ward  | salesman | 1981-02-22 | 1250 |   2 |
| jones | manager  | 1981-04-02 | 2975 |   4 |
| martin | salesman | 1981-09-28 | 1250 |   2 |
| blake | manager  | 1981-05-01 | 2850 |   4 |
| clark | manager  | 1981-06-09 | 2450 |   4 |
| scott | analyst  | 1987-04-19 | 3000 |   4 |
| king  | persident | 1981-11-17 | 5000 |   5 |
| turner | salesman | 1981-09-08 | 1500 |   3 |
| adams | clerk   | 1987-05-23 | 1100 |   1 |
| james | clerk   | 1981-12-03 |  950 |   1 |
| ford  | analyst  | 1981-12-03 | 3000 |   4 |
| miller | clerk   | 1982-01-23 | 1300 |   2 |
+--------+-----------+------------+------+-------+

连接总结

一表作为主表可以保证维度的完整性,多表作为主表可以保证度量的准确性。
在没有明确表示需要保证维度完整性的情况下,优先保证度量的准确性,所以将度量值所在的表作
为主表。
度量字段通常存在于多表中,因此通常情况下可以将多表作为主表进行外连接。

  • 确定查询的信息在哪几张表
  • 确定表和表之间的对应关系和主附关系
  • 确定表和表之间的连接条件
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值