SQL Mode 三种作用域
SQL Mode 按作用区域和时间可分为 3。个级别,分别是会话级别,全局级别,配置(永久生效)级别。
我们上面使用的 SQL Mode 都是 会话级别
,会话级别就是当前窗口域有效。它的设置方式是
set @@session.sql_mode='xx_mode' set session sql_mode='xx_mode'
全局域就是当前会话关闭不失效,但是在 MySQL 重启后失效。它的设置方式是
set global sql_mode='xx_mode'; set @@global.sql_mode='xx_mode';
配置域就是在 vi /etc/my.cnf
里面添加
[mysqld] sql-mode = "xx_mode"
配置域在保存退出后,重启服务器,即可永久生效。
SQL 正则表达式
正则表达式相信大家应该都用过,不过你在 MySQL 中用过正则表达式吗?下面我们就来聊一聊 SQL 中的正则表达式。
正则表达式(Regular Expression)
是指一个用来描述或者匹配字符串的句法规则。正则表达式通常用来检索和替换某个文本中的文本内容。很多语言都支持正则表达式,MySQL 同样也不例外,MySQL 利用 REGEXP
命令提供给用户扩展的正则表达式功能。下面是 MySQL 中正则表达式的一些规则。
下面来演示一下正则表达式的用法
^
在字符串的开始进行匹配,根据返回的结果来判断是否匹配,1 = 匹配,0 = 不匹配。下面尝试匹配字符串aaaabbbccc
是否以字符串a
为开始
select 'aaaabbbccc' regexp '^a';
- 同样的,
$
会在末尾处进行匹配,如下所示
select 'aaaabbbccc' regexp 'c$';
.
匹配单个任意字符
select 'berska' regexp '.s', 'zara' regexp '.a';
[...]
表示匹配括号内的任意字符,示例如下
select 'whosyourdaddy' regexp '[abc]';
[^...]
匹配括号内不包含的任意字符,和[...]
是相反的,如果有任何匹配不上,返回 0 ,全部匹配上返回 1。
select 'x' regexp '[^xyz]';
n*
表示匹配零个或者多个 n 字符串,如下
select 'aabbcc' regexp 'd*';
没有 d 出现也可以返回 1 ,因为 * 表示 0 或者多个。
n+
表示匹配 1 个或者 n 个字符串
select 'aabbcc' regexp 'd+';
n?
的用法和 n+ 类似,只不过 n? 可以匹配空串
常见 SQL 技巧
RAND() 函数
大多数数据库都会提供产生随机数的函数,通过这些函数可以产生随机数,也可以使用从数据库表中抽取随机产生的记录,这对统计分析来说很有用。
在 MySQL 中,通常使用 RAND()
函数来产生随机数。RAND() 和 ORDER BY 组合完成数据抽取功能,如下所示。
我们新建一张表用于数据检索。
CREATE TABLE `clerk_Info` ( `id` int(11) NOT NULL, `name` varchar(255) DEFAULT NULL, `salary` decimal(10,2) DEFAULT NULL, `companyId` int(10) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1
然后插入一些数据,插入完成后的数据如下。
然后我们可以使用 RAND() 函数进行随机检索数据行
select * from clerk_info order by rand();
检索完成后的数据如下
多次查询后发现每次检索的数据顺序都是随机的。
这个函数多用于随机抽样,比如选取一定数量的样本在进行随机排序,需要用到 limit
关键字。
GROUP BY + WITH ROLLUP
我们经常使用 GROUP BY 语句,但是你用过 GROUP BY
和 WITH ROLLUP
一起使用的吗?使用 GROUP BY 和 WITH ROLLUP 字句可以检索出更多的分组集合信息。
我们仍旧对 clerk_info 表进行操作,我们对 name 和 salary 进行分组统计工资总数。
select name,sum(salary) from clerk_info group by name with rollup;
可以看到上面的表按照 name 进行分组,然后再对 money 进行统计。
也就是说 GROUP BY 语句执行完成后可以满足用户想要的任何一个分组以及分组组合的聚合信息值。
这里需要注意一点,不能同时使用 ORDER BY 字句对结果进行排序,ROLLUP 和 ORDER BY 是互斥的。