楼主: keaide

[参考文档] MySQL数据库技术

[复制链接]
论坛徽章:
456
ITPUB年度最佳版主
日期:2011-12-28 15:24:18马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有车
日期:2014-02-19 11:55:14ITPUB年度最佳版主
日期:2014-02-19 10:05:27优秀写手
日期:2013-12-18 09:29:09ITPUB社区千里马徽章
日期:2013-06-09 10:15:34ITPUB年度最佳版主
日期:2013-01-30 17:30:25版主9段
日期:2012-07-03 02:21:03
21#
 楼主| 发表于 2006-5-28 19:57 | 只看该作者
还可以键入Control-D 来退出,至少在UNIX 上可以这样。
    1.4.4 发布查询
    在连接到服务器后,就可以发布查询了。本节介绍有关与mysql 交互应该了解的一些知识。为了在mysql 中输入一个查询,只需键入它即可。在查询的结尾处,键入一个分号(“;”)并按Enter 键。分号告诉mysql 该查询是完整的。(如果您喜欢键入两个字符的话,也可以使用“\ g”终止查询。)在键入一个查询之后, mysql 将其发送到服务器上。该服务器处理此查询并将结果送回m y s q l,mysql 将此结果显示出来。下面是一个简单的查询例子和结果:

    它给出当前的日期和时间。(NOW() 函数本身并无多大用处,但可将其用于表达式中。如比较当前日期和其他日期的差异。)
mysql 还在结果中显示行数计数。本书在例子中一般不给出这个计数。因为mysql 需要见到分号才发送查询到服务器,所以在单一的行上不需要键入分号。如果有必要,可将一个查询分为几行,如下所示:

使用道具 举报

回复
论坛徽章:
456
ITPUB年度最佳版主
日期:2011-12-28 15:24:18马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有车
日期:2014-02-19 11:55:14ITPUB年度最佳版主
日期:2014-02-19 10:05:27优秀写手
日期:2013-12-18 09:29:09ITPUB社区千里马徽章
日期:2013-06-09 10:15:34ITPUB年度最佳版主
日期:2013-01-30 17:30:25版主9段
日期:2012-07-03 02:21:03
22#
 楼主| 发表于 2006-5-28 19:57 | 只看该作者
请注意,在键入查询的第一行后,提示符从‘m y s q l’ 变成了‘- >’;这表示mysql 允许继续键入这个查询。这是一个重要的提示,因为如果在查询的末尾忘记了分号,此提示将有助于提醒您查询尚不完整。否则您会一直等下去,心里纳闷为什么mysql 执行查询为什么这么长的时间还没完;而mysql 也搞不清为什么结束查询的键入要花您那么多的时间!
    大部分情况下,用大写字符、小写字符或大小写字符混合键入查询没什么关系。下列查询全是等价的:

    本书中的例子用大写字符表示SQL 关键字和函数名,用小写字符表示数据库、表和列名。
    如果在查询中调用一个函数,在函数名和后跟的圆括号中间不允许有空格,例:

    这两个查询看上去差别不大,但第二个失败了,因为圆括号并没有紧跟在函数名的后面。如果已经开始键入一个多行的查询,而又不想立即执行它,可键入‘\ c’ 来跳过(放弃)它,如:

使用道具 举报

回复
论坛徽章:
456
ITPUB年度最佳版主
日期:2011-12-28 15:24:18马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有车
日期:2014-02-19 11:55:14ITPUB年度最佳版主
日期:2014-02-19 10:05:27优秀写手
日期:2013-12-18 09:29:09ITPUB社区千里马徽章
日期:2013-06-09 10:15:34ITPUB年度最佳版主
日期:2013-01-30 17:30:25版主9段
日期:2012-07-03 02:21:03
23#
 楼主| 发表于 2006-5-28 19:57 | 只看该作者
请注意,提示符又变回了‘m y s q l >’,这表示mysql 为键入的新查询作好了准备。可将查询存储在一个文件中并告诉mysql 从文件中读取查询而不是等待键盘输入。可利用外壳程序键入重定向实用程序来完成这项工作。例如,如果在文件my_file.sql 中存放有查
询,可如下执行这些查询:

    可用这种办法调用任何所需的文件。这里用后缀为“ . s q l”来表示该文件含有SQL 语句。执行mysql 的这种方法将在输入数据到samp_db 数据库时的“增加新记录”中使用。为了装载一个表,让mysql 从某个文件中读取I N S E RT 语句比每次用手工键入这些语句更为方便。
    本教程的其余部分向您提供了许多可以自己试试的查询。这些查询以‘m y s q l >’ 提示为前导后跟结束分号,这些例子通常都给出了查询输出结果。可以按给出的形式键入这些查询,所得到的结果应该与自学材料中的相同。给出的查询中无提示符的或无分号语句结束符的只是用来说明某个要点,不用执行它们。(如果愿意您可以试一下,但如果试的话,请记住给语句末尾加一个分号。)本书后面的章节中,我们一般不给出‘m y s q l >’ 提示或SQL 语句的分号。这样做的原因是为了可以在非mysql 客户机程序的语言环境(如在Perl 脚本中或PHP 脚本中)中发布查询,在这些语言环境中,既无提示符也不需要分号。在专门针对mysql 输入一个查询的场合会作出相应的说明。
    1.4.5 创建数据库
    现在开始创建samp_db 样例数据库及其表,填充这些表并对包含在这些表中的数据进行一些简单的查询。
   使用数据库涉及几个步骤:
   1) 创建(初始化)数据库。
   2) 创建数据库中的表。
   3) 对表进行数据插入、检索、修改或删除。

使用道具 举报

回复
论坛徽章:
456
ITPUB年度最佳版主
日期:2011-12-28 15:24:18马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有车
日期:2014-02-19 11:55:14ITPUB年度最佳版主
日期:2014-02-19 10:05:27优秀写手
日期:2013-12-18 09:29:09ITPUB社区千里马徽章
日期:2013-06-09 10:15:34ITPUB年度最佳版主
日期:2013-01-30 17:30:25版主9段
日期:2012-07-03 02:21:03
24#
 楼主| 发表于 2006-5-28 19:57 | 只看该作者
检索现有数据是对数据库执行的最简单且常见的操作。另外几个最简单且常见的操作是插入新数据、更新或删除现有数据。较少使用的操作是创建表的操作,而最不常用的操作是创建数据库。
   我们将从头开始,先创建数据库,再插入数据,然后对数据进行检索。为了创建一个新的数据库,用mysql 连接到数据库然后发布C R E ATE DATABASE 语句,此语句指定了数据库名:

    在创建表以及对这些表进行各种操作之前,必须先创建samp_db 数据库。创建数据库后,这个新创建的数据库并不是当前数据库。这可从执行下面的查询看出:

    为了使samp_db 成为当前数据库,发布USE 语句即可:

    USE 为少数几个不需要终结符的语句之一,当然,加上终结符也不会出错。HELP 是另一个不需要终结符的语句。如果想了解不需要终结符的语句有哪些,可发布HELP 语句。在发布了USE 语句后,samp_db 成为缺省数据库:

    使数据库成为当前数据库的另一个方法是在激活mysql 时在命令行上指定它,如下所示:

使用道具 举报

回复
论坛徽章:
456
ITPUB年度最佳版主
日期:2011-12-28 15:24:18马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有车
日期:2014-02-19 11:55:14ITPUB年度最佳版主
日期:2014-02-19 10:05:27优秀写手
日期:2013-12-18 09:29:09ITPUB社区千里马徽章
日期:2013-06-09 10:15:34ITPUB年度最佳版主
日期:2013-01-30 17:30:25版主9段
日期:2012-07-03 02:21:03
25#
 楼主| 发表于 2006-5-28 19:58 | 只看该作者
事实上,这是一个命名要使用的数据库的方法。如果需要连接参数可在数据库名前指定。例如,下列两个命令使我们能连接到在本地主机和p i t - v i p e r.snake.net 上的samp_db 数据库上:

    除非另有指定,否则后面的例子都假定在激活mysql 时,在命令行上给出samp_db 使其成为当前数据库。如果激活数据库时忘了在命令行上指定数据库,只需发布USE samp_db 语句即可。
    1.4.6 创建表
    本节中,我们将创建样例数据库samp_db 所需的表。我们首先考虑美国历史同盟需要的表。然后再考虑学分保存方案所需的表。在某些数据库的书籍中,在这里要大讲分析与设计、实体—关系图、标准程序以及诸如此类的东西。这里确实也可以讲这些东西,但是我宁可只讲点实用的东西,比方说,我们的数据库应该是怎样的:数据库中将包含什么内容,每个表中有哪些数据以及由决定如何表示数据而带来的一些问题。这里所作出的关于数据表示的选择并不是绝对的。在其他场合下,可能会选择不同的方式来表示类似的数据,这取决于应用的需要以及打算将数据派何用途。
    1. 美国历史同盟所需的表
    美国历史同盟的表设计相当简单:
    ■ 总统( p r e s i d e n t )表。此表含有描述每位总统的记录。同盟站点上的联机测验要使用这个表。
    ■ 会员( m e m b e r )表。此表用来维护同盟每个会员的当前信息。这些信息将用来建立会员地址名录的书面和联机版本、发送会员资格更新提示等等。
    (1) president表

使用道具 举报

回复
论坛徽章:
456
ITPUB年度最佳版主
日期:2011-12-28 15:24:18马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有车
日期:2014-02-19 11:55:14ITPUB年度最佳版主
日期:2014-02-19 10:05:27优秀写手
日期:2013-12-18 09:29:09ITPUB社区千里马徽章
日期:2013-06-09 10:15:34ITPUB年度最佳版主
日期:2013-01-30 17:30:25版主9段
日期:2012-07-03 02:21:03
26#
 楼主| 发表于 2006-5-28 19:58 | 只看该作者
president 表很简单,因此我们先讨论它。这个表将包含每位美国总统的一些基本信息:
    ■ 姓名。姓名在一个表中可用几种方式表示。如,可以用一个单一的列来存放完整的姓名,或者用分开的列来分别容纳名和姓。当然用单一的列更为简单,但是在使用上会带来一些限制,如:
    ■ 如果先输入只有名的姓名,则不可能对姓进行排序。
    ■ 如果先输入只有姓的姓名,就不可能对具有名的姓名进行显示。
    ■ 难以对姓名进行搜索。例如,如果要搜索某个特定的姓,则必须使用一个特定的模式,并且查找与这个模式匹配的姓名。这样较之只查找姓效率更低和更慢。member 表将使用单独的名和姓的列以避免这些限制。名列还存放中名(注:西方国家的姓名一般将名放在前,姓放在后,而且除了有名和姓外,有时还有中名,这是在位置上介于名和姓之间的中间名字)或首字母。这样应该不会削弱我们可能进行的任何一种排序,因为一般不可能对中名进行排序(或者甚至不会对名进行排序)。姓名即可以“ Bush, George W. ”格式显示,也可以“G e o rge W. B u s h”格式显示。还有一种稍显复杂一点的情形。一个总统( Jimmy Carter)在其姓名的末尾处有一
个“ J r. ”,这时怎样做?根据名字打印的格式,这个总统的姓名显示为“ J a m e s E . C a r t e r, J r.”或“C a r t e r, James E., Jr.”,“J r.”与名和姓都没有关系,因此我们将建另外一个字段来存放姓名的后缀。这表明在试图确定怎样表示数据时,即使一个特殊的值也可能会带来问题。它也表明,为什么在将数据放入数据库前,尽量对数据值的类型进行了解是一个很好的想法。如果对数据了解不够,那么有可能在已经开始使用一个表后,不得不更改该表的结构。这不一定是个灾难,但通常应该避免。
    ■ 出生地(城市和州)。就像姓名一样,出生地也可以用单个列或多个列来表示。使用单列更为简单些,但正如姓名中的情形一样,独立的多个列使我们可以完成用单

使用道具 举报

回复
论坛徽章:
456
ITPUB年度最佳版主
日期:2011-12-28 15:24:18马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有车
日期:2014-02-19 11:55:14ITPUB年度最佳版主
日期:2014-02-19 10:05:27优秀写手
日期:2013-12-18 09:29:09ITPUB社区千里马徽章
日期:2013-06-09 10:15:34ITPUB年度最佳版主
日期:2013-01-30 17:30:25版主9段
日期:2012-07-03 02:21:03
27#
 楼主| 发表于 2006-5-28 19:59 | 只看该作者
1.4.9 删除或更新现有记录
    有时,希望除去某些记录或更改它们的内容。DELETE 和U P D ATE 语句令我们能做到这一点。
    DELETE 语句有如下格式:
    DELETE FROM t b l _ n a m e WHERE 要删除的记录
    WHERE 子句指定哪些记录应该删除。它是可选的,但是如果不选的话,将会删除所有的记录。这意味着最简单的DELETE 语句也是最危险的。
   DELETE FROM tb1_name
   这个查询将清除表中的所有内容。一定要当心!为了删除特定的记录,可用WHERE 子句来选择所要删除的记录。这类似于SELECT 语
句中的WHERE 子句。例如,为了删除president 表中所有出生在Ohio 的总统记录,可用下列查询:

   DELETE 语句中的WHERE 子句的一个限制是只能够引用要删除记录的表中的列。在发布DELETE 语句以前,最好用SELECT 语句测试一下相应的WHERE 子句以确保实际删除的记录就是确实想要删除的记录(而且只删除这些记录)。假如想要删除Te d d yRoosevelt 的记录。下面的查询能完成这项工作吗?

使用道具 举报

回复
论坛徽章:
456
ITPUB年度最佳版主
日期:2011-12-28 15:24:18马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有车
日期:2014-02-19 11:55:14ITPUB年度最佳版主
日期:2014-02-19 10:05:27优秀写手
日期:2013-12-18 09:29:09ITPUB社区千里马徽章
日期:2013-06-09 10:15:34ITPUB年度最佳版主
日期:2013-01-30 17:30:25版主9段
日期:2012-07-03 02:21:03
28#
 楼主| 发表于 2006-5-28 19:59 | 只看该作者
是的,感觉上它能删除您头脑中打算删除的记录。但是,错了,实际上它也能删除Franklin Roosevelt 的记录。如果首先用WHERE 子句检查一下就安全了,如下所示:

    现在我们明白了能选择出所需记录的WHERE 子句了,因此DELETE 查询可正确地构造如下:

    似乎删除一个记录需要做许多工作,不是吗?但是安全第一!(如果想使键盘输入工作尽量少,可利用拷贝和粘贴技术或采用输入行编辑技术。更详细的信息,请参阅“与m y s q l交互的技巧”一节。)为了修改现有记录,可利用U P D ATE 语句,它具有下列格式:
U P D ATE t b l_n a m e SET 要更改的列WHERE 要更新的记录这里的WHERE 子句正如DELETE 语句一样,是可选的,因此如果不指定的话,表中的每个记录都被更新。下面的查询将每个学生的名字都更改为“ G e o rg e”:

    显然,对于这样的查询必须极为小心。一般对正在更新的记录要更为小心。假定近来增加了一个新记录到历史同盟,但是只填写了此实体的少数几个列:

    然后意识到忘了设置其会员终止日期。那么可如下进行设置

使用道具 举报

回复
论坛徽章:
456
ITPUB年度最佳版主
日期:2011-12-28 15:24:18马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有车
日期:2014-02-19 11:55:14ITPUB年度最佳版主
日期:2014-02-19 10:05:27优秀写手
日期:2013-12-18 09:29:09ITPUB社区千里马徽章
日期:2013-06-09 10:15:34ITPUB年度最佳版主
日期:2013-01-30 17:30:25版主9段
日期:2012-07-03 02:21:03
29#
 楼主| 发表于 2006-5-28 19:59 | 只看该作者
可同时更新多个列。下面的语句将更新Jerome 的电子邮件和通信地址:

    还可以通过设置某列的值为N U L L(假设此列允许NULL 值)“不设置”此列。如果在未来的某个时候Jerome 决定支付成为终生会员的会员资格更新费,那么可以设置其记录的终止日期为N U L L(“永久”)以标记他为终生会员。具体设置如下:

    正如DELETE 语句一样,对于U P D AT E,用SELECT 语句测试WHERE 子句以确保选择正确的更新记录是一个好办法。如果选择条件范围太窄或太宽,就会使更新的记录太少或太多。如果您试验过本节中的查询,那么必定已经删除和修改了samp_db 表中的记录。在继续学习下一节的内容以前,应该撤消这些更改。按1 . 4 . 7节“增加新记录”最后的说明重新装载表的内容来完成这项工作。
    1.4.10 改变表的结构
    回顾我们创建历史同盟member 表时缺了一个会员号列,因此我们可以进行一次A LT E RTABLE 语句的练习。需要用A LTER TA B L E,可以对表重新命名,增加或删除列,更改列的类型等等。这里给出的例子是关于怎样增加新列的。有关A LTER TABLE 功能的详细内容,请参阅第3章。增加会员号列到member 表的主要考虑是,其值应该是唯一的,以免各会员条目混淆。A U TO_INCREMENT 列在此是很有用的,因为我们可以在增加新的号码时令MySQL 自动地生成唯一的号码。在C R E ATE TABLE 语句中,这样一个列的说明如下:

使用道具 举报

回复
论坛徽章:
456
ITPUB年度最佳版主
日期:2011-12-28 15:24:18马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有车
日期:2014-02-19 11:55:14ITPUB年度最佳版主
日期:2014-02-19 10:05:27优秀写手
日期:2013-12-18 09:29:09ITPUB社区千里马徽章
日期:2013-06-09 10:15:34ITPUB年度最佳版主
日期:2013-01-30 17:30:25版主9段
日期:2012-07-03 02:21:03
30#
 楼主| 发表于 2006-5-28 20:00 | 只看该作者
对于A LTER TA B L E,相应的句法也是类似的。可执行下列查询增加该列:

    我们已经有一个存放会员号的列,现在怎样分配会员号给member 表中的现有记录呢?很容易!MySQL 已经做了这项工作。在增加一列到某个表时, MySQL 将会用缺省值初始化该列值。对于A U TO_INCREMENT 列,每个行将会产生一个新的顺序号。

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表