[学会MySql系列] 第三篇:条件检索数据(过滤数据)

接上篇

上篇主要介绍了一下简单的检索数据,接下来要介绍使用指定条件检索数据。
条件检索数据主要分两种:1. 使用普通条件,比如大于某值,等于指定值等等,2.在文本搜索中采用通配符或者正则表达式。

6. WHERE

6.1 单条件过滤数据

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, ORDER BY, LIMIT 都是可选子句,但是如果都选择了,排序应该遵照这个顺序,不然会导致错误。

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)
6.1 多条件过滤数据

可以通过逻辑操作符组合多个判断条件,达到多条件过滤数据。
逻辑操作符有AND(与)和OR(或),IN(集合检查),NOT(否定)。
典型例子如下

...
WHERE statue<170 AND weight<60;
#输出175cm以下,60kg以下的
...
WHERE statue IN (170,178);
#输出170或者178的结果
  • 注:在使用多个逻辑操作符时需要考虑计算先后,在SQL中逻辑操作符AND和OR等级一样高,圆括号等级最高。
  • 注:如果要进行范围检索用BETWEEN子句。
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)
6.2 用通配符过滤

通配符 % 主要功能是匹配任何字符任意多次(包括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是必不可少的。

6.3 用正则表达式过滤

在正则表达式中关键词变成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)

其中^是定位符,下面会介绍。

  • 注:正则表达式中REGEXP与LIKE最大的不同在于REGEXP匹配的是匹配子序列,而LIKE是匹配全序列,比如在上例中,如果语句如下,是找不到任何结果的,但是如果换成REGEXP能够找到两个结果。
...
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)
6.3.1 正则表达式
6.3.1.1 or匹配符:|
...
WHERE names REGEXP 'ZHANG|ZHAN'
#匹配名字中有ZHANG或者ZHAN的人
6.3.1.2 集合选一:[]
...
WHERE emails REGEXP '[0123456789]'
#匹配邮箱地址中至少有一个数字的
#[0123456789]==[0|1|2|3|4|5|6|7|8|9]
6.3.1.3 元字符

正则表达式内部也可以实现通配符的功能,而且功能更多,只不过是通过叫元字符的组合而成的。元字符见下表。

元字符意义
*匹配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
6.3.1.4 转义字符

在MySQL的正则表达式中,转义字符为\\,对于一些特殊字符需要用转义字符,比如匹配’.’ 要用 ‘\\.’
转义字符还可以表示空白元字符

6.3.1.5 定位符

上面的例子中’^ZHANG’的 ^符号就是定位符,定位符主要设定匹配的位置,所有定位符见下表

定位符意义
^文本开头
$文本结束
[[:<:]]词的开头
[[:>:]]词的结束
6.3.1.6 字符集

匹配常用的字符可以采用预定义的字符集,这样更方便,常用的字符集定义如下

字符集意义
[:alpha:][a-zA-Z]
[:alnum:][a-zA-Z0-9]
[:digit:][0-9]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

努力的骆驼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值