本站文章均为 李华明Himi 原创,转载务必在明显处注明:

转载自【黑米GameDev街区】 原文链接: http://www.himigame.com/mysql/781.html

          ☞ 点击订阅 ☜
 本博客最新动态!及时将最新博文通知您!

 

继续上一篇继续讲解MySQL的相关知识点;

     1. NULL 值操作:

NULL值可能令人感到奇怪直到你习惯它。概念上,NULL意味着“没有值”或“未知值”,且它被看作与众不同的值。为了测试NULL,你不能使用算术比较 操作符例如=、<或!=。为了说明它,试试下列查询:

 

   
   
   
   
  1. mysql> SELECT 1 = NULL, 1 <> NULL, 1 < NULL, 1 > NULL
  2. +----------+-----------+----------+----------+ 
  3. | 1 = NULL | 1 <> NULL | 1 < NULL | 1 > NULL | 
  4. +----------+-----------+----------+----------+ 
  5. |     NULL |      NULL |     NULL |     NULL | 
  6. +----------+-----------+----------+----------+ 
  7. 1 row in set (0.05 sec) 
很显然你不能通过这些比较得到有意义的结果。相反使用IS NULL和IS NOT NULL操作符:

 

   
   
   
   
  1. mysql> select 1 is null, 1 is not null
  2. +-----------+---------------+ 
  3. | 1 is null | 1 is not null | 
  4. +-----------+---------------+ 
  5. |         0 |             1 | 
  6. +-----------+---------------+ 
  7. 1 row in set (0.04 sec) 

注意:可以在定义为NOT NULL的列内插入0或空字符串,实际是NOT NULL。

  2.  模式匹配:

MySQL提供标准的SQL模式匹配,以及一种基于象Unix实用程序如vi、grep和sed的扩展正则表达式模式匹配的格式。 SQL模式匹配允许你使用“_”匹配任何单个字符,而“%”匹配任意数目字符(包括零字符)。注意使用SQL模式时,不能使用=或!=;而应使用LIKE或NOT LIKE比较操作符;

找出所有以y开头的名字;        

 

    
    
    
    
  1. mysql> select *from people; 
  2. +------+------+-------+------------+ 
  3. name | age  | sex   | birthday   | 
  4. +------+------+-------+------------+ 
  5. | Himi | 21   | man   | 1990-01-01 | 
  6. | xioi | 23   | woman | 1980-03-08 | 
  7. | uhi  | 23   | woman | 1980-08-08 | 
  8. | ouha | 23   | woman | 1989-04-02 | 
  9. | yunu | 20   | man   | 1993-10-19 | 
  10. | yyun | 20   | man   | 1993-10-19 | 
  11. +------+------+-------+------------+ 
  12. rows in set (0.00 sec) 
  13.   
  14. mysql> selectfrom people where name like 'y%'
  15. +------+------+------+------------+ 
  16. name | age  | sex  | birthday   | 
  17. +------+------+------+------------+ 
  18. | yunu | 20   | man  | 1993-10-19 | 
  19. | yyun | 20   | man  | 1993-10-19 | 
  20. +------+------+------+------------+ 
  21. rows in set (0.00 sec) 
找出所有以i结尾的名字; 

 

    
    
    
    
  1. mysql> selectfrom people where name like '%i'
  2. +------+------+-------+------------+ 
  3. name | age  | sex   | birthday   | 
  4. +------+------+-------+------------+ 
  5. | Himi | 21   | man   | 1990-01-01 | 
  6. | xioi | 23   | woman | 1980-03-08 | 
  7. | uhi  | 23   | woman | 1980-08-08 | 
  8. +------+------+-------+------------+ 
  9. rows in set (0.00 sec) 
找出所有以包含h的名字;

 

   
   
   
   
  1. mysql> selectfrom people where name like '%h%'
  2. +------+------+-------+------------+ 
  3. name | age  | sex   | birthday   | 
  4. +------+------+-------+------------+ 
  5. | Himi | 21   | man   | 1990-01-01 | 
  6. | uhi  | 23   | woman | 1980-08-08 | 
  7. | ouha | 23   | woman | 1989-04-02 | 
  8. +------+------+-------+------------+ 
  9. rows in set (0.00 sec) 
要想找出正好包含3个字符的名字,使用3个“_”模式字符:

 

   
   
   
   
  1. mysql> selectfrom people where name like '___'
  2. +------+------+-------+------------+ 
  3. name | age  | sex   | birthday   | 
  4. +------+------+-------+------------+ 
  5. | uhi  | 23   | woman | 1980-08-08 | 
  6. +------+------+-------+------------+ 
  7. 1 row in set (0.00 sec) 

 

由MySQL提供的模式匹配的其它类型是使用扩展正则表达式。当你对这类模式进行匹配测试时,使用REGEXP和NOT REGEXP操作符(或RLIKE和NOT RLIKE,它们是同义词)。

     3.  正则表达式的使用;

扩展正则表达式的一些字符是:

·         ‘.’匹配任何单个的字符。

·         字符类“[...]”   匹配在方括号内的任何字符。例如,“[abc]” 匹配 “a”、“b”或“c”。为了命名字符的范围,使用一个“-”。“[a-z]”匹配任何字母,而“[0-9]”匹配任何数字。

·“ * ”匹配零个或多个在它前面的字符。例如,“x*”匹配任何数量的“x”字符,“[0-9]*”匹配任何数量的数字,而“.*”匹配任何数量的任何字符。

  • 如果REGEXP模式与被测试值的任何地方匹配,模式就匹配(这不同于LIKE模式匹配,只有与整个值匹配,模式才匹配)。
  • 为了定位一个模式以便它必须匹配被测试值的开始或结尾,在模式开始处使用“^”或在模式的结尾用“$”。

为了说明扩展正则表达式如何工作,下面使用REGEXP重写上面所示的LIKE查询:

为了找出以“b”开头的名字,使用“^”匹配名字的开始:

mysql> SELECT * FROM pet WHERE name REGEXP '^b';
+--------+--------+---------+------+------------+------------+
| name   | owner  | species | sex  | birth      | death      |
+--------+--------+---------+------+------------+------------+
| Buffy  | Harold | dog     | f    | 1989-05-13 | NULL       |
| Bowser | Diane  | dog     | m    | 1989-08-31 | 1995-07-29 |
+--------+--------+---------+------+------------+------------+

如果你想强制使REGEXP比较区分大小写,使用BINARY关键字使其中一个字符串变为二进制字符串。该查询只匹配名称首字母的小写‘b’。

mysql> SELECT * FROM pet WHERE name REGEXP BINARY '^b';

为了找出以“fy”结尾的名字,使用“$”匹配名字的结尾:

mysql> SELECT * FROM pet WHERE name REGEXP 'fy$';
+--------+--------+---------+------+------------+-------+
| name   | owner  | species | sex  | birth      | death |
+--------+--------+---------+------+------------+-------+
| Fluffy | Harold | cat     | f    | 1993-02-04 | NULL  |
| Buffy  | Harold | dog     | f    | 1989-05-13 | NULL  |
+--------+--------+---------+------+------------+-------+

为了找出包含一个“w”的名字,使用以下查询:

mysql> SELECT * FROM pet WHERE name REGEXP 'w';
+----------+-------+---------+------+------------+------------+
| name     | owner | species | sex  | birth      | death      |
+----------+-------+---------+------+------------+------------+
| Claws    | Gwen  | cat     | m    | 1994-03-17 | NULL       |
| Bowser   | Diane | dog     | m    | 1989-08-31 | 1995-07-29 |
| Whistler | Gwen  | bird    | NULL | 1997-12-09 | NULL       |
+----------+-------+---------+------+------------+------------+

既然如果一个正则表达式出现在值的任何地方,其模式匹配了,就不必在先前的查询中在模式的两侧放置一个通配符以使得它匹配整个值,就像你使用了一个SQL模式那样。

为了找出包含正好5个字符的名字,使用“^”和“$”匹配名字的开始和结尾,和5个“.” 实例在两者之间:

mysql> SELECT * FROM pet WHERE name REGEXP '^.....$';
+-------+--------+---------+------+------------+-------+
| name  | owner  | species | sex  | birth      | death |
+-------+--------+---------+------+------------+-------+
| Claws | Gwen   | cat     | m    | 1994-03-17 | NULL  |
| Buffy | Harold | dog     | f    | 1989-05-13 | NULL  |
+-------+--------+---------+------+------------+-------+

你也可以使用“{n}”“重复n次”操作符重写前面的查询:

mysql> SELECT * FROM pet WHERE name REGEXP '^.{5}$';
+-------+--------+---------+------+------------+-------+
| name  | owner  | species | sex  | birth      | death |
+-------+--------+---------+------+------------+-------+
| Claws | Gwen   | cat     | m    | 1994-03-17 | NULL  |
| Buffy | Harold | dog     | f    | 1989-05-13 | NULL  |
+-------+--------+---------+------+------------+-------+

附录G:MySQL正则表达式 提供了关于正则表达式的句法的详细信息。

5.常用查询的例子

  5.1 列的最大值

下面是一些学习如何用MySQL解决一些常见问题的例子。

在一些例子中,使用数据库表“shop”来储存某个商人(经销商)的每件物品(物品号)的价格。假定每个商人对每项物品有一个固定价格,那么(物品,商人)即为该记录的主关键字。

启动命令行工具mysql并选择数据库:

shell> mysql your-database-name

(在大多数MySQL中,你可以使用test数据库)。

你可以使用以下语句创建示例表:

mysql> CREATE TABLE shop (
    -> article INT(4) UNSIGNED ZEROFILL DEFAULT '0000' NOT NULL,
    -> dealer  CHAR(20)                 DEFAULT ''     NOT NULL,
    -> price   DOUBLE(16,2)             DEFAULT '0.00' NOT NULL,
    -> PRIMARY KEY(article, dealer));
mysql> INSERT INTO shop VALUES
    -> (1,'A',3.45),(1,'B',3.99),(2,'A',10.99),(3,'B',1.45),
    -> (3,'C',1.69),(3,'D',1.25),(4,'D',19.95);

执行语句后,表应包含以下内容:

mysql> SELECT * FROM shop;
+---------+--------+-------+
| article | dealer | price |
+---------+--------+-------+
|    0001 | A      |  3.45 |
|    0001 | B      |  3.99 |
|    0002 | A      | 10.99 |
|    0003 | B      |  1.45 |
|    0003 | C      |  1.69 |
|    0003 | D      |  1.25 |
|    0004 | D      | 19.95 |
+---------+--------+-------+