MySQL笔记4 | 您所在的位置:网站首页 › sql语句消除重复 › MySQL笔记4 |
文章目录
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 实验室设备网 版权所有 |