函数

1、统计函数

mysql 数据超过500w查找走索引 mysql查找大于80_mysql

-- 查询姓名为赵云的学生成绩
SELECT *FROM student WHERE `name`='赵云'
-- 查询英语成绩大于90分的同学
SELECT * FROM student where english>90
-- 查询总分大于200分的同学
SELECT * FROM student where (chinese+english+math)>200

-- 查询math大于60并且english大于90分的学生的成绩
SELECT * from student WHERE math>60 AND english>80
-- 查询英语成绩大于语文成绩的同学
SELECT * FROM student WHERE english>chinese
-- 查询总分大于200分并且数学成绩小宇=于语文成绩的姓刘的学生
-- 刘%表示  名字以刘开头的就可以
SELECT
	* 
FROM
	student 
WHERE
	( chinese + english + math )> 200 
	AND math > chinese 
	AND `name` LIKE '刘%'
-- 查询英语分数在80-90之间的同学
SELECT *FROM student where english>=80 AND english<=90;
-- between .. and.. 是闭区间
SELECT english FROM student where english BETWEEN 80 AND 90;

select math from student
														

-- 查询数学成绩为90,77,30的同学
SELECT *FROM student WHERE math=90 OR math=77 OR math=30;
SELECT *FROM student WHERE math IN (90,77,30);

mysql 数据超过500w查找走索引 mysql查找大于80_mysql 数据超过500w查找走索引_02

-- 对数学成绩排序后输出【升序】
SELECT math FROM student ORDER BY math;
-- 对总分按从高到低的顺序输出
SELECT (chinese+english+math) as Total from student ORDER BY (chinese+english+math) DESC;
-- 对总分按从高到低的顺序输出 别名排序
SELECT (chinese+english+math) as Total from student ORDER BY Total DESC;
-- 对姓刘的学生成绩排序输出(升序)
SELECT `name`,(chinese+english+math) as Total from student WHERE `name`LIKE '刘%' ORDER BY Total

mysql 数据超过500w查找走索引 mysql查找大于80_数据库_03

-- 演示mysql的统计函数的使用
-- 统计一个班级共有多少学生
SELECT COUNT(*) FROM student; 
-- 统计数学成绩大于90的学生有多少个?
SELECT COUNT(*) FROM student WHERE math>90;
-- 统计总分大于250的人数有多少?
SELECT COUNT(*) FROM student WHERE (chinese+english+math)>250;
-- count(*)和count(列)的区别
-- 解释 count(*)  返回妈祖条件的记录的行数?
-- count(列)统计满足条件的某列有多少个?排除值为NULL的情况
CREATE TABLE t15 (`name` VARCHAR(20));
INSERT INTO t15 VALUES('jack');
INSERT INTO t15 VALUES('tom');
INSERT INTO t15 VALUES('cat');
INSERT INTO t15 VALUES(NULL);

-- 该值为4
SELECT COUNT(*) FROM t15;
-- 该值为3
SELECT COUNT(`name`) FROM t15;

mysql 数据超过500w查找走索引 mysql查找大于80_mysql_04

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

mysql 数据超过500w查找走索引 mysql查找大于80_数据库_05

-- 演示avg的使用
-- 练习
-- 求一个班级学生平均分?
SELECT AVG(math) FROM student
-- 求一个班级总平均分?
SELECT AVG(chinese+english+math) FROM student;

mysql 数据超过500w查找走索引 mysql查找大于80_mysql 数据超过500w查找走索引_06

-- 演示max和min的使用
-- 求班级最高分和最低分(数值范围在统计中特别有用)
SELECT MAX(chinese+english+math), MIN(chinese+english+math) FROM student;

mysql 数据超过500w查找走索引 mysql查找大于80_mysql_07

-- #演示group by+having
-- GROUP BY 用于对查询的结果分组统计
-- having字句用于限制分组显示结果。
-- ?如何显示每个部门的平均工资和最高工资
SELECT AVG(sal),MAX(sal),depton FROM emp GROUP BY depton;
-- ?显示每个部门的每种岗位的平均工资和最低工资
SELECT AVG(sal),MIN(sal),depton,job from emp GROUP BY depton,job;
-- ?显示平均工资低于2000 的部门号和它的平均工资
SELECT AVG(sal) AS avg_sal ,depton FROM emp  GROUP BY depton HAVING  avg_sal<2000;

2、字符串函数

mysql 数据超过500w查找走索引 mysql查找大于80_字符串_08

-- 演示字符串相关函数的使用
-- CHARSET(str) 返回字符串字符集
SELECT CHARSET(ename) FROM emp;
-- CONCAT(str1,str2,...)连接字串
SELECT CONCAT(ename,' job is ',job) FROM emp;
-- INSTR(string,substring) 返回substring在string中出现的位置,没有返回0
-- DUAL 亚元表,是一张一张系统表,可以作为测试使用
SELECT INSTR('yangyongbing','bing') FROM DUAL;
-- UCASE(str) 转换成大写
SELECT UCASE('yangyongbing') FROM DUAL;
-- LCASE(str)转换成小写
SELECT LCASE('BBBBBBBBB') FROM DUAL;
-- LEFT(str,len) 从str中的左边起取length个字符
SELECT LEFT(ename,2) FROM emp;
SELECT RIGHT(ename,2) FROM emp;
-- LENGTH(str) str的长度
SELECT LENGTH(ename) FROM emp;
-- REPLACE(str,from_str,to_str) 在str中用to_str代替from_str
SELECT ename, REPLACE(job,'MANAGER','经理') FROM emp;
-- STRCMP(expr1,expr2) 逐字比较两个字符串的大小
SELECT STRCMP('abc','def') FROM DUAL;
-- SUBSTRING(str,pos,len) 从str的position开始计算长度
SELECT SUBSTRING(ename,1,5) FROM emp;
-- LTRIM(str)  RTRIM(str)  trim 去除前端空格或后端空格
SELECT LTRIM('   abc   '),RTRIM('  abc  ') ,TRIM('   abc   ')FROM DUAL;
-- 练习,以首字母小写的方式显示所有员工emp表的姓名
SELECT CONCAT(LCASE(SUBSTRING(ename,1,1)),SUBSTRING(ename,2,LENGTH(ename))) FROM emp;
SELECT CONCAT(LCASE(LEFT(ename,1)),SUBSTRING(ename,2,LENGTH(ename))) FROM emp;

3、数学函数

mysql 数据超过500w查找走索引 mysql查找大于80_bc_09

-- 演示数学相关函数
-- ABS(num) 绝对值
SELECT ABS(-10) FROM DUAL;
-- BIN(decimal_number)十进制转二进制
SELECT BIN(10) FROM DUAL;
-- CEILING(num) 向上取整,得到比num大的最小整数
SELECT CEILING(1.1) FROM DUAL;
-- CONV(N,from_base,to_base) 进制转换
SELECT CONV(19,10,2) FROM DUAL;
SELECT CONV(10011,2,10) FROM DUAL;
-- FLOOR(num) 向下取整,得到比num小的最大整数
SELECT FLOOR(1.7) FROM DUAL;
-- FORMAT(number,deciaml_places) 保留小数位数
SELECT FORMAT(1.234,2) FROM DUAL;
-- HEX(DecimalNumber) 转十六进制
SELECT HEX(23) FROM DUAL;
-- LEAST(value1,value2,...)求最小值
SELECT LEAST(89,96,67) FROM DUAL;
-- MOD(N,M)求余
SELECT MOD(199,2) FROM DUAL;
-- RAND([seed])  反回随机数其范围为0<=v<=1.0
SELECT RAND() FROM DUAL;
-- seed不变,返回的随机数不会变
SELECT RAND(3) FROM DUAL;

4、时间日期相关函数

mysql 数据超过500w查找走索引 mysql查找大于80_bc_10


mysql 数据超过500w查找走索引 mysql查找大于80_bc_11

-- 日期时间相关函数
-- CURRENT_DATE() 当前日期
SELECT CURRENT_DATE() FROM DUAL;
-- CURRENT_TIME() 当前时间
SELECT CURRENT_TIME() FROM DUAL;
-- CURRENT_TIMESTAMP() 当前时间戳
SELECT CURRENT_TIMESTAMP() FROM DUAL;
-- 创建测试表
CREATE TABLE mes(id INT,content VARCHAR(30),send_time DATETIME);
INSERT INTO mes VALUES(1,'海淀新闻',CURRENT_TIMESTAMP()),
(2,'朝阳新闻',NOW()),
(3,'东城区新闻',NOW());
SELECT * FROM mes;
-- 显示所有新闻信息,发布日期只显示日期,不用显示时间
SELECT *, DATE(send_time) FROM mes;
-- 请查询在10分钟内发布的贴子
SELECT * FROM mes WHERE DATE_ADD(send_time,INTERVAL 10 MINUTE)>=NOW();
-- 请在mysql的sql语句中求出2011-11-11和1990-1-1相差多少天
SELECT DATEDIFF('2011-11-11','1990-01-01') FROM DUAL;
-- 请用mysql的sql语句求出你活了多少天?
SELECT DATEDIFF(NOW(),'1990-01-01') FROM DUAL;
-- 如果你能活到80岁,求出你还能活多少天,1989-11-11出生
-- 先求出活到80岁的时间,再去减现在的时间
SELECT DATEDIFF(DATE_ADD('1996-05-03',INTERVAL 80 YEAR),NOW()) FROM DUAL;
-- 两个时间之间相差多少?
SELECT TIMEDIFF('10:11:11','06:10:10') FROM DUAL;

mysql 数据超过500w查找走索引 mysql查找大于80_字符串_12

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

5、加密和系统函数

mysql 数据超过500w查找走索引 mysql查找大于80_mysql 数据超过500w查找走索引_13

-- 演示用户表,存放密码时,是md5
CREATE TABLE yyb_user (id INT,`name` VARCHAR(32) NOT NULL DEFAULT '',pwd CHAR(32) NOT NULL DEFAULT '');
INSERT INTO yyb_user VALUES (1,'羊永兵',MD5('yyb'));
SELECT * FROM yyb_user WHERE pwd=MD5('yyb');
-- MD5加密后的字符串定长为32位
SELECT LENGTH(pwd) FROM yyb_user; 
-- PASSWORD(str) 加密函数,这也是mysql数据库的用户密码加密方式
SELECT PASSWORD('yyb') FROM DUAL;
-- mysql数据库的用户密码加密方式
SELECT * FROM mysql.`user`

6、流程控制函数

mysql 数据超过500w查找走索引 mysql查找大于80_bc_14


mysql 数据超过500w查找走索引 mysql查找大于80_数据库_15

#演示流程控制语句
#IF(expr1,expr2,expr3) 如果expr1为True,则返回expr2否则返回expr3
SELECT IF(TRUE,'北京','上海') FROM DUAL;
SELECT IF(FALSE,'北京','上海') FROM DUAL;
#IFNULL(expr1,expr2)   如果expr1不为null,则返回expr1否则返回expr2
SELECT IFNULL('123','456') FROM DUAL;
SELECT IFNULL(NULL,'456') FROM DUAL;
#SELECT CASE case_value WHEN when_value THEN	statement_list ELSE	statement_list END CASE;
-- 1.查询emp表,如果comm是null,则显示0.0
-- 判断为空要用 IS NULL
SELECT ename,IF(comm IS NULL,0.0,comm)FROM emp;
SELECT ename,IFNULL(comm,0.0)FROM emp;
-- 2.如果emp表的job是CLERK则显示职员,如果是MANAGER则显示经理
--    如果是SALESMAN则显示销售人员,其它正常显示
SELECT ename,( SELECT CASE job WHEN 'CLERK' THEN '职员' WHEN 'MANAGER' THEN '经理' WHEN 'SALESMAN' THEN '销售人员' ELSE job END ) AS 'job' 
FROM
	emp;