MySQL笔记4 您所在的位置:网站首页 sql语句消除重复 MySQL笔记4

MySQL笔记4

2024-07-14 18:41| 来源: 网络整理| 查看: 265

文章目录 1、去重distinct2、连接查询①、连接查询的分类②、笛卡尔积现象③、表的别名③、避免笛卡尔积现象

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语法,不用。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有