MySQL-函数

一、统计函数

CREATE TABLE student (
				id INT NOT NULL DEFAULT 1,
				`name` varchar(20) not null default '',
				 chinese float not null default 0.0,
				 english float not null default 0.0,
				 math float not null default 0.0 );
 insert into student values (1,'曹操',77,89,85);
  insert into student values (2,'刘备',80,89,90);
	 insert into student values (3,'孙权',87,79,86);
	  insert into student values (4,'诸葛亮',88,89,90);
		 insert into student values (5,'郭嘉',82,89,85);
		  insert into student values (6,'周瑜',79,89,99);
			 insert into student values (7,'荀彧',79,90,80);

1、count     返回行的总数

公式: Select count(*)|count(列名) from tablename
                                          [WHERE where definition]

示例:

#统计一个班级共有多少同学?
select count(*) from student;
#统计数学成绩大于90的学生有多少个?
select count(*) from student where math>90;
#统计总分大于250的人数有多少
select count(*) from student where (math+chinese+english)>250;

-- count(*)和count(列)的区别

-- count(*)和count(列)的区别
-- 解释:count(*)返回满足条件的记录的行数
-- count(列):统计满足条件的某列有多少个,但是会排除 为null
CREATE TABLE ww_15 (
				`name` VARCHAR (20)
				);
  INSERT INTO ww_15	VALUES ('tom');			
  INSERT INTO ww_15	VALUES ('jack');			
  INSERT INTO ww_15	VALUES ('mary');			
  INSERT INTO ww_15	VALUES (NULL);			
SELECT * from ww_15;

SELECT count(*) from ww_15;   -- 4
SELECT count(`name`) from ww_15;   -- 3

2、sum  合计函数

公式:   Select sum(列名) {,sum(列名)...} from tablename
                                        [WHERE where definition]


#统计一个班级数学总成绩?
SELECT sum(math) from student;
#统计一个班级语文、英语、数学各科的总成绩
SELECT sum(math) as math_total,sum(chinese) as chinese_totoal,sum(english) as english_total from student;
#统计一个班级语文、英语、数学的成绩总和
select sum(math+english+chinese) from student;
#统计一个班级语文成绩平均分
select sum(chinese)/count(*) from student;

注意:sum仅对数值起作用,否则会报错。
注意:对多列求和,“,”号不能少。

3、AVG   合计函数 

公式 : Select avg(列名) {,avg(列名)...} from tablename
                          [WHERE where definition]


#求一个班级数学平均分
select AVG(math) from student;
#求一个班级总分平均分
SELECT avg(math+english+chinese) from student;

4、MAX  合计函数

        MIN 合计函数

Max/min函数返回满足where条件的一列的最大/最小值

公式 : Select max(列名)from tablename
                        [WHERE where definition]

 #求班级总分的最高分 , 最低分
 select max(math+english+chinese) as `max_score`,
 min(math+english+chinese) as `min_score` from student;

5、GROUP BY、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,'ACCOUNTING','NEW YORK'),(20,'RESEARCH','DALLAS'),(30,'SALES','CHICAGO'),(40,'OPERATIONS','BOSTON');
#新建一张员工表
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 , /* 薪水*/
				comn 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);
INSERT INTO emp VALUES ( 7499,'ALLEN' , 'SALESMAN', 7698, '1991-2-20', 1600.00, 300.00, 30);
INSERT INTO emp VALUES (7521,'WARD','SALESMAN', 7698,'1991-2-22', 1250.00, 500.00, 30);
INSERT INTO emp VALUES (7566,'JONES','MANAGER', 7839,'1991-4-2', 2975.00, NULL, 20);
INSERT INTO emp VALUES (7654,'MARTIN','SALESMAN',7698,'1991-9-28',1250.00,1400.00,30);
INSERT INTO emp VALUES (7698, 'BLAKE', 'MANAGER', 7839,'1991-5-1', 2850.00, NULL, 30);
INSERT INTO emp VALUES (7782,'CLARK','MANAGER',7839,'1991-6-9',2450.00,NULL,10);
INSERT INTO emp VALUES (7788, 'SCOTT', 'ANALYST', 7566, '1997-4-19', 3000.00, NULL, 20);
INSERT INTO emp VALUES (7839, 'KING', 'PRESIDENT' , NULL, '1991-11-17' , 5000.00, NULL,10);
INSERT INTO emp VALUES (7844,'TURNER', 'SALESMAN', 7698, '1991-9-8', 1500.00, NULL, 30);
INSERT INTO emp VALUES (7900, 'JAMES', 'CLERK' , 7698, '1991-12-3', 950.00, NULL, 30);
INSERT INTO emp VALUES (7902,'FORD', 'ANALYST', 7566, '1991-12-3', 3000.00, NULL, 20);
INSERT INTO emp VALUES (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); -- 该级别最高工资

RENAME TABLE salgradegrade TO salgrade;

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);
INSERT INTO salgrade VALUES(1,700,1200);

>1.要求查询每个部门的平均工资与最高工资 

#>1.要求查询每个部门的平均工资与最高工资 
SELECT AVG(sal),MAX(sal) FROM emp GROUP BY deptno;

      在进行分组后,对每个分组求平均值与最高值 。

>2.要求查询每个部门的平均工资与最低工资

#>2.要求查询每个部门的每种岗位的平均工资与最低工资
SELECT AVG(sal),MIN(sal) ,deptno,job FROM emp GROUP BY deptno,job;

       GROUP BY deptno,job  //相当于分组两次,按部门先分组再按工作分组。

>3.要求查询平均工资低于2000的部门号和它的平均工资

#>3.要求查询平均工资低于2000的部门号和它的平均工资
SELECT AVG(sal) as sal_avg,deptno FROM emp GROUP BY deptno HAVING sal_avg>2000;

      group by 与 having 是搭配使用的一对兄弟, having的作用相当于where,即在分组的基础上再做筛选。

二、字符串函数

#练习字符串的相关函数的使用,使用emp表
 
 #CHARSET(str)返回字串字符集
 select CHARSET(ename) from emp;
 #CONCAT(string2 [...]) ,连接字串,将多个列拼接成一列显示
 select CONCAT(ename,'的工作是',job) from emp;
 #INSTR (string,substring) 返回substring在string中出现的位置
 SELECT INSTR('LOVEFREVER','LOVE') FROM DUAL;
 #DUAL  亚元表,系统表作测试使用
 #UCASE(string) 转成大写
 #LCASE(string) 转成小写
 #LEFT(string2,length) 从length2中的左边去除length个字符
 #RIGHT(string2,length)
 select LEFT('LOVE',2) FROM emp;
 #LENGTH(string) 取字串长度
 select LENGTH(ename) from emp;
 #REPLACE (STR,search_str,replace_str) 
 -- 在str中用replace_str替换search_str
 select ename,REPLACE(job,'MANAGER','经理')FROM emp;
 #逐字符比较两字串大小, STRCMP(stringl ,string2 )
 select STRCMP('bsmsm','asmsm') from dual;  -- 输出1
 #SUBSTRING(str,position,[,length]) 
 #从str 这个字段的第position个位置取出length个字符
 #*****如果length不写,即默认从position全部取出来*****
 select SUBSTRING(ename,1,3) from emp;
 #LTRIM(str) /RTRIM(str) /TRIM([remstr FROM] str)
 -- 去除前端或者后端的空格
 select LTRIM('   THINK') FROM DUAL;
 select RTRIM('think     ') from dual;
 select TRIM('   THINK   ') FROM  DUAL;
 
 #以首字母小写的方式显示所有员工的ename
 select CONCAT(LCASE(SUBSTR(ename,1,1)),SUBSTR(ename,2)) from emp;

三、数学函数

#练习数学函数的使用
--  ABS(num) 绝对值
SELECT ABS(-10) FROM DUAL;  -- 10
--  BIN (decimal number ) 十进制转二进制
SELECT BIN(10) FROM DUAL;  -- 1010
--  CEILING (number2 ) 向上取整,得到比num2大的最小整数
SELECT CEILING(-1.1) FROM DUAL;  -- -1
-- CONV(number2,from base, to base)  进制转换
--下面的含义是8 是十进制的8, 转成2进制输出
SELECT CONV(8,10,2) FROM DUAL;  -- 1000
-- FLOOR (number2 ) 向下取整,得到比num2小的最大整数 
select FLOOR(-1.1) from DUAL;  -- -2
-- FORMAT (number , decimal places ) 保留小数位数
#>1.要求查询每个部门的平均工资与最高工资 
SELECT FORMAT(AVG(sal),2),MAX(sal) FROM emp GROUP BY deptno;
-- HEX(DecimalNumber )转十六进制
SELECT HEX(1001) FROM DUAL;
-- LEAST (number , number2 [,..]) 求最小值
SELECT LEAST(0,-1,-10,-15)FROM dual;  -- -15
-- MOD (numerator ,denominator ) 求余
-- RAND([seed])  RAND([seed])其范围为 0≤ v ≤1.0
-- 如果使用RAND() , 每次返回一个不同的随机数,0≤ v ≤1.0
-- 如果使用RAND() , 返回随机数0≤ v ≤1.0,如果seed不变
-- 该随机数也不变
SELECT RAND() FROM DUAL;
SELECT RAND(4) FROM DUAL;

四、日期函数

-- 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);

 

上面函数的细节说明:
1.DATE ADD()中的 interval 后面可以是year minute second day等
2.DATE SUB()中的 interval 后面可以是 year minute second hour day等3.DATEDIFF(date1,date2)得到的是天数,而且是date1-date2的天数,因此可以取负数
4.这四个函数的日期类型可以是date,datetime 或者 timestamp

INSERT into mes VALUES (2,'上海时间',CURRENT_TIMESTAMP);
INSERT into mes VALUES (3,'杭州时间',CURRENT_TIMESTAMP);

-- 上应用实例--显示所有新闻信息,发布日期只显示日期,不用显示时间.
SELECT id ,content,DATE(send_time) from mes;
-- 请查询在10分钟内发布的帖子
SELECT* from mes where DATE_ADD(send_time,INTERVAL 10 MINUTE) >=NOW();
-- 请在mysq1的sql语句中求出2011-11-11和1990-1-1相差多少天
SELECT DATEDIFF('2011-11-11','1990-1-1') FROM DUAL;
-- 请用mysql的sq1语句求出你活了多少天?[练习]
SELECT DATEDIFF(NOW(),'1996-11-12') FROM DUAL;
-- 如果你能活80岁,求出你还能活多少天.[练习]	
SELECT DATEDIFF(DATE_ADD('1996-11-12',INTERVAL 80 YEAR),NOW())	FROM DUAL;

-- YEAR | MONTH | DAY |DATE (datetime)
SELECT YEAR(NOW()) FROM DUAL;  -- 2023
SELECT DAY(NOW()) FROM DUAL;  -- 29
-- unix_timestamp() : 返回的是1970-1-1 到现在的秒数
select UNIX_TIMESTAMP()/(365*24*60*60) from dual;
-- FROM_UNIXTIME() : 可以把一个unix_timesamp 转换为指定格式的日期
SELECT FROM_UNIXTIME(1618483484,'%Y-%m-%d') from dual;  -- 2021-04-15
SELECT FROM_UNIXTIME(1618483100,'%Y-%m-%d %H:%i:%s') from dual;  -- 2021-04-15 18:38:20

  在实际开发中,我们也经常使用int来保存一个unix时间戳,然后使用from_unixtime()进行转换,还是非常有实用价值的

(例如,一个订单的创建时间createTime 可以设置成 int 类型, 到数据库再转换成时间)

五、加密函数

-- USER() 查询用户
-- 可以查看登录到mysql的有哪些用户,以及登录的ip
SELECT USER() from dual;   -- 用户@ip地址
-- DATABASE()  查询当前使用的数据库名称
SELECT DATABASE() FROM DUAL;
-- MD5(str)  为字符串算出一个MD532的字符串,(用户密码)加密
-- 在数据库中存放的是加密字段
SELECT (MD5 ('loveyou')) FROM DUAL;    -- f74a10e1d6b2f32a47b8bcb53dac5345
SELECT LENGTH(MD5 ('loveyou')) FROM DUAL;    -- 32
CREATE TABLE love_user (
		id INT,
		`name` VARCHAR(32) NOT NULL default'',
		pwd CHAR(32) NOT NULL DEFAULT '');
		INSERT INTO love_user VALUES (100,'love',MD5('FOREVER'));
SELECT * FROM love_user;  -- CSDN
SELECT * from love_user where `name` = 'love' and pwd = MD5('FOREVER');  -- 查询时也需要使用MD5函数
-- PASSWORD (str) 加密函数 , MySQL数据库的用户密码就是PASSWORD函数加密的
select PASSWORD('LOV') FROM DUAL;
-- select*frommysql.user \G从原文密码str计算并返回密码字符串,通常用于对mysql数

六、流程控制函数

#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 END;[类似多重分支.]
#如果expr1 为TRUE,则返回expr2,如果expr2 为t, 返回expr4,否则返回expr5
SELECT CASE 
						WHEN true THEN 'jack'
						WHEN false THEN 'tom'
						ELSE 'mary' END
	#查询emp表,如果comm是null,则显示0.0
	SELECT ename,IF(comn is null,0.0,comn) from emp;					
SELECT ename,IFNULL(comn,0.0) from emp;
#如果emp表的job是英文则显示对应中文
SELECT ename,(SELECT CASE 
                              WHEN job = 'CLERK' THEN '职员'
															WHEN job = 'MANAGER'THEN '经理'
															WHEN job  = 'SALESMAN' THEN '销售人员'
															ELSE job END) AS 'job'
													FROM emp;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/201887.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python内置函数与标准库函数的详细解读

一、内置函数与标准库函数的区分 Python 解释器自带的函数叫做内置函数,这些函数可以直接使用,不需要导入某个模块。 Python 解释器也是一个程序,它给用户提供了一些常用功能,并给它们起了独一无二的名字,这些常用功能…

二叉树leetcode(求二叉树深度问题)

today我们来练习三道leetcode上的有关于二叉树的题目,都是一些基础的二叉树题目,那让我们一起来学习一下吧。 https://leetcode.cn/problems/maximum-depth-of-binary-tree/submissions/ 看题目描述是让我们来求出二叉树的深度,我们以第一个父…

【LeetCode刷题】--90.子集II

90.子集II class Solution {public List<List<Integer>> subsetsWithDup(int[] nums) {List<List<Integer>> ans new ArrayList<>();List<Integer> list new ArrayList<>();//排序后便于去重Arrays.sort(nums);dfs(0,nums,ans,lis…

Docker的数据持久化;Docker网络;Dockerfile编写

Docker的数据持久化&#xff1b;Docker网络&#xff1b;Dockerfile编写&#xff1b; 文章目录 Docker的数据持久化&#xff1b;Docker网络&#xff1b;Dockerfile编写&#xff1b;**Docker的数据持久化**1&#xff09;将本地目录映射到容器里2&#xff09;数据卷3&#xff09;将…

聚类分析例题 (多元统计分析期末复习)

例一 动态聚类&#xff0c;K-means法&#xff0c;随机选取凝聚点&#xff08;题目直接给出&#xff09; 已知5个样品的观测值为&#xff1a;1&#xff0c;4&#xff0c;5&#xff0c;7&#xff0c;11。试用K均值法分为两类(凝聚点分别取1&#xff0c;4与1&#xff0c;11) 解&…

JavaScript编程进阶 – Return语句

JavaScript编程进阶 – Return语句 JavaScript Programming Advanced – Return Statement By JacksonML 就像人们习惯的函数一样&#xff0c;总觉得在函数体最后需要一个return语句&#xff0c;标志着函数的结束,就像下面这个函数 theFunc() 那样。 function theFunc() { re…

【Openstack Train安装】八、placement安装

Placement 肩负着这样的历史使命&#xff0c;最早在 Newton 版本被引入到 openstack/nova repo&#xff0c;以 API 的形式进行孵化&#xff0c;所以也经常被称呼为 Placement API。它参与到 nova-scheduler 选择目标主机的调度流程中&#xff0c;负责跟踪记录 Resource Provide…

Vue diff 算法探秘:如何实现快速渲染

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

思维模型 达维多定律

本系列文章 主要是 分享 思维模型&#xff0c;涉及各个领域&#xff0c;重在提升认知。持续创新&#xff0c;引领市场潮流。 1 达维多定律的应用 1.1 达维多定律应用之吉列公司&#xff1a;不断创新的刀片领导者 吉列公司是一家以剃须刀片而闻名的公司。自 1901 年推出首款安…

高级IO—poll,epoll,reactor

高级IO—poll,epoll,reactor 文章目录 高级IO—poll,epoll,reactorpoll函数poll函数接口poll服务器 epollepoll的系统调用epoll_createepoll_ctlepoll_wait epoll的工作原理epoll的工作方式水平触发边缘触发 epoll服务器 reactor poll函数 poll函数是一个用于多路复用的系统调…

C++中的类型转换和异常

C类型转换 类型转换(cast) 是将一种数据类型转换成另一种数据类型。例如&#xff0c;如果将一个整型 值赋给一个浮点类型的变量&#xff0c;编译器会暗地里将其转换成浮点类型。 转换是非常有用的&#xff0c;但是它也会带来一些问题&#xff0c;比如在转换指针时&#xff0c…

【linux防火墙】iptables的四表五链以及实操应用

目录 一、防火墙的基本认识 浅提一下iptables 二、防火墙的分类 三、netfilter中的五个勾子函数和报文流向 四、netfilter/iptables的简介 五、iptables的原理讲解和四表五链 内核中数据包传输的过程&#xff1a; 六、iptables iptables的语法&#xff1a; 七、实操 七…

二.运算符

运算符 1.算术运算符2.比较运算符3.逻辑运算符 1.算术运算符 算数运算符主要用于数学运算&#xff0c;其可以连接运算符前后的两个数值或表达式&#xff0c;对数值或表达式进行 - * / 和 取模%运算 1.加减法运算符 mysql> SELECT 100,100 0,100 - 0,100 50,100 50 - …

RK3568平台开发系列讲解(Linux系统篇)通过OF函数获取设备树节点实验

** 🚀返回专栏总目录 文章目录 一、获取获取设备树节点二、驱动程序沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇将介绍通过OF函数获取设备树节点实验 一、获取获取设备树节点 在 Linux 内核源码中提供了一系列的 of 操作函数来帮助我们获取到设备树中编写的…

LLM面面观之Prefix LM vs Causal LM

1. 背景 关于Prefix LM和Causal LM的区别&#xff0c;本qiang在网上逛了一翻&#xff0c;发现多数客官只给出了结论&#xff0c;但对于懵懵的本qiang&#xff0c;结果仍是懵懵... 因此&#xff0c;消遣了多半天&#xff0c;从原理及出处&#xff0c;交出了Prefix LM和Causal …

01数仓平台 Hadoop介绍与安装

Hadoop概述 Hadoop 是数仓平台的核心组件。 在 Hadoop1.x 时代&#xff0c;Hadoop 中的 MapReduce 同时处理业务逻辑运算和资源调度&#xff0c;耦合性较大。在 Hadoop2.x 时代&#xff0c;增加了 Yarn。Yarn 只负责资源的调度&#xff0c;MapReduce 只负责运算。Hadoop3.x 在…

【已解决】游戏缺少xinput1_3.dll的详细解决方案与详情解析

在现代科技日新月异的时代&#xff0c;电脑已经成为我们生活和工作中不可或缺的工具。然而&#xff0c;由于各种原因&#xff0c;电脑可能会出现一些问题&#xff0c;其中之一就是xinput1_3.dll文件的缺失。本文将详细介绍xinput1_3.dll丢失对电脑的影响以及丢失的原因&#xf…

Web安全漏洞分析-XSS(下)

随着互联网的迅猛发展&#xff0c;Web应用的普及程度也愈发广泛。然而&#xff0c;随之而来的是各种安全威胁的不断涌现&#xff0c;其中最为常见而危险的之一就是跨站脚本攻击&#xff08;Cross-Site Scripting&#xff0c;简称XSS&#xff09;。XSS攻击一直以来都是Web安全领…

优化器原理——权重衰减(weight_decay)

优化器原理——权重衰减&#xff08;weight_decay&#xff09; weight_decay的作用 原理解析 实验观察 在深度学习中&#xff0c;优化器的 weight_decay 参数扮演着至关重要的角色。它主要用于实现正则化&#xff0c;以防止模型过拟合。过拟合是指模型在训练数据上表现优异&…

C++ 通过CryptoPP计算Hash值

Crypto (CryptoPP) 是一个用于密码学和加密的 C 库。它是一个开源项目&#xff0c;提供了大量的密码学算法和功能&#xff0c;包括对称加密、非对称加密、哈希函数、消息认证码 (MAC)、数字签名等。Crypto 的目标是提供高性能和可靠的密码学工具&#xff0c;以满足软件开发中对…