《MySQL必知必会》读书笔记(进阶)

本篇文章用于记录MySQl学习过程中漏掉的知识点,通过本书查漏补缺。

一、limit

1、带一个值的limit总是从第一行开始,给出的数为返回的行数

select prod_name from products limit 5;
#返回前五行数据

《MySQL必知必会》读书笔记(进阶)
2、带两个值的limit可以指定从行号为第一个值的位置开始(偏移量从0开始)

select prod_name from products limit 2,5;
#返回从行2(第3行)开始的5行

《MySQL必知必会》读书笔记(进阶)

二、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

《MySQL必知必会》读书笔记(进阶)
此外还有and ; or ; in ; not in

1、空值检查(is null)

select cust_id from customers where cust_email is null;

《MySQL必知必会》读书笔记(进阶)
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;

《MySQL必知必会》读书笔记(进阶)
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;

《MySQL必知必会》读书笔记(进阶)
注:建议任何时候都在具有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;

《MySQL必知必会》读书笔记(进阶)
.是正则表达式语言中一个特殊的字符,它表示匹配任意一个字符。

select prod_name from products where prod_name regexp '.000' order by prod_name;

《MySQL必知必会》读书笔记(进阶)

匹配不区分大小写
为区分大小写可用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;

《MySQL必知必会》读书笔记(进阶)
3、匹配几个字符之一

如果只想匹配特定字符,可通过指定一组 [ ] 括起来的字符集合来完成

select prod_name from products where prod_name regexp '[123] Ton' order by prod_name;

《MySQL必知必会》读书笔记(进阶)
[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;

《MySQL必知必会》读书笔记(进阶)
5、匹配特殊字符

正则表达式语言由具有特定含义的特殊字符构成,如 .[]|-
若需匹配这些字符,则需用 \ 进行转义
匹配反斜杠(\)字符本身,需用 \\\

select vend_name from vendors where vend_name regexp '\\.' order by vend_name;

《MySQL必知必会》读书笔记(进阶)
\ 也用来引用元字符(具有特殊含义的字符),如图所示
《MySQL必知必会》读书笔记(进阶)
注:多数正则表达式使用单个反斜杠转义,但MySQL要求两个反斜杠(MySQL自己解释一个,正则表达式库解释另一个)

6、匹配字符类

你自己经常使用的数字、所有字母字符或所有数字字母字 符等的匹配。为更方便工作,可以使用预定义的字符集,称为字符类 (character class),下图列出字符类以及它们的含义。

《MySQL必知必会》读书笔记(进阶)
7、匹配多个实例

《MySQL必知必会》读书笔记(进阶)
7.1 ?

select prod_name from products where prod_name regexp '\\([0-9] sticks?\\)' order by prod_name;

《MySQL必知必会》读书笔记(进阶)
注释:\\([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;

《MySQL必知必会》读书笔记(进阶)
注释:[[: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、定位符

匹配特定位置的文本,需要使用下图所示的定位符

《MySQL必知必会》读书笔记(进阶)
例如:如果你想找出以一个数(包括以小数点开始的数)开始的所 有产品,怎么办?简单搜索[0-9\\.](或[[:digit:]\\.])不行,因为 它将在文本内任意位置查找匹配。解决办法是使用^定位符,如下所示:

select prod_name from products where prod_name regexp '^[0-9\\.]' order by prod_name;

《MySQL必知必会》读书笔记(进阶)
分析:^匹配串的开始。因此,^[0-9\\.]只在.或任意数字为串中第 一个字符时才匹配它们。没有^,则还要多检索出4个别的行(那 些中间有数字的行)。

注:
^的双重用途:^有两种用法。
在集合中(用[]定义),用它来否定该集合,否则,用来指串的开始处。