三度网教程:是一个免费提供流行视频软件教程、在线学习分享的学习平台!

MySQL查询语句之复杂查询

时间:2022-9-15作者:未知来源:三度网教程人气:


SQL是Structured Query Language(结构化查询语言)的缩写。SQL是专为数据库而建立的操作命令集,是一种功能齐全的数据库语言。在使用它时,只需要发出“做什么”的命令,“怎么做”是不用使用者考虑的。SQL功能强大、简单易学、使用方便,已经成为了数据库操作的基础,并且现在几乎所有的数据库均支持SQL。
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 都是放在最后的

相关推荐:

MySQL5.7缺少my.ini文件如何解决

关于mysql max 与 where 间的执行问题小结

MySQL统计信息的详细概述

以上就是MySQL查询语句之复杂查询的详细内容,更多请关注php中文网其它相关文章!


学习教程快速掌握从入门到精通的SQL知识。

关键词:  MySQL查询语句之复杂查询





Copyright © 2012-2018 三度网教程(http://www.3du8.cn) .All Rights Reserved 网站地图 友情链接

免责声明:本站资源均来自互联网收集 如有侵犯到您利益的地方请及时联系管理删除,敬请见谅!

QQ:1006262270   邮箱:kfyvi376850063@126.com   手机版