mysql笔记-- mysql命令札记2

4. 从表检索信息

4.1. 选择所有数据
NOTE: ' * ' 在正则表达式中代表通配符的意思;
mysql> select * from test;
+-------+------+------+
| name  | sex  | arg  |
+-------+------+------+
| kevin | M    |   18 |
| kevin | M    |   18 |
+-------+------+------+
2 rows in set (0.00 sec)

4.2. 选择特殊行

选择where 之后的变量作为条件来检索数据表;
mysql> select name from test where name = 'kevin';
+-------+
| name  |
+-------+
| kevin |
| kevin |
+-------+
2 rows in set (0.01 sec)
选择多个条目
mysql> select name ,sex from test;
+-------+------+
| name  | sex  |
+-------+------+
| kevin | M    |
| kevin | M    |
+-------+------+
2 rows in set (0.00 sec)
where 条件组合检索
mysql> select name, sex from test where sex = 'M' and arg=18;  
+-------+------+
| name  | sex  |
+-------+------+
| kevin | M    |
| kevin | M    |
+-------+------+
2 rows in set (0.00 sec)


mysql> select name, sex from test where sex = 'M' or arg=17; 
+-------+------+
| name  | sex  |
+-------+------+
| kevin | M    |
| kevin | M    |
+-------+------+
2 rows in set (0.00 sec)


mysql> select name, sex from test where sex = 'N' or arg=17; 
Empty set (0.00 sec)

以上对比可知,使用where 中or , and 进行组合变量的条件,来进行选择;对于多个选项,可持续的进行and 或or;

4.4. 分类行

按某种方式排序时,检查查询输出通常更容易。为了 排序结果,使用ORDER BY子句。
mysql> select arg from test order by arg;
+------+
| arg  |
+------+
|   18 |
|   18 |
|   20 |
+------+
3 rows in set (0.07 sec)
mysql> select name from test order by arg;   
+--------+
| name   |
+--------+
| kevin  |
| kevin  |
| sherry |
+--------+
3 rows in set (0.00 sec)

4.5. 日期计算

MySQL提供了几个函数,可以用来计算日期
curdate(); 读取当前的日期;
year(curdate()); 读取年份;
RIGHT(xxx,n)提取从右起第n个向右的所有字符;
MySQL提供几个日期部分的提取函数,例如YEAR( )、MONTH( )和DAYOFMONTH( ) 分别读取年份,月份,和日期从‘xxxx-xx-xx'中读取;
mysql> select name , year(curdate()) - year('1990-12-11') - (right(curdate(),5)< right('1990-12-11',5)) as age from test order by age;
+--------+------+
| name   | age  |
+--------+------+
| kevin  |   23 |
| kevin  |   23 |
| sherry |   23 |
+--------+------+
3 rows in set (0.00 sec)

4.6. NULL值操作

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

mysql> SELECT 1 = NULL, 1 <> NULL, 1 < NULL, 1 > NULL;
+----------+-----------+----------+----------+
| 1 = NULL | 1 <> NULL | 1 < NULL | 1 > NULL |
+----------+-----------+----------+----------+
|     NULL |      NULL |     NULL |     NULL |
+----------+-----------+----------+----------+

很显然你不能通过这些比较得到有意义的结果。相反使用IS NULL和IS NOT NULL操作符:

mysql> SELECT 1 IS NULL, 1 IS NOT NULL;
+-----------+---------------+
| 1 IS NULL | 1 IS NOT NULL |
+-----------+---------------+
|         0 |             1 |
+-----------+---------------+

请注意在MySQL中,0或 NULL意味着假而其它值意味着真。布尔运算的默认真值是1。

NULL操作的常见错误是不能在定义为NOT NULL的列内插入0或空字符串,但事实并非如此。在NULL表示"没有数值"的地方有数值。使用IS [NOT] NULL则可以很容易地进行测试,如下所示:

mysql> SELECT 0 IS NULL, 0 IS NOT NULL, '' IS NULL, '' IS NOT NULL;
+-----------+---------------+------------+----------------+
| 0 IS NULL | 0 IS NOT NULL | '' IS NULL | '' IS NOT NULL |
+-----------+---------------+------------+----------------+
|         0 |             1 |          0 |              1 |
+-----------+---------------+------------+----------------+

因此完全可以在定义为NOT NULL的列内插入0或空字符串,实际是NOT NULL。


.4.7. 模式匹配

MySQL提供标准的SQL模式匹配,以及一种基于象Unix实用程序如vi、grepsed的扩展正则表达式模式匹配的格式。

SQL模式匹配允许你使用“_”匹配任何单个字符,而“%”匹配任意数目字符(包括零字符)。在 MySQL中,SQL的模式默认是忽略大小写的。下面给出一些例子。注意使用SQL模式时,不能使用=或!=;而应使用LIKE或NOT LIKE比较操作符。


mysql 支持的正则表达式

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

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

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

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

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

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

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

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

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



mysql> select * from test where name regexp '^k...n$';
+-------+------+------+
| name  | sex  | arg  |
+-------+------+------+
| kevin | M    |   18 |
| kevin | M    |   18 |
+-------+------+------+
2 rows in set (0.00 sec)


mysql> select * from test where name regexp '^k..n$'; 
Empty set (0.00 sec)


mysql> select * from test where name regexp '^k.{3}n$';
+-------+------+------+
| name  | sex  | arg  |
+-------+------+------+
| kevin | M    |   18 |
| kevin | M    |   18 |
+-------+------+------+
2 rows in set (0.00 sec)


mysql> select * from test where name regexp '^k.{4}n$';
Empty set (0.00 sec)


4.8. 计数行

COUNT(*)函数计算行数

min (int type)

max (int type)

计算最大的int型数和最小的int型数;

4.9. 使用1个以上的表

于该查询要注意的几件事情:

  • FROM子句列出两个表,因为查询需要从两个表提取信息。
  • 当从多个表组合(联结)信息时,你需要指定一个表中的记录怎样能匹配其它表的记录。这很简单,因为它们都有一个name列。查询使用WHERE子句基于name值来匹配2个表中的记录。
  • 因为name列出现在两个表中,当引用列时,你一定要指定哪个表。把表名附在列名前即可以实现。

你不必有2个不同的表来进行联结。如果你想要将一个表的记录与同一个表的其它记录进行比较,可以将一个表联结到自身。

查询中,我们为表名指定别名以便能引用列并且使得每一个列引用与哪个表实例相关联更直观。

mysql> select test.name,test2.name from test ,test2;
+--------+--------+
| name   | name   |
+--------+--------+
| kevin  | kevin  |
| kevin  | sherry |
| kevin  | kevin  |
| kevin  | sherry |
| sherry | kevin  |
| sherry | sherry |
+--------+--------+
6 rows in set (0.00 sec)

mysql> select t1.name,t2.name from test as t1 ,test2 as t2;
+--------+--------+
| name   | name   |
+--------+--------+
| kevin  | kevin  |
| kevin  | sherry |
| kevin  | kevin  |
| kevin  | sherry |
| sherry | kevin  |
| sherry | sherry |
+--------+--------+
6 rows in set (0.04 sec)

你可能感兴趣的:(mysql笔记-- mysql命令札记2)