《MySQL必知必会》读书笔记(进阶)
本篇文章用于记录MySQl学习过程中漏掉的知识点,通过本书查漏补缺。
一、limit
1、带一个值的limit总是从第一行开始,给出的数为返回的行数
select prod_name from products limit 5;
#返回前五行数据
2、带两个值的limit可以指定从行号为第一个值的位置开始(偏移量从0开始)
select prod_name from products limit 2,5;
#返回从行2(第3行)开始的5行
二、order by
可进行多列排序,可指定排序方向
desc 降序
esc 升序(默认,可省略)
#多列排序
select prod_id,prod_price,prod_name from products order by prod_price,prod_name;
#指定排序方向
select prod_id,prod_price,prod_name from products order by prod_price desc;
#多列指定方向排序
select prod_id,prod_price,prod_name from products order by prod_price desc,prod_name;
注:若想在多个列上进行降序排序,必须对每列指定desc关键字
三、where
此外还有and ; or ; in ; not in
1、空值检查(is null)
select cust_id from customers where cust_email is null;
2、and or 计算次序
where 可包含任意数目的and 和or 操作符。允许两者结合以进行复杂和高级的过滤。
例如:需要列出价格10美元及以上且由1002和1003制造的所有产品。
错误示范:
select prod_name,prod_price from products where vend_id=1002 or vend_id=1003 and prod_price>=10;
SQL在处理or操作符前会优先处理and操作符,and在计算次序中优先级更高。
故上述查询内容为由供应商1003制造的价格大于等于10的产品及制造商1002制造的所有产品
正确方法:加括号
select prod_name,prod_price from products where (vend_id=1002 or vend_id=1003) and prod_price>=10;
注:建议任何时候都在具有and和or的where子句中使用圆括号明确的分组相应的操作符。不要过分的依赖默认计算次序。
四、使用通配符过滤
使用like进行通配搜索
% :任意多个字符,包含0个字符
_ :任意单个字符
注:若做为普通符号使用,需进行转义
select prod_id,prod_name from products where prod_name like 'jet%';
select prod_id,prod_name from products where prod_name like '%anvil%';
select prod_id,prod_name from products where prod_name like '_ ton anvil';
五、用正则表达式进行搜索
regexp
正则表达式可以用来:
从一个文本文件中提取电话号码;
查找名字中间由数字的所有文件;
在一个文本块中找到所有重复的单词;
替换一个页面中的所有URL为这些URL的实际HTML链接;
等。
1、基本字符匹配
查找prod_name包含文本1000的所有行:
select prod_name from products where prod_name regexp '1000' order by prod_name;
.
是正则表达式语言中一个特殊的字符,它表示匹配任意一个字符。
select prod_name from products where prod_name regexp '.000' order by prod_name;
匹配不区分大小写
为区分大小写可用binary关键字
如:where prod_name regexp binary 'JetPack .000'
2、进行or匹配
| 为正则表达式的or操作符,表示匹配其中之一。
多个or条件可并入单个正则表达式,如'1000|2000|3000'
将匹配1000或2000或3000
select prod_name from products where prod_name regexp '1000|2000' order by prod_name;
3、匹配几个字符之一
如果只想匹配特定字符,可通过指定一组 [ ] 括起来的字符集合来完成
select prod_name from products where prod_name regexp '[123] Ton' order by prod_name;
[123]定义一组字符,它的意思是匹配1或2或3,是[1|2|3]的缩写
注:匹配除指定字符外的任何东西,在集合开始处放置一个 ^ 即可,如[^123]
4、匹配范围
集合可用来定义要匹配的一个或多个字符,可使用 - 来定义一个范围。
例如:[0-5]等同于[012345]
; [a-z]匹配任意字母字符
select prod_name from products where prod_name regexp '[1-5] Ton' order by prod_name;
5、匹配特殊字符
正则表达式语言由具有特定含义的特殊字符构成,如 .
、[]
、 |
、 -
等
若需匹配这些字符,则需用 \ 进行转义
匹配反斜杠(\)字符本身,需用 \\\
。
select vend_name from vendors where vend_name regexp '\\.' order by vend_name;
\ 也用来引用元字符(具有特殊含义的字符),如图所示
注:多数正则表达式使用单个反斜杠转义,但MySQL要求两个反斜杠(MySQL自己解释一个,正则表达式库解释另一个)
6、匹配字符类
你自己经常使用的数字、所有字母字符或所有数字字母字 符等的匹配。为更方便工作,可以使用预定义的字符集,称为字符类 (character class),下图列出字符类以及它们的含义。
7、匹配多个实例
7.1 ?
select prod_name from products where prod_name regexp '\\([0-9] sticks?\\)' order by prod_name;
注释:\\([0-9] sticks?\\)
\\(
匹配 (, [0-9]
匹配任意数字(这个例子中为1和5),sticks?
匹配stick 和sticks(s后的?使s可选,因为?匹配它前面的任何字符的0次或1次出现) ,\\)
匹配 )。
7.2 {n}
select prod_name from products where prod_name regexp '[[:digit:]]{4}' order by prod_name;
注释:[[:digit:]]{4}
[:digit:]
匹配任意数字,因而它为数字的一个集 合。{4}
确切地要求它前面的字符(任意数字)出现4次,所以 [[:digit:]]{4}匹配连在一起的任意4位数字。
等价于:select prod_name from products where prod_name regexp '[0-9][0-9][0-9][0-9]' order by prod_name;
8、定位符
匹配特定位置的文本,需要使用下图所示的定位符
例如:如果你想找出以一个数(包括以小数点开始的数)开始的所 有产品,怎么办?简单搜索[0-9\\.]
(或[[:digit:]\\.]
)不行,因为 它将在文本内任意位置查找匹配。解决办法是使用^
定位符,如下所示:
select prod_name from products where prod_name regexp '^[0-9\\.]' order by prod_name;
分析:^匹配串的开始。因此,^[0-9\\.]
只在.或任意数字为串中第 一个字符时才匹配它们。没有^,则还要多检索出4个别的行(那 些中间有数字的行)。
注:^
的双重用途:^
有两种用法。
在集合中(用[]定义),用它来否定该集合,否则,用来指串的开始处。