MySql中流程控制函数/统计函数/分组查询用法解析_Mysql

来源:脚本之家  责任编辑:小易  

SELECT COUNT(*) FROM (SELECT 分组字段2113 FROM 表 GROUP BY 分组字段 )别名5261 或者 SELECT COUNT(*) FROM (SELECT distinct 分组字段 FROM 表)别名扩展资4102料:SQL分组查询在SQL Server中使用的分组查询是1653ORDER BY子句,使用ORDER BY子句要同聚合函数配合使用才能完成分组查询,在SELECT查询的字段中如果字段没有使用聚合函数就必须出现在ORDER BY子句中(即SELECT后边的字段名要么出现在聚合函数中,要么在ORDER BY子句中使用)在分组查询中还可以配合使用HAVING子句,定义查询条件。使用group by进行分组查询在使用group by关键字时,在select列表中可以指定的项目是有限制的,select语句中仅许以下几项:1、被分组的列2、为每个分组返回一个值得表达式,例如用一个列名作为参数的聚合函数3、group by 有一个原则,就是 select 后面的所有列中,没有使用聚合函数的列,必须出现在 group by 后面,要得2113到每组的合计可以用2、3楼,要总计5261用1楼,想一次性得4102到分组合计以及总计,1653sql2005可以这么写:SELECT 分组字段 FROM 表GROUP BY 分组字段compute sum(COUNT(*)) =====那就这样SELECT COUNT(*)FROM (SELECT 分组字段 FROM 表GROUP BY 分组字段)别名或者SELECT COUNT(*)FROM (SELECT distinct 分组字段 FROM 表)别名本回答被提问者采纳,统计记录条数就用count()函数啊,如果想统计分组以后每个组的记录数,就分别统计或者在where条件中加上分组条件,使用函数COUNT(*)就可以啊。要是统计总和就用SUM。 SELECT 分组字段 COUNT(*)FROM 表GROUP BY 分组字段,假设表tablename字段col1select col1,count(col1)as [count] from tablename group by col1www.zgxue.com防采集请勿采集本网。

路漫漫其修远兮,吾将上下而求索,又到了周末,我继续带各位看官学习回顾Mysql知识。

不同的数据库查询2113语句是不一5261样的,例如: 1、4102MYSQL: select*from 表名1653 limit 100 2、ORACLE: select*from 表名 where rownum 3、SQL SERVER: select top 100*from 表名 4、

上次说到了流程控制函数,那就从流程控制函数来继续学习吧!

可以实现 use information_schema;select table_name,table_rows from tables where TABLE_SCHEMA='数据库名' order by table_rows desc;查询出来的是每张表的行数

#五.流程控制函数#1.if函数:if else的效果IF(条件表达式,成立返回1,不成立返回2)#与Java三元运算相同SELECT IF(10>5,'大','小');

SqlWave支持所有MySQL的最新版本,包括它用来管理数据库结构的所有最新功能,如工作表、视图、存储过程、函数、事件、外键和触发器等。7.MyWebSQL MyWebSQL主要用于管理基于Web的MySQL数据库。与桌面应用

SELECT last_name,commission_pct,IF(commission_pct IS NULL,'没奖金呵呵','有奖金嘻嘻') AS 备注FROM employees;

mysql 命令导入sql 进入mysql 安装所在的目录的子目录bin.输入执行导入sql的命令. 例如:你的mysql 安装在 d:\\mysql 步骤如下: 开始->运行->输入CMD D: cd mysql\\bin mysql-u root-p123456 test

#2.CASE函数的使用一: swirch case的效果【等值判断】回顾:switch(变量或表达式){case 常量1:语句1;break;...default:语句n;break;}mysql中case 要判断的字段或表达式或变量when 常量1 then 要显示的值1或者语句1;[语句要加分号,值不用加]when 常量2 then 要显示的值2或者语句2;...slse要显示的值n或者语句n;[默认值]end[结尾]case在SELECT后面相当于表达式用,后面不能放语句,只能是值.在后续的学习中,存储过程与函数内就可以单独,用不搭配SLECT,就用语句.先是表达式的操作案例:查询员工的工资,要求部门号=30,显示的工资为1.1倍部门号=40,显示的工资为1.2倍部门号=50,显示的工资为1.3倍其他部门,显示的工资为原工资

1、使用navicat for mysql登录到指定数据库,写好sql语句,并点击如图标红处的按钮,将数据拖到底部。2、点击界面上方的导出向导。3、选择excel格式,然后点击下一步。4、填写好excel文件的存放

SELECT salary 原始工资,department_id,CASE department_idWHEN 30 THEN salary*1.1WHEN 40 THEN salary*1.2WHEN 50 THEN salary*1.3ELSE salaryEND AS 新工资FROM employees;

#2.CASE函数的使用二:类是于多重IF【区间判断】回顾Java中:if(条件1){语句1;}else if(条件2){语句2;}...else{语句n;}

mysql中:casewhen 条件1 then 要显示的值1或者语句[语句后面要加分号;]when 条件2 then 要显示的值2或者语句[语句后面要加分号;]...else 要显示的值n或语句nend案例:查询员工的工资的情况如果工资>20000,显示A级别如果工资>15000,显示B级别如果工资>10000,显示C级别否则,显示D级别

==============流程函数到此结束,要想熟练运用还需要勤加练习。===============

提供几道习题供读者试试手!

#计算有几种工资。SELECT COUNT(DISTINCT salary),COUNT(salary)FROM employees;

#5.count 函数的详细介绍SELECT COUNT(salary) FROM employees;

#COUNT(统计所有列)SELECT COUNT(*) FROM employees;

#把表的行生成一个列每一列都是1。统计1的总数。count里面可以用任意常量值。SELECT COUNT(1) FROM employees;

#考虑到效率问题:#5.5之前都是MYISAM 下COUNT(*)最高,计数器直接返回#5.5之后默认都是INNODB下COUNT()与COUNT(1)都差不多, 比COUNT(字段)效率高,如果是字段要判断字段是否为NULL。

#6.和分组函数一同查询的字段有限制SELECT AVG(salary),employee_id FROM employees;

#1.查询公司员工工资的最大值,最小值,平均值,总和。SELECT MAX(salary),MIN(salary),AVG(salary),SUM(salary)FROM employees;

SELECT MAX(salary) AS 最大值,MIN(salary) AS 最小值,ROUND(AVG(salary)) AS 最小值,SUM(salary) AS总和FROM employees;

#2.查询员工表中最大入职时间和最小入职时间的相差天数。#DATEDIFF计算天数。DATEIFF(参数1-参数2)SELECT DATEDIFF(NOW(),('1995-1-1'));

SELECT DATEDIFF(MAX(hiredate),MIN(hiredate)) AS DIFFRENCEFROM employees;

#3.查询部门编号为90的员工个数。SELECT COUNT(*) AS个数FROM employeesWHERE department_id=90;

#进阶5.分组查询GROUP BY子句语法。可以使用GROUP BY子句将表中的数据分成若干组。语法:SELECT 分组函数,列(要求出现在GROUP BY的后面)FROM 表【WHERE筛选条件】GROP BY 分组的列表【ORDER BY 子句】注意: 查询列表必须特殊,要求是分组函数和GROUP BY后出现的字段特点: 1.分组查询中的筛选条件分为两类

2.GROUP BY 子句支持单个字段分组,多个字段分组(多个字段之间用逗号隔开没有顺序要求)也支持表达式或函数分组(用的较少)3.也可以添加排序(排序放在整个分组查询的最后)

#引入:查询每个部门的平均工资,保留两位小数。SELECT ROUND(AVG(salary),2) AS 平均工资FROM employees;

#简单的分组查询,添加分组前的筛选WHERE#案例1:查询每个工种的最高工资。SELECT MAX(salary) AS 最高工资,job_id AS 工种编号FROM employeesGROUP BY job_id;

#案例2:查询每个位置上的部门个数。SELECT COUNT(*) AS 总数,location_idFROM departmentsGROUP BY location_id;

#添加筛选条件#查询邮箱中包含a字符的,平均工资保留两位小数,每个部门的平均工资SELECT email,ROUND(AVG(salary),2),department_idFROM employeesWHERE email LIKE '%a%'GROUP BY department_id;

#案例2:查询每个领导手下员工有奖金的的最高工资SELECT MAX(salary),manager_idFROM employeesWHERE commission_pct IS NOT NULLGROUP BY manager_id;

添加复杂的筛选,添加分组后的筛选HAVING#案例1:查询哪个部门的员工个数>2#①查询每个部门的员工个数SELECT COUNT(*),department_idFROM employeesGROUP BY department_id;

#②根据①的结果,查询哪个部门的员工个数>2SELECT COUNT(*) AS 总数,department_id AS 部门编号FROM employeesGROUP BY department_idHAVING COUNT(*)>2;

#案例2.查询每个工种有奖金的员工的最高工资>12000的工种编号和最高工资。#①查询每个工种有奖金的员工的最高工资。#原始表能筛选的就放在FROM 后面用WHERE。

SELECT job_id AS 员工编号,MAX(salary) AS 最高工资FROM employeesWHERE commission_pct IS NOT NULLGROUP BY job_id;

#②根据①结果继续筛选,最高工资>12000。SELECT job_id AS 员工编号,MAX(salary) AS 最高工资FROM employeesWHERE commission_pct IS NOT NULLGROUP BY job_idHAVING MAX(salary)>12000;

#案例3.查询领导编号>102的每个领导手下的最低工资>5000的领导编号是哪个,以及其最低工资。#①查询领导编号>102的每个领导手下的最低工资SELECT MIN(salary) AS 最低工资,manager_id AS 领导编号FROM employeesWHERE manager_id > 102GROUP BY manager_id;

#②最低工资大于5000的。SELECT MIN(salary) AS 最低工资,manager_id AS 领导编号FROM employeesWHERE manager_id > 102GROUP BY manager_idHAVING 最低工资 > 5000;

#案例:按员工姓名的长度分组,查询每一组的员工个数,筛选员工个数>5的有哪些#MYSQL内GROUP BY与HAVING后面支持别名,WHERE不支持别名。但ORACLE数据库的GROUP BY与HAVING是不支持别名的。SELECT LENGTH(CONCAT(last_name,first_name)) AS 姓名长度,COUNT(*) AS 个数FROM employeesGROUP BY 姓名长度HAVING 姓名长度 > 5;

#按多个字段分组#案例:查询每个部门工种的员工的平均工资(保留两位小数)。SELECT ROUND(AVG(salary),2) AS 平均工资,department_id AS 部门,job_id AS 工种FROM employeesGROUP BY 部门,工种;

#添加排序#案例:查询每个部门每个工种的员工的平均工资,并且按平均工资的高低显示。SELECT ROUND(AVG(salary),2) AS 平均工资,department_id AS 部门,job_id AS 工种FROM employeesGROUP BY 工种,部门ORDER BY 平均工资 DESC;

#案例:查询部门不能为空的,每个部门每个工种的员工的平均工资,并且按平均工资的高低显示。SELECT ROUND(AVG(salary),2) AS 平均工资,department_id AS 部门,job_id AS 工种FROM employeesWHERE department_id IS NOT NULLGROUP BY 工种,部门ORDER BY 平均工资 DESC;

#案例:查询部门不能为空的,每个部门每个工种的员工的平均工资高于10000的,并且按平均工资的高低显示。SELECT ROUND(AVG(salary),2) AS 平均工资,department_id AS 部门,job_id AS 工种FROM employeesWHERE department_id IS NOT NULLGROUP BY 工种,部门HAVING 平均工资 > 10000ORDER BY 平均工资 DESC;

加强练习:

#1.查询各job_id的员工工资的最大值,最小值,平均值,总和,并按job_id升序。SELECT job_id,MAX(salary),MIN(salary),AVG(salary),SUM(salary)FROM employeesGROUP BY job_idORDER BY job_id ASC;

#2.查询员工最高工资和最低工资的差距(DIFFERENCE)。SELECT MAX(salary) - MIN(salary) AS DIFFERENCEFROM employees;=======================================================SELECT MAX(salary) AS 最高,MIN(salary) AS 最低,MAX(salary)-MIN(salary) AS DIFFERENCEFROM employees;

#3.查询各个管理者手下员工的最低工资,其中最低工资不能低于6000,没有管理者的员工不能计算在内。SELECT MIN(salary),CONCAT(last_name,first_name),manager_idFROM employeesWHERE manager_id IS NOT NULLGROUP BY manager_idHAVING MIN(salary)>6000;

到此结束,MySql的统计,分组查询到此结束。如果没有感觉的看官可以自己手动练习一下。

夏天的太阳总是那么亮的刺眼,但多沐浴一下阳光也补钙,想不到吧!o(^▽^)o

到此这篇关于MySql中流程控制函数/统计函数/分组查询用法解析的文章就介绍到这了,更多相关MySql 流程控制函数 统计函数 分组查询内容请搜索真格学网以前的文章或继续浏览下面的相关文章希望大家以后多多支持真格学网!

可直接2113用嵌套查询。5261方法如下:如数据4102:id          name1            a1            b2            c2            d3            e3            f3            g3            hselect count(t.counts) from(select id,count(*) counts from 表名 group by id) t这样得到1653的结果就是3,需要准2113备的工具:电脑,sql数据库。1、首先新5261建一个test表,有id,name,second三个字段,其中name字段有重4102复数据。2、输入1653“select name,max(second) from test group by name”语句,点击运行。3、可以看到已经查询出按name分组后取出的second最大的一条记录。4、以输入“select name,max(second) from test group by name order by max(second) desc”语句,按分组后second最大值进行降序。5、如果想查询mysql分组后最小的一条记录,输入“select name,min(second) from test group by name”语句,点击运行即可。本回答被网友采纳,select count(*) from(SELECT count(*) FROM 表名 WHERE 条件 GROUP BY id ) a ;本回答被提问者和网友采纳,第二个写法出来的是相2113同id值的计数情况。一般来5261说,一条select语句的4102执行顺序如下:from子句→where→group by(having)→1653select→order by→limit,因为聚集函数是在select中的,所以是在执行完group by之后再执行count()函数,所以第二条写法是得不到总的记录数的。如果你要获得总的记录数就用第一种写法,你第二个那样写不会报错吗内容来自www.zgxue.com请勿采集。


  • 本文相关:
  • mysql统计函数group_concat使用陷阱分析
  • mysql分组查询group by实现原理详解
  • 详解mysql中的分组查询与连接查询语句
  • ubuntu下mysql中文乱码的问题解决
  • mysql myisam默认存储引擎实现原理
  • mysql中如何判断当前是字符 mysql判断字段中有无汉字
  • mysql修改表一次添加多个列(字段)和索引的方法
  • mysql的索引详解
  • 手动配置phpmyadmin和mysql密码的两种方案
  • mysql中date_formate函数使用时的注意点
  • mysql代码 定期备份mysql数据库
  • mysql的字符串函数使用说明
  • mysql三张表连接建立视图
  • mysql 分组之后如何统计记录条数, gourp by 之后的 count
  • sql语句 如何分组后得到记录总数
  • SQL中统计字符串长度的函数是什么?
  • SQL语句如何查询某一字符串字段长度等于某个值的所有记录
  • SQL如何显示查询结果的前100条?
  • mysql中如何统计一个数据库中每张表的行数?
  • mysql一般用什么管理工具?
  • 怎么在mysql命令行执行一个sql文件
  • 如何将navicat for mysql 中查询出来的内容导出到xls文件中
  • EXCEL中的常用函数,功能及用法?
  • 网站首页网页制作脚本下载服务器操作系统网站运营平面设计媒体动画电脑基础硬件教程网络安全mssqlmysqlmariadboracledb2mssql2008mssql2005sqlitepostgresqlmongodbredisaccess数据库文摘数据库其它首页mysql统计函数group_concat使用陷阱分析mysql分组查询group by实现原理详解详解mysql中的分组查询与连接查询语句ubuntu下mysql中文乱码的问题解决mysql myisam默认存储引擎实现原理mysql中如何判断当前是字符 mysql判断字段中有无汉字mysql修改表一次添加多个列(字段)和索引的方法mysql的索引详解手动配置phpmyadmin和mysql密码的两种方案mysql中date_formate函数使用时的注意点mysql代码 定期备份mysql数据库mysql的字符串函数使用说明mysql三张表连接建立视图mysql安装图解 mysql图文安装教程can""""t connect to mysql servwindows下mysql5.6版本安装及配置mysql字符串截取函数substring的mysql创建用户与授权方法mysql提示:the server quit withmysql日期数据类型、时间类型使用mysql——修改root密码的4种方法mysql update语句的用法详解mysql 的case when 语句使用说明mysql中的行级锁定示例详解对mysql经常使用语句的全面总结(必看篇)mysql占用内存较大与cpu过高测试与解决办linux下mysql数据库单向同步配置方法分享mysql innodb 二级索引的排序示例详解mac版修改mysql初始密码的方法mysql5.7及mysql 8.0版本修改root密码的方mysql备份脚本以及删除前5天的备份文件javascript身份证验证代码sql语句执行深入讲解(mysql架构总览->
    免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved