• Java编程学习-MySQL(函数)


    合计/统计函数

    count 函数返回行的总数

    1. Select count(*) | count (列名) from table_name
    2. [WHERE where_definiton]
    1. -- 统计一个班级一共有多少人
    2. SELECT COUNT(*) FROM student;
    3. SELECT COUNT(math) FROM student;
    4. -- 统计数学成绩大于90的学生有多少个
    5. SELECT COUNT(*) FROM student
    6. WHERE math>90;
    7. SELECT COUNT(math) FROM student
    8. WHERE math>90;
    9. -- 统计总分大于260的学生人数有多少个
    10. SELECT COUNT(*) FROM student
    11. WHERE (chinese+english+math)>260;
    12. SELECT COUNT(math) FROM student
    13. WHERE(chinese+english+math)>260;
    14. -- count(*)和count(列)的区别
    15. -- count(*):返回满足条件的记录的行数
    16. -- count(列):统计满足条件的某列有多少个学生,但是会排除null的数据
    17. CREATE TABLE t4(
    18. `name` VARCHAR(20));
    19. INSERT INTO t4 VALUES ('tom');
    20. INSERT INTO t4 VALUES ('marry');
    21. INSERT INTO t4 VALUES (NULL);
    22. INSERT INTO t4 VALUES ('jake');
    23. INSERT INTO t4 VALUES ('lucy');
    24. INSERT INTO t4 VALUES ('smith');
    25. SELECT * FROM t4;
    26. SELECT COUNT(*) FROM t4; -- 6
    27. SELECT COUNT(`name`) FROM t4; -- 5

    Sum 函数返回满足where条件的行数据的和(统计数)

    1. select sum(列名) {,sum(列名)...} from table_name
    2. [WHERE where_sefinition]

    注意事项:

    1)sum函数只对数值起作用;

    2)对多列求和,“,”号不能少。

    1. #sum函数的使用
    2. -- 统计一个班的数学总成绩
    3. SELECT SUM(math) FROM student;
    4. -- 统计一个班级语文、英语、数学各科的总成绩
    5. SELECT SUM(chinese),SUM(english),SUM(math) FROM student;
    6. -- 统计一个班级语文、数学、英语的成绩总和
    7. SELECT SUM(chinese+english+math) FROM student;
    8. -- 统计一个班级语文的平均分
    9. SELECT SUM(chinese)/COUNT(chinese) AS '语文平均成绩' FROM student;

    AVG 函数返回满足where条件的一列的平均值

    1. SELECT avg(列名) {,acg(列名)...} from table_name
    2. [WHERE where_definition]
    1. #AVG函数使用
    2. -- 求一个班级数学平均分
    3. SELECT AVG(math) AS '数学平均分' FROM student;
    4. -- 求一个班级总分平均分
    5. SELECT AVG(总分) AS '总分平均分' FROM student;
    6. SELECT AVG(chinese+english+math) AS '总分平均分' FROM student;

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

    1. #求最大值
    2. select max(列名) from table_name
    3. [WHERE where_definition]
    4. #求最小值
    5. select min(列名) from table_name
    6. [WHERE where_definition]
    1. -- 求班级最高分和最低分
    2. SELECT MAX(总分) AS '总分最高' FROM student;
    3. SELECT MIN(chinese+english+math) AS '总分最低分' FROM student;
    4. --求班级数学最高分和数学最低分
    5. SELECT MAX(math) AS '数学最高分' FROM student;
    6. SELECT MIN(math) AS '数学最低分' FROM student;

    分组统计

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

    1. select column1,column2,column3.. from table_name
    2. group by column;

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

    1. select column1,column2,column3...
    2. from table_name
    3. group by column having ...

    测试代码

    1. #创建部门表
    2. DROP TABLE dept;
    3. CREATE TABLE dept(
    4. deptno MEDIUMINT UNSIGNED NOT NULL DEFAULT 0,
    5. dname VARCHAR(20) NOT NULL DEFAULT " ",
    6. loc VARCHAR(13) NOT NULL DEFAULT " ");
    7. INSERT INTO dept
    8. VALUES(10,'ACCOUNTING','NEW YORK'),
    9. (20,'RESEARCH','DALLAS'),
    10. (30,'SALES','CHICAGO'),
    11. (40,'OPERATIONS','BOSTON');
    12. SELECT * FROM dept;
    13. #创建雇员表
    14. DROP TABLE EMP;
    15. CREATE TABLE emp(
    16. empno MEDIUMINT UNSIGNED NOT NULL DEFAULT 0, -- 编号
    17. ename VARCHAR(20) NOT NULL DEFAULT " ", -- 名字
    18. job VARCHAR(9) NOT NULL DEFAULT " ", -- 工作
    19. mgr MEDIUMINT UNSIGNED, -- 上级编号
    20. hiredate DATE NOT NULL, -- 入职时间
    21. sal DECIMAL(7,2) NOT NULL, -- 薪水
    22. comm DECIMAL(7,2), -- 红利
    23. deptno MEDIUMINT UNSIGNED NOT NULL DEFAULT 0); -- 部门编号
    24. INSERT INTO emp
    25. VALUES (7369,'SMITH','CLERK',7902,'1990-12-17',800.00,NULL,20),
    26. (7499,'ALLEN','SALESMAN',7698,'1991-2-20',1600.00,300.00,30),
    27. (7521,'WARD','SALESMAN',7698,'1991-2-22',1250.00,500.00,30),
    28. (7566,'JONES','MANAGER',7839,'1991-4-2',2975.00,NULL,20),
    29. (7654,'MARTIN','SALESMAN',7698,'1991-9-28',1250.00,1400.00,30),
    30. (7698,'BLAKE','MANAGER',7839,'1991-5-1',1850.00,NULL,30),
    31. (7782,'CLARK','MANAGER',7839,'1991-6-9',2450.00,NULL,10),
    32. (7788,'SCOTT','ANALYST',7566,'1997-4-19',3000.00,NULL,20),
    33. (7839,'KING','PRESIDENT',NULL,'1991-11-17',5000.00,NULL,10),
    34. (7844,'TURNER','SALESMAN',7698,'1991-9-8',1500.00,NULL,30),
    35. (7900,'JAMES','CLERK',7698,'1991-12-3',950.00,NULL,30),
    36. (7902,'FORD','ANALYST',7566,'1991-12-3',3000.00,NULL,20),
    37. (7934,'MILLER','CLERK',7782,'1992-1-23',1300.00,NULL,10);
    38. SELECT * FROM emp;
    39. #创建工资级别表
    40. CREATE TABLE slagrade(
    41. grade MEDIUMINT UNSIGNED NOT NULL DEFAULT 0,
    42. losal DECIMAL(17,2) NOT NULL, -- 该级别的最低工资
    43. hisal DECIMAL(17,2) NOT NULL); -- 该级别的最高工资
    44. INSERT INTO slagrade VALUES (1,700,1200);
    45. INSERT INTO slagrade VALUES (2,1201,1400);
    46. INSERT INTO slagrade VALUES (3,1401,2000);
    47. INSERT INTO slagrade VALUES (4,2001,3000);
    48. INSERT INTO slagrade VALUES (5,3001,9999);
    49. SELECT * FROM slagrade;
    50. #分组统计
    51. -- having 子句用于限制分组显示结果
    52. -- 如何显示每个部门的平均工资和最高工资
    53. -- 分析:1.每个部门员工的平均工资AVG
    54. -- 2.每个部门最高工资MAX
    55. SELECT AVG(sal), MAX(sal),deptno FROM emp -- 查询平均工资、最高工资、和部门编号
    56. GROUP BY deptno; -- 按照部门进行分组
    57. -- 显示每个部门的每个岗位的平均工资和最低工资
    58. -- 分析:1.显示每个部门的平均工资和最低工资
    59. -- 2.每个部门的每个岗位的平均工资和最低工资 -- 再加一个分组的标准(job)
    60. SELECT AVG(sal), MAX(sal), deptno, job FROM emp
    61. GROUP BY deptno, job;
    62. -- 显示平均工资低于2000的部门号和它的平均工资 //别名
    63. -- 分析:1.显示部门号和它的平均工资
    64. -- 2.筛选,保留平均工资低于2000的
    65. SELECT deptno, AVG(sal) FROM emp
    66. GROUP BY deptno HAVING AVG(sal) < 2000;
    67. -- 使用别名
    68. SELECT deptno AS `部门编号`, AVG(sal) AS `平均工资` FROM emp
    69. GROUP BY `部门编号` HAVING `平均工资` < 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,position[,length])从str的position开始【从1开始计算】,取length个字符
    LTRIM(string2)|RTRIM(string2)|TRIM(string2)去除前端空格或者后端空格

    测试代码 

    1. #字符串常用函数的使用
    2. -- CHARSET(str)返回字串字符集
    3. SELECT CHARSET (ename) FROM emp; -- utf8.......
    4. -- concat(String2 [,...])连接字串
    5. SELECT CONCAT (ename,' job is ',job) AS '姓名和工作' FROM emp;
    6. -- instr(string ,substring) 返回substring在string中出现的位置,没有则返回0
    7. SELECT INSTR ('MARTIN','IN') FROM DUAL; -- dual为亚元表(系统表),没有表可用时可以用此表做测试
    8. -- ucase(string2) 转换成大写
    9. SELECT UCASE(ename) FROM emp;
    10. -- lcase(string2) 转换成小写
    11. SELECT LCASE(ename) FROM emp;
    12. -- left(string2,length) 从string2中的左边起取出length个字符
    13. SELECT LEFT(ename,2) FROM emp;
    14. -- right(string2,length) 从string2中的左边起取出length个字符
    15. SELECT RIGHT(ename,2) FROM emp;
    16. -- length(string) string长度[按照字节]
    17. SELECT LENGTH(ename) FROM emp;
    18. -- replace (str ,search_str,replace_str) 在str中用replace_str替换search_str
    19. SELECT REPLACE (job,'MANAGER','经理') FROM emp;
    20. -- strcmp(string1,string2)逐字符比较两个字串大小
    21. SELECT STRCMP('abcd','abcde') FROM DUAL;
    22. -- substring(str,position[,length]) 从str的position开始【从1开始计算】,取length个字符
    23. -- select substring (ename, 1, 2) from emp; -- 报错
    24. -- ltrim (string2) rtrim (string) trim(string) 去除前端空格或者后端空格,去除两端空格
    25. SELECT LTRIM(' lucy ') FROM DUAL;
    26. SELECT RTRIM(' lucy ') FROM DUAL;
    27. SELECT TRIM(' lucy ') FROM DUAL;
    28. -- 以首字母小写的方式输出所有员工emp表中的姓名
    29. -- 分析1:思路先取出ename的第一个字符,转成小写的
    30. -- 然后和后面的字符串进行拼接输出
    31. SELECT CONCAT(
    32. LCASE(LEFT(ename,1)),
    33. RIGHT(ename,LENGTH (ename) -1))
    34. AS new_name FROM emp;
    35. -- select concat(
    36. -- lcase(substring(ename,1,1)),
    37. -- substring (ename,2)) -- substring 函数报错
    38. -- from emp;

    数学函数

    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(numerator,denominator)求余
    RAND([seed])RAND([seed])其范围为0≤v≤1.0

    测试代码

    1. -- ABS(num) 绝对值
    2. SELECT ABS(-12) FROM DUAL;
    3. -- BIN(decimal_number) 十进制转二进制
    4. SELECT BIN(10) FROM DUAL;
    5. -- CEILING(number2) 向上取整,得到比num2大的最小整数
    6. SELECT CEILING(2.3) FROM DUAL;
    7. -- CONV(number2,from_base,to_base) 进制转换
    8. SELECT CONV(15,10,2) FROM DUAL; -- 把15当作10进制转换成2进制
    9. SELECT CONV(110111001,2,10) FROM DUAL; -- 把110111001当作2进制转换成10进制
    10. SELECT CONV('B',16,10) FROM DUAL; -- 把' B '当作十六进制转换成10进制
    11. -- FLOOR(number2) 向下取整,得到比num2小的最大整数
    12. SELECT FLOOR(-12.8) FROM DUAL;
    13. -- FORMAT(number,decimal_places) 保留小数位数
    14. SELECT FORMAT(123456.789123456789,3) FROM DUAL;
    15. SELECT FORMAT(AVG(sal),2) , MAX(sal) , deptno
    16. FROM emp GROUP BY deptno;
    17. -- HEX(DecimalNumber) 转十六进制
    18. SELECT HEX(10) FROM DUAL;
    19. -- LEAST(number,number2[,...] 求最小值
    20. SELECT LEAST(1,2,5,8,6,4,3,-5,17,19) FROM DUAL;
    21. -- MOD(numerator,denominator) 求余
    22. SELECT MOD(10,3) FROM DUAL; -- 10%3 = 1
    23. -- RAND([seed]) 返回一个随机数RAND([seed])其范围为0≤v≤1.0
    24. -- seed 为种子,插入后返回一个随机数,
    25. -- 随机数与种子数绑定不再改变,相同的种子数得到的随机数相同
    26. SELECT RAND(3) FROM DUAL;

    日期函数

    CURRENT_DATE()当前日期
    CURRENT_TIME()当前时间
    CURRENT_TIMESTAMP()当前时间戳

    DATE(datetime)

    返回datetime的日期部分
    DATE_ADD(date2, INTERVAL d_valued_type)

    在date2中加上日期或者时间

    DATE_SUB(date2, INTERVAL d_calued_type)在date2上减去一个时间
    DATEDIFF(date1, date2)两个日期差(结果返回是天数)
    TIMEDIFF(date1, date2)两个时间差(XX小时XX分钟XX秒)
    NOW()当前时间(年月日时分秒)

    YEAR|MONTH|DATE(datetime)

    FROM_UNIXTIME() unix_timestamp();

    年月日
    CURRENT_DATE( )当前日期
    CURRENT_TIME( )当前时间
    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。

    5)在实际开发中,经常使用int来保存一个unix时间戳,然后使用from_unixtime()进行转换。

    1. -- CURRENT_DATE() 当前日期
    2. SELECT CURRENT_DATE FROM DUAL;
    3. -- CURRENT_TIME() 当前时间
    4. SELECT CURRENT_TIME FROM DUAL;
    5. -- CURRENT_TIMESTAMP() 当前时间戳
    6. SELECT CURRENT_TIMESTAMP FROM DUAL;
    7. -- DATE(datetime) 返回datetime的日期部分
    8. SELECT DATE('2021-11-12 19:32:51') FROM DUAL;
    9. -- DATE_ADD(date2, INTERVAL d_valued_type) 在date2中加上日期或者时间
    10. SELECT * FROM mes
    11. WHERE DATE_ADD(sendtime,INTERVAL 10 MINUTE) >=NOW();
    12. -- DATE_SUB(date2, INTERVAL d_calued_type) 在date2上减去一个时间
    13. SELECT * FROM mes
    14. WHERE sendtime >= DATE_SUB(NOW(),INTERVAL 50 MINUTE);
    15. -- DATEDIFF(date1, date2) 两个日期差(结果返回是天数)
    16. SELECT DATEDIFF('2011-11-11','1990-01-01') FROM DUAL; -- 大的日期放在前面
    17. -- TIMEDIFF(date1, date2) 两个时间差(XX小时XX分钟XX秒)
    18. SELECT TIMEDIFF('10:10:10','01:01:01:') FROM DUAL;
    19. -- NOW() 当前时间
    20. SELECT NOW() FROM DUAL;
    21. -- YEAR|MONTH|DATE(datetime) 年月日
    22. SELECT YEAR(NOW()) FROM DUAL;
    23. SELECT MONTH(NOW()) FROM DUAL;
    24. SELECT DAY(NOW()) FROM DUAL;
    25. SELECT HOUR(NOW()) FROM DUAL;
    26. SELECT MINUTE(NOW()) FROM DUAL;
    27. SELECT SECOND(NOW()) FROM DUAL;
    28. --返回1970-1-1到现在的秒数
    29. SELECT UNIX_TIMESTAMP() FROM DUAL;
    30. -- 可以转成一个自1970-1-1 00:00:00过去FROM_UNIXTIME秒数的日期
    31. -- 固定格式年月日:'%Y-%m-%d 时分秒:%H:%i:%s
    32. SELECT FROM_UNIXTIME(1618483484,'%Y-%m-%d') FROM DUAL;
    33. SELECT FROM_UNIXTIME(1618483484,'%Y-%m-%d %H:%i:%s') FROM DUAL;
    34. # 创建测试表
    35. CREATE TABLE mes(
    36. id INT ,
    37. content VARCHAR(30),
    38. sendtime DATETIME);
    39. -- 添加记录
    40. INSERT INTO mes VALUES (1,'新闻联播',CURRENT_TIMESTAMP());
    41. INSERT INTO mes VALUES (2,'上海新闻',NOW());
    42. INSERT INTO mes VALUES (3,'广州新闻',NOW());
    43. -- 显示所有新闻信息,发布日期只显示日期不显示时间
    44. SELECT id,content,DATE(sendtime) FROM mes;
    45. -- 查询10分钟内发布的新闻
    46. SELECT * FROM mes
    47. WHERE DATE_ADD(sendtime,INTERVAL 10 MINUTE) >=NOW();
    48. -- 求出2011-11-11和1990-1-1相差多少天
    49. SELECT DATEDIFF('2011-11-11','1990-01-01') FROM DUAL;
    50. -- 求出生活了多少天
    51. SELECT DATEDIFF(NOW(),'1996-01-20') FROM DUAL;
    52. -- 如果能活100岁,求出剩余天数'1996-01-20'->date、'1996-01-20 11:10:10'->tatetime、timestamp;
    53. SELECT DATEDIFF(DATE_ADD('1996-01-20',INTERVAL 100 YEAR),NOW()) FROM DUAL;
    54. SELECT * FROM mes;

    加密函数和系统函数

    USER()查询用户
    DATABASE()数据库名称
    MD5(str)为运算符算出一个md5 32的字符串,(用户密码)加密

    PASSWORD(str)

    select * from mysql.user  \G

    从原文密码str计算并返回密码字符串,通常用于对mysql数据库的用户密码加密

    测试代码

    1. # 加密函数和系统函数
    2. -- user() 查询用户
    3. SELECT USER() FROM DUAL; -- 用户名@地址
    4. -- database() 当前在使用的数据库名称
    5. SELECT DATABASE() FROM DUAL;
    6. -- MD5(str) 为运算符算出一个md5 32的字符串,(用户密码)加密
    7. -- 在数据库中存放的是加密后的密匙
    8. SELECT MD5('pero') FROM DUAL;
    9. -- 加密后的数据长度为32位置
    10. SELECT LENGTH(MD5('pero')) FROM DUAL;
    11. #创建用户表
    12. CREATE TABLE `users`(
    13. id INT UNSIGNED NOT NULL DEFAULT 0,
    14. `name` VARCHAR(32) NOT NULL DEFAULT ' ',
    15. pwd CHAR(32) NOT NULL DEFAULT ' ');
    16. INSERT INTO users VALUES (1,'pero',MD5('look'));
    17. SELECT * FROM users;
    18. SELECT * FROM users
    19. WHERE `name` = 'pero' AND pwd = 'look'; -- 查出为空表
    20. SELECT * FROM users
    21. WHERE `name` = 'pero' AND pwd = MD5('look'); -- 查出用户
    22. -- password(str) 加密函数 mysql数据库的用户密码就是用password函数加密
    23. SELECT PASSWORD('pero') FROM DUAL;
    24. -- select * from mysql.user \G 从原文密码str计算并返回密码字符串
    25. -- 通常用于对mysql数据库的用户密码加密
    26. -- mysql.user 表示数据库.表
    27. SELECT * FROM mysql.user

    流程控制函数

    IF(expr1,expr2,expr3)如果expr1为ture,则返回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,如果expr3为true,则返回expr4,否则返回expr5

    测试代码

    1. #流程控制语句
    2. -- IF(expr1,expr2,expr3) 如果expr1为ture,则返回expr2否则返回expr3
    3. SELECT IF(TRUE,'北京','上海') FROM DUAL; -- 北京
    4. SELECT IF(FALSE,'北京','上海') FROM DUAL; -- 上海
    5. -- IFNULL(expr1,expr2) 如果expr1不为null,则返回expr1否则返回expr2
    6. SELECT IFNULL(NULL,'pero') FROM DUAL; -- pero
    7. SELECT IFNULL('jake','pero') FROM DUAL; -- jake
    8. -- SELECT CASE WHEN expr1 THEN expr2 WHEN expr3 THEN expr4 ELSE expr5 END;
    9. -- 如果expr1为true,则返回expr2,如果expr3为true,则返回expr4,否则返回expr5
    10. SELECT CASE
    11. WHEN TRUE THEN 'jake'
    12. WHEN FALSE THEN 'lucy'
    13. ELSE 'mary' END;
    14. -- 查询emp表,如果comm是null,则显示0.0;
    15. SELECT IFNULL(comm,0.0) FROM emp;
    16. SELECT IF(comm IS NULL,0.0,comm) FROM emp;
    17. -- 如果emp表的job是clerk则显示职员,如果是manager则显示经理
    18. -- 如果是salesman 则显示销售人员,其他正常显示
    19. SELECT ename , ( SELECT CASE
    20. WHEN job = 'CLERK' THEN '职员'
    21. WHEN job = 'MANAGER' THEN '经理'
    22. WHEN job = 'SALESMAN' THEN '销售人员'
    23. ELSE job END) AS 'job'
    24. FROM emp;
  • 相关阅读:
    文本框粘贴时兼容Unix、Mac换行符的方法源码
    Python-Django 项目模块-使用自定义管理应用-登录(十二)
    DataGrip 2023 年下载、安装教程、亲测可用
    Fedora安装腾讯会议
    数据分析技能点-多元分析和应用
    机器视觉杂
    好用免费的PPT模板
    15 轮转数组
    HTML网页设计结课作业——11张精美网页 html+css+javascript+bootstarp
    超越NumPy和Pandas的Python库
  • 原文地址:https://blog.csdn.net/Ego_Ekko/article/details/127096181