今天继续关于MySQL的学习,由于之前有稍微涉猎过关于数据库的操作,所以,前面的几章都还算比较容易接受和理解,但接下来的东西开始慢慢的超出我的知识范围,让我意识到,接下来的东西我必需更用心去学。
第六章:过滤数据
数据过滤即从整个表或者多个表的搜索中给定条件,使得搜索结果更符合我们的需要。在SELECT语句中,依靠WHERE子句指定搜索条件进行搜索。
由于之前的表数据太过于简单,所以我删除了之前的 test 表,并重新建了一个 test 表,其代码如下:
CREATE TABLE test(
user_id int NOT NULL AUTO_INCREMENT,
user_name varchar(20) NOT NULL,
user_add varchar(30) NOT NULL,
PRIMARY KEY(user_id)
);
插入四条记录:
INSERT INTO test VALUES
(NULL,'Xiao Hong','Guangzhou'),
(NULL,'Xiao Ming','Shanghai'),
(NULL,'Lin Xiao','Beijing'),
(NULL,'Zhang San','GuangZhou');
对 test 进行查询,其结果如下:
+------------+-------------------+--------------------+ 表2
| user_id | user_name | user_add |
---------------+------------------+---------------------
| 1 | Xiao Hong | Guangzhou |
| 2 | Xiao Ming | Shanghai |
| 3 | Lin Xiao | Beijing |
| 4 | Zhang San | GuangZhou |
+---------------------------------+---------------------+
简单的WHERE子句使用:
SELECT user_add
FROM test
WHERE user_name='xiao hong';
WHERE子句的操作符除了=以外还有下面几种
---------------------------------------------------------------------------------------
操作符 说明
---------------------------------------------------------------------------------------
= 等于
<> 不等于
!= 不等于
< 小于
> 大于
<= 小于等于
>= 大于等于
BETWEEN 在指定的两个值之间
---------------------------------------------------------------------------------------
BETWEEN操作符的用法:
SELECT user_name
FROM test
WHERE user_id BETWEEN 2 AND 4;
-- 包括端点 2 和 4
IS NULL 子句 与 IS NOT NULL 语句。
一个表在设计的时候可以由设计员指定该列是否可以为空,一个列不包含值时,称其包含空值 NULL。
SELECT user_id
FROM test
WHERE user_name IS NOT NULL
第七章:数据过滤
第六章是过滤数据,第七章是数据过滤,好吧,我觉得这个作者为了让每一章看起来均衡一点,故意把这一章拆成两章的=。=这一章主要讲的是有关WHERE子名中的逻辑操作符 AND OR IN NOT。
由于比较简单,看下例子就会懂得怎么用了。
AND操作符
SELECT user_id,user_name
FROM test
WHERE user_id!=4 AND user_add='guangzhou';
OR操作符 与 IN操作符
SELECT user_name
FROM test
WHERE user_id=2 OR user_id=3;
-- 等价于
SELECT user_name
FROM test
WHERE user_id IN (2,3);
关于OR与IN的公优缺点比较在后面的学习中再总结出来。
NOT操作符
SELECT user_id,user_name
FROM test
WHERE user_id NOT IN (1,3);
第八章:用通配符进行过滤
通配符一般是对于一些字符使用类似模糊搜索的模式进行搜索。其关键字是LIKE操作符。
百分号"%"通配符,在搜索串中,%表示任何字符出现任意次数。
SELECT user_name,user_add
FROM test
WHERE user_name LIKE 'xiao%';
这样将会搜索出 user_name中前面是xiao的记录,当然后也可以将%放置于xiao之前"%xiao",这样搜索出来的记录将是user_name中xiao在字符串后面的记录。
下划线"_"通配符,在搜索串中,"_"表示匹配单个字符,而不像%可以表示多个字符,用法上与%一样。
SELECT user_id,user_name
FROM test
WHERE user_name LIKE 'xiao _ong';
第九章:用正则表达式进行搜索
终于到正则表达式了,这个既熟悉又陌生的名字,它会出现在各种书的各种地方,但我从来没有认真的学习过,借由这一次机会,先弄懂大概在MySQL中如何使用正则表达式来构建搜索串。为了加深体验,我又在表中加插了两条记录。
INSERT INTO test VALUES
(NULL,'T.bag','U.S.A'),
(NULL,'A.bao','CHINA');
用正则表达式进行搜索有点类似于上一章用通配符进行过滤,但其功能比通配符要强大的多,并且关键字是REGEXP
SELECT user_name
FROM test
WHERE user_name REGEXP 'xiao'
ORDER BY user_name;
如果是用LIKE关键字的话,上面的xiao必需在前面或者是后面加上%才能搜索出想要的记录,而使用用REGEXP关键字则不需要,只要有与'xiao'匹配的项都会被搜出。
LIKE匹配整个列,而REGEXP则是匹配列值。
正则表达式中的特殊字符:
“.”(小圆点)用来匹配任一字符
SELECT user_name
FROM test
WHERE user_name REGEXP '.ng'
ORDER BY user_name;
“|”用来进行OR匹配
SELECT user_id,user_name
FROM test
WHERE user_name REGEXP 'xiao [ming|hong]'
ORDER BY user_id;
这其中的“
[]”代表一个多个字符的字符集,也可以用来定义一个范围,如[0-9]匹配任意一个数字,[a-z]匹配任意字母字符。
如果是要匹配特殊字符则需要使用双反斜杠进行转义,如" \\[ "匹配" [ ","\\."匹配"."。(其中双反斜杠是由于MySQL自己解释一个,正则表达式库解释一个)
正则表达式字符类是对于经常使用的一些字符和数字控制符等做的预定义的字符集,用法如下:
在括号表达式中(使用[和]),[:character_class:]表示与术语类的所有字符匹配的字符类
-------------------------------------------------------------------------
类 说明
-------------------------------------------------------------------------
alpha 文字字符
blank 空白字符
cntrl 控制字符
digit 数字字符
graph 图形字符
lower 小写文字字符
print 图形或空格字符
punct 标点字符
space 空格、制表符、新行、和回车
upper 大写文字字符
xdigit 十六进制数字字符
--------------------------------------------------------------------------
SELECT user_id,user_name
FROM test
WHERE user_name REGEXP 'xiao [[:alpha:]]'
ORDER BY user_id;
正则表达式重复元字符
--------------------------------------------------------------------
元字符 说明
--------------------------------------------------------------------
* 0个或多个
+ 1个或多个
? 1个或0个
{n} 指定数目
{n,} 不少于指定
{n,m} 匹配数目的范围
--------------------------------------------------------------------
SELECT user_id,user_name
FROM test
WHERE user_add REGEXP 'beiX?jing'
ORDER BY user_id;
正则表达式定位元字符
--------------------------------------------------------------------
元字符 说明
--------------------------------------------------------------------
^ 文本的开始
$ 文本的结尾
[:<:] 词的开始
[:>:] 词的结尾
--------------------------------------------------------------------
SELECT user_id,user_name
FROM test
WHERE user_name REGEXP '^[[:alpha:]]?\\.[[:alpha:]]{3}';