0
点赞
收藏
分享

微信扫一扫

mysql学习之select语句下的函数

书呆鱼 2022-05-06 阅读 59

系列文章目录

mysql学习之select语句


文章目录


前言


`
.

一、统计函数

1

1. count函数

-- 演示mysql的统计函数的使用
-- 统计一个班级共多少学生
SELECT COUNT(*) FROM student;
-- 统计数学成绩大于90的学生的人数
SELECT COUNT(*) FROM student
	WHERE math > 90;
-- 统计总分大于250的人数有多少?
SELECT COUNT(*) FROM student
	WHERE (math + english + chinese) > 250;
-- count(*) 和 count () 的区别
-- 解释: count(*) :返回满足条件的记录的行数
--        count():统计满足条件的某列有多少个,但会排除为 null(非空的)


CREATE TABLE t15(
	`name` VARCHAR(20));
INSERT INTO t15 VALUES('nana');
INSERT INTO t15 VALUES('jacky');
INSERT INTO t15 VALUES('berlin');
INSERT INTO t15 VALUES(NULL);

SELECT * FROM t15;
SELECT COUNT(`name`) FROM t15;
SELECT COUNT(*) FROM t15;

2.sum函数

-- 演示 sum 函数的使用
-- 统计一个班级数学总成绩?
SELECT SUM(math) FROM student;
-- 统计一个班级语文、英语、数学各科的总成绩
SELECT SUM(math) AS math_total_score,
	SUM(chinese) AS chinese_total_score,
	SUM(english) AS english_total_score FROM student;
-- 统计一个班级语文、英语、数学的成绩总和
SELECT SUM(math + english + chinese) FROM student;
-- 统计一个班级语文成绩平均分
SELECT SUM(chinese)/COUNT(*) FROM student;
SELECT SUM(`name`) FROM student;

3.avg函数

-- 演示avg的使用
-- 练习 
-- 求一个班级数学平均分
SELECT AVG(math) FROM student;

4.min max 函数

-- 演示 max 和 min 的使用
-- 求班级最高分和最低分 (数值范围在统计中特别有用)
SELECT MAX(math + english + chinese),MIN(math + english + chinese)
	FROM student;
	
-- 求班级数学最高分和最低分
SELECT MAX(math) AS math_high,MIN(math) AS math_low
	FROM student;

5.order by + having

-- 演示 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', 'NEWYORK'),
(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),
(7654, '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, '1997-4-19',3000.00,NULL,20),
(7839, 'KING','PRESIDENT',NULL,'1991-11-17',5000.00,NULL,10),
(7844, 'TURNER', 'SALESMAN',7698, '1991-9-8', 1500.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);
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);
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);
SELECT * FROM salgrade;
SELECT * FROM dept;
# 演示group by + having
-- group by 用于查询的结果分组统计
-- having 子句用于限制分组显示结果
-- ?如何显示每个部门的平均工资和最高工资
-- 老韩分析: avg(sal),max(sal),depthno
-- 按照部门来分组查询
SELECT AVG(sal),MAX(sal), deptno 
	FROM emp GROUP BY deptno; 
-- 按部门分组
	
-- ?显示每个部门的每种岗位的平均工资和最低工资
-- 老师分析:1.显示每个部门的平均工资和最低工资
--          2.显示每个部门每种岗位的平均工资和最低工资

SELECT AVG(sal), MIN(sal) , deptno,job
	FROM emp GROUP BY deptno,job;

-- ?显示平均工资低于2000的部门号和他的平均工资//别名
-- 老师分析  [写sql语句的思路是化繁为简,各个击破]
-- 1.显示各个部门的平均工资和部门号
-- 2.1的结果基础上进行过滤,保留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) 返回字串字符集
SELECT * FROM emp;
SELECT CHARSET(ename) FROM emp;
-- CONCAT (string2 [,... ]) 连接字串, 将多个列拼接成一列
SELECT CONCAT(ename, ' 工作是 ', job) FROM emp;
-- INSTR (string ,substring ) 返回 substring 在 string 中出现的位置,没有返回 0
-- dual 亚元表, 系统表 可以作为测试表使用
SELECT INSTR('hanshunping', 'ping') FROM DUAL;
-- UCASE (string2 ) 转换成大写
SELECT UCASE(ename) FROM emp;
-- LCASE (string2 ) 转换成小写
SELECT LCASE(ename) FROM emp;
-- LEFT (string2 ,length )从 string2 中的左边起取 length 个字符
-- RIGHT (string2 ,length ) 从 string2 中的右边起取 length 个字符
SELECT LEFT(ename, 2) FROM emp;
-- LENGTH (string )string 长度[按照字节]
SELECT LENGTH(ename) 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;
-- SUBSTRING (str , position [,length ])截取字串
-- 从 str 的 position 开始【从 1 开始计算】,取 length 个字符
-- 从 ename 列的第一个位置开始取出 2 个字符
SELECT SUBSTRING(ename, 1, 2) FROM emp;
-- LTRIM (string2 ) RTRIM (string2 ) TRIM(string)
-- 去除前端空格或后端空格
SELECT LTRIM(' 韩顺平教育') FROM DUAL;
SELECT RTRIM('韩顺平教育 ') FROM DUAL;
SELECT TRIM(' 韩顺平教育 ') FROM DUAL;
-- 练习: 以首字母小写的方式显示所有员工 emp 表的姓名
-- 方法 1
-- 思路先取出 ename 的第一个字符,转成小写的
-- 把他和后面的字符串进行拼接输出即可
SELECT CONCAT(LCASE(SUBSTRING(ename,1,1)), SUBSTRING(ename,2))AS new_name
FROM emp;
SELECT CONCAT(LCASE(LEFT(ename,1)), SUBSTRING(ename,2)) AS new_name
FROM emp;

三、数学函数

-- 演示数学相关函数
-- ABS(num) 绝对值
SELECT ABS(-10) FROM DUAL;
-- BIN (decimal_number )十进制转二进制
SELECT BIN(10) FROM DUAL;
-- CEILING (number2 ) 向上取整, 得到比 num2 大的最小整数
SELECT CEILING(-1.1) FROM DUAL;
-- CONV(number2,from_base,to_base) 进制转换
-- 下面的含义是 8 是十进制的 8, 转成 2 进制输出
SELECT CONV(8, 10, 2) FROM DUAL;
-- 下面的含义是 1616 进制的 16, 转成 10 进制输出
SELECT CONV(16, 16, 10) FROM DUAL;
-- FLOOR (number2 ) 向下取整,得到比 num2 小的最大整数
SELECT FLOOR(-1.1) FROM DUAL;
-- FORMAT (number,decimal_places ) 保留小数位数(四舍五入)
SELECT FORMAT(78.125458,2) FROM DUAL;
-- HEX (DecimalNumber ) 转十六进制
SELECT HEX(1.2)FROM DUAL;
-- LEAST (number , number2 [,..]) 求最小值
SELECT LEAST(0,1, -10, 4) FROM DUAL;
-- MOD (numerator ,denominator ) 求余
SELECT MOD(10, 3) FROM DUAL;
-- RAND([seed]) RAND([seed]) 返回随机数 其范围为 0 ≤ v ≤ 1.0
-- 老韩说明
-- 1. 如果使用 rand() 每次返回不同的随机数 ,在 0 ≤ v ≤ 1.0
-- 2. 如果使用 rand(seed) 返回随机数, 范围 0 ≤ v ≤ 1.0, 如果 seed 不变,
-- 该随机数也不变了
SELECT RAND() FROM DUAL;
SELECT RAND(3) FROM DUAL;-- 随机的但是每次不变
SELECT CURRENT_TIMESTAMP() FROM DUAL;

四、日期函数

datediff ,date1写大的
SELECT DATEDIFF(NOW(), ‘1986-11-11’) FROM DUAL;

-- 演示加密函数和系统函数
-- USER() 查询用户
-- 可以查看登录到 mysql 的有哪些用户,以及登录的 IP
SELECT USER() FROM DUAL;-- 用户@Ip地址
--  database() 查询当前使用数据库的名称
SELECT DATABASE();
-- MD5(str) 为字符串算出一个 MD5 32 的字符串,常用(用户密码)加密
-- root 密码是 hsp -> 加密 md5 -> 在数据库中存放的是加密后的密码
SELECT MD5('hsp') FROM DUAL;
SELECT LENGTH(MD5('hsp')) FROM DUAL;

-- 演示用户表,存放密码时,是 md5
CREATE TABLE sjn_users
	(id INT,
	`name` VARCHAR(32) NOT  NULL DEFAULT '',
	pwd CHAR(32) NOT NULL DEFAULT '');
INSERT INTO sjn_users VALUES(100,'孙泡面',MD5('sjn'));
SELECT * FROM sjn_users;-- csdn

SELECT * FROM sjn_users-- sql注入问题
	WHERE `name` = '孙泡面' AND pwd = MD5('sjn')

-- password(str) -- 加密函数,mysql数据库的用户密码就是password函数加密。MySQL8.0.11删除了这个功能
SELECT PASSWORD('sjn') FROM DUAL;

六、流程控制函数

# 演示流程控制语句
# IF(expr1,expr2,expr3) 如果 expr1 为 True ,则返回 expr2 否则返回 expr3
SELECT IF(TRUE,'北京','上海') FROM DUAL;
# IFNULL(expr1,expr2) 如果 expr1 不为空 NULL,则返回 expr1,否则返回 expr2
SELECT IFNULL('jacky','泡面');
# SELECT CASE WHEN expr1 THEN expr2 WHEN expr3 THEN expr4 ELSE expr5 END; [类似多重分支.]
# 如果 expr1 为 TRUE,则返回 expr2,如果 expr2 为 true, 返回 expr4, 否则返回 expr5  类似if ifelse else
SELECT CASE 
	WHEN TRUE THEN 'jacky'   -- jacky 
	WHEN FALSE THEN 'berlin' 
	ELSE 'nana' END
	
-- 1. 查询 emp 表, 如果 comm 是 null , 则显示 0.0
-- 老师说明,判断是否为 null 要使用 is null, 判断不为空 使用 is not
SELECT * 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 '职员'   -- jacky 
	WHEN job = 'MANAGER' THEN '经理'
	WHEN job ='SALESMAN' THEN '销售人员' 
	ELSE job END) 
	FROM emp;

总结

举报

相关推荐

0 条评论