MySQL查询语句之复杂查询的示例分析

60次阅读
没有评论

共计 2610 个字符,预计需要花费 7 分钟才能阅读完成。

自动写代码机器人,免费开通

这篇文章主要介绍 MySQL 查询语句之复杂查询的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

MySQL 是一种关系数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。在 MySQL 中经常会有很多复杂的查询,比如:

MySQL 复杂查询

一、分组查询:

1、关键字:GROUP
BY

2、用法:GROUP
BY 语句用于结合合计函数 (比如 SUM),根据一个或多个列对结果集进行分组, 合计函数常常需要添加
GROUP BY 语句。

下面的给了两张表 一张是 emp, 一张是 dept, 下面的查询我们都对这两张表进行操作,如下图:

第一张:emp 表

MySQL 查询语句之复杂查询的示例分析

第二张:dept 表

MySQL 查询语句之复杂查询的示例分析

现在我们查询 emp 每个部门的工资总和, 语句如下:

SELECT deptno,SUM(sal)FROM emp GROUP BY deptno;

结果如下:

MySQL 查询语句之复杂查询的示例分析

注:这里我们查询每个部门的工资 (sal) 总和,所以应该按照部门标号 (deptno) 进行分组,求和所以用了 sum();

3、having:

where 和 having 都是做条件判断,在介绍 having 前我们看下 where 和 having 的区别

where 的作用是在对查询结果进行分组前,将不符合 where 条件的行去掉,即在分组之前过滤数据,条件中不能包含聚合函数,使用 where 条件显示特定的行。

having 的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚合函数,使用 having
条件显示特定的组,也可以使用多个分组标准进行分组。

例如: 我们要查询 emp 表中工资总和大于 10000 的部门编号, 语句如下:

SELECT
deptno,SUM(sal)FROM emp GROUP BY deptno HAVING SUM(sal) 10000;

结果如下:

MySQL 查询语句之复杂查询的示例分析

这样就查出了工资总和大于 10000 的部门编号为 20,(为了理解也把工资总和显示出来了)。

二、连表查询:

根据两个或多个表中的列之间的关系,从这些表中查询数据.

1、inner join(内连接):

语法:select 字段名 1,字段名 2 from table1 [INNER] join table2 ON table1. 字段名 =table2. 字段名;

注: 内连接是从结果中删除其他被连接的表中没有匹配行的所有行,只能查询出连接的表中都拥有的信息,所以内连接可能会丢失信息,还有 inner 可以省略。

例如: 我们连接 emp 和 dept 两张表, 查询 ename 和 deptno, 语句如下:

SELECT emp.ename,dept.deptno FROM emp INNER JOIN dept ON emp.deptno=dept.deptno;

还有种写法:SELECT emp.ename,dept.deptno from emp,dept where emp.deptno=dept.deptno;

MySQL 查询语句之复杂查询的示例分析

注意: 原来 dept 表中有 deptno 为 40 的, 但查询出来就没有了,这里是因为 emp 中 deptno 字段中没有值为 40,所以使用 innner join 连接时就自动删除了 dept 表中 deptno 字段值为 40 的记录。

2、外连接:

2.1: 左外连接: 结果集保留左表的所有行,但只包含第二个表与第一表匹配的行。第二个表相应的空行被放入 NULL 值。

2.2: 右外连接: 结果集保留右表的所有行,但只包含第二个表与第一表匹配的行。第二个表相应的空行被放入 NULL 值。

左外连接和右外连接交换两个表的位置就可以达到相同的效果。

现在我们进行分组和连表一起用的查询

例如: 我们要查询 emp 每个部门的工资总和并且对应 dept 表中的部门名称

解析这句话: 查询的字段是 emp 中的每个部门 sal(工资总和),这里就要用到分组查询, 但是还要查询到对应部门的部门名称(dname),由于 dname

是在 dept 表中,所以就应该连接 emp 和 dept 两张表.

思路 1: 我们先查询出我们需要的所有字段再进行分组, 所以先连接再分组, 语句如下:

SELECT e.deptno,d.dname,SUM(e.sal)  FROM  emp  e INNER JOIN dept d ON e.deptno=d.deptno GROUP BY d.deptno;)(注意这里使

用了别名 emp 的别名是 e,dept 的别名是 d)

第二种写法:

SELECT  e.deptno,d.dname,SUM(e.sal) FROM emp e,dept d WHEREe.deptno=d.deptno GROUP BY d.deptno;

这两种写法的结果都是一样,如下:

MySQL 查询语句之复杂查询的示例分析

思路 2:我们要查询 emp 每个部门的工资总和,把这个结果集当作一个表(这里称为表 1),再让表 1 去连接 dept 表查询出对应的部门名称(dname);

分步 1:SELECT deptno,SUM(sal) FROM emp GROUP BY deptno; 这个语句就查询出了 emp 表中每个部门的工资总和,现在我们再与 dept

表连接:

分步 2:SELECT xin.*,d.dname FROM(SELECT deptno,SUM(sal) FROM emp GROUP BY deptno) xin INNER JOIN dept d ON xin.deptno

=d.deptno; 这样就查询出了想要的结果, 注意这里的 xin 是别名,结果如下:

MySQL 查询语句之复杂查询的示例分析

这里的代码看起来很长,其实思路是很明确的,就是把第一个查询结果当作一张表去连接另一张表,这样的思路不容易出错,多练习写起来就

很熟练了。

三、分页:

关键字:LIMIT

语法:select * from tableName 条件 limit 当前页码 * 页面容量 -1 , 页面容量;

一般 limit 都和 order by 连用

例如 我们要查询 emp 表中按部门编号升序排列的 5 -10 的记录,每页显示 5 条记录, 语句如下:

SELECT *FROM emp ORDER BY deptno LIMIT 4,5;

这样就可以查询出想要的结果了,注意最后一个参数 5 是页面容量,也就是本页要显示的行数(即本页开始行到结束行的记录条数)。

比如我们要查询 17 页的记录,每页显示 10 条记录:

LIMIT 17*10-1,10;

四:IN

关键字:In

子查询的返回值结果不只一个条件就必须用 IN 不能用 =

注:LIMIT 都是放在最后的。

以上是“MySQL 查询语句之复杂查询的示例分析”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注丸趣 TV 行业资讯频道!

向 AI 问一下细节

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-12-04发表,共计2610字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)