文章目录

  • 合计/统计函数
    • count
      • 案例练习
    • sum
      • 案例练习
    • avg
      • 案例练习
    • Max/Min
      • 案例练习
  • 分组查询
    • group by
      • having
        • 部门表源码
        • 案例练习
  • 字符串相关函数
    • 函数表格
    • 案例演示
    • 案例练习
      • **dual表**
  • 数学函数
    • 函数表格
    • 案例演示
  • 时间日期函数
    • 函数表格
    • 创建测试表
    • 案例演示
    • 应用实例演示1
    • 应用实例演示2
  • 加密和系统函数
    • 函数表格
    • 案例演示
    • 演示md5加密
    • 演示password加密
  • 流程控制函数
    • 引出流程控制函数(需求)
    • 函数表格
    • 案例演示
    • 案例练习

合计/统计函数

count

count返回行的总数

案例练习

-- 统计一个班级共有多少学生?
select count(*) as '学生数' from student-- 统计数学成绩大于60的学生有多少个?
select count(*) as '数学成绩大于60' from student where math > 60-- 统计总分大于200的人数有多少?
select count(*) as '总分大于200' from student where (chinese + math + english) > 200 -- count(*)和count(列)的区别
-- 解释:count(*)返回满足条件的记录的行数
-- count(列):统计满足条件的某列有多少个,但是会排除 为null的数据create table t15(`name` VARCHAR(20));insert into t15 values(null);
insert into t15 values('1');
insert into t15 values('2');
-- 3
select count(*) as '统计数' from t15
-- 2
select count(name) as '统计数' from t15

sum

Sum函数返回满足where条件的行的和

案例练习

-- 统计一个班级数学总成绩?
select sum(math) as '数学总成绩' from student-- 统计一个班级语文、英语、数学各科的总成绩
select sum(math) as '数学总成绩', sum(chinese) as '语文总成绩' ,sum(english) as '英语总成绩' from student-- 统计一个班级语文、英语、数学的成绩总和
select sum(math + chinese + english) as '班级所有成绩总和' from student-- 统计一个班级语文成绩平均分
-- 第一种
select avg(chinese) as '语文成绩平均分' from student
-- 第二种
select (sum(chinese)) / count(*) as '语文成绩平均分' from student-- 注意: sum仅对数值起作用,否则会报错。注意:对多列求和,“,”号不能少。
-- 0
select sum(NAME) from student 

avg

案例练习

-- 求一个班级数学平均分?
select avg(math) as '数学平均分' from student-- 求一个班级总分平均分
select avg(math + chinese + english) as '总分平均分' from student

Max/Min

案例练习

-- 练习:求班级最高分和最低分(数值范围在统计中特别有用)
select max(math + chinese + english)as '最高分' ,min(chinese + math + english) as '最低分'from student

分组查询

group by

使用group by 子句对列进行分组

having

使用having子句对分组后的结果进行过滤

部门表源码

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,'ACOUNTING ','NEW YORK'),(20,'RESEARCh' , 'DALAS '),(30,'SALRS', 'CHICGO '),(40,'OPERATION', 'BoTo ');#创建表EMP雇员CREATE TABLE emp(empno MEDIUMINT UNSIGNED NOT NULL,/*编号*/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,'TONES','AANACEN', 7098,'1991-2-22 ',1250.00,500.00,30),(7654,'MARTIN ','SALESMAN ', 7698,'1991-9-28', 1250.00,1400.00,30),(7698,'BLAKE','MANAGER', 7839,'1991-5-1', 2850.00,NULL,30 ),(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);
--  工资级别表
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);
INSERT INTO salgrade VALUES (2,1201,1400);
INSERT INTO salgrade VALUES (3,1401,2000);
INSERT INTO salgrade VALUES (4,2001,3000);
INSERT INTO salgrade VALUES (5,3001,9999);delete  from emp
delete from dept
delete from salgrade
select * from emp

案例练习

-- 演示group by + having
-- having子句用于限制分组显示结果-- ?如何显示每个部门的平均工资和最高工资
-- 分析:1.显示每个部门的平均工资和最低工资
select avg(sal),max(sal),deptno from emp group by deptno;
-- 分析:2.显示每个部门的每种岗位的平均工资和最低工资
select avg(sal),min(sal),deptno,job from emp group by deptno,job;-- 显示平均工资低于2000的部门号和它的平均工资//别名
-- 分析avg(sal) < 2000
select avg(sal),deptno  from emp group by deptno having avg(sal) < 2000
-- 使用别名进行过滤
select avg(sal) as avg_sal,deptno  from emp group by deptno having avg_sal < 2000

字符串相关函数

函数表格

CHARSET(str) 返回字串字符集
CONCAT(string2[,…]) 连接字串
INSTR(string,substring) 返回substring在string中出现的位置,没有返回0
UCASE(string2) 转换成大写
LCASE(string2) 转换成小写
LEFT(string2,length) 从string2中的左边起取length个字符
LENGTH(string) string长度【按照字节】
REPLACE(str,search_str,replace_str) 在str中用replace_str替换search_str
STRCMP(string1,string2) 逐字符比较两字串大小
SUBSTRING(str,positon[,length]) 从str的position开始【从1开始计算】,取length个字符
LTRIM(string2) RTRIM(string2)trim 去除前端空格或后端空格

案例演示

-- 演示字符串相关函数的使用      使用group by练习中的emp表演示
-- CHARSET(str)返回字串字符集
select charset (ename) from emp;    -- utf8-- CONCAT (string2[ ,... ])连接字串//多个列拼接成一行
select concat (ename,'  job is  ', job)from emp;  --  SMITH   job is   CLERK-- INSTR(string ,substring )返回substring在string中出现的位置,没有返回0
select instr ('liuhongtao','tao') from dual;    -- 返回 8 //  dual(测试表,亚元表) -- UCASE (string2) 转换成大写
select ucase (ename) from emp-- LCASE (string2) 转换成小写
select lcase (ename) from emp-- LEFT(string2 ,length )  从string2中的左边起取1ength个字符
select left(ename,2) from emp   -- 返回前两位-- LENGTH (string ) string长度[按照字节]
select length(ename) from emp   -- 返回字符串长度-- REPLACE(str ,searah_str ,replace_str)  在str中用replace_str替换search_str
select ename,replace(job,'MANAGER','经理')  from emp; -- STRCMP(string1 ,string2 )逐字符比较两字串大小
select strcmp('鸿涛','刘鸿涛') from dual;    -- 1,否则返回-1-- SUBSTRING (str , positon ,length) 从str的position开始【从1开始计算】,取length个字符(注意:如果后面不写length,则q)
-- 从ename 列的第一个位置开始取出2个字符
select substring(ename,1,2) from emp; -- LTRIM(string2) RTRIM(string2)trim 去除前端空格或后端空格
select ltrim(ename) from empselect * from emp

案例练习

-- 以首字母小写的方式显示所有员工emp表的姓名
-- 1.先取出ename 的第一个字符,转成小写的
select lcase(left(ename,1)) from emp
-- 2.拼接后面字符
select substring(ename,2) from emp
-- 3.得出
select concat(lcase(left(ename,1)) ,substring(ename,2))from emp

dual表

dual(测试表,亚元表) ,不需要创建表,直接使用就可以

数学函数

函数表格

ABS(num) 绝对值
BIN(decimal_number) 十进制转二进制
CEILING(number2) 向上取整,得到比num2大的最小整数
CONV(number2,from_base,to_base) 进制转换
FLOOR(number2) 向下取整,得到比num2小的最大整数
FORMAT(number,decimal_places) 保留小数位数
HEX(DecimalNumber) 转十六进制
LEAST(number,number2[,…]) 求最小值
MOD(numerrator,denominator) 求余
RAND([seed]) RAND([seed])其范围为0 <= v <= 1.0

案例演示

-- 演示数学相关函数
-- ABS(num)绝对值
select abs(-10) from dual;   -- 10-- BIN(decimal_number)十进制转二进制
select 10 from dual;
select bin(10) from dual;       -- 1010-- CEILING(number2)向上取整,得到比num2大的最小整数
select ceiling (1.2) from dual; -- 2-- CONV(number2,from_base,to_base)进制转换
select conv(50,10,2) from dual;  -- 把10进制50转为2进制  ,110010-- FLOOR(number2)向下取整,得到比num2小的最大整数
select floor(1.9) from dual;        -- 1-- FORMAT(number,decimal_places)保留小数位数
select format(1.1215454,2) from dual;   -- 1.12-- HEX(DecimalNumber)转十六进制
select hex(15) from dual;       -- F-- LEAST(number,number2[,...])求最小值
select least(1,5,7,0,8) from dual;  -- 0-- MOD(numerrator,denominator)求余
select mod(10,3) from dual; -- 1-- RAND([seed])其范围为0 <= v <= 1.0
select rand() from dual;    -- 其范围为0 <= v <= 1.0
select rand(3)  from dual;  -- 写入种子数后固定为0.9057697559760601

时间日期函数

函数表格

CURRENT_DATE() 当前日期
CURRENT_TIME() 当前时间
CURRENT_TIMESTAMP() 当前时间戳
DATE(datetime) 返回datetime的日期部分
DATE_ADD(date2,INTERVAL d_valued_type) 在date2中加上日期或时间
DATE_SUB(date2,INTERVAL d_valued_type) 在date2上减去一个时间
DATEDIFF(date1,date2) 两个日期差(结果是天)
TIMEDIFF(date1,date2) 两个时间差(多少小时,多少分钟,多少秒)
NOW() 当前时间
YEAR|Month|DATE(datetime) 年月日
unix_timestamp() 返回的是1970-1-1到现在的秒数
FROM_UNIXTIME() 可以把一个unix_timestamp 秒数,转成指定格式的日期

创建测试表

create table mes(id int,content VARCHAR(30),sendtime datetime);insert into mes values(1,'北京新闻',current_time)
insert into mes values(2,'上海新闻',now())

案例演示

# 演示时间函数
-- | CURRENT_DATE()                              | 当前日期                |
select current_date() from dual;    -- 2022-02-14-- | CURRENT_TIME()                              | 当前时间                |
select current_time() from dual; -- 12:00:34-- | CURRENT_TIMESTAMP()                         | 当前时间戳              |
select current_timestamp() from dual;   -- 2022-02-14 12:01:00-- | DATE(datetime)                              | 返回datetime的日期部分  |
select date(current_time()) from dual;  -- 2022-02-14-- | NOW()                                       | 当前时间                |
select now() from dual; -- 2022-02-14 12:11:05-- | TIMEDIFF         返回时分秒
select timediff('10:11:11','06:10:10') from dual; -- 04:01:01

应用实例演示1

-- 显示所有留言信息,发布日期只显示日期,不用显示时间
select id,content,date(sendtime) from mes;-- 请查询在10分钟内发布的帖子
select * from mes where date_add(sendtime,interval 10 minute) >= now()
select * from mes where sendtime >= date_sub(now(),interval 10 minute)-- 请在mysql 的sql语句中求出2011-11-11 和1990-1-1相差多少天
select datediff('2011-11-11','1990-1-1')-- 请用mysql的sqli语句求出你活了多少天?[练习]
select datediff(now(),'1997-05-06') as '我已在地球生存了' from dual;-- 如果你能活80岁,求出你还能活多少天﹒[练习]
select datediff(date_add('1997-05-06',interval 80 year),now()) from dual;

应用实例演示2

-- | NOW()                                       | 当前时间 |
-- | YEAR\|Month\|DATE(datetime)                                 | 年月日   |
select year(now()) from dual;-- 2022
select month(now()) from dual; -- 2
select year('2013-1-1')from dual; -- 2013-- unix_timestamp() 返回的是1970-1-1到现在的秒数
select unix_timestamp() from dual;  -- 1644820922
select unix_timestamp() / (24 * 3600 * 365) from dual;  -- 52.1569年-- FROM_UNIXTIME() 可以把一个unix_timestamp 秒数,转成指定格式的日期
select FROM_UNIXTIME(1644820922,'%Y-%m-%d') from dual;    -- 2022-02-14
select FROM_UNIXTIME(1644820922,'%Y-%m-%d %H:%i:%s') from dual;   -- 2022-02-14 14:42:02
-- 意义:在开发中,可以存放一个整数,然后表示-- 在实际开发中,我们也经常使用int来保存一个unix时间戳,
-- 然后使用from_unixtime()进行转换,还是非常有实用价值的

加密和系统函数

函数表格

USER() 查询用户
DATABASE() 查询当前使用的数据库名称
MD5(str) 为字符串算出一个MD5 32的字符串,(用户密码)加密
PASSWORD(str) 从原文密码str 计算并返回密码字符串,通常用于对mysql数据库的用户密码加密

案例演示

-- 演示加密函数和系统函数
-- | USER()                                    | 查询用户
-- 可以查看登录到mysql的有哪些用户,一级登录的ip
select user()from dual; -- 用户@ip地址     -- root@localhost-- | DATABASE()                                | 查询当前使用的数据库名称
select database();-- | MD5(str)                                  | 为字符串算出一个MD5 32的字符串,(用户密码)加密
-- root密码是 *** -> 加密md5 -> 在数据库中存放的是加密后的密码
select md5('gangqixi') from dual;                     -- md5加密后为(618372821f2b093c02fda1317fab65a1)
select length(md5('gangqixi')) from dual;     -- 32 位-- | PASSWORD(str)    -- 加密函数,mysql数据库的用户密码就是password函数加密
select password('gangqixi') from dual;    -- *4886447239D8C351DCE92FC82981B5ADB009AA6E-- mysql.user 表示 数据库.表
select password('gangqixi') from mysql.user   -- *4886447239D8C351DCE92FC82981B5ADB009AA6E

演示md5加密

create table tao(id int,`name` VARCHAR(32) not null default '',pwd char(32) not null default '');insert into tao values(1,'涛涛',md5('gangqixi'));
select * from tao;      -- 618372821f2b093c02fda1317fab65a1
-- 查询数据要加md5
select * from tao where `name`= '涛涛' and pwd=md5('gangqixi'); -- sql注入问题

演示password加密

-- | PASSWORD(str)    -- 加密函数,mysql数据库的用户密码就是password函数加密
select password('gangqixi') from dual;    -- *4886447239D8C351DCE92FC82981B5ADB009AA6E-- mysql.user 表示 数据库.表
select password('gangqixi') from mysql.user   -- *4886447239D8C351DCE92FC82981B5ADB009AA6E

流程控制函数

引出流程控制函数(需求)

函数表格

IF(expr1,expr2,expr3) 如果expr1为True,则返回 expr2 否则返回expr3
IFNULL(expr1,expr2) 如果expr1不为空NULL,则返回expr1,否则返回expr2
SELECT CASE WHEN expr1 THEN expr2 WHEN expr3 THEN expr4 ELSE expr5 END;【类似多重分支】 如果expr1为TRUE,则返回expr2,如果expr2为t,返回expr4,否则返回expr5

案例演示

# 演示流程控制语句
-- | IF(expr1,expr2,expr3) 如果expr1为True,则返回 expr2 否则返回expr3
select if(true,'北京','上海') from dual;        -- 北京-- | IFNULL(expr1,expr2)  如果expr1不为空NULL,则返回expr1,否则返回expr2
select ifnull(null,'涛涛')from dual;    -- 涛涛-- | SELECT CASE WHEN expr1 THEN expr2 WHEN expr3 THEN expr4 ELSE expr5
-- |如果expr1为TRUE,则返回expr2,如果expr2为t,返回expr4,否则返回expr5 |
-- END;[类似多重分支]
select case when true then 'jack'  -- jackwhen false then 'tom' else 'marry' END

案例练习

-- 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-- 2.如果emp表的job是CLERK则显示职员,如果是 MANAGER 则显示经理
--              如果是SALESMAN则显示销售人员,其它正常显示.select ename,(select CASEWHEN job = 'CLERK' then '职员'WHEN job = 'MANAGER' then '经理'WHEN job = 'SALESMAN' then '销售人员'else job END) from emp;

MySQL攻略 - 函数篇(各类函数统计、练习、细节、表格)相关推荐

  1. ML与math:机器学习与高等数学基础概念、代码实现、案例应用之详细攻略——基础篇

    ML与math:机器学习与高等数学基础概念.代码实现.案例应用之详细攻略--基础篇 目录 一.ML与高等数学 0.基础数学 1.导数.方向导数.梯度 1.1.概念简介 1.2.代码实现 2.Taylo ...

  2. ML与math:机器学习与高等数学基础概念、代码实现、案例应用之详细攻略——进阶篇

    ML与math:机器学习与高等数学基础概念.代码实现.案例应用之详细攻略--进阶篇 目录 人工智能数学基础综合 人工智能数学基础之高等数学 1.哈夫曼编码Huffman Coding简介及代码实现 人 ...

  3. ACM模式输入输出攻略 | C++篇

    文章目录 ACM模式输入输出攻略 | C++篇 1.核心代码模式与ACM模式 2.C++常用的输入输出方法 2.1 输入 (1)cin (2)getline() (3)getchar() 2.2 输出 ...

  4. 国企央企OFFER收割全攻略 | 银行篇之面试

    文章目录 国企央企OFFER收割全攻略 | 银行篇之面试 5 面试 5.1 银行面试的考察内容与考察形式 5.2 不同银行面试的面试内容 5.3 银行面试流程与常考问题 5.4 如何准备银行面试 5. ...

  5. 国企央企OFFER收割全攻略 | 银行篇之笔试

    文章目录 国企央企OFFER收割全攻略 | 银行篇之笔试 4 笔试 4.1 银行笔试的考察内容与题型 4.2 不同银行笔试的侧重点 4.3 如何准备银行笔试 4.4 笔试的注意事项 小结 国企央企OF ...

  6. Retrofit全攻略——进阶篇

    最近事比较多,距离上次写文章已经过去了一个月了.上一篇文章Retrofit全攻略--基础篇 介绍了Retrofit的基础用法,这篇文章介绍点进阶的用法. 打印网络日志 在开发阶段,为了方便调试,我们需 ...

  7. device or resource busy_北海or涠洲岛旅游攻略(收藏篇)

    北海or涠洲岛之旅,我是和我的朋友们一起去的!!一共玩了4天~平均每人只花了1000元左右!在去之前我们在网上做了半个月的功课,再加上游玩后的一些感受和经验,总结了以下经验分享给大家,希望这篇北海or ...

  8. 国企央企OFFER收割全攻略 | 银行篇之差额体检答疑

    文章目录 国企央企OFFER收割全攻略 | 银行篇之差额体检&答疑 6 体检 6.1 体检是差额体检,是招聘的一个环节 6.2 体检的流程 6.3 体检的注意事项 7 答疑 8 结束语 题外话 ...

  9. 倩女幽魂2服务器维护怎么抢先进,玉玉倩女幽魂新区攻略-经验篇

    玉玉已经发表过一篇新区升级的攻略了. 可以让普通玩家只花一块钱,轻轻松松的到达69级. 练级篇里面提到了60级做一条布袋,很多人可能不满意获得的经验. 这次这篇可以让经验再次扩大,多到开封印就可以秒8 ...

  10. asp功放怎么装_汽车音响安装全攻略--功放篇

    汽车音响安装全攻略--功放篇 安装功放比安装接收机或扬声器更需要一些技巧,但并不意味着不可操作.事先了解注意事项,可以减少发生故障的机率. 安 装 第一步:作好准备工作 功放与接收机间必须保持至少90 ...

最新文章

  1. kaliLinux下保持匿名
  2. python图片识别拉框_python目标检测给图画框,bbox画到图上并保存案例
  3. jQuery操作input改变value属性值
  4. 对于出差的看法_我对于挑选背包的一些小建议
  5. Python 链接汇总
  6. springmvc跳转html_SpringMVC基础(三)
  7. jQuery 基础事件
  8. k8s集群之master节点部署
  9. 纯新手DSP编程--5.21--CCS高级工具的使用
  10. 全局变量的使用和声明
  11. 软件工程知识点总结(含各类软件工程各类图的画法)
  12. 2022 CVPR 三维人体重建相关论文汇总(3D Human Reconstruction)
  13. 激活Windows10,激活软件被报出,软件存在威胁或者恶意程序?
  14. 109 个实用 shell 脚本
  15. 基于SSM实现的新闻发布系统【附源码】(毕设)
  16. Ext cookies设置、获取和清除
  17. 查找算法--Java实例/原理
  18. `SpringBoot`+`axios`结合发送`ajax`请求
  19. 都在说软件测试真的干不到35岁,那咋办呢...我都36了...
  20. 从苏宁电器到卡巴斯基第07篇:我在佳木斯的日子(下)

热门文章

  1. BACnet协议介绍
  2. 0xc000007b应用程序无法正常启动,dll损坏
  3. revit学习-图元属性
  4. PythonShell
  5. docker存储卷的使用
  6. 嵌入式Linux应用开发完全手册.pdf 影印版 OCR可复制 高清 带书签
  7. 【js下载图片打不开】
  8. 1038 一元三次方程求解 2001年NOIP全国联赛提高组
  9. Leetcode-111 二叉树的最小深度(递归)
  10. python eval函数_Python中eval与exec区别 | 萧小寒