文字
分享

第3章:教程

目录

3.1. 连接与断开服务器
3.2. 输入查询
3.3. 创建并使用数据库
3.3.1. 创建并选择数据库
3.3.2. 创建表
3.3.3. 将数据装入表中
3.3.4. 从表检索信息
3.4. 获得数据库和表的信息
3.5. 在批处理模式下使用mysql
3.6. 常用查询的例子
3.6.1. 列的最大值
3.6.2. 拥有某个列的最大值的行
3.6.3. 列的最大值:按组
3.6.4. 拥有某个字段的组间最大值的行
3.6.5. 使用用户变量
3.6.6. 使用外键
3.6.7. 根据两个键搜索
3.6.8. 根据天计算访问量
3.6.9. 使用AUTO_INCREMENT
3.7. 孪生项目的查询
3.7.1. 查找所有未分发的孪生项
3.7.2. 显示孪生对状态的表
3.8. 与Apache一起使用MySQL

本章通过演示如何使用mysql客户程序创造和使用一个简单的数据库,提供一个MySQL的入门教程。mysql(有时称为“终端监视器”或只是“监视”)是一个交互式程序,允许你连接一个MySQL服务器,运行查询并察看结果。mysql可以用于批模式:你预先把查询放在一个文件中,然后告诉mysql执行文件的内容。本章将介绍使用mysql的两个方法。

要想查看由mysql提供的选择项目表,可以用--help选项来调用:

1

<span>shell> </span><span><b><span>mysql --help</span></b></span>

本章假定mysql已经被安装在你的机器上,并且有一个MySQL服务器可以连接。否则,请联络MySQL管理员。(如果是管理员,则需要查阅本手册的其它章节,例如第5章:数据库管理。)

本章描述建立和使用一个数据库的全过程。如果你仅仅对访问一个已经存在的数据库感兴趣,可以跳过描述怎样创建数据库及它所包含的表的章节。

由于本章是一个教程,省略了许多细节。关于这里所涉及的主题的详细信息,请查阅本手册的相关章节。

3.1. 连接与断开服务器

为了连接服务器,当调用mysql时,通常需要提供一个MySQL用户名并且很可能需要一个 密码。如果服务器运行在登录服务器之外的其它机器上,还需要指定主机名。联系管理员以找出进行连接所使用的参数 (即,连接的主机、用户名和使用的密码)。知道正确的参数后,可以按照以下方式进行连接:

1

<span>shell> </span><span><b><span>mysql -h <i>host</i> -u <i>user</i> -p</span></b></span>

1

<span>Enter password: </span><span><b><span>********</span></b></span>

hostuser分别代表MySQL服务器运行的主机名和MySQL账户用户名。设置时替换为正确的值。******** 代表你的密码;当mysql显示Enter password:提示时输入它。

如果有效,你应该看见mysql>提示符后的一些介绍信息:

1

<span>shell> </span><span><b><span>mysql -h <i>host</i> -u <i>user</i> -p</span></b></span>

1

<span>Enter password: </span><span><b><span>********</span></b></span>

1

<span>Welcome to the MySQL monitor.  Commands end with ; or \g.</span>

1

<span>Your MySQL connection id is 25338 to server version: 5.1.2-alpha-standard</span>

1

<span> </span>

1

<span>Type 'help;' or '\h' for help. Type '\c' to clear the buffer.</span>

1

<span> </span>

1

<span>mysql></span>

mysql> 提示符告诉你mysql准备为你输入命令。

一些MySQL安装允许用户以匿名(未命名)用户连接到本地主机上运行的服务器。如果你的机器是这种情况,你应该能不带任何选项地调用mysql与该服务器连接:

1

<span>shell> </span><span><b><span>mysql</span></b></span>

成功地连接后,可以在mysql>提示下输入QUIT (\q)随时退出:

1

<span>mysql> </span><span><b><span>QUIT</span></b></span>

1

<span>Bye</span>

Unix中,也可以按control-D键断开服务器。

在下列章节的大多数例子都假设你连接到了服务器。由mysql>提示指明。

3.2. 输入查询

确保你连接上了服务器,如在先前的章节讨论的。连接上服务器并布代表选择了任何数据库,但这样就可以了。知道关于如何查询的基本知识,比马上跳至创建表、给他们装载数据并且从他们检索数据更重要。本节描述输入命令的基本原则,使用几个查询,你能尝试了解mysql是如何工作的。

这是一个简单的命令,要求服务器告诉它的版本号和当前日期。在mysql>提示输入如下命令并按回车键:

1

<span>mysql> </span><span><b><span>SELECT VERSION(), CURRENT_DATE;</span></b></span>

1

<span>+-----------------+--------------+</span>

1

<span>| VERSION()       | CURRENT_DATE |</span>

1

<span>+-----------------+--------------+</span>

1

<span>| 5.1.2-alpha-log | 2005-10-11   |</span>

1

<span>+-----------------+--------------+</span>

1

<span>1 row in set (0.01 sec)</span>

1

<span>mysql></span>

这询问说明mysql的几个方面:

·         一个命令通常由SQL语句组成,随后跟着一个分号。(有一些例外不需要分号。早先提到的QUIT是一个例子。后面我们将看到其它的例子。)

·         当发出一个命令时,mysql将它发送给服务器并显示执行结果,然后显示另一个mysql>显示它准备好接受其它命令。

·         mysql用表格(行和列)方式显示查询输出。第一行包含列的标签,随后的行是查询结果。通常,列标签是你取自数据库表的列的名字。如果你正在检索一个表达式而非表列的值(如刚才的例子)mysql用表达式本身标记列。

·         mysql显示返回了多少行,以及查询花了多长时间,它给你提供服务器性能的一个大致概念。因为他们表示时钟时间(不是 CPU 或机器时间),并且因为他们受到诸如服务器负载和网络延时的影响,因此这些值是不精确的。(为了简洁,在本章其它例子中不再显示“集合中的行”。)

能够以大小写输入关键词。下列查询是等价的:

1

<span>mysql> </span><span><b><span>SELECT VERSION(), CURRENT_DATE;</span></b></span>

1

<span>mysql> </span><span><b><span>select version(), current_date;</span></b></span>

1

<span>mysql> </span><span><b><span>SeLeCt vErSiOn(), current_DATE;</span></b></span>

这是另外一个查询,它说明你能将mysql用作一个简单的计算器:

1

<span>mysql> </span><span><b><span>SELECT SIN(PI()/4), (4+1)*5;</span></b></span>

1

<span>+------------------+---------+</span>

1

<span>| SIN(PI()/4)      | (4+1)*5 |</span>

1

<span>+------------------+---------+</span>

1

<span>| 0.70710678118655 |      25 |</span>

1

<span>+------------------+---------+</span>

1

<span>1 row in set (0.02 sec)</span>

至此显示的命令是相当短的单行语句。你可以在一行上输入多条语句,只需要以一个分号间隔开各语句:

1

<span>mysql> </span><span><b><span>SELECT VERSION(); SELECT NOW();</span></b></span>

1

<span>+-----------------+</span>

1

<span>| VERSION()       |</span>

1

<span>+-----------------+</span>

1

<span>| 5.1.2-alpha-log |</span>

1

<span>+-----------------+</span>

1

<span>1 row in set (0.00 sec)</span>

1

<span> </span>

1

<span>+---------------------+</span>

1

<span>| NOW()               |</span>

1

<span>+---------------------+</span>

1

<span>| 2005-10-11 15:15:00 |</span>

1

<span>+---------------------+</span>

1

<span>1 row in set (0.00 sec)</span>

不必全在一个行内给出一个命令,较长命令可以输入到多个行中。mysql通过寻找终止分号而不是输入行的结束来决定语句在哪儿结束。(换句话说,mysql接受自由格式的输入:它收集输入行但直到看见分号才执行。)

这里是一个简单的多行语句的例子:

1

<span>mysql> </span><span><b><span>SELECT</span></b></span>

1

<span>    -> </span><span><b><span>USER()</span></b></span>

1

<span>    -> </span><span><b><span>,</span></b></span>

1

<span>    -> </span><span><b><span>CURRENT_DATE;</span></b></span>

1

<span>+---------------+--------------+</span>

1

<span>| USER()        | CURRENT_DATE |</span>

1

<span>+---------------+--------------+</span>

1

<span>| jon@localhost | 2005-10-11   |</span>

1

<span>+---------------+--------------+</span>

在这个例子中,在输入多行查询的第一行后,要注意提示符如何从mysql>变为->,这正是mysql如何指出它没见到完整的语句并且正在等待剩余的部分。提示符是你的朋友,因为它提供有价值的反馈,如果使用该反馈,将总是知道mysql正在等待什么。

如果你决定不想执行正在输入过程中的一个命令,输入\c取消它:

1

<span>mysql> </span><span><b><span>SELECT</span></b></span>

1

<span>    -> </span><span><b><span>USER()</span></b></span>

1

<span>    -> </span><span><b><span>\c</span></b></span>

1

<span>mysql></span>

这里也要注意提示符,在你输入\c以后,它切换回到mysql>,提供反馈以表明mysql准备接受一个新命令。

下表显示出可以看见的各个提示符并简述它们所表示的mysql的状态:

提示符

含义

mysql>

准备好接受新命令。

->

等待多行命令的下一行。

'>

等待下一行,等待以单引号(')开始的字符串的结束。

">

等待下一行,等待以双引号(")开始的字符串的结束。

`>

等待下一行,等待以反斜点(`)开始的识别符的结束。

LEFT JOIN twin_data AS td ON tp.id = td.id AND tp.tvab = td.tvab LEFT JOIN informant_data AS id ON tp.id = id.id AND tp.tvab = id.tvab LEFT JOIN harmony AS h ON tp.id = h.id AND tp.tvab = h.tvab LEFT JOIN lentus AS l ON tp.id = l.id AND tp.tvab = l.tvab LEFT JOIN twin_data AS td2 ON p2.id = td2.id AND p2.tvab = td2.tvab LEFT JOIN informant_data AS id2 ON p2.id = id2.id AND p2.tvab = id2.tvab LEFT JOIN harmony AS h2 ON p2.id = h2.id AND p2.tvab = h2.tvab LEFT JOIN lentus AS l2 ON p2.id = l2.id AND p2.tvab = l2.tvab, person_data AS p1, person_data AS p2, postal_groups AS pg WHERE p1.id = tp.id AND p1.tvab = tp.tvab AND p2.id = p1.id AND p2.ptvab = p1.tvab AND tp.survey_no = 5 AND (p2.dead = 0 OR p2.dead = 9 OR (p2.dead = 1 AND (p2.death_date = 0 OR (((TO_DAYS(p2.death_date) - TO_DAYS(p2.birthday)) / 365) >= 65)))) AND ( (td.future_contact = 'Yes' AND td.suspect = 2) OR (td.future_contact = 'Yes' AND td.suspect = 1 AND id.suspect = 1) OR (ISNULL(td.suspect) AND id.suspect = 1 AND id.future_contact = 'Yes') OR (td.participation = 'Aborted' AND id.suspect = 1 AND id.future_contact = 'Yes') OR (td.participation = 'Aborted' AND ISNULL(id.suspect) AND p2.dead = 0)) AND l.event = 'Finished' AND SUBSTRING(p1.postal_code, 1, 2) = pg.code AND (h.nurse IS NULL OR h.nurse=00 OR h.doctor=00) AND NOT (h.status = 'Refused' OR h.status = 'Aborted' OR h.status = 'Died' OR h.status = 'Other') ORDER BY tvid;

一些解释:

·         CONCAT(p1.id, p1.tvab) + 0 AS tvid

我们想要在idtvab的连接上以数字顺序排序。结果加0使得MySQL把结果变为一个数字。

·         id

这标识一对孪生。它是所有表中的一个键。

·         tvab

这标识孪生中的一个。它的值为12

·         ptvab

这是tvab一个逆运算。当tvab1,它是2,反之亦然。它用来保存输入并且使MySQL优化查询更容易。

这个查询表明,怎样用联结(p1p2)从同一个表中查找表。在例子中,这被用来检查孪生的一个是否在65岁前死了。如果如此,行不返回值。

上述所有孪生信息存在于所有表中。我们对id,tvab(所有表)和id,ptvab (person_data) 上采用键以使查询更快。

在我们的生产机器上(一台200MHz UltraSPARC),这个查询返回大约 150-200 行并且时间不超过一秒。

行数

person_data

71074

lentus

5291

twin_project

5286

twin_data

2012

informant_data

663

harmony

381

postal_groups

100

3.7.2. 显示孪生对状态的表

每一次会面以一个称为event的状态码结束。下面显示的查询被用来显示按事件组合的所有孪生的表。这表明多少对孪生已经完成,多少对的其中之一已完成而另一个拒绝了,等等。

1

<span>SELECT</span>

1

<span>        t1.event,</span>

1

<span>        t2.event,</span>

1

<span>        COUNT(*)</span>

1

<span>FROM</span>

1

<span>        lentus AS t1,</span>

1

<span>        lentus AS t2,</span>

1

<span>        twin_project AS tp</span>

1

<span>WHERE</span>

1

<span>        </span>

1

<span>        t1.id = tp.id</span>

1

<span>        AND t1.tvab=tp.tvab</span>

1

<span>        AND t1.id = t2.id</span>

1

<span>        </span>

1

<span>        AND tp.survey_no = 5</span>

1

<span>        </span>

1

<span>        AND t1.tvab='1' AND t2.tvab='2'</span>

1

<span>GROUP BY</span>

1

<span>        t1.event, t2.event;</span>

3.8. 与Apache一起使用MySQL

还有一些项目,你可以从MySQL数据库鉴别用户,并且你还可以将日志文件写入MySQL数据库表。

你可以将以下内容放到Apache配置文件中,更改Apache日志格式,使MySQL更容易读取:

1

<span>LogFormat \</span>

1

<span>        "\"%h\",%{%Y%m%d%H%M%S}t,%>s,\"%b\",\"%{Content-Type}o\",  \</span>

1

<span>        \"%U\",\"%{Referer}i\",\"%{User-Agent}i\""</span>

要想将该格式的日志文件装载到MySQL,你可以使用以下语句:

1

<span>LOAD DATA INFILE '</span><span><i><span>/local/access_log</span></i></span><span>' INTO TABLE </span><span><i><span>tbl_name</span></i></span>

1

<span>FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' ESCAPED BY '\\'</span>

所创建的表中的列应与写入日志文件的LogFormat行对应。


这是MySQL参考手册的翻译版本,关于MySQL参考手册,请访问dev.mysql.com。 原始参考手册为英文版,与英文版参考手册相比,本翻译版可能不是最新的。

Linux公社(www.linuxidc.com)于2006年9月25日注册并开通网站,Linux现在已经成为一种广受关注和支持的一种操作系统,IDC是互联网数据中心,LinuxIDC就是关于Linux的数据中心。
 
Linux公社是专业的Linux系统门户网站,实时发布最新Linux资讯,包括Linux、Ubuntu、Fedora、RedHat、红旗Linux、Linux教程、Linux认证、SUSE Linux、Android、Oracle、Hadoop、CentOS等技术。