MySQL数据库中去重与连接查询的方法

目录

1.去重

2.连接查询

使用where进行多表连接查询

内连接 – 等值连接

内连接 – 非等值连接

内连接 – 自连接

外连接 – 左右外连接

三表连接

1.去重

示例表内容参考此文章

有些 MySQL 数据表中可能存在重复的记录,有些情况我们允许重复数据的存在,但有时候我们也需要删除这些重复的数据。

例如:去重显示岗位信息:

mysql> select distinct job from emp;+-----------+| job       |+-----------+| CLERK     || SALESMAN  || MANAGER   || ANALYST   || PRESIDENT |+-----------+5 rows in set (0.02 sec)

另一个示例:联合去重,查找部门和岗位的独有信息:

mysql> select distinct job,deptno from emp;+-----------+--------+| job       | deptno |+-----------+--------+| CLERK     |     20 || SALESMAN  |     30 || MANAGER   |     20 || MANAGER   |     30 || MANAGER   |     10 || ANALYST   |     20 || PRESIDENT |     10 || CLERK     |     30 || CLERK     |     10 |+-----------+--------+9 rows in set (0.00 sec)

另一个示例:现在我们想统计一下工作岗位的数量,结合使用count函数:

mysql> select count(distinct job) from emp;+---------------------+| count(distinct job) |+---------------------+|                   5 |+---------------------+1 row in set (0.00 sec)

2.连接查询

我们已经学会了如何在一张表中读取数据,这是相对简单的,但是在真正的应用中经常需要从多个数据表中读取数据。

JOIN 按照功能大致分为如下三类:

INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录。

LEFT JOIN(左连接):获取左表所有记录,即使右表没有对应匹配的记录。

RIGHT JOIN(右连接): 与 LEFT JOIN 相反,用于获取右表所有记录,即使左表没有对应匹配的记录。

多表连接的操作是将一个表的每一条数据与另一个表的数据行进行匹配。这就涉及到了效率控制问题

使用where进行多表连接查询

现在我们来演示一个例子:取出每个员工的名字和部门名字:

mysql> select ename,dname    -> from emp,dept    -> where emp.deptno = dept.deptno;+--------+------------+| ename  | dname      |+--------+------------+| SMITH  | RESEARCH   || ALLEN  | SALES      || WARD   | SALES      || JONES  | RESEARCH   || MARTIN | SALES      || BLAKE  | SALES      || CLARK  | ACCOUNTING || SCOTT  | RESEARCH   || KING   | ACCOUNTING || TURNER | SALES      || ADAMS  | RESEARCH   || JAMES  | SALES      || FORD   | RESEARCH   || MILLER | ACCOUNTING |+--------+------------+14 rows in set (0.00 sec)

上面的sql语句实际上效率很低,我们尝试进行优化(给表起别名):(sql92语法)

mysql> select e.ename,d.dname    -> from emp e,dept d    -> where e.deptno = d.deptno;+--------+------------+| ename  | dname      |+--------+------------+| SMITH  | RESEARCH   || ALLEN  | SALES      || WARD   | SALES      || JONES  | RESEARCH   || MARTIN | SALES      || BLAKE  | SALES      || CLARK  | ACCOUNTING || SCOTT  | RESEARCH   || KING   | ACCOUNTING || TURNER | SALES      || ADAMS  | RESEARCH   || JAMES  | SALES      || FORD   | RESEARCH   || MILLER | ACCOUNTING |+--------+------------+14 rows in set (0.00 sec)

注意:表的连接次数越多,效率越低,请尽量减少表的连接次数!

内连接 – 等值连接

还是上面的例子,取出每个员工的名字和部门名字:(sql99语法)

内连接,我们使用inner

mysql> select e.ename,d.dname    -> from emp e    -> inner join    -> dept d    -> on    -> e.deptno = d.deptno;+--------+------------+| ename  | dname      |+--------+------------+| SMITH  | RESEARCH   || ALLEN  | SALES      || WARD   | SALES      || JONES  | RESEARCH   || MARTIN | SALES      || BLAKE  | SALES      || CLARK  | ACCOUNTING || SCOTT  | RESEARCH   || KING   | ACCOUNTING || TURNER | SALES      || ADAMS  | RESEARCH   || JAMES  | SALES      || FORD   | RESEARCH   || MILLER | ACCOUNTING |+--------+------------+14 rows in set (0.00 sec)

sql99的优点是:表的连接是独立的,不占用where的位置。使sql语句整体更加清晰

内连接 – 非等值连接

案例:找出每个员工的薪资等级,要求显示员工名,薪资,薪资等级

mysql> select    -> e.ename,e.sal,s.grade    -> from    -> emp e    -> inner join    -> salgrade s    -> on    -> e.sal between s.losal and s.hisal;+--------+---------+-------+| ename  | sal     | grade |+--------+---------+-------+| SMITH  |  800.00 |     1 || ALLEN  | 1600.00 |     3 || WARD   | 1250.00 |     2 || JONES  | 2975.00 |     4 || MARTIN | 1250.00 |     2 || BLAKE  | 2850.00 |     4 || CLARK  | 2450.00 |     4 || SCOTT  | 3000.00 |     4 || KING   | 5000.00 |     5 || TURNER | 1500.00 |     3 || ADAMS  | 1100.00 |     1 || JAMES  |  950.00 |     1 || FORD   | 3000.00 |     4 || MILLER | 1300.00 |     2 |+--------+---------+-------+14 rows in set (0.01 sec)

内连接 – 自连接

案例:查询员工的上级领导,要求显示员工名和对应的领导名

我们可以发现,员工和领导的关系在一张表中,此时需要用到自连接(技巧:一张表看成两张表)

mysql> select    -> a.ename as '员工名',b.ename as '领导名'    -> from emp a    -> join emp b    -> on    -> a.mgr = b.empno;+-----------+-----------+| 员工名    | 领导名      |+-----------+-----------+| SMITH     | FORD      || ALLEN     | BLAKE     || WARD      | BLAKE     || JONES     | KING      || MARTIN    | BLAKE     || BLAKE     | KING      || CLARK     | KING      || SCOTT     | JONES     || TURNER    | BLAKE     || ADAMS     | SCOTT     || JAMES     | BLAKE     || FORD      | JONES     || MILLER    | CLARK     |+-----------+-----------+13 rows in set (0.00 sec)

外连接 – 左右外连接

外连接与内连接的区别是,外连接没有匹配成功的某一个表的记录也会被取出

案例:查找员工的部门信息。要求部门即使没有员工也要查出

mysql> select    -> e.ename,d.dname    -> from emp e    -> right join dept d    -> on    -> e.deptno = d.deptno;+--------+------------+| ename  | dname      |+--------+------------+| SMITH  | RESEARCH   || ALLEN  | SALES      || WARD   | SALES      || JONES  | RESEARCH   || MARTIN | SALES      || BLAKE  | SALES      || CLARK  | ACCOUNTING || SCOTT  | RESEARCH   || KING   | ACCOUNTING || TURNER | SALES      || ADAMS  | RESEARCH   || JAMES  | SALES      || FORD   | RESEARCH   || MILLER | ACCOUNTING || NULL   | OPERATIONS |+--------+------------+15 rows in set (0.00 sec)

同样的,如果是左外连接,将查询出左表的全部数据,使用left join关键字即可

外连接的查询结果条数一定是 >= 内连接的查询结果条数

三表连接

更为复杂的情况是,群表连接

我们来看一个案例:

找出每个员工的部门名称及工资等级。要求显示员工名,部门名,薪资,薪资等级

mysql> select    -> e.ename,e.sal,d.dname,s.grade    -> from emp e    -> join dept d    -> on e.deptno = d.deptno    -> join salgrade s    -> on e.sal between s.losal and s.hisal;+--------+---------+------------+-------+| ename  | sal     | dname      | grade |+--------+---------+------------+-------+| SMITH  |  800.00 | RESEARCH   |     1 || ALLEN  | 1600.00 | SALES      |     3 || WARD   | 1250.00 | SALES      |     2 || JONES  | 2975.00 | RESEARCH   |     4 || MARTIN | 1250.00 | SALES      |     2 || BLAKE  | 2850.00 | SALES      |     4 || CLARK  | 2450.00 | ACCOUNTING |     4 || SCOTT  | 3000.00 | RESEARCH   |     4 || KING   | 5000.00 | ACCOUNTING |     5 || TURNER | 1500.00 | SALES      |     3 || ADAMS  | 1100.00 | RESEARCH   |     1 || JAMES  |  950.00 | SALES      |     1 || FORD   | 3000.00 | RESEARCH   |     4 || MILLER | 1300.00 | ACCOUNTING |     2 |+--------+---------+------------+-------+14 rows in set (0.00 sec)

再来看一个更复杂的情况:

找出每个员工的部门名称及工资等级及领导名称。要求显示员工名,部门名,领导名,薪资,薪资等级

mysql> select    -> e.ename,e.sal,d.dname,s.grade,l.ename    -> from emp e    -> join dept d    -> on e.deptno = d.deptno    -> join salgrade s    -> on e.sal between s.losal and s.hisal    -> left join    -> emp l    -> on e.mgr = l.empno;+--------+---------+------------+-------+-------+| ename  | sal     | dname      | grade | ename |+--------+---------+------------+-------+-------+| SMITH  |  800.00 | RESEARCH   |     1 | FORD  || ALLEN  | 1600.00 | SALES      |     3 | BLAKE || WARD   | 1250.00 | SALES      |     2 | BLAKE || JONES  | 2975.00 | RESEARCH   |     4 | KING  || MARTIN | 1250.00 | SALES      |     2 | BLAKE || BLAKE  | 2850.00 | SALES      |     4 | KING  || CLARK  | 2450.00 | ACCOUNTING |     4 | KING  || SCOTT  | 3000.00 | RESEARCH   |     4 | JONES || KING   | 5000.00 | ACCOUNTING |     5 | NULL  || TURNER | 1500.00 | SALES      |     3 | BLAKE || ADAMS  | 1100.00 | RESEARCH   |     1 | SCOTT || JAMES  |  950.00 | SALES      |     1 | BLAKE || FORD   | 3000.00 | RESEARCH   |     4 | JONES || MILLER | 1300.00 | ACCOUNTING |     2 | CLARK |+--------+---------+------------+-------+-------+14 rows in set (0.00 sec)

以上就是MySQL数据库中去重与连接查询的方法的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/155275.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
YII框架的XSS防护是什么?YII框架如何过滤输入?
上一篇 2025年12月4日 09:34:38
恶意抹黑无用!李想:理想i8同价位产品力没有对手 处于敌无我有的赛道
下一篇 2025年12月4日 09:36:41

相关推荐

  • MySQL精讲之四:TCL事务控制语句

    免费学习推荐:mysql视频教程 文章目录 一、事务的介绍与使用二、事务并发问题及解决方案三、视图 一、事务的介绍与使用 通过show engines;可以查看mysql支持的存储引擎,其中innodb支持事务,而myisam,memory等不支持事务。 事务:一个或一组sql语句组成一个sql单元…

    2026年9月6日
    100
  • vivox100s和x100区别:性能对比及功能解析

    vivo x100s和x100手机都是vivo手机产品线中的代表机型,它们分别代表了vivo在不同时间段内的高端技术水平,因此这两款手机在设计、性能和功能上均有一定区别。本文将从性能对比和功能解析两个方面对这两款手机进行详细比较,帮助消费者更好地选择适合自己的手机。 首先,我们来看vivo x100…

    用户投稿 2026年9月6日
    000
  • MySQL精讲之五:存储过程和函数

    免费学习推荐:mysql视频教程 文章目录 一、变量系统变量自定义变量二、存储过程三、函数 一、变量 系统变量 系统变量分为全局变量和会话变量,是由系统提供的。 全局变量作用域:服务器每次启动将为所有的全局变量初始化,不能跨重启。 会话变量作用域:仅针对当前会话有效。 【全局变量】 作用域:服务器每…

    2026年9月6日
    100
  • MySQL精讲之六:流程控制

    MySQL精讲之六:流程控制MySQL精讲之六:流程控制MySQL精讲之六:流程控制MySQL精讲之六:流程控制

    免费学习推荐:mysql视频教程 文章目录 分支结构IF函数case结构IF结构循环结构 mysql中的流程控制和其他编程语言中的类似,也分为三种:顺序结构、分支结构、循环结构。前几篇文章中用到的基本上都是顺序结构(除了IF函数),下面主要针对分支结构和循环结构进行介绍。 分支结构 IF函数 语法:…

    2026年9月6日 用户投稿
    100
  • hive和mysql的区别是什么

    区别:1、Mysql采用了SQL语言,Hive采用了类SQL的查询语言HQL。2、Hive不支持数据的改写和添加,Mysql支持。3、Hive无索引,MySQL有索引。4、Hive底层是MarReduce,MySQL底层是执行引擎。 本教程操作环境:windows7系统、mysql8版本、Dell …

    2026年9月6日
    100
  • linux下如何部署php项目?

    linux下如何部署php项目?linux下如何部署php项目?linux下如何部署php项目?linux下如何部署php项目?

    linux下部署php项目环境可以分为两种,一种使用apache,php,mysql的压缩包安装,一种用yum命令进行安装。 使用三种软件的压缩包进行安装,需要手动配置三者之间的关系。apache和php之间的配置没有什么难度,但是和mysql进行配置的时候就需要对php的了解了。 以下是用yum在…

    2026年9月6日 用户投稿
    400
  • MySQL如何处理长文本字段_性能和存储空间的权衡?

    MySQL如何处理长文本字段_性能和存储空间的权衡?MySQL如何处理长文本字段_性能和存储空间的权衡?MySQL如何处理长文本字段_性能和存储空间的权衡?MySQL如何处理长文本字段_性能和存储空间的权衡?

    varchar适合较短文本,text系列适合大文本;长文本字段影响查询性能和内存资源;解决办法包括拆分到扩展表、避免text索引、使用搜索引擎;存储引擎建议用innodb并设置dynamic行格式;全文检索可用外部工具优化性能。mysql处理长文本时需根据字段长度选择varchar或text类型,v…

    2026年9月6日 用户投稿
    200
  • mysql环境变量如何配置

    mysql环境变量如何配置mysql环境变量如何配置mysql环境变量如何配置mysql环境变量如何配置

    mysql环境变量的配置方法:1、找到C盘中的MySQL安装路径;2、在“我的电脑”中,依次点击“系统属性”-“高级系统设置”选项;3、在“环境变量”弹窗中,依次点击“高级”-“系统变量”;4、找到path路径,点击“编辑”选项,将MySQL安装路径填入即可。 本教程操作环境:windo…

    2026年9月6日 用户投稿
    000
  • mysql练习之2:运算符的使用

    案例:创建数据表tmp15,其中包含varchar类型的字段note和int类型的字段price。 使用运算符对表tmp15中不同的字段进行运算。使用逻辑操作符对数据进行逻辑操作。 使用位操作符对数据进行位操作。 (免费学习推荐:mysql视频教程) 首先创建tmp15表,插入一条记录,note值为…

    2026年9月6日
    100
  • 百家号视频尺寸比例是多少?百家号的视频比例是多少

    在当今这个短视频盛行的时代,百家号作为一款热门的短视频平台,吸引了大量用户入驻。不少用户在制作视频时,常常会遇到一个难题:百家号视频尺寸比例是多少?这篇文章将为你揭秘百家号视频尺寸比例,并教你如何制作出符合标准的完美视频尺寸。 一、百家号视频尺寸比例 百家号视频尺寸比例有三种:横版、竖版和方形。下面…

    2026年9月5日
    100
  • 抖音的群怎么私信一个人?私信一个人能看到吗?

    在使用抖音群聊时,不少用户都希望了解如何单独向某位成员发送私信。这不仅涉及具体操作流程,还与隐私设置密切相关。那么,究竟该如何在抖音群里私信一个人呢? 一、如何在抖音群聊中私信某人? 进入目标群聊页面首先确认你已加入该群。打开抖音App,点击底部“消息”标签,找到并进入你想操作的群聊界面。群聊会话通…

    2026年9月5日
    000
  • MySQL数据查询之连接查询

    连接关系是关系数据库模型的主要特点。也是最主要的查询,主要包括内连接、外连接等。通过连接运算符可以实现多个表查询。在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在一个表中。当查询数据时,通过连接操作查询出存放在多个表中不同实体的信息。当两个或多个表中存在相同意义…

    2026年9月5日
    100
  • MySQL字段默认值设置与约束控制_Sublime一键生成标准规范建表语句

    MySQL字段默认值设置与约束控制_Sublime一键生成标准规范建表语句MySQL字段默认值设置与约束控制_Sublime一键生成标准规范建表语句MySQL字段默认值设置与约束控制_Sublime一键生成标准规范建表语句MySQL字段默认值设置与约束控制_Sublime一键生成标准规范建表语句

    如何在mysql中设置字段的默认值?使用default关键字指定常量值或current_timestamp。例如:age int default 0或created_at timestamp default current_timestamp,但default值必须为常量表达式,不能是函数或变量;若…

    2026年9月5日 用户投稿
    100
  • MySQL数据查询之子查询

    子查询是指一个查询语句嵌套在另一个查询语句内部的查询。在select子句中先计算子查询,子查询结果作为外层另一个查询的过滤条件,查询可以基于一个表或者多个表。 子查询中常用的操作符有any(some)、all、in、exists。子查询可以添加到select、update和delete语句中,而且可…

    2026年9月5日
    100
  • MySQL查询数据之合并查询结果

    . 利用union关键字,可以给出多条select语句,并将它们的结果组合成单个结果集。合并时,两个表对应的列数和数据类型必须相同。各个select语句之间使用union或union all 关键字分隔。union不使用关键字all,执行的时候删除重复的记录,所有返回的行都是唯一的;使用关键字all…

    2026年9月5日
    100
  • MySQL查询函数之 为表和字段取别名

    目录: (1)为表取别名 (2)为字段取别名 (免费学习推荐:mysql视频教程) (1)、为表取别名 当表名字很长或者执行一些特殊查询时,为了方便操作或者需要多次使用相同的表时,可以为表指定别名,用这个别名代替原来的名称。为表取别名的基本语法格式为: 表名 [as] 表别名 “表名&#…

    2026年9月5日
    200
  • 数据库怎么删除表

    在数据库中,可以使用“DROP TABLE”语句来删除一个或多个数据表,具体语法“DROP TABLE [IF EXISTS] 表名1 [ ,表名2, 表名3 …]”,其中“IF EXISTS”是用于在删除数据表之前判断该表是否存在。 本教程操作环境:windows7系统、mysql8版…

    2026年9月5日
    100
  • 数据库字段包含多个日期值,如何用SQL查询特定日期范围内的记录?

    SQL查询:多日期字段的范围筛选 数据库表中,当某个字段包含多个日期值时,如何用SQL语句高效筛选特定日期范围内的记录?本文提供解决方案。 场景示例: 假设字段realstarttime可能包含多个日期值,例如:”2022-09-14 11:38:21,2022-09-14 18:00:…

    2026年9月5日
    200
  • 数据库怎么增加表中字段

    增加表中字段的方法:1、使用“ALTER TABLE 表名 ADD 新字段名 数据类型;”语句在末尾添加字段;2、使用“ALTER TABLE 表名 ADD 新字段名 数据类型 FIRST;”语句在开头添加字段;3、使用“ALTER TABLE 表名 ADD 新字段名 数据类型 [约束条件] AFT…

    2026年9月5日
    100
  • 怎么删除数据表中数据

    方法:1、使用DELETE语句,可删除表的一行或多行数据,语法“DELETE FROM 表名 [WHERE子句]”;如果省略“WHERE子句”,则可删除表中全部数据。2、使用“TRUNCATE TABLE 表名;”语句,可删除表中全部数据。 本教程操作环境:windows7系统、mysql8版本、D…

    2026年9月5日
    100

发表回复

登录后才能评论
关注微信