数据库常用函数-基础

数据库常用函数-基础

在这里插入图片描述

常见函数

1.统计函数-- count

count 会统计我们表中有多少个行 就会返回我们的行数


-- MySQL的统计函数的使用 函数可以自己去写 也可以自定义函数 
-- 1.统计一个班有多少学生
SELECT COUNT(*) FROM student;-- 就是表有多少行就返回多少个学生!!!
-- 统计数学成绩大于90分的同学有多少
SELECT COUNT(*) FROM student 
	WHERE (math>90);
-- count  就是要求和
-- count* 是返回满足条件的记录的总行数
-- count (列)统计满足条件的某列有多少个,但是会排除null的情况 就是这两个基本没差别
2.sum 函数

sum函数就是简单的求和

多条求和语句使用逗号隔开处理

-- sum 统计返回满足where 条件某一行的和
-- 统计一个班级语文,英语,数学各科的总成绩
SELECT SUM(math) FROM student; -- 这个就会统计全班的成绩进去
-- 各科的总成绩
SELECT SUM(math),SUM(english),SUM(chinese) FROM student;
-- 统计总分的总和
SELECT SUM(math+english+chinese) FROM student;
3.avg函数

这个函数就是求平均值的一个函数 这个函数的具体操作就是求出我们规定的某个数据在我们表中的平均值是多少


SELECT AVG(chinese) FROM student;-- 这个就是对数学成绩进行求平均分
要是想求不同数据的平均值我们就直接从avg里面进行修改一下就行
-- 这个是利用我们的求和进行模拟的一个函数 其实我们后期是可以自己写函数的 这样也就是增强我们的查询速度
-- 统计一个班的语文平均分 我们先求出这个班的总成绩 然后除以总和就是我们的平均分的操作处理
SELECT SUM(chinese)/COUNT(*) FROM student;
-- sum函数仅仅对数值有用 不要对数值进行求和处理
4.max min函数

这个就是求出整个表中给某个数据的最大或者最小值的操作



-- 求班级最高分 或者最低分
SELECT MAX(math+english+chinese),MIN(math+english+chinese)
FROM student;
5.字符串函数
1.几个比较常用的字符串函数(红色的使用频率多,需要掌握)

在这里插入图片描述

1.charset()

这个函数返回我们当前选中字段的字符集是什么

-- 
SELECT CHARSET(ename) FROM emp;-- 这个ename是代表我们要查看的字段是什么样的
2.concat()

字符串的拼接,这个也是十分的简单,就是将多个数据进行拼接,和Java里面的字符串拼接很像

-- 格式化查询 

-- 这个是当作一列进行返回的,连接字符串,将多个列放到同一行
SELECT CONCAT(ename,' 的工作是',job) FROM emp; -- 这个插入图片展示 就是我们可以格式化的显示

在这里插入图片描述

3.instr

这里这个函数里面进行传递的参数是说 ,第二个字符串在什么位置第一次出现

SELECT INSTR("yt1105","1") FROM DUAL; -- 这个dual就是一个很小的表 这个表就是我们没表可以用的时候我们就可以用系统给我们的表

这里我们用到了dual这个表,这个表是系统分配给我们的 叫做亚元表 可以作为一个测试表使用

还有就是注意一下 在数据库里面的数组的下标是从1开始的 要注意

4.lcase ucase的转换

也就是大小写的转换操作

-- 转成大写或者是小写
-- low upper 的转换 
SELECT LCASE(ename) FROM emp;
这个可以将我们的数据进行转化小写
5.left

这个函数有两个参数 第一个是你要取的位置,第二个是你要取几个

-- 这个就是从左边取出来一些数据出来 2代表是取出几个
SELECT LEFT(ename,2) FROM emp;

在这里插入图片描述

看图说实话,我们就会取出我们的前两位,也即是从左侧进行取出2位

6.length
-- 这个是按照字节进行返回的 
SELECT LENGTH(ename) FROM emp;  -- 这个是去统计到底是每一个长度是多少这个是返回字节


既然是返回字节数 那么就会和我们的字符集有关,我们的utf8是汉字对应3个字节

7.replace

-- 如果是mannager就替换成经理我们从工作里面找的
SELECT ename,REPLACE (job,'MANAGER','经理') FROM emp;

这个函数会把我们想要替换的数据替换成我们自己想的数据
在这里插入图片描述

看图就是显而易见的了

8.strcmp

这个就是比较两个字符串是不是相同的 如果是就返回0 否则根据前后大小关系 返回正负数


SELECT STRCMP('hh','hh')FROM DUAL;-- 这个就是如果相同就会返回0 不然就会返回其他数据
-- 注意是不是大小写的区分
9.substring

截取字符串的操作处理

-- substring 用来截取字符串的
SELECT SUBSTRING(ename,1,2) FROM emp;-- 这句话是返回ename这个列从第一个位置开始取出2个字符

这个第一个参数代表我要从哪里进行截取,后面是从第几位截取到第几位

10 ltrim,rtrim ,trim(了解)

这个就是去除左边空格 去除右边空格 和去除左右空格的操作


-- 
SELECT LTRIM('    asdsadsda') FROM DUAL;-- 进行图片演示

SELECT RTRIM('sadsads      ') FROM DUAL;-- 进行图片演示

SELECT TRIM('   ada    adsa   ') FROM DUAL;
小练习

显示出员工姓名第一个为转为小写,其余不变

在这里插入图片描述

解析



-- 不断进行套娃就行 以首字母小写的方式显示所有员工emp表的姓名
-- 先取出ename的第一个字符取出,转成小写的,把他后面的字符串取出进行拼接输出
-- substring如果第三个参数什么都不写的话 就会导致我们会默认取到最后
SELECT CONCAT(LCASE(SUBSTRING(ename,1,1)),SUBSTRING(ename,2,LENGTH(ename)))FROM emp;
6.数学函数
1.简介

在这里插入图片描述

1.abs()绝对值函数
-- 演示数学函数
SELECT ABS(-110) FROM DUAL;
2.ceiling

天花板函数的操作

SELECT BIN(10) FROM DUAL;  --  配图片
-- ceiling 天花板 就是向上取整
3.floor 向下取整的操作
SELECT FLOOR(1.2) FROM DUAL;-- 这个dual 是一个亚元表 
4.conv

将你的数据从吗某个进制准换到你想要的进制

SELECT CONV(1221,10,2) FROM DUAL; -- 从10进制准换为2进制
-- 第一个是表明你要将这个数据准化为什么进制
-- 第一个数 是你指定的数据 然后第二数据是你认为这个数据是什么数,然后第三个数据代表你要将这个数据转化为什么数据

在这里插入图片描述

5.format

这个函数是将我们想要处理的小数部分转换为我们向保留几位

-- 截图
SELECT FORMAT(12111.1212121,2) FROM DUAL;-- 你决定保留几位小数 这个系统会四舍五入 这个会科学计数法
6.least
SELECT LEAST(1,2,21,21,1,2121,-121) FROM DUAL;
-- 求一群数据中的最小值
7.mod
SELECT MOD(10,3) FROM DUAL;-- 这个就是 10%3 的操作处理
8.rand()

-- rand 这个是返回一个随机数值
-- 这个数据放进去之后是种子 但是随机数如果是想要固定的话 我们就给一个具体的数据放进去就行 只要是固定的 那么就不会发生改变
SELECT RAND() FROM DUAL;-- 0~1
7.时间相关的函数

在这里插入图片描述

1.查看一些时间
SELECT CURRENT_DATE FROM DUAL; 2022-01-28

SELECT CURRENT_TIME FROM DUAL; 17:18:40

SELECT CURRENT_TIMESTAMP FROM DUAL; 2022-01-281 7:18:40
2.date_add和date_sub和NOW函数的使用

可以放置2个参数进去,第一个参数是代表你要进行处理的参数,第二个参数是要加或者减的时间 单位是时分秒年月日都可以

加上关键字interval

now函数的操作是返回当前的时间 包含年月日时分秒的 now会计算出年月日 时分秒 都会计算出来的

CREATE TABLE mes(
	id INT ,
	content VARCHAR(30),
	send_time DATETIME);
-- 添加一条记录
INSERT INTO mes VALUES(1,'北京新闻',CURRENT_TIMESTAMP);
-- 这个时间函数可以进行的是返回某时某分某秒的操作处理
INSERT INTO mes VALUES(2,'上海新闻',NOW());-- 这个now是返回当前的日期加时间
INSERT INTO mes VALUES(3,'广东新闻',NOW());
SELECT * FROM mes;
-- 1.显示所有的新闻信息,发布日期只显示日期,不用显示时间
SELECT id ,content,DATE(send_time) FROM mes;-- 有种格式话的感觉
-- 请查询在10min中内发布的新闻
SELECT * FROM mes 
	WHERE DATE_ADD(send_time,INTERVAL 10 MINUTE)>=NOW()-- 这个时间加上10min 还是不如滴
	-- 
	SELECT * FROM mes
	WHERE DATE_SUB(NOW(),INTERVAL 10 MINUTE)<=send_time;-- 第一个参数是减数 第二个参数是被减数
3.datediff

这个函数是用来计算我们之间的数据相差的天数是多少


-- 求一下2011 -11 -11和 1990 -1-1他们之间差了多少天
SELECT DATEDIFF('2011-11-11','1990-01-01') FROM DUAL; 
小案例1,-计算你活了多少天

-- 用mysql计算你活了多少天
SELECT DATEDIFF(NOW(),'2003-11-05')/365 FROM DUAL;
小案例2

-- 如果 你能活80岁,求你还能活多少天
-- 1.你要求出 你活到80岁的时候是什么日期
-- 2.然后使用这个datediff求出来和现在进行相减
-- 这个年月日 时分秒都是可以的
-- 这个datediff返回的是相差的时间
SELECT DATEDIFF( DATE_ADD('2003-11-05',INTERVAL 80 YEAR),NOW()) FROM DUAL;
4.timediff

这个是进行时间的差值计算 就是时分秒之间的计算


SELECT TIMEDIFF ('10:11:11','2:02:11');-- 这个是进行时间的差值处理操作
-- 
5.强制类型转换

SELECT YEAR (NOW()) FROM DUAL;

SELECT MONTH(NOW())FROM DUAL;
-- 有种强制类型转换的感觉

这个语句写出来之后 就是只会显示年 或者是月

6.UNIX_TIMESTAMP

这个是会返回一个从1970 -01-01-00-00-00的秒数

-- 这个是返回一个秒数 从1970 到现在的时间 
SELECT UNIX_TIMESTAMP FROM DUAL; -- 1970 1 1  这个是返回我们的时间戳的时间是多少时间 从1970年开始的秒数
7.FROM_UNIXTIME

这个是将秒数加到我们时间戳开始的时间上面 ,然后根据我们用户自行决定我们应该如何进行输出这个格式


SELECT FROM_UNIXTIME(112312313,'%Y-%m-%d %H:%i:%s') FROM DUAL;
-- 这个是可以将一个秒数转成一个指定的格式 这个我上边写的格式 是我们自己写的 在开发中可以存放一个数值或者一个整数
-- 这个格式返回的是年月日
-- 实际开发中 我们会使用int来保存一个Unix的时间戳,然后再使用from_unixtime()进行转换,还是很有实用价值的
8.加密函数和系统函数
1.USER()

这个函数是返回我们的用户名的ip地址

SELECT USER() FROM DUAL; -- 这个可以返回的是用户@ip地址 这里由于是一个人进行登陆的 但是由于我们是一个人进行登陆的 所以说
-- 要是有用户进行远程操控 那么我们就会从远程进行获取到对方的ip地址和用户名了

在这里插入图片描述

2.SELECT DATABASE() FROM DUAL;

显示我们当前所处的是哪个数据库


SELECT DATABASE() FROM DUAL;

在这里插入图片描述

3.加密函数md5
-- md5 对用户密码的加密
-- root 不能存放明文 而是加密后的密码
SELECT MD5('root') FROM DUAL;-- 及时被攻破也是很久以前 其实还是很安全的

在这里插入图片描述

通过这个函数进行加密之后不管你的密码是多长都会被加密成为32位的长度

4.mysql自带加密函数PASSWORD

这个和md5也是因加密而生的,就是加密的算法不一样导致结果不一样

知道就行

SELECT PASSWORD('root') FROM DUAL;-- 这个算法处理得到的结果又是不同于md5的 
9.流程控制函数的使用

在这里插入图片描述

1.任务驱动,要求查询emp表,如果column是null,则显示0.0,

2.如果emp表的job是clerk则显示职员,如果是manager则显示经理,其他正常显示

大家看到这里是不是就感觉到了似乎有一种if else语句的感觉,其实就是这样的 的确是有if else的感觉

只不过在这里变成了 when then 而已

1.if


SELECT IF(TRUE,1,2) FROM DUAL; -- 这个就是说  如果表达式为真 返回第一个否则返回第二个

2.ifnull

SELECT IFNULL(NULL,'hello');-- 如果第一个不为空就返回第一个 否则返回第二个

3.when then 操作

SELECT CASE 
	WHEN TRUE THEN 'jack'
	WHEN TRUE THEN 'tom'
	ELSE 'marry' END;-- 如果返回一个成功就不会继续返回下面的了

实现第二个任务驱动

SELECT ename,(SELECT CASE
		WHEN job='CLERK' THEN '职员'
		WHEN job='MANAGER' THEN '经理'
		WHEN job='SALESMAN' THEN '销售人员'
		ELSE job END) AS 'job'
		FROM emp;		
	-- 这个就是当我们需求需要的时候可以这样操作
	-- 可以理解为select语句后面的,就是我们要显示的,这样就是要表示显示两列,
	-- 第二列经过条件判断进行的操作其实是进行了一个类似于多个并列的if语句
	-- when then

分组统计

小案例1.

首先引入我们的数据表

在这里插入图片描述

浅谈一下 什么是分组统计 ,可以叫做是分组计算,个人理解 就是我们假设在一个部门里面,我们分成了

10 20 30 为编号的3个小组,里面有100多个人 然后这些人隶属于这些小组中 ,也就是说这些人的数量是不同的其实,

我们分配给这三个小组

好啦 我们先看一下我们的任务驱动 来引出我们要学习的知识点

请你显示出 不同小组的最大值和平均值

好,我们先把代码进行展示 然后以代码进行讲解

SELECT AVG(sal),MAX(sal),deptno -- 这个就是按照我们的平均值 最大值 部门进行筛选的操作
FROM emp GROUP BY deptno; -- 按小组的形式进行查询 就是我们是按照小组进行查询的

看第一句话我们,这个select语句后面的意思是我要进行显示哪些数据处理,

第二个是我们从哪个表进行查询,然后 group by 这个关键字是比较重要的 ,就是我们原先是有很多人,但是并不是所有都属于一个小组里面,那么我们分组之后 对每个组进行了平均值和最大值的显示 这就是第二句话的意思

小案例2

好 我们再看一个例子

-- 显示每个部门的每种岗位的平均工资和最低工资 也即是说 我们每个部门的每个岗位的 一个部门的不同岗位里面的人数也是不同的 所以说 我们要进行新的统计处理 
SELECT AVG(sal),MAX(sal),deptno,job
FROM emp GROUP BY deptno,job;

这个说显示显示每个部门的每种岗位的平均工资和最低工资,这个和我们刚刚看到很相似,但是除了多家一个部门,

好 我们想一想,就是 每个部门下面分职工 普通职员,经理,老板,但是所代表的数量又是不同的,普通员工的人数比较高,然后次之,我们要干的事情就是说,每个职位进行平均值和最大值的匹配 就是再这个组 下面再分组,分到适合的位置即可。

在这里插入图片描述

上图我们就能清晰的看出分组到部门的情况

小案例3

任务-- 显示某个部门平局工资小于两千的部门


-- 分析 1.
SELECT AVG(sal) AS avg_sal ,deptno-- 我们采用别名的话 可以使我们的效率更加高效的处理 因为我们已经调用过一次我们的函数 我们如果不采取别名的话,我们
-- 我们肯定会再一次的调用
FROM emp GROUP BY deptno -- 这里规定我们计算的范围是哪里其实是 我们计算的范围是哪里
HAVING avg_sal < 2000;-- 
SELECT * FROM emp;

这个经过上两次的训练,大家肯定就是掌握了,但是有了限制,我们的having就腾空出世,这个是对于我们的小组机进行查看,然后有了限制,我们采用having就可以解决。

总结

我们进行一下这个代码的剖析一下,

select 后面跟着的就是 我们要进行显示的

2.from 就是告诉我们的显示是从哪里进行数据操作(告诉我们分组的情况)

3.having 就是对于查询的限制

大值的匹配 就是再这个组 下面再分组,分到适合的位置即可。

[外链图片转存中…(img-woUJp9aU-1643371820322)]

上图我们就能清晰的看出分组到部门的情况

小案例3

任务-- 显示某个部门平局工资小于两千的部门


-- 分析 1.
SELECT AVG(sal) AS avg_sal ,deptno-- 我们采用别名的话 可以使我们的效率更加高效的处理 因为我们已经调用过一次我们的函数 我们如果不采取别名的话,我们
-- 我们肯定会再一次的调用
FROM emp GROUP BY deptno -- 这里规定我们计算的范围是哪里其实是 我们计算的范围是哪里
HAVING avg_sal < 2000;-- 
SELECT * FROM emp;

这个经过上两次的训练,大家肯定就是掌握了,但是有了限制,我们的having就腾空出世,这个是对于我们的小组机进行查看,然后有了限制,我们采用having就可以解决。

总结

我们进行一下这个代码的剖析一下,

select 后面跟着的就是 我们要进行显示的

2.from 就是告诉我们的显示是从哪里进行数据操作(告诉我们分组的情况)

3.having 就是对于查询的限制

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/SpongeBob_shouse/article/details/122735981
今日推荐