上篇主要介绍了一下简单的检索数据,接下来要介绍使用指定条件检索数据。
条件检索数据主要分两种:1. 使用普通条件,比如大于某值,等于指定值等等,2.在文本搜索中采用通配符或者正则表达式。
SQL中条件检索也就是过滤数据,都要使用WHERE子句。例如有如下表
+-----------+-------------+--------+--------+
| friend_id | names | statue | weight |
+-----------+-------------+--------+--------+
| 1001 | Wangxiaodai | 178 | 71 |
| 1002 | Songxiaobao | 168 | 62 |
| 1003 | Lixiaomei | 168 | 52 |
| 1004 | Guoxiaoyi | NULL | NULL |
| 1005 | Xixiaopin | 172 | 75 |
| 1006 | Penxiaoyuan | 171 | 60 |
+-----------+-------------+--------+--------+
选择语句如下
SELECT names, statue
FROM myfriends
WHERE statue < 175
ORDER BY statue DESC, names
LIMIT 2,3;
上面输出的是身高小于175,以身高降序姓名升序排名,从第3行(行号2)开始选择3行的friends。
mysql> SELECT names, statue
-> FROM myfriends
-> WHERE statue<175
-> ORDER BY statue DESC,names
-> LIMIT 2,3;
+-------------+--------+
| names | statue |
+-------------+--------+
| Lixiaomei | 168 |
| Songxiaobao | 168 |
+-------------+--------+
2 rows in set (0.00 sec)
# 由于筛选条件之后可选总行数是4行,所以从第3行开始选,只能选择2行
WHERE子句中的操作符如下表
操作符 | 意义 |
---|---|
= | 等于 |
<>或!= | 不等于 |
< | 小于 |
> | 大于 |
<= | 小于等于 |
>= | 大于等于 |
BETWEEN | 两值之间 |
除此之外,还有NULL检查,如下,看是否由身高缺失的。
SELECT names
FROM myfriends
WHERE statue IS NULL;
mysql> SELECT names
-> FROM myfriends
-> WHERE statue is NULL;
+-----------+
| names |
+-----------+
| Guoxiaoyi |
+-----------+
1 row in set (0.00 sec)
可以通过逻辑操作符组合多个判断条件,达到多条件过滤数据。
逻辑操作符有AND(与)和OR(或),IN(集合检查),NOT(否定)。
典型例子如下
...
WHERE statue<170 AND weight<60;
#输出175cm以下,60kg以下的
...
WHERE statue IN (170,178);
#输出170或者178的结果
mysql> SELECT names,statue,weight
-> FROM myfriends
-> WHERE statue BETWEEN 170 AND 180;
+-------------+--------+--------+
| names | statue | weight |
+-------------+--------+--------+
| Wangxiaodai | 178 | 71 |
| Xixiaopin | 172 | 75 |
| Penxiaoyuan | 171 | 60 |
+-------------+--------+--------+
3 rows in set (0.00 sec)
通配符 % 主要功能是匹配任何字符任意多次(包括0次)
通配符_ 主要功能是匹配任何字符一次
典型例子如下
SELECT names, statue, weight
FROM myfriends
WHERE names LIKE 'Zhang%'
#查找姓张的人
mysql> SELECT names,statue,weight
-> FROM myfriends
-> WHERE names LIKE 'Zhang%';
+-------------+--------+--------+
| names | statue | weight |
+-------------+--------+--------+
| Zhangxiaoyi | NULL | NULL |
+-------------+--------+--------+
1 row in set (0.00 sec)
关键词LIKE是必不可少的。
在正则表达式中关键词变成REGEXP,那么过滤条件变成如下格式
...
WHERE names REGEXP '^Li'
mysql> SELECT names,statue,weight
-> FROM myfriends
-> WHERE names REGEXP '^LI';
+-----------+--------+--------+
| names | statue | weight |
+-----------+--------+--------+
| Lixiaomei | 168 | 52 |
+-----------+--------+--------+
1 row in set (0.00 sec)
其中^是定位符,下面会介绍。
...
WHERE names LIKE 'Li'
mysql> SELECT names,statue,weight
-> FROM myfriends
-> WHERE names LIKE 'LI';
Empty set (0.00 sec)
mysql> SELECT names,statue,weight
-> FROM myfriends
-> WHERE names REGEXP 'LI';
+-----------+--------+--------+
| names | statue | weight |
+-----------+--------+--------+
| Lixiaomei | 168 | 52 |
| Zhangli | NULL | NULL |
+-----------+--------+--------+
2 rows in set (0.00 sec)
...
WHERE names REGEXP 'ZHANG|ZHAN'
#匹配名字中有ZHANG或者ZHAN的人
...
WHERE emails REGEXP '[0123456789]'
#匹配邮箱地址中至少有一个数字的
#[0123456789]==[0|1|2|3|4|5|6|7|8|9]
正则表达式内部也可以实现通配符的功能,而且功能更多,只不过是通过叫元字符的组合而成的。元字符见下表。
元字符 | 意义 |
---|---|
* | 匹配0个以上的任意字符 |
+ | 匹配1个以上的任意字符 |
? | 匹配0或1个任意字符 |
{n} | 匹配n次 |
{n,} | 匹配n次以上 |
{n,m} | 匹配n次到m次 |
利用元字符,找到姓ZHANG或者ZHAN的人如下
...
WHERE names REGEXP '^ZHANG?'
#这样G和?组成能够匹配到有一个G和没有G的结果
...
WHERE email REGEXP '0{4}'
#这样就能匹配到邮箱地址中存在0000的值
在例如
mysql> SELECT names
-> FROM myfriends
-> WHERE names REGEXP 'zhangx*li';
+---------+
| names |
+---------+
| Zhangli |
+---------+
1 row in set (0.00 sec)
#能够匹配0个x
mysql> SELECT names
-> FROM myfriends
-> WHERE names REGEXP 'zhangx+li';
Empty set (0.00 sec)
#+匹配不到0个x
在MySQL的正则表达式中,转义字符为\\,对于一些特殊字符需要用转义字符,比如匹配’.’ 要用 ‘\\.’
转义字符还可以表示空白元字符
上面的例子中’^ZHANG’的 ^符号就是定位符,定位符主要设定匹配的位置,所有定位符见下表
定位符 | 意义 |
---|---|
^ | 文本开头 |
$ | 文本结束 |
[[:<:]] | 词的开头 |
[[:>:]] | 词的结束 |
匹配常用的字符可以采用预定义的字符集,这样更方便,常用的字符集定义如下
字符集 | 意义 |
---|---|
[:alpha:] | [a-zA-Z] |
[:alnum:] | [a-zA-Z0-9] |
[:digit:] | [0-9] |