查询数据

虽然花了不少时间,但我们终于进入了与数据库有关的最令人兴奋也是最有用的部分:查询数据。查询数据是指要求 MySQL 从指定的表中返回记录,并根据一组规则过滤这些结果。你也可以选择获取特定字段,而不是整行。为了查询数据,我们将使用 SELECT 命令,如下所示:

mysql> SELECT firstname, surname, type FROM customer;
+-----------+---------+---------+
| firstname | surname | type    |
+-----------+---------+---------+
| Han       | Solo    | premium |
| James     | Kirk    | basic   |
+-----------+---------+---------+
2 rows in set (0.00 sec)

查询数据最简单的方法之一是在 SELECT 后指定感兴趣的字段,并用 FROM 关键字指定表。由于我们没有在查询中添加任何过滤器(主要称为条件),因此我们获得了所有记录。有时,这是我们想要的行为,但最常见的做法是在查询中添加条件,以便只检索我们需要的记录。使用 WHERE 关键字可以实现这一目的。

mysql> SELECT firstname, surname, type FROM customer
-> WHERE id = 1;
+-----------+---------+---------+
| firstname | surname | type    |
+-----------+---------+---------+
| Han       | Solo    | premium |
+-----------+---------+---------+
1 row in set (0.00 sec)

添加条件与我们在 PHP 中创建布尔表达式非常相似。我们将指定字段的名称、运算符和值,MySQL 将只检索对该表达式返回 true 的记录。在本例中,我们查询 ID 为 1 的客户,MySQL 返回一条记录:ID 恰好为 1 的客户。

常见的查询是获取以某个文本开头的书籍。我们不能用任何比较操作符(如 = 和 < 或 >)来构造这个表达式,因为我们只想匹配字符串的一部分。为此,MySQL 提供了 LIKE 操作符,它可以使用包含通配符的字符串。通配符是一个代表规则的字符,可以匹配规则后面的任意字符数。例如,% 通配符代表任意数量的字符,因此使用 1% 字符串将匹配任何以 1 开头且后面跟有任意数量或字符的字符串,从而匹配 1984 或 1Q84 等字符串。下面是一个例子:

mysql> SELECT title, author, price FROM book
    -> WHERE title LIKE "1%";
+------------+-----------------+-------+
| title      | author          | price |
+------------+-----------------+-------+
| 1984       | George Orwell   | 7.5   |
| 1Q84       | Haruki Murakami | 9.75  |
| 19 minutes | Jodi Picoult    | 10    |
+------------+-----------------+-------+
3 rows in set (0.00 sec)

我们要求查找书名以 1 开头的所有书籍,结果得到了三行。你可以想象这个运算符有多有用,尤其是当我们在应用程序中实现搜索工具时。

与 PHP 一样,MySQL 也允许添加逻辑运算符,即接受操作数并执行逻辑运算,返回布尔值的运算符。与 PHP 一样,最常见的逻辑运算符是 ANDOR。如果两个表达式都为真,则 AND 返回值为真;如果其中一个操作数为真,则 OR 返回值为真。下面我们来看一个例子:

mysql> SELECT title, author, price FROM book
    -> WHERE title LIKE "1%" AND stock > 0;
+------------+-----------------+-------+
| title      | author          | price |
+------------+-----------------+-------+
| 1984       | George Orwell   | 7.5   |
| 1Q84       | Haruki Murakami | 9.75  |
+------------+-----------------+-------+
2 rows in set (0.00 sec)

这个例子与上一个例子非常相似,但我们增加了一个条件。我们要求输入以 1 开头的所有书目,以及是否有库存。这就是其中一本书不显示的原因,因为它不满足这两个条件。您可以根据需要使用逻辑运算符添加任意多个条件,但要记住 AND 运算符优先于 OR 运算符。如果想改变这种优先级,可以像在 PHP 中一样,用括号将表达式包起来。

到目前为止,我们在查询数据时已经检索了特定字段,但我们还可以查询给定表中的所有字段。为此,我们只需在 SELECT 中使用 * 通配符。让我们通过以下代码选择客户的所有字段:

mysql> SELECT * FROM customer \G
*************************** 1. row ***************************
id: 1
firstname: Han
surname: Solo
email: han@tatooine.com
type: premium
*************************** 2. row ***************************
id: 2
firstname: James
surname: Kirk
email: enter@prise
type: basic
2 rows in set (0.00 sec)

除了字段,您还可以检索更多信息。例如,可以使用 COUNT 来检索满足给定条件的行数,而不是检索所有列。这种方法比检索所有列然后进行计数要快,因为可以节省时间,减少响应的大小。让我们来看看它是如何运行的:

mysql> SELECT COUNT(*) FROM borrowed_books
    -> WHERE customer_id = 1 AND end IS NOT NULL;
+----------+
| COUNT(*) |
+----------+
| 1        |
+----------+
1 row in set (0.00 sec)

正如你所注意到的,答案是 1,这意味着只有一本借来的书满足条件。但是,检查一下条件,你会发现我们使用了另一个熟悉的逻辑运算符: NOT。NOT 否定表达式,就像 PHP 中的!一样。还要注意的是,我们没有使用等号来与空值进行比较。在 MySQL 中,要与 NULL 比较,必须使用 IS 而不是等号。因此,当借阅图书的结束日期不是空值时,第二个条件就满足了。

在本节的最后,让我们在查询数据时再增加两个功能。第一个功能是指定返回记录的顺序。要做到这一点,只需使用关键字 ORDER BY,后面跟上要排序的字段名称即可。您还可以指定是以默认的升序模式排序,还是以降序模式排序,这可以通过附加 DESC 来实现。另一个功能是使用 LIMIT 限制要返回的行数和要检索的行数。现在,运行以下程序:

mysql> SELECT id, title, author, isbn FROM book
    -> ORDER BY title LIMIT 4;
+----+-------------+-----------------+---------------+
| id | title       | author          | isbn          |
+----+-------------+-----------------+---------------+
| 5  | 19 minutes  | Jodi Picoult    | 9780753179246 |
| 1  | 1984        | George Orwell   | 9780882339726 |
| 2  | 1Q84        | Haruki Murakami | 9789724621081 |
| 3  | Animal Farm | George Orwell   | 9780736692427 |
+----+-------------+-----------------+---------------+
4 rows in set (0.00 sec)