[译] MySQL参考手册·下篇

目录

  1. 获取数据库和表的信息
  2. 使用mysql的批处理模式
  3. 命令行查询示例

4. 获取数据库和表的信息

一旦你忘记了数据库或者表的名字,或者表的结构(举个例子,字段的全称怎么拼?),MySQL为我们解决了这些问题,他提供了几个数据库和表支持的很实用的语句来帮助我们。

在前几章里,你学会了使用 SHOW DATABASES 显示全部数据库的列表。那么如何找到当前正在使用哪一个数据库呢?使用 DATABASES() 函数:

mysql> SELECT DATABASE();
+------------+
| DATABASE() |
+------------+
| menagerie  |
+------------+

如果你没有选择任何数据库,则上方的查询结果为NULL。

为了查询出当前数据库包含那些表(举个例子,当你不是很确定表的名字怎么拼写的时候。)。使用如下语句:

mysql> SHOW TABLES;
+---------------------+
| Tables_in_menagerie |
+---------------------+
| event                       |
| pet                           |
+---------------------+

返回的查询结果的字段名总是 Tables_in_db_name ,其中 db_name 就是你的数据库的名字,获取更多帮助信息访问 Section 13.7.5.37, “SHOW TABLES Syntax”

如果你想要查询表的结构,DESCRIBE 语句就很实用,他能显示出表的每一个字段的信息。

mysql> DESCRIBE pet;
+---------+-------------+------+-----+---------+-------+
| Field       | Type            | Null   | Key  | Default  | Extra   |
+---------+-------------+------+-----+---------+-------+
| name     | varchar(20) | YES     |         | NULL    |       |
| owner     | varchar(20) | YES    |         | NULL    |       |
| species   | varchar(20) | YES     |         | NULL    |       |
| sex          | char(1)        | YES     |         | NULL    |       |
| birth       | date            | YES     |          | NULL    |       |
| death      | date            | YES     |         | NULL    |       |
+---------+-------------+------+-----+---------+-------+

Field 列指明了 字段的名称。Type列是数据类型,NULL表示该字段可以包含NULL,key 表示当前字段是否为整张表的索引,Default 指明当前字段如果在插入数据时不填则使用什么默认值。Extra 显示了每一个字段的额外信息:如果这一字段需要自增 AUTO_INCREMENT ,那么会填入Extra 中。

DESCDESCRIBE 的简写形式,获取帮助请前往 Section 13.8.1, “DESCRIBE Syntax”

你可以获得已经存在的一张使用 CREATE TABLE 语句创建的表在创建时所必须的关键字,可是使用 SHOW CREATE TABLE 语句来获得。关于该命令的更多帮助信息前往Section 13.7.5.10, “SHOW CREATE TABLE Syntax”.

如果你在一张表中建立了索引,SHOW INDEX FROM tbl_name,获取更多帮助信息前往 Section 13.7.5.22, “SHOW INDEX Syntax”

5. 使用mysql的批处理模式

在前面的章节,你使用mysql交互式输入语句和浏览查询结果。你也可以在批处理模式中执行mysql。为了达到这一目的,将你希望执行的语句写入文件中,并告诉msql读取该文件,将文件内容输入到此处。

shell> mysql < batch-file

如果你在Windows平台下编写文件,那么文件中将会出现一些奇怪的字符,你可以这样做:

C:\> mysql -e "source batch-file"

当你以这种方法使用mysql时,你也就创建了一个相当于脚本文件的东西,然后执行这个脚本。

如果你想要在脚本抛出错误时仍然继续执行,你应当使用 –force 命令行参数。

使用脚本的优势有哪些?有以下几点:

如果你需要执行重复的查询任务(比如说,每天或者每周都要执行重复的任务),将他做成一个脚本你就不再需要每次执行他的时候还要再输入一次。你可以通过拷贝(或者稍加修改)的方式直接从现存的查询语句生成一个新的查询语句。

批处理模式对很长的多行查询语句非常有帮助。如果你犯了错误,你不在需要重新在命令行从头写一遍,只需要编辑你的脚本将错误的位置变成正确的,然后告诉mysql在一次执行他即可。

如果你有一个会输出很多结果的查询,你可以通过翻页的形式翻阅查询结果,而不是让查询结果一下子滚动到屏幕的顶端。

shell> mysql < batch-file | more

你可以贡献你的脚本给别人,如此以来别人也可以执行你写的查询语句。

一些情况不允许使用交互式输入,举个例子,当你需要定时的执行查询语句,你就必须让机器自动的执行批处理脚本。

当你在批处理模式和交互式输入模式执行mysql语句是。两者默认的输出格式是不相同的(显而易见)。举个例子,我们执行并输出 SELECT DISTINCT species FROM pet 看起来像这样:

+---------+
| species   |
+---------+
| bird        |
| cat          |
| dog        |
| hamster |
| snake     |
+---------+

批处理模式中,输出内容看起来像这样:

species
bird
cat
dog
hamster
snake

如果你想要在批处理模式中得到像交互式模式的格式,使用 mysql -t ,输出执行的脚本文件,使用 mysql -v

你也可以通过mysql的提示符来使用脚本,例如:

mysql> source filename;
mysql> \. filename

获取更多帮助信息前往Section 4.5.1.5, “Executing SQL Statements from a Text File”

6. 命令行查询示例

以下是解决一些MYSQL命令问题的示例。

一些示例使用 shop 这张表,每一个售货员销售的每一件商品(条目数量)的价格。假设每一个售货员对每一件商品都有固定的交易价格,并且(商品,售货员)是记录的主键。

打开命令行工具mysql,并且选择一个数据库:

> mysql your-database-name

(在一些MYSQL的安装环境中,你可以使用叫做 test 的数据库)。

你可是使用如下语句创建一张表:

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));
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);

在开始探讨上面语句之前,整张表应该包含如下的内容:

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   |
+---------+--------+-------+

一组数据中的最大值

“最大值是多少?”

SELECT MAX(article) AS article FROM shop;

+---------+
| article     |
+---------+
|       4       |
+---------+

拥有最大值的整条记录

任务:查询出最贵的商品的数两,交易额和价格。

使用子查询是很容易办到的:

SELECT article, dealer, price
FROM   shop
WHERE  price=(SELECT MAX(price) FROM shop);

+---------+--------+-------+
| article     | dealer  | price   |
+---------+--------+-------+
|    0004    | D          | 19.95 |
+---------+--------+-------+

另一种结局办法是使用 LEFT JOIN 或者 将所有的记录根据价格逆向排序然后得到第一条记录,其中使用到了MYSQL指明条件的 LIMIT 子句。

SELECT s1.article, s1.dealer, s1.price
FROM shop s1
LEFT JOIN shop s2 ON s1.price < s2.price
WHERE s2.article IS NULL;

SELECT article, dealer, price
FROM shop
ORDER BY price DESC
LIMIT 1;

注意:如果这里有几件最贵的商品,每一件商品价值19.95,那么 LIMIT 解决方案仅仅能获取其中一件。

每一组商品的最大值

任务:查询出每一件商品的最大值

SELECT article, MAX(price) AS price
FROM   shop
GROUP BY article;

+---------+-------+
| article    | price    |
+---------+-------+
|    0001   |  3.99    |
|    0002   | 10.99   |
|    0003   |  1.69    |
|    0004   | 19.95   |
+---------+-------+

写在最后:

距离翻译完成socket.io的官方文档有一点时间了,这次翻译mysql的官方参考手册,感触最深的是:国外的文档会把每一个知识点用最最最生动形象的例子和容易被人理解方式的从各种角度反反复复的讲了一遍又一遍(小孩子都能听懂了!甚至稍微有些啰嗦,),目的是力求学生真的学会了搞懂了。国内的有些教程则喜欢把原本挺简单的东西给复杂化,甚至故弄玄虚。

请使用Github账号登录留言