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_strselect 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;#以首字母小写的方式显示所有员工的enameselect 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.0SELECT 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;

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

postgres在docker中使用

记录个人开发过程中postgres在docker中的使用,以便后续查看。 Dockerfile 个人是在M1电脑上开发,所以platform使用linux/amd64来兼容amd芯片。 FROM --platformlinux/amd64 postgres:16.1-alpine COPY ./poetrydb.sql /docker-entrypoint-initdb.d/po…

Jenkins 如何查看已经记录登录服务器的凭证密码

文章目录 一、背景描述二、解决方案一(查看所有账号密码)三、解决方案二(查询指定账号密码) 一、背景描述 在日常的开发过程中,有时候会出现忘记开发、测试服务器的登录密码的情况。此时恰巧 Jenkins 上记录了登录该主…

【笔记】windows+pytorch:部署一下stable diffusion和NeRF

之前都是 *nix 环境使用 pytorch,这次尝试了一下windows。 我们来部署下流行性高的stable diffusion和我觉得实用性比stable diffusion高多了的NeRF Stable Diffusion 其实,我也不知道要写啥,都是按照步骤做就好了,后面等有时间…

如何快速生成项目目录结构树?

经常在网上看到下面这种由一个项目,生成一个结构树,你知道它是怎么生成的吗? 这就是利用本文要介绍的一个工具——Treer,treer就是一款专门用来快速生成目录结构树的命令行工具。 第一步:安装treer 在终端执行全局…

蓝桥杯第199题 扫地机器人 暴力优化 二分法 简单题 C++

题目 扫地机器人 - 蓝桥云课 (lanqiao.cn)https://www.lanqiao.cn/problems/199/learning/?page1&first_category_id1&name%E6%89%AB%E5%9C%B0%E6%9C%BA%E5%99%A8%E4%BA%BA 思路和解题方法 首先,通过cin语句输入了终点位置n和障碍物数量k。使用一个数组a来…

微服务学习|初识elasticsearch、操作索引库、文档操作、RestClient操作索引库、RestClient操作文档

初识elasticsearch 什么是elasticsearch? elasticsearch是一款非常强大的开源搜索引擎,可以帮助我们从海量数据中快速找到需要的内容。 elasticsearch结合kibana、Logstash、Beats,也就是elastic stack (ELK)。被广泛应用在日志数据分析、实…

python+pytest接口自动化(4)-requests发送get请求

python中用于请求http接口的有自带的urllib和第三方库requests,但 urllib 写法稍微有点繁琐,所以在进行接口自动化测试过程中,一般使用更为简洁且功能强大的 requests 库。下面我们使用 requests 库发送get请求。 requests库 简介 request…

C# WPF上位机开发(倒计时软件)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 生活当中,我们经常会遇到倒计时的场景,比如体育运动的时候、考试的时候等等。正好最近我们学习了c# wpf开发,完…

记录一次现网问题排查(分享查域名是否封禁小程序)

背景: 收到工单反馈说现网业务一个功能有异常,具体现象是tc.hb.cn域名无法访问,客户地区是河南省,这里记录下排查过程和思路。 首先梳理链路 客户端域名 tc.hb.cn cname—> domainparking-dnspod.cn(新加坡clb)—> snat—&…

基于ssm的汽车论坛管理系统设计与实现

基于ssm的汽车论坛管理系统设计与实现 摘要:信息化社会内需要与之针对性的信息获取途径,但是途径的扩展基本上为人们所努力的方向,由于站在的角度存在偏差,人们经常能够获得不同类型信息,这也是技术最为难以攻克的课题…

论文学习-Attention Is All You Need

Attention Is All You Need 目前暂时不会用到,大概了解一下即可。 Recurrent model 序列化的计算方式,难以并行,随着序列的增长,以前的记忆会逐渐丢失。而Attention机制可以观察到句子中所有的信息,不受距离影响&…

vuepress-----2、初体验

2、初体验 目标 创建GitHub账号创建Github项目初体验vuepress默认主体的首页 初体验 (opens new window) --- home: true heroImage: /hero.png heroText: Hero 标题 tagline: Hero 副标题 actionText: 快速上手 → actionLink: /zh/guide/ features: - title: 简洁至上deta…

【傻瓜级JS-DLL-WINCC-PLC交互】7.​C#直连PLC并读取PLC数据

思路 JS-DLL-WINCC-PLC之间进行交互,思路,先用Visual Studio创建一个C#的DLL控件,然后这个控件里面嵌入浏览器组件,实现JS与DLL通信,然后DLL放入到WINCC里面的图形编辑器中,实现DLL与WINCC的通信。然后PLC与…

使用Redis实现接口防抖

说明:实际开发中,我们在前端页面上点击了一个按钮,访问了一个接口,这时因为网络波动或者其他原因,页面上没有反应,用户可能会在短时间内再次点击一次或者用户以为没有点到,很快的又点了一次。导…

Notepad++批量添加引号

工作中经常会遇到这样情景:业务给到一批订单号,需要查询这批订单的某些字段信息。在where条件中需要传入这些订单号的数组,并且订单号用引号引起,用引号隔开。 字符串之间长度相同 可以按住CtrlAlt和鼠标左键选中区域&#xff0…

ora.LISTENER.lsnr状态为Not All Endpoints Registered

客户的监控反馈有个监听无法连接,登录环境检查发现ora.LISTENER.lsnr的状态为Not All Endpoints Registered,如下 [rootdb2 ~]# crsctl status res -t -------------------------------------------------------------------------------- NAME …

C/C++内存管理(含C++中new和delete的使用)

文章目录 C/C内存管理(含C中new和delete的使用)1、C/C内存分布2、C语言中动态内存管理方式:malloc/calloc/realloc/free3、C动态内存管理3.1、new/delete操作内置类型3.2、new/delete操作自定义类型 4、operator new与operator delete函数5、…

Jave内存模型 与 CPU硬件架构 的交互图

JMM里所讲的主内存、工作内存与Java内存区域中的Java堆、栈、方法区等并不是同一个层次的对内存的划分,这两者基本上是没有任何关系的。 如果两者一定要勉强对应起来,那么从变量、主内存、工作内存的定义来看,主内存主要对应于Java堆中的对象…

[PyTorch][chapter 3][李宏毅深度学习-偏差,方差,过拟合,欠拟合]

前言: 这章的目的主要是通过诊断错误的来源,通过错误的来源去优化,挑选模型。 通过本章掌握 过拟合(overfitting)和欠拟合(underfitting)出现原因及解决方案. 目录: 1 概述 2 方差,偏差现象 3 过拟合和欠拟合 4 模型选择 5 概率论回顾 一 概…

Linux:windows 和 Linux 之间文本格式转换

背景 在 Windows 上编辑的文件,放到 Linux 平台,有时会出现奇怪的问题,其中有一个是 ^M 引起的,例如这种错误: /bin/bash^M: bad interpreter 这个问题相信大家也碰到过,原因是 Windows 和 Linux 关于换行的…