文章目录

  • 一、统计函数
  • 合计函数-sum
  • 合计函数-avg
  • 合计函数-Max/Min
  • 分组统计
  • 二、字符串函数
  • 三、数学函数
  • 四、日期函数
  • 五、加密函数
  • 六、流程控制函数



一、统计函数

Select count(*) | count (列名) from table_name
				[WHERE where_definition]
#count返回行的总数
-- count(*) 和 count(列) 的区别 
-- 解释 :count(*) 返回满足条件的记录的行数
-- count(列): 统计满足条件的某列有多少个,但是会排除 为null的情况

栗子:

-- 统计一个班级共有多少学生?
SELECT COUNT(*) FROM student;
-- 统计数学成绩大于90的学生有多少个?
SELECT COUNT(*) FROM student
	WHERE math > 90
-- 统计总分大于250的人数有多少?
SELECT COUNT(*) FROM student
	WHERE (math + english + chinese) > 250

合计函数-sum

Select sum (列名) {, sum(列名) ...} from table_name
				[WHERE where_definition]
#sum函数返回满足where条件的行的和
#sum只对数值起作用,所以使用在数值列。

栗子:

-- 演示sum函数的使用
-- 统计一个班级数学总成绩?
SELECT SUM(math) FROM student;
-- 统计一个班级语文、英语、数学各科的总成绩
SELECT SUM(math),SUM(english),SUM(chinese) FROM student;
-- 统计一个班级语文、英语、数学的成绩总和
SELECT SUM(math + english + chinese) FROM student;
-- 统计一个班级语文成绩平均分
SELECT SUM(chinese)/ COUNT(*)  FROM student;

合计函数-avg

Select avg(列名) {,avg(列名)...} from table_name
			[WHERE where_definition]
#返回满足where条件的这一列的平均值

栗子:

-- 求一个班级数学平均分?
SELECT AVG(math) FROM student;
-- 求一个班级总分平均分
SELECT AVG(math + english + chinese) FROM student;

合计函数-Max/Min

Select max(列名) from table_name
			[WHERE where_definition]
#返回满足where条件的一列的最大/最小值

栗子:

-- 求班级最高分和最低分
SELECT MAX(math + english + chinese), MIN(math + english + chinese) 
	FROM student;

-- 求出班级数学最高分和最低分
SELECT MAX(math) AS math_high_socre, MIN(math)  AS math_low_socre
	FROM student;

分组统计

SELECT column1, column2, column3 ... FROM table
			group by column
#使用group by对列进行分组
SELECT column1 ,column2 , column3 ... 
			FROM table
			group by column having ...
#使用having对分组之后的结果进行过滤。

栗子:

引入一张提前准备好的员工表,empno是编号,ename是名字,job是工作,mgr是上级编号,hiredate是入职时间,sal是薪水,comm是奖金,deptno是部门编号

mysql统计401课程的及格人数 mysql求学生总人数_mysql统计401课程的及格人数


再引入一张部门表,dname职务,loc位置

mysql统计401课程的及格人数 mysql求学生总人数_数据库_02


还有一张工资级别表,losal是该级别的最低工资,hisal是该级别的最高工资。

mysql统计401课程的及格人数 mysql求学生总人数_sql_03


举几个小栗子:

-- 显示每个部门的平均工资和最高工资
-- 按照部门来分组查询
SELECT AVG(sal), MAX(sal) , deptno 
	FROM  emp GROUP BY deptno;

mysql统计401课程的及格人数 mysql求学生总人数_mysql统计401课程的及格人数_04

-- 使用数学方法,对小数点进行处理
SELECT FORMAT(AVG(sal),2), MAX(sal) , deptno 
	FROM  emp GROUP BY deptno;

mysql统计401课程的及格人数 mysql求学生总人数_数据库_05

-- 显示每个部门的平均工资和最低工资
-- 显示每个部门的每种岗位的平均工资和最低工资
SELECT AVG(sal), MIN(sal) , deptno, job 
	FROM  emp GROUP BY deptno, job;

mysql统计401课程的及格人数 mysql求学生总人数_数据库_06

-- 显示平均工资低于2000的部门号和它的平均工资
-- 1. 显示各个部门的平均工资和部门号
-- 2. 在1的结果基础上,进行过滤,保留 AVG(sal) < 2000
SELECT AVG(sal), deptno 
	FROM emp GROUP BY deptno
		HAVING AVG(sal) < 2000;

mysql统计401课程的及格人数 mysql求学生总人数_mysql_07

-- 3. 使用别名进行过滤 
-- 使用别名		
SELECT AVG(sal) AS avg_sal, deptno 
	FROM emp GROUP BY deptno
		HAVING avg_sal < 2000;

mysql统计401课程的及格人数 mysql求学生总人数_mysql统计401课程的及格人数_08

二、字符串函数

参考:https://www.runoob.com/mysql/mysql-functions.html 这里例举一些常见的字符串函数用法:

mysql统计401课程的及格人数 mysql求学生总人数_mysql_09


栗子:

mysql统计401课程的及格人数 mysql求学生总人数_mysql统计401课程的及格人数_10

-- CHARSET(str)	返回字串字符集
SELECT CHARSET(ename) FROM emp;
-- CONCAT (string2  [,... ])	连接字串, 将多个列拼接成一列
SELECT CONCAT(ename, ' 工作是 ', job) FROM emp;

-- UCASE (string2 )	转换成大写
SELECT UCASE(ename) FROM emp;

-- LCASE (string2 )	转换成小写
SELECT LCASE(ename) FROM emp;

-- LEFT (string2 ,length )	从string2中的左边起取length个字符
-- RIGHT (string2 ,length )	从string2中的右边起取length个字符
SELECT LEFT(ename, 2) FROM emp;

-- LENGTH (string )	string长度[按照字节]
SELECT LENGTH(ename) FROM emp;

-- REPLACE (str ,search_str ,replace_str ) 	
-- 在str中用replace_str替换search_str
-- 如果是manager 就替换成 经理
SELECT ename, REPLACE(job,'MANAGER', '经理')  FROM emp;

-- STRCMP (string1 ,string2 )	逐字符比较两字串大小
SELECT STRCMP('xiaolang', 'xiaoming') FROM DUAL;

-- SUBSTRING (str , position  [,length ])	
-- 从str的position开始【从1开始计算】,取length个字符
-- 从ename 列的第一个位置开始取出2个字符
SELECT SUBSTRING(ename, 1, 2) FROM emp;

三、数学函数

#DUAL是虚拟表,为了满足 select ...from .....的格式

-- ABS(num)	绝对值
SELECT ABS(-10) FROM DUAL;

-- BIN (decimal_number )十进制转二进制
SELECT BIN(10) FROM DUAL;

-- CEILING (number2 )	向上取整, 得到比num2 大的最小整数
SELECT CEILING(-1.1) FROM DUAL;

-- CONV(number2,from_base,to_base)	进制转换
-- 下面的含义是 8 是十进制的8, 转成 2进制输出
SELECT CONV(8, 10, 2) FROM DUAL;

-- 下面的含义是 8 是16进制的8, 转成 2进制输出
SELECT CONV(8, 16, 2) FROM DUAL;

-- FLOOR (number2 )	向下取整,得到比 num2 小的最大整数
SELECT FLOOR(-1.1) FROM DUAL;

-- FORMAT (number,decimal_places )	保留小数位数(四舍五入)
SELECT FORMAT(78.125458,2) FROM DUAL;

-- LEAST (number , number2  [,..])	求最小值
SELECT LEAST(0,1, -10, 4) FROM DUAL;

-- MOD (numerator ,denominator )	求余
SELECT MOD(10, 3) FROM DUAL;

四、日期函数

mysql统计401课程的及格人数 mysql求学生总人数_数据库_11


栗子:

-- CURRENT_DATE (  )	当前日期
SELECT CURRENT_DATE() FROM DUAL;

-- CURRENT_TIME (  )	当前时间
SELECT CURRENT_TIME()  FROM DUAL;

-- CURRENT_TIMESTAMP (  ) 当前时间戳
SELECT CURRENT_TIMESTAMP()  FROM DUAL;

我们再引入一张表:

mysql统计401课程的及格人数 mysql求学生总人数_sql_12


栗子:

-- 显示所有新闻信息,发布日期只显示 日期,不用显示时间.
SELECT id, content, DATE(send_time) 
	FROM mes;

mysql统计401课程的及格人数 mysql求学生总人数_mysql_13

-- 请查询在5分钟内发布的新闻
SELECT * 
	FROM mes
	WHERE DATE_ADD(send_time, INTERVAL 5 MINUTE) >= NOW()

SELECT * 
	FROM mes
	WHERE send_time >= DATE_SUB(NOW(), INTERVAL 5 MINUTE)

mysql统计401课程的及格人数 mysql求学生总人数_mysql_14

-- 请在mysql 的sql语句中求出 2022-2-11 和 1999-1-1 相差多少天
SELECT DATEDIFF('2022-2-11', '1999-01-01') FROM DUAL;

mysql统计401课程的及格人数 mysql求学生总人数_mysql统计401课程的及格人数_15

-- YEAR|Month|DAY| DATE (datetime ),写出现在的年月日
SELECT YEAR(NOW()) FROM DUAL;
SELECT MONTH(NOW()) FROM DUAL;
SELECT DAY(NOW()) FROM DUAL;
-- 写出下面的月份
SELECT MONTH('2022-02-11') FROM DUAL;
-- unix_timestamp() : 返回的是1970-1-1 到现在的秒数
SELECT UNIX_TIMESTAMP() FROM DUAL;
-- FROM_UNIXTIME() : 可以把一个unix_timestamp 秒数[时间戳],转成指定格式的日期
-- %Y-%m-%d 格式是规定好的,表示年月日
-- 意义:在开发中,可以存放一个整数,然后表示时间,通过FROM_UNIXTIME转换   
SELECT FROM_UNIXTIME(1615333100, '%Y-%m-%d %H:%i:%s') FROM DUAL;

mysql统计401课程的及格人数 mysql求学生总人数_mysql统计401课程的及格人数_16

五、加密函数

mysql统计401课程的及格人数 mysql求学生总人数_数据库_17

-- USER()	查询用户
-- 可以查看登录到mysql的有哪些用户,以及登录的IP
SELECT USER() FROM DUAL; -- 用户@IP地址
-- DATABASE()	查询当前使用数据库名称
SELECT DATABASE();

-- MD5(str)	为字符串算出一个 MD5 32的字符串,常用(用户密码)加密
-- root 密码是 123456 -> 加密md5 -> 在数据库中存放的是加密后的密码
SELECT MD5('123456') FROM DUAL;
SELECT LENGTH(MD5('123456')) FROM DUAL;
-- PASSWORD(str) -- 加密函数, MySQL数据库的用户密码就是 PASSWORD函数加密
SELECT PASSWORD('123456') FROM DUAL;
-- select * from mysql.user \G 	从原文密码str 计算并返回密码字符串,\G方便阅读
-- 通常用于对mysql数据库的用户密码加密
-- mysql.user 表示 数据库.表 
SELECT * FROM mysql.user

六、流程控制函数

mysql统计401课程的及格人数 mysql求学生总人数_数据库_18


例举一个emp表:

mysql统计401课程的及格人数 mysql求学生总人数_mysql统计401课程的及格人数_19


栗子:

-- 1. 查询emp 表, 如果 comm 是null , 则显示0.0
-- 判断是否为null 要使用 is null, 判断不为空 使用 is not
SELECT ename, IF(comm IS NULL , 0.0, comm)
	FROM emp;
SELECT ename, IFNULL(comm, 0.0)
	FROM emp;

mysql统计401课程的及格人数 mysql求学生总人数_字符串_20


mysql统计401课程的及格人数 mysql求学生总人数_mysql统计401课程的及格人数_21

-- 2. 如果emp 表的 job 是 CLERK 则显示 职员, 如果是 MANAGER 则显示经理
-- 如果是 SALESMAN 则显示 销售人员,其它正常显示

SELECT ename, (SELECT CASE 
		WHEN job = 'CLERK' THEN '职员' 
		WHEN job = 'MANAGER' THEN '经理'
		WHEN job = 'SALESMAN' THEN '销售人员' 
		ELSE job END) AS 'job'
	FROM emp;

mysql统计401课程的及格人数 mysql求学生总人数_字符串_22