第3章:教程目录3.1.连接与断开服务器3.2.输入查询3.3.创建并使用数据库3.3.1.创建并选择数据库3.3.2.创建表3.3.3.将数据装入表中3.3.4.从表检索信息3.4.获得数据库和表的信息3.5.在批处理模式下使用mysql3.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_INCREMENT3.7.孪生项目的查询3.7.1.查找所有未分发的孪生项3.7.2.显示孪生对状态的表3.8.与Apache一起使用MySQL本章通过演示如何使用mysql客户程序创造和使用一个简单的数据库,提供一个MySQL的入门教程。mysql(有时称为“终端监视器”或只是“监视”)是一个交互式程序,允许你连接一个MySQL服务器,运行查询并察看结果。mysql可以用于批模式:你预先把查询放在一个文件中,然后告诉mysql执行文件的内容。本章将介绍使用mysql的两个方法。要想查看由mysql提供的选择项目表,可以用--help选项来调用:shellmysql--help本章假定mysql已经被安装在你的机器上,并且有一个MySQL服务器可以连接。否则,请联络MySQL管理员。(如果你是管理员,则需要查阅本手册的其它章节,例如第5章:数据库管理。)本章描述建立和使用一个数据库的全过程。如果你仅仅对访问一个已经存在的数据库感兴趣,可以跳过描述怎样创建数据库及它所包含的表的章节。由于本章是一个教程,省略了许多细节。关于这里所涉及的主题的详细信息,请查阅本手册的相关章节。3.1.连接与断开服务器为了连接服务器,当调用mysql时,通常需要提供一个MySQL用户名并且很可能需要一个密码。如果服务器运行在登录服务器之外的其它机器上,还需要指定主机名。联系管理员以找出进行连接所使用的参数(即,连接的主机、用户名和使用的密码)。知道正确的参数后,可以按照以下方式进行连接:shellmysql-hhost-uuser-pEnterpassword:********host和user分别代表MySQL服务器运行的主机名和MySQL账户用户名。设置时替换为正确的值。********代表你的密码;当mysql显示Enterpassword:提示时输入它。如果有效,你应该看见mysql提示符后的一些介绍信息:shellmysql-hhost-uuser-pEnterpassword:********WelcometotheMySQLmonitor.Commandsendwith;or\g.YourMySQLconnectionidis25338toserverversion:5.1.2-alpha-standardType'help;'or'\h'forhelp.Type'\c'toclearthebuffer.mysqlmysql提示符告诉你mysql准备为你输入命令。一些MySQL安装允许用户以匿名(未命名)用户连接到本地主机上运行的服务器。如果你的机器是这种情况,你应该能不带任何选项地调用mysql与该服务器连接:shellmysql成功地连接后,可以在mysql提示下输入QUIT(或\q)随时退出:mysqlQUITBye在Unix中,也可以按control-D键断开服务器。在下列章节的大多数例子都假设你连接到了服务器。由mysql提示指明。3.2.输入查询确保你连接上了服务器,如在先前的章节讨论的。连接上服务器并布代表选择了任何数据库,但这样就可以了。知道关于如何查询的基本知识,比马上跳至创建表、给他们装载数据并且从他们检索数据更重要。本节描述输入命令的基本原则,使用几个查询,你能尝试了解mysql是如何工作的。这是一个简单的命令,要求服务器告诉它的版本号和当前日期。在mysql提示输入如下命令并按回车键:mysqlSELECTVERSION(),CURRENT_DATE;+-----------------+--------------+|VERSION()|CURRENT_DATE|+-----------------+--------------+|5.1.2-alpha-log|2005-10-11|+-----------------+--------------+1rowinset(0.01sec)mysql这询问说明mysql的几个方面:·一个命令通常由SQL语句组成,随后跟着一个分号。(有一些例外不需要分号。早先提到的QUIT是一个例子。后面我们将看到其它的例子。)·当发出一个命令时,mysql将它发送给服务器并显示执行结果,然后显示另一个mysql显示它准备好接受其它命令。·mysql用表格(行和列)方式显示查询输出。第一行包含列的标签,随后的行是查询结果。通常,列标签是你取自数据库表的列的名字。如果你正在检索一个表达式而非表列的值(如刚才的例子),mysql用表达式本身标记列。·mysql显示返回了多少行,以及查询花了多长时间,它给你提供服务器性能的一个大致概念。因为他们表示时钟时间(不是CPU或机器时间),并且因为他们受到诸如服务器负载和网络延时的影响,因此这些值是不精确的。(为了简洁,在本章其它例子中不再显示“集合中的行”。)能够以大小写输入关键词。下列查询是等价的:mysqlSELECTVERSION(),CURRENT_DATE;mysqlselectversion(),current_date;mysqlSeLeCtvErSiOn(),current_DATE;这是另外一个查询,它说明你能将mysql用作一个简单的计算器:mysqlSELECTSIN(PI()/4),(4+1)*5;+------------------+---------+|SIN(PI()/4)|(4+1)*5|+------------------+---------+|0.70710678118655|25|+------------------+---------+1rowinset(0.02sec)至此显示的命令是相当短的单行语句。你可以在一行上输入多条语句,只需要以一个分号间隔开各语句:mysqlSELECTVERSION();SELECTNOW();+-----------------+|VERSION()|+-----------------+|5.1.2-alpha-log|+-----------------+1rowinset(0.00sec)+---------------------+|NOW()|+---------------------+|2005-10-1115:15:00|+---------------------+1rowinset(0.00sec)不必全在一个行内给出一个命令,较长命令可以输入到多个行中。mysql通过寻找终止分号而不是输入行的结束来决定语句在哪儿结束。(换句话说,mysql接受自由格式的输入:它收集输入行但直到看见分号才执行。)这里是一个简单的多行语句的例子:mysqlSELECT-USER()-,-CURRENT_DATE;+---------------+--------------+|USER()|CURRENT_DATE|+---------------+--------------+|jon@localhost|2005-10-11|+---------------+--------------+在这个例子中,在输入多行查询的第一行后,要注意提示符如何从mysql变为-,这正是mysql如何指出它没见到完整的语句并且正在等待剩余的部分。提示符是你的朋友,因为它提供有价值的反馈,如果使用该反馈,将总是知道mysql正在等待什么。如果你决定不想执行正在输入过程中的一个命令,输入\c取消它:mysqlSELECT-USER()-\cmysql这里也要注意提示符,在你输入\c以后,它切换回到mysql,提供反馈以表明mysql准备接受一个新命令。下表显示出可以看见的各个提示符并简述它们所表示的mysql的状态:提示符含义mysql准备好接受新命令。-等待多行命令的下一行。'等待下一行,等待以单引号(“'”)开始的字符串的结束。等待下一行,等待以双引号(“”)开始的字符串的结束。`等待下一行,等待以反斜点(‘`’)开始的识别符的结束。/*等待下一行,等待以/*开始的注释的结束。当你打算在一个单行上发出一个命令时,通常会“偶然”出现多行语句,但是没有终止分号。在这种情况中,mysql等待进一步输入:mysqlSELECTUSER()-如果出现这种情况(你认为输完了语句,但是只有一个-提示符响应),很可能mysql正在等待分号。如果你没有注意到提示符的提示,在意识到你需要做什么之前,你可能会呆坐一会儿。输入一个分号完成语句,mysql将执行:mysqlSELECTUSER()-;+---------------+|USER()|+---------------+|jon@localhost|+---------------+在字符串收集期间将出现'和提示符(提示MySQL正等待字符串的结束)。在MySQL中,可以写由‘'’或‘’字符括起来的字符串(例如,'hello'或goodbye),并且mysql允许输入跨越多行的字符串。当看到一个'或提示符时,这意味着已经输入了包含以‘'’或‘’括号字符开始的字符串的一行,但是还没有输入终止字符串的匹配引号。这显示你粗心地省掉了一个引号字符。例如:mysqlSELECT*FROMmy_tableWHEREname='SmithANDage30;'如果你输入SELECT语句,然后按Enter(回车)键并等待结果,什么都没有出现。不要惊讶,“为什么该查询这么长呢?”,注意提示符提供的线索。它告诉你mysql期望见到一个未终止字符串的余下部分。(你看见语句中的错误吗?字符串Smith丢掉了第二个引号。)走到这一步,你该做什么?最简单的是取消命令。然而,在这种情况下,你不能只是输入\c,因为mysql作为它正在收集的字符串的一部分来解释它!相反,应输入关闭的引号字符(这样mysql知道你完成了字符串),然后输入\c:mysqlSELECT*FROMmy_tableWHEREname='SmithANDage30;''\cmysql提示符回到mysql,显示mysql准备好接受一个新命令了。`提示符类似于'和提示符,但表示你已经开始但没有结束以`开始的识别符。知道'和提示符的含义很重要,因为如果你错误地输入一个未终止的字符串,任何后面输入的行将要被mysql忽略--包括包含QUIT的行!这可能令人相当困惑,特别是如果取消当前命令前还不知道你需要提供终止引号。3.3.创建并使用数据库3.3.1.创建并选择数据库3.3.2.创建表3.3.3.将数据装入表中3.3.4.从表检索信息知道怎样输入命令,便可以访问数据库了。假定在你的家(你的“动物园”)中有很多宠物,并且你想跟踪关于它们各种类型的信息。你可以通过创建表来保存你的数据并根据所需要的信息装载他们,然后你可以从表中检索数据来回答关于动物不同种类的问题。本节显示如何做到所有这些事情:·创建数据库·创建数据库表·装载数据到数据库表·以各种方法从表中检索数据·使用多个表动物园数据库很简单(特意的),但是不难把它想象成可能用到类似数据库的真实世界情况。例如,农夫可以使用这样的一个数据库来追踪家畜,或者兽医可以用它跟踪病畜记录。从MySQL网址上可以获得后面章节中将用到的含有部分查询和样例数据的动物园分发。有tar压缩格式(