赞
踩
目录
触发器创建:
- create trigger trigger_name
- before|after trigger_event
- on TableName
- for each row
- trigger_stmt;
参数说明:
创建触发器包含多条执行语句:
- delimiter $$
- 此处操作时说在触发器内部要用分号结束操作,为了不和系统分号;冲突就修改用$$
- create trigger
- trigger_name
- before|after trigger_event
- on TableName for each row
- begin
- insert into log_table()...;
- insert into log1_table()....;
- end
- delimiter ;
- 把结束操作符合还修改为原来的分号 ;
- 触发器查看:
- show triggers;
-
- 触发器删除:
- drop trigger trigger_name;
- CREATE PROCEDURE procedure_name([procedure_paramter[,…]])
- [characteristic…] routine_body
参数说明:
示例例子
- delimiter $$
- create procedure procedure_name (参数[可选])
- begin
- select * from temp_table;
- end$$
- delimiter ;
在 MySQL中使用declare声明变量,语法:
- delcare var_name type [default vaule];
- 示例例子
- declare employee_sal int default 1000;
在MySQL中通过关键字set或select ... into...来给变量赋值
set var_name=expr[,...];或者使用select ... into...语句实现赋值,语法如下:
- select field_name into var_name from table_name where conditon ;
- 示例例子
- SELECT 'Hello World' into @x;
存储过程中使用的例子
- delimiter $$
- CREATE PROCEDURE proc1(OUT s int)
- BEGIN
- SELECT COUNT(*) INTO s FROM user;
- END
- $$
- delimiter ;
-
- set @s :=0;//给一个用户变量赋值
- CALL proc1(@s);//执行存储过程
- select @s;//查看结果
内部的变量在其作用域范围内享有更高的优先权,当执行到end时,内部变量消失,此时已经在其作用域外,变量不再可见了,应为在存储过程外再也不能找到这个申明的变量,但是可以通过out参数或者将其值指派给会话变量来保存其值。
- DELIMITER //
- CREATE PROCEDURE proc3()
- begin
- declare x1 varchar(5) default 'outer';
- begin
- declare x1 varchar(5) default 'inner';
- select x1;
- end;
- select x1;
- end;
- //
- DELIMITER ;
查看存储过程:
- show procedure status where db='数据库名' 查看状态信息
- show create procddure procedure_name 查看定义信息
-
- 查看当前数据库中存储过程
- SELECT * FROM mysql.proc WHERE db='数据库名';
- select * from information_schema.routines where routine_schema='数据库名';
调用存储
CALL procedure_name ( [ parameter [ , ... ] ] )
if-then -else语句
- DELIMITER //
- CREATE PROCEDURE proc2(IN parameter int)
- begin
- declare var int;
- set var=parameter+1;
- if var=0 then
- insert into t values(17);
- end if;
- if parameter=0 then
- update t set s1=s1+1;
- else
- update t set s1=s1+2;
- end if;
- end;
- //
- DELIMITER ;
case语句
- DELIMITER //
- CREATE PROCEDURE proc3 (in parameter int)
- begin
- declare var int;
- set var=parameter+1;
- case var
- when 0 then
- insert into t values(17);
- when 1 then
- insert into t values(18);
- else
- insert into t values(19);
- end case;
- end;
- //
- DELIMITER ;
循环语句
while ···· end while语句
- DELIMITER //
- CREATE PROCEDURE proc4()
- begin
- declare var int;
- set var=0;
- while var<6 do
- insert into t values(var);
- set var=var+1;
- end while;
- end;
- //
- DELIMITER ;
repeat···· end repeat:
它在执行操作后检查结果,而while则是执行前进行检查
- DELIMITER //
- CREATE PROCEDURE proc5 ()
- begin
- declare v int;
- set v=0;
- repeat
- insert into t values(v);
- set v=v+1;
- until v>=5
- end repeat;
- end;
- //
- DELIMITER ;
loop ·····end loop:
loop循环不需要初始条件,这点和while 循环相似,同时和repeat循环一样不需要结束条件, leave语句的意义是离开循环。
- DELIMITER //
- CREATE PROCEDURE proc6 ()
- begin
- declare v int;
- set v=0;
- LOOP_LABLE:loop
- insert into t values(v);
- set v=v+1;
- if v >=5 then
- leave LOOP_LABLE;
- end if;
- end loop;
- end;
- //
- DELIMITER ;
ITERATE迭代
ITERATE : 通过引用复合语句的标号,来从新开始复合语句,在MySQL的LOOP,WHILE和REPEAT语句中,当想再次执行循环主体时,可以使用ITERATE语句,即:当不满足条件时,要继续执行的意思
LABLES 标号:标号可以用在begin repeat while或者loop 语句前,语句标号只能在合法的语句前面使用。可以跳出循环,使运行指令达到复合语句的最后一步
- DELIMITER //
- CREATE PROCEDURE proc10 ()
- begin
- declare v int;
- set v=0;
- LOOP_LABLE:loop
- if v=3 then
- set v=v+1;
- ITERATE LOOP_LABLE;
- end if;
- insert into t values(v);
- set v=v+1;
- if v>=5 then
- leave LOOP_LABLE;
- end if;
- end loop;
- end;
- //
- DELIMITER ;
修改存储过程:
alter procedure procedure_name [sql语句]
删除存储过程:
drop procedure procedure_name;
在MySQL中创建函数通过SQL语句CREATE Function来实现,其语法形式如下:
- CREATE FUNCTION function function_name([function_paramter[,…]])
- [returns 数据类型]
- [characteristic…] routine_body
参数说明:
创建函数示例
- DELIMITER $$
- CREATE FUNCTION func_employee_sal (empno INT(11))
- RETURNS DOUBLE(10,2)
- COMMENT'查询某个雇员的工资'
- BEGIN
- RETURN (SELECT sal
- FROM t_employee
- WHERE t_employee.empno=empno);
- END$$
- DELIMITER ;
查看函数:
- show function status查看状态信息
- show create function function_name查看定义信息
调用函数
select function_name ( [ parameter [ , ... ] ] )
修改存储过程:
alter function function_name [sql语句]
删除存储过程:
drop function function_name;
- 查找字符集
- CHARSET(str); //返回字串字符集
-
- 查询长度
- LENGTH (string ); //string长度 按照字节来统计的
- char_length(); //按照字符来统计的
-
- 连接字串
- CONCAT (string2 [,... ]); //连接字串
- concat_ws(',','2021','04'); //是带连字符的字符串连接
-
- 比较字符串
- STRCMP (string1 ,string2 ); //逐字符比较两字串大小,(实际是ascii码值比较)
-
- 查找字符串
- find_in_set('mysql','order,mysql,sql'); //是在集合中查找字符串位置
- field('mysql','oracle','sql server','mysql'); //查找第一个字符串在后面跟随字符串中匹配的位置
- INSTR (string ,substring ) //返回substring首次在string中出现的位置,不存在返回0,这和LOCATE的双参数形式相同,除非参数的顺序被颠倒
- LOCATE (substring , string [,start_position ] ) ;//同INSTR,但可指定开始位置,
- position(str1 in str); //position(substr IN str)是 LOCATE(substr,str)同义词
-
- 截取字符串
- LEFT (string2 ,length ); //从string2中的左边起取length个字符
- right(str,num); //从右边指定位置截取字符串
- SUBSTRING (str , position [,length ]) //从str的position开始,取length个字符, 注:mysql中处理字符串时,默认第一个字符下标为1,即参数position必须大于等于1
- mid(str,num,len); //和substring同义
- TRIM([[BOTH|LEADING|TRAILING] [padding] FROM]string2); //去除指定位置的指定位置空格
- ltrim(str); //去除左边空格
- rtrim(str); //去除右边空格
-
- 填充替换字符串
- insert(str,pos,len,newstr); //指定位置和长度替换
- replace(str,substr,newstr); //用新字符串替换原字符串中子字符串
- LPAD (string ,length ,pad ); //重复用pad加在string开头,直到字串长度为length
- RPAD (string ,length ,pad); //在string后用pad补充,直到长度为length
- REPEAT (string ,count ); //重复count次
- SPACE(count); //生成count个空格
-
- 读取文件
- LOAD_FILE (file_name ); //从文件读取内容
-
- 大小写转换
- UCASE (string2 ); //转换成大写
- upper(s);//转换为大写
- lower(s);//转换为小写
- lcase(s);//转换为小写
- ABS (number2 ); //绝对值
- BIN (decimal_number ); //十进制转二进制
- ceil(x);//向上取整
- CEILING (number2 ); //向上取整
- CONV(number2,from_base,to_base); //进制转换
- FLOOR (number2 ); //向下取整
- FORMAT (number,decimal_places ); //保留小数位数
- HEX (DecimalNumber ); //转十六进制
- 注:HEX()中可传入字符串,则返回其ASC-11码,如HEX('DEF')返回4142143,也可以传入十进制整数,返回其十六进制编码,如HEX(25)返回19
- LEAST (number , number2 [,..]); //求最小值
- MOD (numerator ,denominator ); //求余
- POWER (number ,power ); //求指数
- RAND(); //随机数 ,返回[0,1)之间的小数
- RAND([seed]);//当调用一个整数参数时,RAND()使用该随机数发生器种子值。每次在给定值种子生成,RAND()会产生一个可重复的一系列数字
- SQRT(number2); //开平方
- truncate(x,y); //对x进行小数点后y位的舍取
- ROUND (number [,decimals ]); //四舍五入,decimals为小数位数]
注:ROUND函数返回类型并非均为整数,如:
- (1)默认变为整形值
- mysql> select round(1.23);
- +-------------+
- | round(1.23) |
- +-------------+
- | 1 |
- +-------------+
- 1 row in set (0.00 sec)
-
- mysql> select round(1.56);
- +-------------+
- | round(1.56) |
- +-------------+
- | 2 |
- +-------------+
- 1 row in set (0.00 sec)
-
- 可以设定小数位数,返回浮点型数据
- mysql> select round(1.567,2);
- +----------------+
- | round(1.567,2) |
- +----------------+
- | 1.57 |
- +----------------+
- 1 row in set (0.00 sec)
- SIGN (number2 ) //
- 获取时间
- NOW (); //当前时间 日期+时间
- SYSDATE();//取的是动态的实时时间 日期+时间
- localtime();//日期+时间
- localtimestamp();//日期+时间
- CURRENT_DATE ( ); //当前日期
- curdate(); //当前日期
- CURRENT_TIME ( ); //当前时间
- curtime(); //当前时间
- CURRENT_TIMESTAMP ( ); //当前时间戳
- FROM_UNIXTIME(毫秒值/1000,'%Y-%m-%d %T');//毫秒值转换成日期数据类型
- UNIX_TIMESTAMP(日期);//日期转秒值 若要毫秒需要乘以1000
-
- 计算日期和时间函数:
- ADDTIME (date2 ,time_interval ); //将time_interval加到date2
- DATE (datetime ); //返回datetime的日期部分
- DATEDIFF(date1,date2);//比较两个日期的天数
- DATE_ADD (date2 , INTERVAL d_value d_type ); //在date2中加上日期或时间
- DATE_SUB (date2 , INTERVAL d_value d_type ); //在date2上减去一个时间
- DATE_FORMAT(date,'日期格式');//用于一不同格式显示日期、时间数据
- DAY (date); //返回日期的天
- DAYNAME (date ); //英文星期
- DAYOFWEEK (date ); //星期(1-7) ,1为星期天
- DAYOFMONTH(datetime) //月的第几天
- DAYOFYEAR (date ); //一年中的第几天
- EXTRACT (interval_name FROM date ) //从date中提取日期的指定部分
- FROM_DAYS(天数);//从TO_DAYS的天数中获取日期
- MAKEDATE (year ,day ) //给出年及年中的第几天,生成日期串
- MAKETIME (hour ,minute ,second ) //生成时间串
- MONTHNAME (date ) //英文月份名
- SEC_TO_TIME (seconds ) //秒数转成时间
- STR_TO_DATE (string ,format ) //字串转成时间,以format格式显示
- TO_DAYS(date);//返回从0年(公元1年)至当前日期总天数
- TIMEDIFF (datetime1 ,datetime2 ) //两个时间差
- TIME_TO_SEC (time ) //时间转秒数
- WEEK (date_time [,start_of_week ]) //第几周
- YEAR (datetime ) //年份
- HOUR(datetime) //小时
- LAST_DAY(date) //date的月的最后日期
- MICROSECOND(datetime) //微秒
- MONTH(datetime) //月
- MINUTE(datetime) //分返回符号,正负或0
-
- 时间和时区转换
- DATE_FORMAT (datetime ,FormatCodes ) //使用formatcodes格式显示datetime
- CONVERT_TZ (datetime2 ,fromTZ ,toTZ ); //转换时区
- 登陆后使用 \h可以查看mysql的帮助信息
- \s 获取当前MySQL实例信息
- version():获取版本号信息
- database():数据库名
- user():用户名
- last_insert_id():获取最近插入的id值
- password(str):对密码进行加密
窗口函数不能直接用于WHERE子句,这是因为窗口函数需要在数据分组后进行计算。因此,它们原则上只能在SELECT子句中使用。然而,可以通过使用子查询的方式,先对满足WHERE条件的数据进行筛选,然后再在这些过滤后的数据上应用窗口函数。
在mysql8.0
中有相关的内置函数,而且考虑了各种排名问题:
row_number()
: 同记录不同名,相当于行号,例如3000、2000、2000、1000排名后为1、2、3、4rank()
: 同记录同名,有跳级
,例如3000、2000、2000、1000排名后为1、2、2、4dense_rank()
: 同薪同名,无跳级
,例如3000、2000、2000、1000排名后为1、2、2、3ntile()
: 分桶排名,即首先按桶的个数分出第一二三桶,然后各桶内从1排名,实际不是很常用另外
这三个函数必须要要与其搭档over()
配套使用,over()
中的参数常见的有两个,分别是
partition by
,按某字段切分order by
,与常规order by
用法一致,也区分ASC
(默认)和DESC
,因为排名总得有个依据LEAD()
函数是一个窗口函数,用于获取指定列的下一行值。它的语法如下:
LEAD(expression, offset, default_value) OVER (PARTITION BY partition_expression ORDER BY sort_expression)
expression
:要获取下一行值的列或表达式。offset
:可选参数,表示要获取的下一行相对于当前行的偏移量,默认为 1。default_value
:可选参数,在没有下一行时返回的默认值,默认为 NULL
。PARTITION BY partition_expression
:可选子句,用于将结果集分区并在每个分区内进行计算。如果不指定该子句,则整个结果集被视为一个分区。ORDER BY sort_expression
:可选子句,用于对结果集进行排序。LEAD()
函数在查询结果集中根据指定的排序条件获取下一行值。它可以用于比较相邻行之间的差异、计算行与下一行之间的差值等操作。
- SELECT
- column_name, LEAD(column_name) OVER (ORDER BY column_name) AS next_value
- FROM table_name;
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。