龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 数据库类 > MySQL 技术 >

深入SELECT语句的查询功能(一)(1)(2)

时间:2011-04-12 23:18来源:未知 作者:admin 点击:
分享到:
取出互不相同的记录 有时候你可能希望取出的数据互不重复,因为重复的数据可能对你没有意义。 解决的办法是使用DISTINCT关键字,使用这个关键字保证

取出互不相同的记录

有时候你可能希望取出的数据互不重复,因为重复的数据可能对你没有意义。

解决的办法是使用DISTINCT关键字,使用这个关键字保证结果集中不包括重复的记录,也就是说,你取出的记录中,没有重复的行。

例如,我们取出pet表中Benny所拥有的宠物的记录:

mysql> SELECT name,owner,species,sex FROM pet WHERE owner="Benny";

+------+-------+---------+------+

| name | owner | species | sex  |

+------+-------+---------+------+

| Fang | Benny | dog     | m    |

| Slim | Benny | snake   | m    |

+------+-------+---------+------+

注意上面的结果,因为我们要使用它。

假定我们指定DISTINCT关键字,并返回列name,species,sex列:

mysql> SELECT DISTINCT name,species,sex FROM pet WHERE owner="Benny";

+------+---------+------+

| name | species | sex  |

+------+---------+------+

| Fang | dog     | m    |

| Slim | snake   | m    |

+------+---------+------+

你可以看到有两条结果,这是因为返回的结果集中的行不同,如果我们做以下更改,只返回owner,sex列,你可以观察变化:

mysql> SELECT DISTINCT owner,sex FROM pet WHERE owner="Benny";

+-------+------+

| owner | sex  |

+-------+------+

| Benny | m    |

+-------+------+

DISTINCT关键字的存在,使查询只返回不同的记录行。

如果一个表中,有完全相同的行,你可以使用DISTINCT,以去除冗余的输出:

SELECT DISTINCT * FROM tbl_name

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意味着假而1意味着真。

NULL这样特殊的处理是为什么,在前面的章节中,为了决定哪个动物不再是活着的,使用death IS NOT NULL而不是death != NULL是必要的:

mysql> SELECT * FROM pet WHERE death IS NOT NULL;

+--------+-------+---------+------+------------+------------+

| name   | owner | species | sex  | birth      | death      |

+--------+-------+---------+------+------------+------------+

| Bowser | Diane | dog     | m    | 1990-08-31 | 1995-07-29 |

+--------+-------+---------+------+------------+------------+

NULL值的概念是造成SQL的新手的混淆的普遍原因,他们经常认为NULL是和一个空字符串''的一样的东西。不是这样的!例如,下列语句是完全不同的:

mysql> INSERT INTO my_table (phone) VALUES (NULL);
mysql> INSERT INTO my_table (phone) VALUES ("");

两个语句把值插入到phone列,但是第一个插入一个NULL值而第二个插入一个空字符串。第一个的含义可以认为是“电话号码不知道”,而第二个则可意味着“她没有电话”。

在SQL中,NULL值在于任何其他值甚至NULL值比较时总是假的(FALSE)。包含NULL的一个表达式总是产生一个NULL值,除非在包含在表达式中的运算符和函数的文档中指出。在下列例子,所有的列返回NULL:

mysql> SELECT NULL,1+NULL,CONCAT('Invisible',NULL);

+------+--------+--------------------------+

| NULL | 1+NULL | CONCAT('Invisible',NULL) |

+------+--------+--------------------------+

| NULL |   NULL | NULL                     |

+------+--------+--------------------------+

如果你想要寻找值是NULL的列,你不能使用=NULL测试。下列语句不返回任何行,因为对任何表达式,expr = NULL是假的:

mysql> SELECT * FROM my_table WHERE phone = NULL;

要想寻找NULL值,你必须使用IS NULL测试。下例显示如何找出NULL电话号码和空的电话号码:

mysql> SELECT * FROM my_table WHERE phone IS NULL;
mysql> SELECT * FROM my_table WHERE phone = "";

在MySQL中,就像很多其他的SQL服务器一样,你不能索引可以有NULL值的列。你必须声明这样的列为NOT NULL,而且,你不能插入NULL到索引的列中。

当使用ORDER BY时,首先呈现NULL值。如果你用DESC以降序排序,NULL值最后显示。当使用GROUP BY时,所有的NULL值被认为是相等的。

为了有助于NULL的处理,你能使用IS NULL和IS NOT NULL运算符和IFNULL()函数。

对某些列类型,NULL值被特殊地处理。如果你将NULL插入表的第一个TIMESTAMP列,则插入当前的日期和时间。如果你将NULL插入一个AUTO_INCREMENT列,则插入顺序中的下一个数字。

 


精彩图集

赞助商链接