目 录
一、MySQL进阶语句
①----空值(NULL)和无值("")的区别----
- 无值的长度为0,不占用空间的;而NULL值的长度是NULL,是占用空间的。
- IS NULL或者 Is Nor NULL,是用来判断字段是不是为NOLL或者不是NOLL,不能查出是不是无值的。
- 无值的判断使用=’'或者<>"来处理。<>代表不等于。{}
- 在通过count()指定字段统计有多少行数时,如果遇到NULL值会自动忽略掉,遇到无值会加入到记录中进行计算。
②数据库中的正则表达式
匹配 | 模式描述 | 实例 |
---|---|---|
^ | 匹配文本的开始宁符 | '^bd’匹配以 bd开头的字符串 |
$ | 匹配文本的结束字符 | 'qn$'匹配以qn结尾的字符串 |
. | 匹配任何单个字符 | 's.t’匹配任何s和t之间有一个字符的字符串 |
* | 匹配零个或多个在它前面的字符 | 'fo*t’匹配t前面有任意个o |
+ | 匹配前面的字符1次或多次 | 'hom+'匹配以 ho开头,后面至少一个m的字符串 |
字符串 | 匹配包含指定的字符串 | 'clo’匹配含有clo 的字符串 |
p1lp2 | 匹配 p1或p2 | 'bg|fg’匹配bg或者fg |
[ …] | 匹配字符集合中的任意一个字符 | '[abc]匹配a或者b或者c |
[^…] | 匹配不在括号中的任何字符 | '[ ^ab]'匹配不包含a或者b的字符串 |
{n} | 匹配前面的字符串n次 | 'g{2]'匹配含有2个g的字符串 |
{n, m} | 匹配前面的字符串至少n次,至多m次 | 'f{1,3}'匹配f最少1次,最多 3 次 |
语法:SELECT "栏位”FROM "表名”WHERE"栏位”REGEXP{模式};
SELECT * FROM Store_Info WHERE Store_Name REGEXP ‘os’ ;
SELECT * FROM Store_Info WHERE Store_Name REGEXP '^[A-G] ';
SELECT * FROM Store_Info WHERE Store_Name REGEXP ‘HolBo’;
二、存储过程
存储过程是一组为了完成特定功能的SQL语句集合。
存储过程在使用过程中是将常用或者复杂的工作预先使用SQL语句写好并用一个指定的名称存储起来,这个过程经编译和优化后存储在数据库服务器中。当需要使用该存储过程时,只需要调用它即可。存储过程在执行上比传统SQL速度更快、执行效率更高。
存储过程的优点:
1、执行一次后,会将生成的二进制代码驻留缓冲区,提高执行效率
2、SQL语句加上控制语句的集合,灵活性高
3、在服务器端存储,客户端调用时,降低网络负载
4、可多次重复被调用,可随时修改,不影响客户端调用
5、可完成所有的数据库操作,也可控制数据库的信息访问权限
①创建存储过程
DELIMITER $$ #将语句的结束符号从分号;临时改为两个$转$(可以是自定义)
CREATE PROCEDURE Proc() #学创建存储过程,过程名为Proc、不带参数
->BEGIN #过程体以关键字BEGIN开始
->select * from Store_Info; #彩过程体语句
->END $$ #过程体以关键字END 结束
DELIMITER ; #半将语句的结束符号恢复为分号
②调用存储过程
CALL Proc;
③查看存储过程
SHOW CREATE PROCEDURE[数据库.]存储过程名; #查看某个存储过程的具体信息
SHOW CREATE PROCEDURE Proc;
SHOW PROCEDURE STATUS [LIKE '%Proc%']\G
④存储过程的参数
IN 输入参数:表示调用者向过程传入值(传入值可以是字面量或变量)
OUT 输出参数:表示过程向调用者传出值(可以返回多个值)(传出值只能是变量)
INOUT 输入输出参数:既表示调用者向过程传入值,又表示过程向调用者传出值(值只能是变量)
DELIMITER $$
CREATE PROCEDURE Proc1(IN inname CHAR (16))
->BEGIN
->SELECT * FROM Store_Info WHERE Store_Name = inname;
->END $$
DELIMITER ;
CALL Proc1('Boston') ;
⑤删除存储过程
存储过程内容的修改方法是通过删除原有存储过程,之后再以相同的名称创建新的存储过程。
DROP PROCEDURE IF EXISTS Proc;
#仅当存在时删除,如果指定的过程不存在,则产生一个错误
⑥存储过程的控制语句
create table t (id int (10));
insert into t values (10);
(1)条件语句if-then-else :..: end ifDELIMITER $$
CREATEPROCEDURE proc2(IN pro int)
-> begin
-> declare var int;-> set var=pro*2;
-> if var>=10 then
-> update t set id=id+1;
-> else
-> update t set id=id-1;
->end if;
-> end $$
DELIMITER ;
CALL Proc2(6);
(2)循环语句while .... end while
DELIMITER $$
CREATE PROCEDURE proc3()
-> begin
-> declare var int (10);
-> set var=0;
-> while var<6 do
-> insert into t values (var) ;
-> set var=var+1;
-> end while;
-> end $$
DELIMITER ;
CALL Proc3;