当前位置: 首页 > news >正文

从零开始MySQL-第5章 函数

1.统计函数(合计函数)

-- 统计一个班级共有多少学生
SELECT COUNT(*) FROM student;
-- 统计数学成绩大于90的学生有多少个
SELECT COUNT(*) FROM studentWHERE math > 90;
-- 统计总分大于250的人数有多少
SELECT COUNT(*) FROM studentWHERE (chinese + english + math) > 150;
-- count(*)和count(列)的区别
-- 解释: coun(*)返回满足条件的记录的行数
-- count(列):统计满足条件的某列有多少个,但是会排除为null
CREATE TABLE t15(`name` VARCHAR(20)
);
INSERT INTO t15 VALUES('tom');
INSERT INTO t15 VALUES('jack');
INSERT INTO t15 VALUES('mary');
INSERT INTO t15 VALUES(NULL);
SELECT * FROM t15;
SELECT COUNT(*) FROM t15; -- 4
SELECT COUNT(`name`) FROM t15; -- 3-- 统计一个班级数学总成绩
SELECT SUM(math) FROM student;
-- 统计一个班级语文、英语、数学各科的总成绩
SELECT SUM(math) AS total_math, SUM(english), SUM(chinese) FROM student;
-- 统计一个班级语文、英语、数学的成绩总和
SELECT SUM(chinese + english + math) FROM student;
-- 统计一个班级语文成绩平均分
SELECT SUM(chinese) / COUNT(*) FROM student;-- 求一个班级数学平均分
SELECT AVG(math) FROM student;
-- 求一个班级总分平均分
SELECT AVG(math + english + chinese) FROM student;-- 求班级最高分和最低分
SELECT MAX(chinese + english + math), MIN(chinese + english + math) FROM student;
SELECT MAX(math) AS 'max_math', MIN(math) AS 'low_math' FROM student;

SUM、AVG针对数值型数据,对于字符型无意义。

GROUP BY 用于对查询的结果分组统计

CREATE TABLE dept(/*部门表*/deptno MEDIUMINT UNSIGNED NOT NULL DEFAULT 0,dname VARCHAR(20) NOT NULL DEFAULT "",loc VARCHAR(13) NOT NULL DEFAULT ""
);
INSERT INTO dept VALUES(10, 'ACCOUNTING', 'NEW YORK'),(20, 'RESEARCH', 'DALLAS'),(30, 'SALES', 'CHICAGO'),(40, 'OPERATIONS', 'BOSTON');
SELECT * FROM dept;CREATE TABLE emp(/*员工表*/empno MEDIUMINT UNSIGNED NOT NULL DEFAULT 0,/*编号*/ename VARCHAR(20) NOT NULL DEFAULT "",/*名字*/job VARCHAR(9) NOT NULL DEFAULT "",/*工作*/mgr MEDIUMINT UNSIGNED,/*上级编号*/hiredate DATE NOT NULL,/*入职时间*/sal DECIMAL(7, 2) NOT NULL,/*薪水*/comm DECIMAL(7, 2),/*红利*/deptno MEDIUMINT UNSIGNED NOT NULL DEFAULT 0 /*部门编号*/
);
INSERT INTO emp VALUES (7369, 'SMITH', 'CLERK', 7902, '1990-12-17', 800.00, NULL, 20),(7499, 'ALLEN', 'SALESMAN', 7698, '1991-2-20', 1600.00, 300.00, 30),(7521, 'WARD', 'SALESMAN', 7698, '1991-2-22', 1250.00, 500.00, 30),(7566, 'JONES', 'MANAGER', 7839, '1991-4-2', 2975.00, NULL, 20),(7565, 'MARTIN', 'SALESMAN', 7698, '1991-9-28', 1250.00, 1400.00, 30),(7698, 'BLAKE', 'MANAGER', 7839, '1991-5-1', 2850.00, NULL, 30),(7782, 'CLARK', 'MANAGER', 7839, '1991-6-9', 2450.00, NULL, 10),(7788, 'SCOTT', 'ANALYST', 7566, '1991-11-22', 3000.00, NULL, 20),(7839, 'KING', 'PRESIDENT', NULL, '1991-11-17', 5000.00, NULL, 10),(7844, 'TURNER', 'SALESMAN', 7698, '1991-9-8', 1500.00, 0.00, 30),(7876, 'ADAMS', 'CLERK', 7788, '1992-1-15', 1100.00, NULL, 20),(7900, 'JAMES', 'CLERK', 7698, '1991-12-3', 950.00, NULL, 30),(7902, 'FORD', 'ANALYST', 7566, '1991-12-3', 3000.00, NULL, 20),(7934, 'MILLER', 'CLERK', 7782, '1992-1-23', 1300.00, NULL, 10);
SELECT * FROM emp;CREATE TABLE salgrade(/*工资级别表*/grade MEDIUMINT UNSIGNED NOT NULL DEFAULT 0,/*工资级别*/losal DECIMAL(17, 2) NOT NULL,/*最低工资*/hisal DECIMAL(17, 2) NOT NULL/*最高工资*/
);
INSERT INTO salgrade VALUES(1, 700, 1200),(2, 1201, 1400),(3, 1401, 2000),(4, 2001, 3000),(5, 3001, 9999);
SELECT * FROM salgrade;
-- having子句用于限制分组显示结果
-- 显示每个部门的平均工资和最高工资
SELECT AVG(sal), MAX(sal), deptnoFROM emp GROUP BY deptno;
-- 显示每个部门的每种岗位的平均工资和最低工资
-- 1. 部门 2. 岗位
SELECT AVG(sal), MIN(sal), deptno, jobFROM emp GROUP BY deptno, job ORDER BY deptno;
-- 显示平均工资低于2000的部门号和它的平均工资
SELECT deptno, AVG(sal)FROM emp GROUP BY deptnoHAVING AVG(sal) < 2000;
-- 减少一次计算
SELECT deptno, AVG(sal) AS avg_salFROM emp GROUP BY deptnoHAVING avg_sal < 2000;

HAVING 作用于组, WHERE作用于行。

2.字符串函数

-- 函数	说明
SELECT * FROM emp;
-- CHARSET(str)	返回字符串字符集
SELECT CHARSET(ename) FROM emp;
-- CONCAT(string2 [, ...])	连接字符串,将多个列拼接成一列
SELECT CONCAT(ename, ' job is ', job) FROM emp;
-- INSTR(string, substring)	返回 substring 在 string 中出现的位置,没有返回 0
-- dual 亚元表,系统表
SELECT INSTR('oooaaaiiioo', 'aa') FROM DUAL;
-- UCASE(string2)	转换成大写
SELECT UCASE(ename) FROM emp;
-- LCASE(string2)	转换成小写
SELECT LCASE(ename) FROM emp;
-- LEFT(string2, length)	从 string2 中的左边起取 length 个字符
SELECT LEFT(ename, 2) FROM emp;
SELECT RIGHT(ename, 2) FROM emp;
-- LENGTH(string)	字符串长度[按照字节]
SELECT LENGTH(ename) FROM emp;
SELECT LENGTH('崴比巴步') FROM emp;
SELECT CHAR_LENGTH('崴比巴步') 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('hsp', 'hsp') FROM DUAL;
SELECT STRCMP('hsp', 'jsp') FROM DUAL;
SELECT STRCMP('hsp', 'asp') FROM DUAL;
-- SUBSTRING(str, position [, length])	从 str 的 position 开始(从 1 开始计算),取 length 个字符
SELECT SUBSTRING(ename, 1, 2) FROM emp;
-- LTRIM(string2) / RTRIM(string2) / trim	去除前端空格或后端空格
SELECT LTRIM('   崴比巴步   ') FROM DUAL;
SELECT LENGTH('   崴比巴步   ') FROM DUAL;
SELECT LENGTH(LTRIM('   崴比巴步   ')) FROM DUAL;
SELECT RTRIM('   崴比巴步   ') FROM DUAL;
SELECT LENGTH(RTRIM('   崴比巴步   ')) FROM DUAL;
SELECT TRIM('   崴比巴步   ') FROM DUAL;
SELECT TRIM('   崴比 巴步   ') FROM DUAL;
SELECT LENGTH(TRIM('   崴比巴步   ')) FROM DUAL;
-- 以首字母小写的方式显示所有员工emp表的姓名SELECT CONCAT(LCASE(LEFT(TRIM(ename), 1)), UCASE(SUBSTRING(TRIM(ename), 2, LENGTH(TRIM(ename))))) FROM emp;
SELECT REPLACE(UCASE(TRIM(ename)), LEFT(UCASE(TRIM(ename)), 1), LCASE(LEFT(UCASE(TRIM(ename)), 1))) FROM emp;

3.数学函数

-- 函数	说明
-- ABS(num)	绝对值
SELECT ABS(10) FROM DUAL;
SELECT ABS(-10) FROM DUAL;
-- BIN(decimal_number)	十进制转二进制
SELECT BIN(10) FROM DUAL;
-- CEILING(number2)	向上取整,得到比 num2 大的最小整数
SELECT CEILING(1.1) FROM DUAL;
SELECT CEILING(-1.1) FROM DUAL;
-- CONV(number2, from_base, to_base)	进制转换 convert
SELECT CONV(8, 10, 2) FROM DUAL; /*十进制的8转换为二进制输出*/
SELECT CONV(16, 16, 10) FROM DUAL;
-- FLOOR(number2)	向下取整,得到比 num2 小的最大整数
SELECT FLOOR(1.1)FROM DUAL;
SELECT FLOOR(-1.1)FROM DUAL;
-- FORMAT(number, decimal_places)	保留小数位数
SELECT FORMAT(78.123456, 3) FROM DUAL;/*会四舍五入*/
-- HEX(DecimalNumber)	转十六进制
SELECT HEX(10) FROM DUAL;
-- LEAST(number, number2 [...])	求最小值
SELECT LEAST(0, 1, -10, 4) FROM DUAL;
-- MOD(numerator, denominator)	求余
SELECT MOD(10, 3) FROM DUAL;
-- RAND([seed])	随机数生成,范围为 0 ≤ v ≤ 1.0
SELECT RAND(3) FROM DUAL;
SELECT RAND() FROM DUAL;
-- 使用RAND()每次返回不同的随机数,使用RAND(seed) 返回随机数,如果seed不变,随机数也不变

4.时间日期

-- 函数	说明-- 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());
INSERT INTO mes VALUES(2, '上海新闻', NOW());
SELECT * FROM mes;
-- DATE(datetime)	返回 datetime 的日期部分
-- 显示所有新闻信息,发布日期只显示日期,不用显示时间
SELECT id, content, DATE(send_time) FROM mes;
-- DATE_ADD(date2, INTERVAL d_value d_type)	在 date2 上加上指定的时间间隔(如天、小时等)
-- 请查询30分钟内发布的新闻
SELECT * FROM mes WHERE DATE_ADD(send_time, INTERVAL 30 MINUTE) >= NOW();
-- DATE_SUB(date2, INTERVAL d_value d_type)	在 date2 上减去指定的时间间隔
SELECT * FROM mes WHERE DATE_SUB(NOW(), INTERVAL 30 MINUTE) <= send_time;
SELECT * FROM mes WHERE DATE_SUB(send_time, INTERVAL 8 MINUTE) >= '2025-11-06 19:00:00';
-- DATEDIFF(date1, date2)	计算两个日期之间的差值(结果为天数)
-- 求出2011-11-11 和 1990-1-1 相差多少天
SELECT DATEDIFF('2011-11-11', '1990-01-01') FROM DUAL;
SELECT CEILING(DATEDIFF('2011-11-11', '1990-01-01') / 365) FROM DUAL;
-- 求出你活了多少天
SELECT DATEDIFF(CURRENT_DATE(), '2003-09-01') FROM DUAL;
SELECT DATEDIFF(CURRENT_DATE(), '2003-09-01') / 365 FROM DUAL;
-- 如果你能活到80岁,求出你还能活多少天
SELECT DATEDIFF(DATE_ADD('2003-09-01', INTERVAL 80 YEAR), NOW()) FROM DUAL;
-- TIMEDIFF(date1, date2)	计算两个时间之间的差值(结果为时:分:秒格式)
SELECT TIMEDIFF('10:11:11', '06:10:10') FROM DUAL;
/*
DATE ADD()中的 interval 后面可以是 year minute second day 等
DATE SUB()中的 interval 后面可以是 year minute second hour day 等
DATEDIFF(date1,date2)得到的是天数,而且是date1-date2 的天数,因此可以取负数
这四个函数的日期类型可以是 date,datetime 或者 timestamp
*/-- NOW()	返回当前日期和时间
SELECT NOW() FROM DUAL;
-- YEAR(Month)/DATE(datetime)	提取年份或日期部分(注:此处可能有误,应为 YEAR(datetime) 或 MONTH(datetime))
SELECT YEAR(NOW()) FROM DUAL;
SELECT MONTH(NOW()) FROM DUAL;
SELECT DAY(NOW()) FROM DUAL;
SELECT MONTH('2011-11-10') FROM DUAL;
-- UNIX_TIMESTAMP():返回的是1970-1-1到现在的秒数
SELECT UNIX_TIMESTAMP() / (60 * 60 * 24 * 365) FROM DUAL;
-- FROM_UNIXTIME()	将 Unix 时间戳转换为可读的日期时间格式
SELECT FROM_UNIXTIME(1, '%Y-%m-%d') FROM DUAL;
SELECT FROM_UNIXTIME(1616161616, '%Y-%m-%d %H:%i:%s') FROM DUAL;
SELECT FROM_UNIXTIME(UNIX_TIMESTAMP(), '%Y-%m-%d %H:%i:%s') FROM DUAL;

5.加密函数

-- USER() 查询用户
-- 可以查看登录到mysql的有哪些用户,以及登录ip
SELECT USER() FROM DUAL;
-- DATABASE() 数据库名称
SELECT DATABASE();
-- MD5(str) 为字符串算出一个 MD5 32的字符串, (用户密码)加密
SELECT MD5('oioio') FROM DUAL;
SELECT LENGTH(MD5('oioio')) FROM DUAL;
-- 演示用户表 ,存放密码时,是md5
CREATE TABLE users(id INT,NAME VARCHAR(32) NOT NULL DEFAULT '',pwd CHAR(32) NOT NULL DEFAULT ''
);
INSERT INTO users VALUES(100, '崴比巴步', MD5('oioi'));
SELECT * FROM users;
SELECT * FROM users WHERE `NAME` = '崴比巴步' AND pwd = MD5('oioi');
-- PASSWORD(str)
SELECT PASSWORD('oioi') FROM DUAL;/*mysql8.0之后取消了该函数*/
-- SELECT * FROM mysql.user \G 从原文密码str 计算并返回密码字符串 
SELECT * FROM mysql.user;
SELECT * FROM mysql.user \G;/*垂直显示*/

6.流程控制

-- 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('javk', 'oi') FROM DUAL;
SELECT IFNULL(NULL, 'oi') FROM DUAL;
-- SELECT CASE WHEN expr1 THEN expr2 WHEN expr3 THEN expr4 ELSE expr5 END;
-- 如果expr1为TRUE,则返回expr2,如果expr2为T,返回expr4,否则返回expr5
SELECT CASE WHEN TRUE THEN 'jack' WHEN FALSE THEN 'tom' ELSE 'mary' END;
-- 1.查询emp 表,如果 comm 是null,则显示0.0
SELECT ename, comm FROM emp;
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 WHEN job = 'CLERK' THEN '职员'  WHEN job = 'MANAGER' THEN '经理'WHEN job = 'SALESMAN' THEN '经理'ELSE job END), jobFROM emp;

http://www.dtcms.com/a/578687.html

相关文章:

  • 广东网站建设十大品牌网站调用新浪微博
  • 邢台集团网站建设价格十大免费行情软件视频
  • React 发送短信验证码和验证码校验功能组件
  • 做视频解析网站犯法荆州网站推广怎么做
  • 中国网站优化公司关键词分析工具
  • Temp Mail4.09 | 生成匿名临时邮箱地址,避免垃圾邮件,保护隐私
  • 可以把网站服务器放在哪里wordpress代码添加
  • 使用Requests和LXML实现安居客二手房数据高效爬取
  • 办公用品十大购物网站排名辞职做网站
  • 威海外贸网站建设联系方式网站域名后缀代表什么意思
  • 从生产到质量: RFID 技术赋能汽车制造全链路管控
  • redis中的offset是什么意思
  • soho做网站谷歌推广短视频推广渠道有哪些
  • 广州微信网站建设报价表网站技术方案
  • 【论文精读】Lumiere:重塑视频生成的时空扩散模型
  • 黑龙江住房和城乡建设厅网站襄城县做网站的
  • 外贸网站vps服务器gstatic wordpress
  • 陕西省建设安全协会网站wordpress采集中文
  • 标签Labels、Scheduler:调度器、k8s污点与容忍度
  • 网站开发询价单重庆网站建设报价
  • [论文阅读] AI + 软件工程 | 3340个Python ML项目实证:PyQu工具+61种代码变更,精准提升软件质量!
  • 【数据结构+算法】进栈顺序推算、卡特兰数与逆波兰表达式
  • 网站源码 一品资源网电龙网站建设
  • 文山网站建设代理成都品牌形象设计
  • SEO超级外链工具 - SEO超级外链工具 - 网站自动外链群发与推广优化助手
  • 企业数据查询网站怎么自己做H5网站
  • 单位门户网站可以做百度百科指数型基金是什么意思
  • 详细阐述时间复杂度和空间复杂度定义、算法、和原理,,举例通过C/C++里面说明
  • 神鹰网站建设公司各行业的专业网址论坛资料
  • 慕枫网站建设做网站电话销售的话术