MySQL学习笔记(二)

来源:互联网 发布:新南威尔士预科 知乎 编辑:程序博客网 时间:2024/06/01 22:53

MySQL之模式匹配

由MySQL提供的模式匹配的其它类型是使用扩展正则表达式,当你对这类模式进行匹配测试时,使用REGEXP和NOT REGEXP操作符(或RLIKE和NOT RLIKE,它们是同义词)

扩展正则表达式的一些字符是:

1.'.':匹配任何单个的字符2.字符类"[...]"匹配在方括号内的任何字符,例如,"[abc]"匹配"a","b""c",为了命名字符的范围,使用一个"-","[a-z]"匹配任何字母,而"[0-9]"匹配任何数字3."":匹配零个或多个在它前面的字符,例如,"x"匹配任何数量的"x"字符,"[0-9]"匹配任何数量的数字,而"."匹配任何数量的任何字符

如果REGEXP模式与被测试值的任何地方匹配,模式就匹配(这不同于LIKE模式匹配,只有与整个值匹配,模式才匹配), 为了定位一个模式以便它必须匹配被测试值的开始或结尾,在模式开始处使用“^”或在模式的结尾用“$”,为了说明扩展正则表达式如何工作,下面使用REGEXP重写上面所示的LIKE查询:

mysql> SELECT * FROM pet WHERE name REGEXP '^b';//为了找出以“b”开头的名字,使用“^”匹配名字的开始

如果你想强制使REGEXP比较区分大小写,使用BINARY关键字使其中一个字符串变为二进制字符串,该查询只匹配名称首字母的小写‘b’:

mysql> SELECT * FROM pet WHERE name REGEXP BINARY '^b';
mysql> SELECT * FROM pet WHERE name REGEXP 'fy$';//为了找出以“fy”结尾的名字,使用“$”匹配名字的结尾mysql> SELECT * FROM pet WHERE name REGEXP 'w';//为了找出包含一个“w”的名字,使用以下查询

既然如果一个正则表达式出现在值的任何地方,他就会被模式匹配,就不必在先前的查询中在模式的两侧放置一个通配符以使得它匹配整个值,就像你使用了一个SQL模式那样
为了找出包含正好5个字符的名字,使用“^”和“$”匹配名字的开始和结尾,和5个“.”实例在两者之间:

mysql> SELECT * FROM pet WHERE name REGEXP '^.....$';

你也可以使用“{n}”重复n次操作符,重写前面的查询:

mysql> SELECT * FROM pet WHERE name REGEXP '^.{5}$';

MySQL自定义函数

创建一个无参数的函数:

CREATE FUNCTION f1() RETURNS VARCHAR(30) RETURN VERSION();//创建函数f1()SELECT f1();//调用f1(),输出版本号

创建带有参数的自定义函数:

CREATE FUNCTION f2(num1 SMALLINT UNSIGNED,num2 SMALLINT UNSIGNED) RETURNS FLOAT(10,2) UNSIGNED RETURN (num1+num2)/2;//创建函数f2()DROP FUNCTION f2;//删除函数f2()SELECT f2(10,15);//调用函数f2()

创建具有复合结构函数体(多条执行语句)的函数:

CREATE FUNCTION adduser(username VARCHAR(20))RETURNS INT UNSIGNEDBEGININSERT test(username) VALUES(username);RETURN LAST_INSERT_ID();END;//        //这里先前定义结束符为"//"具体调用:SELECT adduser('Rose');//输出3

推荐参考的博客:

MySQL之自定义函数: http://www.cnblogs.com/zhangminghui/p/4113160.html

MySQL之存储过程

存储过程的介绍:是SQL语句和控制语句的预编译集合,以一个名称存储作为一个单元处理

mysql存储过程的参数用在存储过程的定义,共有三种参数类型,IN,OUT,INOUT:

1.存储过程的参数IN:表示该参数的值必须在调用存储过程时指定
2.存储过程的参数OUT:表示该参数的值可以被存储过程改变,并且可以返回
3.存储过程的参数INOUT:表示该参数的调用时指定,并且可以被改变和返回

创建不带参数的存储过程:

CREATE PROCEDURE sp1() SELECT VERSION();//创建sp1()//存储过程的调用:CALL sp1;CALL sp1();/两种方式的调用均可!!!

带有IN类型参数的参数过程:

CREATE PROCEDURE removeUserById(IN id INT UNSIGNED)BEGINDELETE FROM users WHERE id=id;END//      //注意:  1.要将结束符设置为//  2.IN中的id是需要传递的参数//存储过程的调用:CALL removeUserById(3);//这将会删除所有,所以数据表中的id和参数的id不能一样!!!!//所以修改如下:CREATE PROCEDURE rempveUserById(IN p_id INT UNSIGNED)BEGINDELETE FROM users WHERE id=p_id;END  ////删除存储过程:DELETE PROCEDURE removeUserById;

创建带有IN和OUT类型参数的存储过程:

CREATE PROCEDURE removeUser(IN p_id INT UNSIGNED,OUT user INT)BEGINDELETE FROM users WHERE id=p_id;SELECT count(id) FROM users INTO user;END ////存储过程的调用:CALL removeUser(27,@nums);//传递参数27,@nums接受返回值

创建带有多个OUT类型参数的存储过程:

SELECT ROW_COUNT();//记录被影响的行数(如插入,删除..)CREATE PROCEDURE removeUser(IN p_age INT,OUT deleteUsers INT,OUT userCounts INT)BEGINDELETE FROM users WHERE age=p_age;SELECT ROW_COUNT() INTO deleteUsers;SELECT COUNT(id) FROM users INTO userCounts;END ////存储过程的调用:CALL removeUser(20,@a,@b);//删除年龄为20的字段,@a:获得影响的行数值,@b:获得剩余的id字段数

推荐的参考博客:
1.mysql进阶之存储过程:http://www.cnblogs.com/machao/p/5919028.html
2.mysql存储过程语法及实例:http://blog.csdn.net/wangchao0605/article/details/5935988

MySQL之存储引擎

//存储引擎:1.MyISAM  2.InnoDB3.Memory  4.CSV  5.Archive

各种存储引擎的特点介绍推荐博客:

几个常用存储引擎的特点:http://blog.csdn.net/s1070/article/details/51255107

并发控制的介绍:

当多个连接对记录进行修改时保证数据的一致性和完整性,可以使用锁来控制:

  • 共享锁(读锁):同一时间段内,多个用户可以读取同一个资源,读取过程中数据不会发生人任何变化

  • 排他锁(写锁):在任何时候只能有一个用户写入资源,当进行写锁是会阻塞其他的读锁或者写锁操作

MySQL的锁策略:

---表锁:是一种开销最小的锁策略---行锁:是一种开销最大的锁策略

修改存储引擎的方法:

1.修改MySQL配置文件实现:default-storage-engine=engine2.通过创建数据表实现:CREATE TABLE tb1(  s1 VARCHAR(10))ENGINE=MyISAM;3.修改存储引擎:ALTER TABLE tb1 ENGINE=InnoDB;
0 0