变量
全局变量(内置变量):可以在多个会话中去访问他
show variables
select @@变量名
set 变量名=新值
SET @@character_set_client=utf8; 设置数据库编码
set @@character_set_results=utf8;
SELECT @@character_set_client;
会话变量:
只存在于当前客户端与数据库服务器端的一次连接当中
如果连接断开 那么会话变量全部丢失
set @变量=值
select @变量
局部变量:
在存储过程中使用的变量就叫局部变量
只要存储过程执行完毕 局部变量就丢失
DECLARE i INT DEFAULT 1;
set i=10;
定义一个变量,作为一个临时展示的字段
SELECT (@i:=@i+1) AS id,ename,job,sal
FROM emp,(SELECT @i:=0) AS init;
说明: SELECT @i:=0意思
它的意思是为变量@i赋值(如:set @i=0;)
在mysql中用户变量赋值有两种方式 一种是=另一种是:=
其中区别在于使用set赋值时两种方式都可以使用
使用select赋值时只能使用:=
存储过程
概念
存储过程是数据库中的一个对象
存储在服务端 用来封装多条SQL语句且带有逻辑性 可以实现一个功能
由于他在创建时 就已经对SQL进行了编译 所以执行效率高
而且可以重复调用 类似与我们Java中的方法
语法
DELIMITER $$
CREATE
PROCEDURE `数据库名`.`存储过程名`()
BEGIN
END$$
DELIMITER ;
注意:
创建存储过程需要管理员分配权限
补充:
delimiter是mysql定义结束标记的
在mysql客户端中结束标记默认是分号;
如果一次输入的语句较多 并且语句中间有分号
这时需要新指定一个特殊的结束符
delimiter $$ 表示mysql用$$表示mysql语句结束
过程结束后肯定会有一句delimiter
表示恢复成默认的
参数
in:输入参数
out:输出参数
inout:输入输出参数
DELIMITER $$
CREATE PROCEDURE `security`.`test2`(IN num INT,OUT res INT)
BEGIN
SELECT * FROM sys_role WHERE id = num;
SELECT COUNT(*) FROM sys_role INTO res;
END $$
DELIMITER ;
CALL `security`.`test2`(1,@res);
SELECT @res;
调用存储过程 call
语法: CALL `security`.`test2`(1,@res);
查询结果: SELECT @res;
删除存储过程 drop
语法: DROP PROCEDURE test1;
查看存储过程 show
SHOW PROCEDURE STATUS;
SHOW CREATE PROCEDURE 存储过程名;
判断的存储过程 if
DELIMITER $$
CREATE PROCEDURE week_procedure(IN num INT, OUT str VARCHAR(32))
BEGIN
IF num=1 THEN
SET str='星期一';
ELSEIF num=2 THEN
SET str='星期二';
ELSE
SET str='输入有误';
END IF;
END$$
DELIMITER ;
CALL week_procedure(1,@str);
SELECT @str;
循环的存储过程 while do
DELIMITER $$
CREATE
PROCEDURE `security`.`while_procedure`(IN num INT, OUT res INT)
BEGIN
DECLARE i INT DEFAULT 1;
DECLARE `sum` INT DEFAULT 0;
WHILE i<=num DO
SET `sum` = `sum`+i;
SET i = i + 1;
END WHILE;
SET res = `sum`;
END$$
DELIMITER ;
CALL while_procedure(100,@res);
SELECT @res;
其他循环
DELIMITER $
CREATE PROCEDURE proRepeat(OUT outnum INT)
BEGIN
DECLARE i INT DEFAULT 0;
REPEAT
SET i=i+1;
UNTIL i>=5
END REPEAT;
SET outnum=i;
END $
DELIMITER ;
CALL proRepeat(@num);
SELECT @num;
DELIMITER $$
CREATE
PROCEDURE proLoop(OUT outnum INT)
BEGIN
DECLARE i INT DEFAULT 0;
myloop:LOOP
SET i=i+1;
IF i>=5 THEN
LEAVE myloop;
END IF;
END LOOP;
SET outnum=i;
END$$
DELIMITER ;
CALL proLoop(@num);
SELECT @num;
控制循环的两个关键字
leave 相当于java中的break
iterate相当于java中的continue
触发器
概念
触发器:
数据库中的一个对象 相当于JS中的监听器
触发器可以监听 增 删 改 三个动作
比如说我想监听一张表,只要我增删改了这张表中的数据,
我就可以触发这个触发器,去往另外一张表中记录一下日志
语法
DELIMITER $$
CREATE
TRIGGER `数据库名`.`触发器名`
BEFORE/AFTER INSERT/UPDATE/DELETE ON 监听的表名
FOR EACH ROW
BEGIN
END$$
DELIMITER ;
BEFORE 行为发生之前就触发
AFTER 行为发生之后触发
FOR EACH ROW 行级触发,每操作一行就触发
DELIMITER $$
CREATE TRIGGER tigger1
AFTER DELETE ON test
FOR EACH ROW
BEGIN
INSERT INTO logger VALUES(NULL,"你删除了一条数据",NOW());
END$$
DELIMITER ;
DELETE FROM employee_enh WHERE emp_no = 25348;
old new
old.字段 可以获取到被监听的表中的字段的旧值
new.字段 可以获取到被监听表中更新后的字段的新值 比如插入新值或者修改旧值
DELIMITER $$
CREATE
TRIGGER `mydb`.`myTri1`
AFTER INSERT ON `mydb`.`t1`
FOR EACH ROW BEGIN
INSERT INTO t2 VALUES(new.id,new.username,new.age);
END$$
DELIMITER ;
DELIMITER $$
CREATE
TRIGGER `mytestdb`.`MyTri7` AFTER UPDATE
ON `mytestdb`.`t1`
FOR EACH ROW
BEGIN
UPDATE t2 SET id=new.id,username=new.username,age=new.age WHERE id=old.id;
END$$
DELIMITER ;
函数(方法)
函数包含了内置函数和自定义函数
函数调用
SELECT 函数名();
删除函数:
DROP FUNCTION 函数名;
函数和存储过程的区别
1.存储过程没有返回值 函数必须要有返回值
但是存储过程可以用out能实现返回值这个作用
2.存储过程有in out inout这几个参数类型
函数的参数全是用来收实参
自定义函数
自定义函数语法
DELIMITER $$
CREATE
FUNCTION `数据库名`.`函数名`()
RETURNS 返回类型
BEGIN
函数逻辑...
END$$
DELIMITER ;
统计函数(count)
●使用Count语句
count 返回行的总数
SELECT COUNT(*)|COUNT(列名) FROM table_name
[WHERE where_definition]
count(*) 返回满足条件的记录的行数
count(列名) 统计满足条件的某列有多少个 会排除为null情况
SELECT COUNT(*) FROM student;
SELECT COUNT(*) FROM student
WHERE math > 80;
合计函数(sum avg max min)
●使用SUM语句
sum函数返回满足where条件的行的和
一般在数值列
SELECT SUM(列名1), SUM(列名2)... FROM table_name
[WHERE where_definition]
只对数值起作用 其他没有意义
多列求和用,分开
SELECT SUM(math) FROM student;
SELECT SUM(chinese),SUM(english),SUM(math)
FROM student;
SELECT SUM(chinese+english+math) AS total_score
FROM student;
SELECT (SUM(chinese) / COUNT(*)) AS aver_chinese
FROM student;
●使用AVG语句
SELECT AVG(列名1), AVG(列名2)... FROM table_name
[WHERE where_definition]
SELECT AVG(math) FROM student;
●使用MAX/MIN语句
SELECT MAX(列名1), MAX(列名2)... FROM table_name
[WHERE where_definition]
SELECT MIN(math) FROM student;
字符串函数
charset(str) | 返回字串字符集 |
---|
contact(str1, str2 …) | 连接字串 | instr(str, substring) | 返回substring在string中出现的位置 没有返回0 | ucase(str) | 转换成大写 | lcase(str) | 转换成小写 | left(str, length) | 从str中的左边起取length个字符 | length(str) | str长度[按照字节] | replace(str, search_str, replace_str) | 在str中用replace_str替换search_str | strcmp(str1, str2) | 逐字符比较两字串的大小 | substrin(str, position, length) | 从str的position开始[从1开始计算],取length个字符 | ltrim(str) / rtrim(str) /trim(str) | 去除前端 后端 前后两段的空格 |
●返回字串字符集
SELECT CHARSET(ename) FROM emp;
●连接字串
SELECT CONCAT(ename, " job is ", job) FROM emp;
●返回substring在string中出现的位置 没有返回0
SELECT INSTR("helloworld", "world") FROM DUAL;
DUAL 亚元表 系统表 可以作为测试表使用
●转换成大写
SELECT UCASE(ename) FROM emp;
●转换成小写
SELECT LCASE(ename) FROM emp;
●从string中的左边起取length个字符
SELECT LEFT(ename, 2) FROM emp;
●从string中的右边起取length个字符
SELECT RIGHT(ename, 2) FROM emp;
●string长度[按照字节返回]
SELECT LENGTH(ename) FROM emp;
●在str中用replace_str替换search_str
SELECT ename, REPLACE(job, 'MANAGER', '经理') FROM emp;
●逐字符比较两字串的大小
SELECT STRCMP('jack','smith') FROM DUAL;
●从str的position开始[从1开始计算],取length个字符
从enamel列的第1个位置开始取出2个字符
SELECT SUBSTRING(ename,1,2) FROM emp;
●去除左端 右端 左右两端的空格
SELECT TRIM(' jack ') FROM DUAL;
●首字母小写 其他字母大写 显示员工的姓名
获取第一个字符并且将其变小写 获取其他字符 将两个字符串连接
SELECT CONCAT(LCASE(SUBSTRING(ename,1,1)), SUBSTRING(ename,2))
FROM emp
获取第一个字符并将其转小写 用其替换之前的字符
SELECT REPLACE(ename,SUBSTRING(ename,1,1),LCASE(SUBSTRING(ename,1,1)))
FROM emp;
数学函数
abs(num) | 绝对值 |
---|
bin(decimal_num) | 十进制转二进制 | conv(num,from_base,to_base | 进制转换 | hex(DecimalNumber) | 转十六进制 | ceiling(num) | 向上取整 | floor (num) | 向下取整 | format(num,decimal_places) | 保留小数位数(四舍五入) | least (number , number2 [,…]) | 求最小值 | mod(numerator ,denominator ) | 求余 | rand([seed]) | 返回随机数 其范围为 0 ≤ v ≤ 1.0 |
SELECT ABS(-10) FROM DUAL; 10
SELECT BIN(10) FROM DUAL; 1010
SELECT CONV(8, 10, 2) FROM DUAL; 1000
SELECT CONV(16, 16, 10) FROM DUAL; 22
SELECT CEILING(-1.1) FROM DUAL; -1
SELECT FLOOR(-1.1) FROM DUAL; -2
SELECT FORMAT(78.125458,2) FROM DUAL; 78.13
SELECT LEAST(0,1, -10, 4) FROM DUAL;
SELECT MOD(10, 3) FROM DUAL;
SELECT RAND() FROM DUAL;
SELECT CURRENT_TIMESTAMP() FROM DUAL;
日期函数
SELECT CURRENT_DATE() FROM DUAL;
SELECT DATE(NOW()) FROM DUAL;
SELECT CURRENT_TIME() FROM DUAL;
SELECT NOW() FROM DUAL;
SELECT CURRENT_TIMESTAMP() FROM DUAL;
SELECT DATE_ADD(NOW(), INTERVAL 10 MINUTE) FROM DUAL;
SELECT DATE_SUB(NOW(), INTERVAL 10 MINUTE) FROM DUAL;
SELECT TIMESTAMPDIFF(DAY,'2020-12-31 00:00:00','2020-12-22 00:00:00')
SELECT DATEDIFF('2020-12-31 00:00:00','2020-12-22 00:00:00')
FROM DUAL;
SELECT TIMEDIFF('10:11:11', '06:10:10') FROM DUAL;
SELECT DATE(NOW()) FROM DUAL;
SELECT UNIX_TIMESTAMP() FROM DUAL;
SELECT FROM_UNIXTIME(1535621, '%Y-%m-%d %H:%i:%s') FROM DUAL;
SELECT DATE_FORMAT(NOW(),'%Y-%m-%d %H:%i:%s');
加密函数
user() | 查询用户 |
---|
database() | 数据库名称 | md5() | 为字符串算出一个MD5 32位的字符串 (用户密码)加密 | password(str) | 从原文密码str计算并返回密码字符串 通常用于对mysql数据库的用户密码加密 |
SELECT USER() FROM DUAL;
SELECT DATABASE();
SELECT MD5('123456') FROM DUAL;
SELECT LENGTH(MD5('123456')) FROM DUAL;
CREATE TABLE jies_user
(id INT ,
`name` VARCHAR(32) NOT NULL DEFAULT '',
pwd CHAR(32) NOT NULL DEFAULT '');
INSERT INTO jies_user
VALUES(100, 'jies', MD5('123456'));
SELECT * FROM jies_user;
SELECT * FROM jies_user
WHERE `name`='jies' AND pwd = MD5('123456')
SELECT PASSWORD('123456') FROM DUAL;
SELECT * FROM mysql.user
流程控制函数
SELECT IF(TRUE, 'jack', 'tom') FROM DUAL;
jack
SELECT IFNULL( NULL, 'jack') FROM DUAL;
jack
SELECT CASE
WHEN TRUE THEN 'jack'
WHEN FALSE THEN 'tom'
ELSE 'mary' END
jack
SELECT ename,IF(comm IS NULL, 0.0, comm) FROM emp;
SELECT ename,IFNULL(comm, 0.0) FROM emp;
SELECT ename,(SELECT CASE
WHEN job='CLERK' THEN '职员'
WHEN job='MANAGER' THEN '经理'
WHEN job='SALESMAN' THEN '销售人员'
ELSE job END
) AS job
FROM emp;
|