1. 数学相关函数 762
rand()返回一个随机浮点值v,范围在0到1之间(即其范围为0≤v≤1.0)。若已指定一个整数参数N.则它被用作种子值,用来产生重复序列。
1.1 练习
代码在E:\java学习\初级\course156\db_
math
#演示数学相关函数 762
-- ABS(num) 绝对值
SELECT ABS(-10) FROM DUAL;#10
-- BIN (decimal_ number ) 十进制转二进制
SELECT BIN(10)FROM DUAL
-- CEILING (number2 ) 向上取整,得到比num2大的最小整数
SELECT CEILING(1.1)FROM DUAL#2
SELECT CEILING(-1.1)FROM DUAL#-1
-- CONV(number2,from_ base,to_ base) 进制转换
#解释将8是个十进制转为二进制
SELECT CONV(8,10,2)FROM DUAL
-- FLOOR (number2 ) 向下取整,得到比num2小的最大整数
SELECT FLOOR(1.1)FROM DUAL#1
SELECT FLOOR(-1.1)FROM DUAL#-2
-- FORMAT (number,decimal places ) 保留 小数位数(四舍五入)
SELECT FORMAT(78.123458,2)FROM DUAL#保留两位小数78.12
SELECT FORMAT(78.125458,2)FROM DUAL#保留两位小数78.13
-- HEX (DecimalNumber ) 转十六进制
SELECT HEX(12)FROM DUAL
-- LEAST (number , number2 [..]) 求最小值
SELECT LEAST(0,1,-10,4)FROM DUAL
-- MOD (numerator ,denominator ) 求余
SELECT MOD(10,3)FROM DUAL#就是10%3=1
-- RAND([seed]) RAND([seed])返回随机数其范围为0<= v <=1.0
SELECT RAND() FROM DUAL
-- 如果使用 rand(seed) 返回随机数, 范围 0 ≤ v ≤ 1.0, 如果 seed 不变,
-- 该随机数也不变了
SELECT RAND(3) FROM DUAL#提示如果给了一个种子seed 3,这个随机数就不会变化
2. 时间日期相关函数 763
2.1 练习1 763
-- CURRENT_ DATE ( ) 当前日期
-- CURRENT_ _TIME ( ) 当前时间
-- CURRENT TIMESTAMP ( ) 当前时间戳
代码在E:\java学习\初级\course156\db_
date
#演示时间日期相关函数 763
-- CURRENT_ DATE ( ) 当前日期
SELECT CURRENT_DATE() FROM DUAL
-- CURRENT_ _TIME ( ) 当前时间
SELECT CURRENT_TIME() FROM DUAL
-- CURRENT TIMESTAMP ( ) 当前时间戳
SELECT CURRENT_TIMESTAMP() FROM DUAL
2.2 练习2 764
显示所有留言信息,发布日期只显示日期,不用显示时间。
请查前在10分钟内发布的帖子
请在mysql的sql语句中求出2011-11-11和1990-1-1相差多少天
请用mysql的sql语句求出你活了多少天? [练习]
如果你能活80岁,求出你还能活多少天[练习]比如 1986-11-11出生
代码在E:\java学习\初级\course156\db_
date
-- 创建测试表 信息表
CREATE TABLE mes(
id INT ,
content VARCHAR(30),
send_time DATETIME);
-- 添加一条记录
INSERT INTO mes
VALUES(1,'北京新闻',CURRENT_TIMESTAMP())
INSERT INTO mes
VALUES(2,'上海新闻',NOW())
INSERT INTO mes
VALUES(3,'广州新闻',NOW())
SELECT *FROM mes
SELECT NOW() FROM DUAL
-- 显示所有留言信息,发布日期只显示日期,不用显示时间。
SELECT id,content,DATE(send_time)
FROM mes;
-- 请查前在40分钟内发布的帖子
#解释send_time为新闻发布时间,40 MINUTE是相差40分钟,NOW()是现在的时间,
#将 新闻发布的时间+40分钟 得到的时间 大于 现在的时间,就是 在新闻发布40分钟内 符合条件
SELECT * FROM mes
WHERE DATE_ADD(send_time,INTERVAL 40 MINUTE) >= NOW()
#写法二
#将 现在的时间-40分钟 得到的时间 小于 新闻发布的时间,就是 在新闻发布40分钟内 符合条件
SELECT * FROM mes
WHERE DATE_SUB(NOW(),INTERVAL 40 MINUTE) <= send_time
-- 请在mysql的sql语句中求出2011-11-11和1990-1-1相差多少天 764
SELECT DATEDIFF('2011-11-11','1990-01-01')FROM DUAL
-- 请用mysql的sql语句求出你活了多少天? [练习]
SELECT DATEDIFF(NOW(),'2001-02-22') FROM DUAL
-- 如果你能活80岁,求出你还能活多少天[练习]比如 1986-11-11出生
-- 先求出活 80 岁 时, 是什么日期 X
-- 然后在使用 datediff(x, now());
-- INTERVAL 80 YEAR : YEAR 可以是 年月日,时分秒
-- '1986-11-11' 可以 date,datetime timestamp 1986-11-11->datetime
SELECT DATEDIFF(DATE_ADD('1986-11-11',INTERVAL 80 YEAR),NOW())
FROM DUAL
2.2.1使用细节 764
DATE ADD()中的interval 后面可以是year minute second day等
DATE SUB()中的interval 后面可以是year minute second hour day等
DATEDIFF(date1,date2)得到的是天数,而且是date1-date2 的天数,因此可以取负数
这四个函数的日期类型可以是date, datetime或者timestamp
2.3 练习3 765
-- TIMEDIFF(date1,date2) 两个时间差(多少小时多少分钟多少秒)
-- NOW() 当前时间
-- YEAR|Month|DAY|DATE (datetime ) 年月日
-- UNIX_TIMESTAMP():返回的是1970-1-1到现在的秒数
-- FROM_ UNIXTIME():可以把UNIX_TIMESTAMP()的秒数,转成指定格式的日期
-- %Y-%m-%d 格式是规定好的,表示年月日
在实际开发中,我们也经常使用int来保存一个unix时间戳,然后使用from unixtime() 进行转换,还是非常有实用价值的
代码在E:\java学习\初级\course156\db_
date
-- TIMEDIFF(date1,date2) 两个时间差(多少小时多少分钟多少秒) 765
SELECT TIMEDIFF('10:11:11','06:11:11')FROM DUAL
-- NOW() 当前时间
SELECT NOW() FROM DUAL
-- YEAR|Month|DAY|DATE (datetime ) 年月日
SELECT YEAR(NOW()) FROM DUAL#取出年
SELECT MONTH(NOW()) FROM DUAL#取出月
SELECT DAY(NOW()) FROM DUAL#取出日
SELECT DATE(NOW()) FROM DUAL#取出日期
-- UNIX_TIMESTAMP():返回的是1970-1-1到现在的秒数
SELECT UNIX_TIMESTAMP()FROM DUAL
-- FROM_ UNIXTIME():可以把UNIX_TIMESTAMP()的秒数,转成指定格式的日期
-- %Y-%m-%d 格式是规定好的,表示年月日
-- 意义:在开发中,可以存放一个整数,然后表示时间,通过 FROM_UNIXTIME 转换
SELECT FROM_UNIXTIME(1671957893,'%Y-%m-%d')FROM DUAL
SELECT FROM_UNIXTIME(1671957893,'%Y-%m-%d %H:%i:%s')FROM DUAL
3. 加密和系统函数 766
3.1 基本使用
演示用户表,存放密码时,是MD5
代码在E:\java学习\初级\course156\db_
pwd
#演示加密和系统函数 766
-- USER() 查询用户
-- 可以查看登录到 mysql 的有哪些用户,以及登录的 IP
SELECT USER() FROM DUAL -- 得到用户@IP地址
-- DATABASE() 查询数据库名称
SELECT DATABASE()FROM DUAL;
-- MD5(str) 为字符串算出一个MD5 32的字符串,(用户密码)加密
SELECT MD5('lzl')FROM DUAL
SELECT LENGTH(MD5('lzl'))FROM DUAL#MD5加密后都是32位的
-- 演示用户表,存放密码时,是MD5
CREATE TABLE hsp_user
(id INT ,
`name` VARCHAR(32) NOT NULL DEFAULT '',
pwd CHAR(32) NOT NULL DEFAULT '');
INSERT INTO hsp_user
VALUES(100,'中国',MD5('lzl'))
SELECT * FROM hsp_user
SELECT * FROM hsp_user
WHERE `name`='中国' AND pwd = MD5('lzl')
-- PASSWORD(str) 加密函数 MySQL 数据库的用户密码就是 PASSWORD 函数加密
SELECT PASSWORD('lzl') FROM DUAL
-- select * from mysql.user \G 从原文密码str计算并返回密码字符串,通常用于对mysql数据库的用户密码加密
SELECT * FROM mysql.user
4. 流程控制函数 767
4.1 演示
代码在E:\java学习\初级\course157\db_
control
#演示流程控制函数 767
# 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 IFNULL('jack','中国')FROM DUAL #jack
# SELECT CASE WHEN expr1 THEN expr2 WHEN expr3 THEN expr4 ELSE expr5 END; [类似多重分支.]
# 如果 expr1 为 TRUE,则返回 expr2,如果 expr3 为 t, 返回 expr4, 否则返回 expr5
SELECT CASE
WHEN TRUE THEN 'jack'
WHEN FALSE THEN 'tom'
ELSE 'mary' END #返回jack
4.2 案例应用 767
1. 查询emp 表如果comm是null ,则显示0.0
2.如果emp表的job是CLERK则显示职员,如果是MANAGER则显示经理如果是SALESMAN则显示销售人员,其它正常显示.
代码在E:\java学习\初级\course157\db_
control
#演示流程控制函数 767
# 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 IFNULL('jack','中国')FROM DUAL #jack
# SELECT CASE WHEN expr1 THEN expr2 WHEN expr3 THEN expr4 ELSE expr5 END; [类似多重分支.]
# 如果 expr1 为 TRUE,则返回 expr2,如果 expr3 为 t, 返回 expr4, 否则返回 expr5
SELECT CASE
WHEN TRUE THEN 'jack'
WHEN FALSE THEN 'tom'
ELSE 'mary' END #返回jack
-- 1. 查询emp 表如果comm是null ,则显示0.0
-- 说明,判断是否为 null 要使用 is null, 判断不为空 使用 is not
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 '职员'
WHEN job='MANAGER' THEN '经理'
WHEN job='SALESMAN' THEN '销售人员'
ELSE job END) AS 'job'
FROM emp;