查询数据
虽然花了不少时间,但我们终于进入了与数据库有关的最令人兴奋也是最有用的部分:查询数据。查询数据是指要求 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 一样,最常见的逻辑运算符是 AND
和 OR
。如果两个表达式都为真,则 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)