Java学习笔记-零基础学MySQL(二)

发布于:2025-09-04 ⋅ 阅读:(12) ⋅ 点赞:(0)

19.5 数据库 CRUD 语句

19.5.1 Insert 语句

  1. 基本介绍

    在这里插入图片描述

    #练习insert 语句
    -- 创建一张商品表goods (id  int , goods_name varchar(10), price double );
    -- 添加2条记录
    CREATE TABLE `goods` (
    	id INT ,
    	goods_name VARCHAR(10), -- 长度10
    	price DOUBLE NOT NULL DEFAULT 100 );
    -- 添加数据
    INSERT INTO `goods` (id, goods_name, price) VALUES(10, '华为手机', 2000);
    INSERT INTO `goods` (id, goods_name) VALUES(20, '苹果手机');
    SELECT * FROM goods;
    
  2. 注意细节

    1. 插入的数据应与字段的数据类型相同
    2. 数据的长度应在列的规定范围内
    3. 在values中列出的数据位置必须与被加入的列的排列位置相对应
    4. 字符和日期型数据应包含在单引号中
    5. 列可以插入空值[前提是该字段允许为空],insert into table value(null)
    6. insert into tab_name (列名..) values (),(),() 形式添加多条记录
    7. 如果是给表中的所有字段添加数据,可以不写前面的字段名称
    8. 默认值的使用,当不给某个字段值时,如果有默认值就会添加默认值,则会报错,不添加时默认值时默认值为null,若写了not null约束,则不给字段时便会报错
    #说明insert 语句的细节
    -- 1.插入的数据应与字段的数据类型相同。
    --       比如 把 'abc' 添加到 int 类型会错误
    INSERT INTO `goods` (id, goods_name, price) 
    	VALUES('韩顺平', '小米手机', 2000);
    -- 2. 数据的长度应在列的规定范围内,例如:不能将一个长度为80的字符串加入到长度为40的列中。
    INSERT INTO `goods` (id, goods_name, price) 
    	VALUES(40, 'vovo手机vovo手机vovo手机vovo手机vovo手机', 3000);
    -- 3. 在values中列出的数据位置必须与被加入的列的排列位置相对应。
    INSERT INTO `goods` (id, goods_name, price)  -- 不对
    	VALUES('vovo手机',40, 2000);
    -- 4. 字符和日期型数据应包含在单引号中。
    INSERT INTO `goods` (id, goods_name, price) 
    	VALUES(40, vovo手机, 3000); -- 错误的 vovo手机 应该 'vovo手机'
    -- 5. 列可以插入空值[前提是该字段允许为空],insert into table value(null)
    INSERT INTO `goods` (id, goods_name, price) 
    	VALUES(40, 'vovo手机', NULL);
    -- 6. insert into tab_name (列名..)  values (),(),()  形式添加多条记录
    INSERT INTO `goods` (id, goods_name, price) 
    	VALUES(50, '三星手机', 2300),(60, '海尔手机', 1800);
    -- 7. 如果是给表中的所有字段添加数据,可以不写前面的字段名称
    INSERT INTO `goods`   
    	VALUES(70, 'IBM手机', 5000);
    -- 8. 默认值的使用,当不给某个字段值时,如果有默认值就会添加默认值,否则报错
          -- 如果某个列 没有指定 not null ,那么当添加数据时,没有给定值,则会默认给null
          -- 如果我们希望指定某个列的默认值,可以在创建表时指定
    INSERT INTO `goods` (id, goods_name)   
    	VALUES(80, '格力手机');
    
    SELECT * FROM goods;
    

19.5.2 update 语句

  1. 基本介绍

    在这里插入图片描述

    在这里插入图片描述

    -- 演示 update 语句
    -- 要求: 在上面创建的 employee 表中修改表中的纪录
    -- 1. 将所有员工薪水修改为 5000 元。[如果没有带 where 条件,会修改所有的记录,因此要小心]
    UPDATE employee SET salary = 5000
    -- 2. 将姓名为 小妖怪 的员工薪水修改为 3000 元。
    UPDATE employee SET salary = 3000 WHERE user_name = '小妖怪'
    -- 3. 将 老妖怪 的薪水在原有基础上增加 1000 元
    INSERT INTO employee
    VALUES(200, '老妖怪', '1990-11-11', '2000-11-11 10:10:10', '捶背的', 5000, '给大王捶背');
    UPDATE employee SET salary = salary + 1000 WHERE user_name = '老妖怪'
    -- 可以修改多个列的值
    UPDATE employee SET salary = salary + 1000 , job = '出主意的' WHERE user_name = '老妖怪'
    SELECT * FROM employee;
    
  2. 注意细节

在这里插入图片描述

19.5.3 delete 语句

  1. 基本介绍

    在这里插入图片描述

    -- delete 语句演示
    
    --  删除表中名称为’老妖怪’的记录。
    DELETE FROM employee 
    	WHERE user_name = '老妖怪';
    --  删除表中所有记录, 老师提醒,一定要小心
    DELETE FROM employee;
    
    -- Delete语句不能删除某一列的值(可使用update 设为 null 或者 '')
    UPDATE employee SET job = '' WHERE user_name = '老妖怪';
    
    SELECT * FROM employee
    
    -- 要删除这个表
    DROP TABLE employee;
    
  2. 注意细节

    在这里插入图片描述

19.5.4 select 语句

  1. 基本语法

    在这里插入图片描述

  2. 注意事项

    在这里插入图片描述

  3. 练习

    在这里插入图片描述

    -- select 语句【重点 难点】
    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(id,NAME,chinese,english,math) VALUES(1,'韩顺平',89,78,90);
    INSERT INTO student(id,NAME,chinese,english,math) VALUES(2,'张飞',67,98,56);
    INSERT INTO student(id,NAME,chinese,english,math) VALUES(3,'宋江',87,78,77);
    INSERT INTO student(id,NAME,chinese,english,math) VALUES(4,'关羽',88,98,90);
    INSERT INTO student(id,NAME,chinese,english,math) VALUES(5,'赵云',82,84,67);
    INSERT INTO student(id,NAME,chinese,english,math) VALUES(6,'欧阳锋',55,85,45);
    INSERT INTO student(id,NAME,chinese,english,math) VALUES(7,'黄蓉',75,65,30);
    INSERT INTO student(id,NAME,chinese,english,math) VALUES(8,'韩信',45,65,99);
    
    SELECT * FROM student;
    
    -- 查询表中所有学生的信息。
    SELECT * FROM student;
    -- 查询表中所有学生的姓名和对应的英语成绩。
    SELECT `name`,english FROM student;
    -- 过滤表中重复数据 distinct 。
    SELECT DISTINCT english FROM student;
    -- 要查询的记录,每个字段都相同,才会去重
    SELECT DISTINCT `name`, english FROM student;
    
  4. select查询补充

    1. 使用表达式对查询的列进行运算

      在这里插入图片描述

    2. 在 select 语句中可使用 as 语句

      在这里插入图片描述

      举例

      在这里插入图片描述

      -- select 语句的使用
      
      -- 统计每个学生的总分
      SELECT `name`, (chinese+english+math) FROM student;
      -- 在所有学生总分加10分的情况
      SELECT `name`, (chinese + english + math + 10) FROM student;
      -- 使用别名表示学生分数。
      SELECT `name` AS '名字', (chinese + english + math + 10) AS total_score 
      	FROM student;
      
    3. 在 where 子句中经常使用的运算符

      在这里插入图片描述

      举例

      在这里插入图片描述

      -- select 语句
      -- 查询姓名为赵云的学生成绩
      SELECT * FROM student WHERE `name` = '赵云'
      -- 查询英语成绩大于90分的同学
      SELECT * FROM student WHERE english > 90
      -- 查询总分大于200分的所有同学
      
      SELECT * FROM student WHERE (chinese + english + math) > 200
      	
      -- 查询math大于60 并且(and) id大于4的学生成绩
      SELECT * FROM student WHERE math >60 AND id > 4
      -- 查询英语成绩大于语文成绩的同学
      SELECT * FROM student WHERE english > chinese
      -- 查询总分大于200分 并且 数学成绩小于语文成绩,的姓赵的学生.
      -- 赵% 表示 名字以韩开头的就可以
      SELECT * FROM student
      	WHERE (chinese + english + math) > 200 AND 
      		math < chinese AND `name` LIKE '赵%'
      -- 查询英语分数在 80-90之间的同学。
      SELECT * FROM student
      	WHERE english >= 80 AND english <= 90;
      SELECT * FROM student
      	WHERE english BETWEEN 80 AND 90; -- between .. and .. 是 闭区间
      -- 查询数学分数为89,90,91的同学。
      SELECT * FROM student 
      	WHERE math = 89 OR math = 90 OR math = 91;
      SELECT * FROM student 
      	WHERE math IN (89, 90, 91);
      -- 查询所有姓李的学生成绩。
      SELECT * FROM student 
      	WHERE `name` LIKE '韩%'
      
    4. 使用 order by 子句排序查询结果

      在这里插入图片描述

      -- 演示order by使用
      -- 对数学成绩排序后输出【升序】。
      SELECT * FROM student 
      	ORDER BY math;
      -- 对总分按从高到低的顺序输出 [降序] -- 使用别名排序
      SELECT `name` , (chinese + english + math) AS total_score FROM student 
      	ORDER BY total_score DESC;
      -- 对姓韩的学生成绩[总分]排序输出(升序) where + order by
      SELECT `name`, (chinese + english + math) AS total_score FROM student
      	WHERE `name` LIKE '韩%'
      	ORDER BY total_score;
      
    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');
      
      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;
      SELECT * FROM emp;
      
      # 演示group by + having
      GROUP by用于对查询的结果分组统计, (示意图)
      -- having子句用于限制分组显示结果.
      -- ?如何显示每个部门的平均工资和最高工资
      -- 老韩分析: avg(sal) max(sal)
      -- 按照部分来分组查询
      SELECT AVG(sal), MAX(sal) , deptno 
      	FROM  emp GROUP BY deptno; 
      -- 使用数学方法,对小数点进行处理
      SELECT FORMAT(AVG(sal),2), 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
      -- 3. 使用别名进行过滤 
      
      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;	
      

19.6 数据库 - 函数

19.6.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('tom');
    INSERT INTO t15 VALUES('jack');
    INSERT INTO t15 VALUES('mary');
    INSERT INTO t15 VALUES(NULL);
    SELECT * FROM t15;
    SELECT COUNT(*) FROM t15; -- 4
    SELECT COUNT(`name`) FROM t15;-- 3
    
  2. sum 函数

    在这里插入图片描述

    -- 演示sum函数的使用
    -- 统计一个班级数学总成绩?
    SELECT SUM(math) FROM student;
    -- 统计一个班级语文、英语、数学各科的总成绩
    SELECT SUM(math) AS math_total_score,SUM(english),SUM(chinese) 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;
    -- 求一个班级总分平均分
    SELECT AVG(math + english + chinese) FROM student;
    
  4. max/min 函数

    在这里插入图片描述

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

19.6.2 字符串相关函数

  1. 函数

    在这里插入图片描述

  2. 举例

    -- 演示字符串相关函数的使用  , 使用emp表来演示
    -- CHARSET(str)	返回字串字符集
    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; 
    

19.6.3 数学相关函数

  1. 函数

    在这里插入图片描述

  2. 举例

    -- 演示数学相关函数
    
    -- 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;
    -- 下面的含义是 8 是16进制的8, 转成 2进制输出
    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 )	转十六进制
    
    -- 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 CURRENT_TIMESTAMP() FROM DUAL;
    

19.6.4 时间日期相关函数

  1. 函数

    在这里插入图片描述

    在这里插入图片描述

  2. 注意事项

    1. DATE_ADD()DATE_SUB中的interval后面可以是 year,month,minute,second,hour,day
    2. DATEDIFF(date1,date2)得到的是天数,而且是date1-date2的天数,因此可以取负数
    3. DATE(),DATE_ADD(),DATE_SUB,DATEDIFF()这四个函数的参数可以date,datetime或者timestamp
  3. 举例

    在这里插入图片描述

    -- 日期时间相关函数
    
    -- 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()); 
    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;
    -- 请查询在10分钟内发布的新闻, 思路一定要梳理一下.
    SELECT * FROM mes
    	WHERE DATE_ADD(send_time, INTERVAL 10 MINUTE) >= NOW()
    
    SELECT * FROM mes
    	WHERE send_time >= DATE_SUB(NOW(), INTERVAL 10 MINUTE) 
    
    -- 请在mysql 的sql语句中求出 2011-11-11 和 1990-1-1 相差多少天
    SELECT DATEDIFF('2011-11-11', '1990-01-01') FROM DUAL;
    -- 请用mysql 的sql语句求出你活了多少天? [练习] 1986-11-11 出生
    SELECT DATEDIFF(NOW(), '1986-11-11') FROM DUAL;
    -- 如果你能活80岁,求出你还能活多少天.[练习] 1986-11-11 出生
    -- 先求出活80岁 时, 是什么日期 X
    -- 然后在使用 datediff(x, now()); 1986-11-11->datetime
    -- INTERVAL 80 YEAR : YEAR 可以是 年月日,时分秒
    -- '1986-11-11' 可以date,datetime timestamp 
    SELECT DATEDIFF(DATE_ADD('1986-11-11', INTERVAL 80 YEAR), NOW()) FROM DUAL;
    	
    SELECT TIMEDIFF('10:11:11', '06:10:10') FROM DUAL;
    
    -- YEAR|Month|DAY| DATE (datetime )
    SELECT YEAR(NOW()) FROM DUAL;
    SELECT MONTH(NOW()) FROM DUAL;
    SELECT DAY(NOW()) FROM DUAL;
    SELECT MONTH('2013-11-10') FROM DUAL;
    -- unix_timestamp() : 返回的是1970-1-1 到现在的秒数
    SELECT UNIX_TIMESTAMP() FROM DUAL;
    -- FROM_UNIXTIME() : 可以把一个unix_timestamp 秒数[时间戳],转成指定格式的日期
    -- %Y-%m-%d 格式是规定好的,表示年月日
    -- 意义:在开发中,可以存放一个整数,然后表示时间,通过FROM_UNIXTIME转换
    SELECT FROM_UNIXTIME(1618483484, '%Y-%m-%d') FROM DUAL;
    SELECT FROM_UNIXTIME(1618483100, '%Y-%m-%d %H:%i:%s') FROM DUAL;
    

19.6.5 加密和系统函数

  1. 函数

    在这里插入图片描述

  2. 举例

    -- 演示加密函数和系统函数
    
    -- 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 hsp_user
    	(id INT , 
    	`name` VARCHAR(32) NOT NULL DEFAULT '', 
    	pwd CHAR(32) NOT NULL DEFAULT '');
    INSERT INTO hsp_user 
    	VALUES(100, '韩顺平', MD5('hsp'));
    SELECT * FROM hsp_user; -- csdn
    
    SELECT * FROM hsp_user  -- SQL注入问题
    	WHERE `name`='韩顺平' AND pwd = MD5('hsp')  
    
    
    -- PASSWORD(str) -- 加密函数, MySQL数据库的用户密码就是 PASSWORD函数加密
    
    SELECT PASSWORD('hsp') FROM DUAL; -- 数据库的 *81220D972A52D4C51BB1C37518A2613706220DAC
    
    
    -- select * from mysql.user \G 	从原文密码str 计算并返回密码字符串
    -- 通常用于对mysql数据库的用户密码加密
    -- mysql.user 表示 数据库.表 
    SELECT * FROM mysql.user
    

19.6.6 流程控制函数

  1. 函数

    在这里插入图片描述

  2. 举例

    在这里插入图片描述

    # 演示流程控制语句
    
    # 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'  -- jack
    	WHEN FALSE THEN 'tom' 
    	ELSE 'mary' END
    
    -- 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; 
    
    SELECT * FROM emp;
    SELECT * FROM dept;
    SELECT * FROM salgrade;
    

网站公告

今日签到

点亮在社区的每一天
去签到