一、正则表达式
匹配文本中特殊的串
select prod_name from products where prod_name REGEXP '.000' ORDER BY prod_name; # 与文字正文1000匹配的一个正则表达式 # REGEXP 后面跟的东西作为正则表达式
匹配出2000,和1000 匹配任意一个字符
REGEXP 前面加上 BINARY 可以区分大小写
select prod_name from products where prod_name REGEXP '[[:digit:]]{4}' # 从来匹配任意四个数字 order by prod_name;
|
| |
或 |
|
[] |
匹配中括号中的某个元素 [0-9][a-z] |
|
\\ |
为了匹配特殊字符 前面需要加上\\ 进行转译 |
| * | 0 个或多个匹配 |
| + | 1个或多个匹配(等于{1,} |
| ? | 0 个或1个匹配 (等于{0,1}) |
| {n} | 指定书目的匹配 |
| {n,} | 不少于指定书目的匹配 |
| {n,m} | 匹配书目的范围(m不超过255) |
| ^ | 文本的开始 |
| $ | 文本的结尾 |
| [[:<:]] | 词的开始 |
| [[:>:]] | 词的结尾 |
| \\f | 换页 |
| \\n | 换行 |
| \\r | 回车 |
| \\t | 制表 |
| \\v | 纵向制表 |
| 字符类 | |
| [:alnum:] | 任意字母和数字 同[a-zA-Z0-9] |
| [:alpha:] | 任意字符 同[a-zA-Z] |
| [:blank:] | 空格和制表 同[\\t] |
| [:cntrl:] | ASCII 控制字符 (ASCII 0到31和127) |
| [:digit:] | 任意数字 同[0-9] |
| [:graph:] | 与[:print:]相同,但不包括空格 |
| [:lower:] | 任意小写字母 同[a-z] |
| [:print:] | 任意可打印字符 |
|
[:punct:] |
既不在[:alnum:]又不在[:cntrl:]中的任意字符 |
| [:space:] | 包括空格在内的任意空白字符 同[\\f\\n\\r\\t\\v] |
| [:upper:] | 任意大写字母 同[A-Z] |
| [:xdigit:] | 任意十六进制数字 同[a-fA-F0-9] |
二、函数
1. 文本处理函数
| left() | 返回串左边的字符 |
| length() | 返回串的长度 |
| locate() | 返回串的一个子串 |
| lower() | 将串转换为小写 |
| ltrim() | 去掉串左边的空格 |
| right() | 返回串右边的字符 |
| rtrim() | 去掉串右边的空格 |
| soundex() | 返回串的soundex值 |
| substring() | 返回子串的字符 |
| upper() | 将串转换为大写 |
2. 日期函数
| AddDate() |
增加一个日期(天、周等) |
AddTime() |
增加一个时间(时、分等) |
CurDate() |
返回当前日期 |
CurTime() |
返回当前时间 |
Date() |
返回日期时间的日期部分 |
DateDiff() |
计算两个日期之差 |
Date_Add() |
高度灵活的日期运算函数 |
Date_Format() |
返回一个格式化的日期或时间串 |
Day() |
返回一个日期的天数部分 |
DayOfWeek() |
对于一个日期,返回对应的星期几 |
Hour() |
返回一个时间的小时部分 |
Minute() |
返回一个时间的分钟部分 |
Month() |
返回一个日期的月份部分 |
Now() |
返回当前日期和时间 |
Second() |
返回一个时间的秒部分 |
Time() |
返回一个日期时间的时间部分 |
Year() |
返回一个日期的年份部分 |
3. 数据处理函数
| Abs() | 返回一个数的绝对值 |
| cos() | 返回一个角度的余弦 |
| exp() | 返回一个数的指数值 |
| mod() | 返回除操作的余数 |
| pi() | 返回圆周率 |
| rand() | 返回一个随机数 |
| sin() | 返回一个角度的正弦 |
| sqrt() | 返回一个数的平方根 |
| tan() | 返回一个角度的正切 |
4.聚集函数 aggregation function
| AVG() | 返回某列的平均值 |
| COUNT() | 返回某列的行数 |
| MAX() | 返回某列的最大值 |
| MIN() | 返回某列的最小值 |
| SUM() | 返回某列值之和 |
三、子句顺序
select - from - where - group by- having- order by- limit
四、全文本搜索
在创建表时启用全文本搜索,在添加表约束的位置加一条,fulltext(列)
最好先创建表,导入数据后,再修改表,定义fulltext
传递给Match()的值必须与 FULLTEXT()定义中的相同。如果指定多个列,则必须列出它 们(而且次序正确)。
除非使用BINARY方式, 否则全文本搜索不区分大小写。
(使用全文本搜索)返回以文本匹配的良好程度排序的数据
select note_text FROM productnotes WHERE match(note_text) against ('anvils')
查询扩展
用来设法放宽所返回的全文本搜索结果的范围
select note_text FROM productnotes WHERE match(note_text) against ('anvils' with query expansion)
表中的行越多(这些行中的文本就越多),使用 查询扩展返回的结果越好。
布尔文本搜索 boolean mode
即使没有fulltext 索引也可以使用
select note_text FROM productnotes WHERE match(note_text) against ('heavy' in boolean mode);
select note_text FROM productnotes WHERE match(note_text) against ('heavy -rope*' in boolean mode); # 指包含heavy 但不包含任意以rope开始的词的行
布尔操作符 : P129 (书上页码)
| + | 包含,词必须存在 |
| - | 排除,词必须不出现 |
| < | 包含,而且增加等级值 |
| > | 包含, 且减少等级值 |
| () | 把词组成子表达式(允许这些子表达式作为一个组被包含、排除、排列等) |
| ~ | 取消一个词的排序值 |
| * | 词尾的通配符 |
| "" | 定义一个短语(与单个词的列表不一样,它匹配整个短语以便包含或排除这个短语) |
五、创建游标
创建一个新的表并填入数据(基于现存表数据的修改)
delimiter $ create procedure processorders() begin -- declare local variables DECLARE done BOOLEAN DEFAULT 0; # 做为循环的条件 DECLARE o INT; DECLARE t DECIMAL(8,2); -- declare the cursor DECLARE ordernumbers CURSOR FOR SELECT order_num FROM orders; -- declare continue handler DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1; -- 与前面的相呼应 -- create a table to store the results CREATE TABLE if not EXISTS ordertotals( order_num INT, total DECIMAL(8,2)); -- open the cursor open ordernumbers; -- loop through all rows REPEAT FETCH ordernumbers INTO o; -- 存入数据 CALL ordertotal(o,1,t); -- 调用过程 INSERT INTO ordertotals(order_num,total) values(o,t); -- 插入上面建的表 UNTIL done END repeat; -- 结束循环 CLOSE ordernumbers; -- 关闭游标 END $
六、触发器
触发器只支持 delete insert update
只有表才支持触发器, 视图不支持
触发器不能更新或覆盖,为了修改一个触发器,必须先删除他,然后再重新创建
create trigger newproduct after insert on products for each row select 'product added';
删除触发器
drop trigger newproduct;
书上错: insert 虚拟NEW 表
create TRIGGER neworder after insert on orders for each row select NEW.order_num into @sad;
Delete 虚拟OLD 表
delimiter $ create trigger deleteorder before delete on orders for EACH ROW BEGIN insert into archive_orders(order_num,order_date,cust_id) values(OLD.order_num,OLD.order_date,OLD.cust_id); end $
UPDATE 虚拟OLD 表 访问以前的值,引用NEW表 访问新的值
# 保证州名缩写总是大写(不管UPDATE语句中给出的是大 写还是小写): create trigger updatevendor before update on vendors FOR EACH ROW set new.vend_state = UPPER(new.vend_state);
浙公网安备 33010602011771号