MySQL笔记4——SQL去重/笛卡尔积现象

1、去重distinct

去除查询结果中的重复记录
select distinct 字段 from 表名

distinct 关键字只能出现在所有字段的最前面
示例
查询共有哪些工作岗位
在这里插入图片描述
统计工作岗位的种类
在这里插入图片描述

select distinct 字段1,字段2,字段3... from 表名

distinct 关键字后面跟多个字段表示所有字段联合去重
在这里插入图片描述

2、连接查询

即多张表联合查询,在实际中为了避免数据的大量重复,导致数据的冗余,会将数据分散存到不同的表中,而不同的表之间又存在着某种关系。

①、连接查询的分类

连 接 方 式 分 类 { 内 连 接 外 连 接 全 连 接 连接方式分类\left\{ \begin{matrix} 内连接 \\ 外连接 \\ 全连接 \end{matrix} \right.
内 连 接 { 等 值 连 接 非 等 值 连 接 自 连 接 内连接\left\{ \begin{matrix} 等值连接\\ 非等值连接 \\ 自连接 \end{matrix} \right.
外 连 接 { 左 外 连 接 ( 左 连 接 ) 右 外 连 接 ( 有 连 接 ) 外连接\left\{ \begin{matrix} 左外连接(左连接)\\ 右外连接 (有连接)\\ \end{matrix} \right. {

②、笛卡尔积现象

如有两个集合A和B,A = {0,1} B = {2,3,4}。
集合 A×B 和 B×A的结果集就可以分别表示为以下这种形式:
A×B = {(0,2),(1,2),(0,3),(1,3),(0,4),(1,4)};
B×A = {(2,0),(2,1),(3,0),(3,1),(4,0),(4,1)};
以上A×B和B×A的结果就可以叫做两个集合相乘的‘笛卡尔积’。基于以上的结果我们得到两个结论:

  • 两个集合相乘,不满足交换率,既 A×B ≠ B×A;
  • A集合和B集合相乘,包含了集合A中元素和集合B中元素相结合的所有的可能性。既两个集合相乘得到的新集合的元素个数是 A集合的元素个数 × B集合的元素个数;

数据库表连接数据行匹配时所遵循的算法就是以上提到的笛卡尔积,表与表之间的连接可以看成是在做乘法运算。

比如:现在有两张表EMP员工表DEPT部门表如下图,现要求找出每位员工的部门名称,并显示员工姓名和部门名。
在这里插入图片描述
看到题目我们首先可能想到的是这条语句。从emp表中找出员工的姓名,从dept表中找出员工所在部门的名称。SQL语句可能是这样select ename,dname from emp,dept;执行结果如下:

mysql> select ename,dname from emp,dept;
±-------±-----------+
| ename | dname |
±-------±-----------+
| SMITH | ACCOUNTING |
| SMITH | RESEARCH |
| SMITH | SALES |
| SMITH | OPERATIONS |
|…………省略……………|
| MILLER | ACCOUNTING |
| MILLER | RESEARCH |
| MILLER | SALES |
| MILLER | OPERATIONS |
±-------±-----------+
56 rows in set (0.00 sec)

从运算结果来看,SQL在两张表之间连接查询时执行了乘法运算,表emp中共有员工14个,表dept中共有部门4个。因此执行上述语句后的结果就为14*4=56个组合。即:当两张表进行连接查询时,若没有任何条件进行限制,最终的查询结果是两张表记录条数的成绩。这种现象在SQL中被称作为笛卡尔积现象。

③、表的别名

# emp表中的字段为ename,dept表中的字段为dname
select ename,dname from emp as e(别名),dept as d(别名);
# as也可以省去
select ename,dname from emp e(别名),dept d(别名);

给表起别名好处:①、执行效率高 ②、直观,可读性好。
如下面该语句select e.ename,d.dname from emp e,dept d;执行效率高是因为ename字段指定了在e(别名)表中,就不会在d表中再查找了。可读性好是因为看到该语句就知道ename在e表中,dname在d表中。

③、避免笛卡尔积现象

加条件过滤。还是上面的问题,现要求找出每位员工的部门名称,并显示员工姓名和部门名。先加上过滤条件

select e.ename,d.dname from emp e,dept d where e.deptno=p.deptno;

在这里插入图片描述

避免了笛卡尔积现象不会减少记录的匹配次数,匹配次数还是那么多只是对显示结果进行了过滤,只显示有效记录。
该语法为SQL92语法,不用。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值