Mysql培训经典教程第三章_第1页
Mysql培训经典教程第三章_第2页
Mysql培训经典教程第三章_第3页
Mysql培训经典教程第三章_第4页
Mysql培训经典教程第三章_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、本章要点: 服务器的启动 客户机与服务器的连接 一些 SQL 语句的功能 一些专用客户机的使用 在我们阅读了前两章,了解了 MySQL 并且安装成功 MySQL 服务器之后,可以 开始学习这个强大而复杂的系统。 客户机/服务器的体系结构是 MySQL 的特点之一,我们首先需要熟悉 MySQL 客 户机和服务器的使用,了解客户机如何与服务器连接。 客户机使用 SQL 语言与 MySQL 服务器通信。为了与 MySQL 服务器进行通信, 必须熟练掌握 SQL。例如,在使用诸如 mysql 客户机这样的程序时,其功能首先是 作为一种发送 SQL 语句给服务器执行的工具。而且,如果编写使用编程语言所提

2、供 的 MySQL 接口的程序时,也必须熟悉 SQL 语言,因为需要发送 SQL 语句与服务 器沟通。 本章也将对大部分 SQL 语句作一个详细的描述。本章涉及的 SQL 语句多数都是 和数据的存储、检索有关,其它少量的 SQL 语句将在其它各章陆续介绍。 数数数数数数据据据据据据库库库库库库的的的的的的基基基基基基本本本本本本操操操操操操作作作作作作 第第第第3 3 3章章章章 3.1 MySQL 的启动与终止 由于 MySQL 服务器具有多种安装分发,而且能够运行在多种操作平台之上,因此 它的启动与停止的方法也多种多样。你可以根据实际情况使用其中的一种。在你安装、 升级或者维护系统时,你可

3、能需要多次启动和终止服务器,你需要了解启动和终止服务 器的方方面面。 3.1.1 直接运行守护程序 1、你可以采用的方法 一般的,你可以有以下几种选择启动 MySQL 服务器,它们的功能和用法几乎是相 同的,所以一起在这里介绍: 直接使用 MySQL 守护程序 mysqld 启动数据库系统,尤其是 Win32 平台上的分 发,这是因为,在 Win32 平台上没有 mysql.server 等服务器脚本可用。 通过调用 safe_mysqld 脚本,它接受与 mysqld 相同的参数,并试图为 mysqld 决 定正确的选项,然后选择用那些运行它。 2、脚本或者守护程序的存放位置 对于二进制分发

4、的安装,mysqld 守护程序安装在 MySQL 安装目录的 bin 目录下, 或者可在 MySQL 源代码分发的 libexec 目录下找到,缺省为/usr/local/libexec/。对于 rpm 分发,mysqld 应该位于 PATH 变量决定的程序搜索路径中,因此可以直接引用。 safe_mysqld 仍旧是一个脚本,并且只存在于 Unix 平台的分发中。safe_mysqld 脚本 安装在 MySQL 安装目录的 bin 目录下,或可在 MySQL 源代码分发的 scripts 目录下找 到。对于 rpm 分发,该脚本应该位于 PATH 变量决定的程序搜索路径中,因此可以直接 引用

5、。 3、为什么要使用 safe_mysqld 脚本 safe_mysqld 接受和 mysqld 同样的参数,并试图确定服务器程序和数据库目录的位 置,然后利用这些位置调用服务器。safe_mysqld 将服务器的标准错误输出重定向到数据 库目录中的错误文件中,并以记录的形式存在。启动服务器后,safe_mysqld 还监控服务 器,并在其死机时重新启动。safe_mysqld 通常用于 Unix 的 BSD 风格的版本。 如果,你曾经为 root 或在系统启动程序中启动 safe_mysqld,其错误日志将有 root 拥有。如果再用非特权的用户身份调用 safe_mysqld,则可能引起“

6、Access Denied”(即, “所有权被拒绝”)的错误。此时可以删除错误文件在试一次。 由于 safe_mysqld 脚本的功能,使用 safe_mysqld 脚本明显比直接启动 mysqld 守护 程序来得有效。 4、启动服务器的完整过程 对于 Unix 平台上的分发,如果你以 root 或在系统引导期间启动 sqfe_mysqld,出错 日志由 root 拥有,这可能在你以后试图用一个非特权用户调用 safe_mysqld 时将导致 “permission denied”(权限拒绝)错误,删除出错日志再试一下。因此建议你在启动服 务器前,首先切换到一个专门的用户 mysql。 具体方

7、法如下: Unix 平台 $ su mysql $ safe_mysql then /usr/local/bin/safe_mysqld then /usr/local/bin/safe_mysqld -user=mysql -datadir=/path/to/data +-+ | Database | +-+ | first | | mysql | | mytest | | test | | test1 | +-+ mysqlshow databases like my%; +-+ | Database (my%) | +-+ | mysql | | mytest | +-+ 用 mysql

8、show 程序也可以得到已有数据库列表。 3.3.2 用 Create Dabase 创建数据库 句法:CREATE DATABASE db_name 功能:CREATE DATABASE 用给定的名字创建一个数据库。 如果数据库已经存在,发生一个错误。 在 MySQL 中的数据库实现成包含对应数据库中表的文件的目录。因为数据库在初 始创建时没有任何表,CREATE DATABASE 语句只是在 MySQL 数据目录下面创建一 个目录。 例如: mysqlcreate database myfirst; 然后利用 show databases 观察效果。 3.3.3 用 DROP DATABA

9、SE 删除数据库 句法:DROP DATABASE IF EXISTS db_name 功能:DROP DATABASE 删除数据库中的所有表和数据库。要小心地使用这个命 令! DROP DATABASE 返回从数据库目录被删除的文件的数目。通常,这 3 倍于表的 数量,因为每张表对应于一个“.MYD”文件、一个“.MYI”文件和一个“.frm”文件。 在 MySQL 3.22 或以后版本中,你可以使用关键词 IF EXISTS 阻止一个错误的发生, 如果数据库不存在。 3.3.4 使用 mysqladmin 工具创建和删除 在命令行环境下可以使用 mysqladmin 创建和删除数据库。 创

10、建数据库: shell mysqladmin create db_name 删除数据库: shell mysqladmin drop db_name 如果出现下面的错误: mysqladmin: connect to server at localhost failed error: Access denied for user: rootlocalhost (Using password: YES) 表示你需要一个可以正常连接的用户,请指定-u -p 选项,具体方法与 3.2 节介绍相同, 在第七章中你将会学到用户授权的知识。 3.3.5 直接在数据库目录中创建或删除 用上述方法创建数据库,

11、只是 MySQL 数据目录下面创建一个与数据库同名目录, 同样删除数据库是把这个目录删除。 所以,你可以直接这么做,创建或删除数据库,或者给数据库更名。这对备份和恢 复备份有一定意义。 3.3.6 用 USE 选用数据库 句法:USE db_name USE db_name 语句告诉 MySQL 使用 db_name 数据库作为随后的查询的缺省数据库。 数据库保持到会话结束,或发出另外一个 USE 语句: mysql USE db1; mysql SELECT count(*) FROM mytable; # selects from db1.mytable mysql USE db2; my

12、sql SELECT count(*) FROM mytable; # selects from db2.mytable 如果你不是用 USE 语句,那么上面的例子应该写成: mysql SELECT count(*) FROM db1.mytable; mysql SELECT count(*) FROM db2.mytable; 由于 use 也是一个 mysql 客户程序的命令,所以你可以在命令行最后不加分号,客 户程序可以得到结果。 3.3.7 总结 本节介绍了有关数据库操作的 SQL 语句、实用程序,其中包括: SQL 语句:CREATE/DROP DATABASE,SHOW DAT

13、ABASES,USE 程序 mysqladmin 直接创建或删除数据库的目录 3.4 有关数据表的操作 用 MySQL,目前(版本 3.23)你可以在三种基本数据库表格式间选择。当你创建一 张表时,你可以告诉 MySQL 它应该对于表使用哪个表类型。MySQL 将总是创建一个. frm 文件保存表和列定义。视表类型而定,索引和数据将在其他文件中存储。 你能用 ALTER TABLE 语句在不同类型的表之间变换。见 7.8 ALTER TABLE 语法。 MyISAM 在 MySQL 3.23 中,MyISAM 是缺省表格类型,它是基于 ISAM 代码并且有很多有 用的扩展。索引存储在一个有.M

14、YI(MYindex)扩展名的文件并且数据存储在有. MYD(MYData)扩展名的文件中。你能用 myisamchk 实用程序检查/修复 MyISAM 表。 ISAM 你也可以使用放弃的 ISAM。这将在不久消失,因为 MyISAM 是同一个东西的更好 实现。ISAM 使用一个 B-tree 索引,这个索引存储在一个有.ISM 扩展名的文件中并且数 据存储在有.ISD 扩展名的文件中,你可用 isamchk 实用程序检查/修复 ISAM 表。ISAM 表不是跨 OS/平台二进制可移植的。 HEAP HEAP 表格使用一个杂凑(hashed)索引并且存储在内存中。这使他们更快,但是 如果 My

15、SQL 崩溃,你将失去所有存储的数据。HEAP 作为临时表很可用! 3.4.1 用 SHOW/ DESCRIBE 语句显示数据表的信息 句法: SHOW TABLES FROM db_name LIKE wild or SHOW COLUMNS FROM tbl_name FROM db_name LIKE wild or SHOW INDEX FROM tbl_name FROM db_name or SHOW TABLE STATUS FROM db_name LIKE wild DESCRIBE | DESC tbl_name col_name | wild 你能使用db_name.tb

16、l_name作为tbl_name FROM db_name句法的另一种选择。 SHOW TABLES 列出在一个给定的数据库中的表。你也可以用 mysqlshow db_name 命令得到这张表。 注意:如果一个用户没有一个表的任何权限,表将不在 SHOW TABLES 或 mysqlshow db_name 中的输出中显示。 SHOW COLUMNS 列出在一个给定表中的列。如果列类型不同于你期望的是基 于 CREATE TABLE 语句的那样,注意,MySQL 有时改变列类型。 DESCRIBE 语句提供了类似 SHOW COLUMNS 的信息。DESCRIBE 提供关于 一张表的列的信息

17、。col_name 可以是一个列名字或包含 SQL 的“%”和“_” 通配符的一个字符串。这个语句为了与 Oracle 兼容而提供的。 SHOW TABLE STATUS(在版本 3.23 引入)运行类似 SHOW STATUS,但是提 供每个表的更多信息。你也可以使用 mysqlshow -status db_name 命令得到这张 表。 SHOW FIELDS 是 SHOW COLUMNS 一个同义词,SHOW KEYS 是 SHOW INDEX 一个同义词。 你也可以用 mysqlshow db_name tbl_name 或 mysqlshow -k db_name tbl_name

18、列 出一张表的列或索引。 SHOW INDEX 以非常相似于 ODBC 的 SQLStatistics 调用的格式返回索引信息。 3.4.2 使用 mysqlshow 工具得到信息 下面简单介绍一下 mysqlshow 实用程序的用法,在得到数据库和表的信息上,使用 起来非常方便。 得到已有数据库的列表: shell mysqlshow 列出某数据库 db_name 中已有的表: shell mysqlshow db_name 列出某数据库表 db_name.tbl_name 的结构信息: shellmysqlshow db_name tbl_name 列出一张表的索引: shell mysq

19、lshow k db_name tbl_name 3.4.3 用 CREATE TABLE 语句创建数据表 用 CREATE TABLE 语句创建表。此语句的完整语法是相当复杂的,因为存在那 么多的可选子句,但在实际中此语句的应用相当简单。如我们在第 1 章中使用的所有 CREATE TABLE 语句都不那么复杂。 有意思的是,大多数复杂东西都是一些子句,这些子句 MySQL 在分析后扔掉。参 阅附录 1 可以看到这些复杂的东西。 1、CREATE TABLE 语句的基本语法 CREATE TABLE tbl_name(create_definition,.) TYPE =table_type

20、 create_definition: col_name type NOT NULL | NULL DEFAULT default_value AUTO_INCREMENTPRIMARY KEY 在 MySQL3.22 或以后版本中,表名可以被指定为 db_name.tbl_name,不管有没有 当前的数据库都可以。 例如,创建一个访问者留言表: shell mysql u root p mysql create database mytest; mysql CREATETABLEguestbook - ( - visitor VARCHAR(40), - comments TEXT, - e

21、ntrydate DATETIME -); 如果一切正常,祝贺你,你已经建立了你的第一个表! 你所创建的表名为 guestbook,你可以使用这个表来存储来字你站点访问者的信息。 你是用 REEATE TABLE 语句创建的这个表,这个语句有两部分:第一部份指定表的名 子;第二部份是括在括号中的各字段的名称和属性,相互之间用逗号隔开。 表 guestbook 有三个字段:visitor,comments 和 entrydate。visitor 字段存储访问者的 名字,comments 字段存储访问者对你站点的意见,entrydate 字段存储访问者访问你站点 的日期和时间。 注意每个字段名后面

22、都跟有一个专门的表达式。例如,字段名 comments 后面跟有 表达式 TEXT。这个表达式指定了字段的数据类型。数据类型决定了一个字段可以存储 什么样的数据。因为字段 comments 包含文本信息,其数据类型定义为文本型。 2、如何指定表的类型 你也可以在创建表时指定表的类型,如果不指定表的类型,在 3.22 及以前版本中缺 省为 ISAM 表,在 3.23 版本中缺省为 MyISAM 表。你应该尽量使用 MyISAM 表。指定 表的类型经常用于创建一个 HEAP 表: mysql CREATE TABLE fast(id int,articles TEXT) TYPE=HEAP; 3、

23、隐含的列说明的改变 在某些情况下,MySQL 隐含地改变在一个 CREATE TABLE 语句给出的一个列说 明。(这也可能在 ALTER TABLE。) 长度小于 4 的 VARCHAR 被改变为 CHAR。 如果在一个表中的任何列有可变长度,结果是整个行是变长的。因此, 如果一 张表包含任何变长的列(VARCHAR、TEXT 或 BLOB),所有大于 3 个字符的 CHAR 列被改变为 VARCHAR 列。这在任何方面都不影响你如何使用列;在 MySQL 中,VARCHAR 只是存储字符的一个不同方法。MySQL 实施这种改变, 是因为它节省空间并且使表操作更快捷。 TIMESTAMP 的

24、显示尺寸必须是偶数且在 2 14 的范围内。如果你指定 0 显 示尺寸或比 14 大,尺寸被强制为 14。从 113 范围内的奇数值尺寸被强制为 下一个更大的偶数。 你不能在一个 TIMESTAMP 列里面存储一个文字 NULL;将它设为 NULL 将设 置为当前的日期和时间。因为 TIMESTAMP 列表现就是这样,NULL 和 NOT NULL 属性不以一般的方式运用并且如果你指定他们,将被忽略。DESCRIBE tbl_name 总是报告该 TIMESTAMP 列可能赋予了 NULL 值。 如果你想要知道 MySQL 是否使用了除你指定的以外的一种列类型,在创建或改变 你的表之后,发出一

25、个 DESCRIBE tbl_name 语句即可。 3.4.4 利用 SELECT 的结果创建表 关系数据库的一个重要概念是,任何数据都表示为行和列组成的表,而每条 SELECT 语句的结果也都是一个行和列组成的表。在许多情况下,来自 SELECT 的 “表”仅是一个随着您的工作在显示屏上滚动的行和列的图像。在 MySQL 3.23 以前, 如果想将 SELECT 的结果保存在一个表中以便以后的查询使用,必须进行特殊的安排: 1) 运行 DESCRIBE 或 SHOW COLUMNS 查询以确定想从中获取信息的表中的列 类型。 2) 创建一个表,明确地指定刚才查看到的列的名称和类型。 3) 在

26、创建了该表后,发布一条 INSERT . SELECT 查询,检索出结果并将它们插 入所创建的表中。 在 MySQL 3.23 中,全都作了改动。CREATE TABLE . SELECT 语句消除了这些 浪费时间的东西,使得能利用 SELECT 查询的结果直接得出一个新表。只需一步就可 以完成任务,不必知道或指定所检索的列的数据类型。这使得很容易创建一个完全用所 喜欢的数据填充的表,并且为进一步查询作了准备。 如果你在 CREATE 语句后指定一个 SELECT,MySQL 将为在 SELECT 中所有的单 元创键新字段。例如: mysql CREATE TABLE test - (a in

27、t not null auto_increment,primary key (a), key(b) - SELECT b,c from test2; 这将创建一个有 3 个列(a,b,c)的表,其中 b,c 列的数据来自表 test2。注意如果 在拷贝数据进表时发生任何错误,表将自动被删除。 可以通过选择一个表的全部内容(无 WHERE 子句)来拷贝一个表,或利用一个总 是失败的 WHERE 子句来创建一个空表,如: mysql CREATE TABLE test SELECT * from test2; mysql CREATE TABLE test SELECT * from test2

28、where 0; 如果希望利用 LOAD DATA 将一个数据文件装入原来的文件中,而不敢肯定是否 具有指定的正确数据格式时,创建空拷贝很有用。您并不希望在第一次未得到正确的选 项时以原来表中畸形的记录而告终。利用原表的空拷贝允许对特定的列和行分隔符用 LOAD DATA 的选项进行试验,直到对输入数据的解释满意时为止。在满意之后,就可 以将数据装入原表了。 可结合使用 CREATE TEMPORARY TABLE 与 SELECT 来创建一个临时表作为 它自身的拷贝,如: 这允许修改 my_tbl 的内容而不影响原来的内容。在希望试验对某些修改表内容的 查询,而又不想更改原表内容时,这样做很

29、有用。为了使用利用原表名的预先编写的脚 本,不需要为引用不同的表而编辑这些脚本;只需在脚本的起始处增加 CREATE TEMPORARY TABLE 语句即可。相应的脚本将创建一个临时拷贝,并对此拷贝进行操 作,当脚本结束时服务器会自动删除这个拷贝。 要创建一个作为自身的空拷贝的表,可以与 CREATE TEMPORARY . SELECT 一 起使用 WHERE 0 子句,例如: 但创建空表时有几点要注意。在创建一个通过选择数据填充的表时,其列名来自所 选择的列名。如果某个列作为表达式的结果计算,则该列的“名称”为表达式的文本。 表达式不是合法的列名,可在 mysql 中运行下列查询了解这一

30、点: 为了正常工作,可为该列提供一个合法的别称: 如果选择了来自不同表的具有相同名称的列,将会出现一定的困难。假定表 t1 和 t2 两者都具有列 c,而您希望创建一个来自两个表中行的所有组合的表。那么可以提供 别名指定新表中惟一性的列名,如: 通过选择数据进行填充来创建一个表并会自动拷贝原表的索引。 3.4.5 用 ALTER TABLE 语句修改表的结构 有时你可能需要改变一下现有表的结构,那么 Alter Table 语句将是你的合适选择。 增加列 alter table tbl_name add col_name type 例如,给表增加一列 weight mysqlalter tab

31、le pet add weight int; 删除列 alter table tbl_name drop col_name 例如,删除列 weight: mysqlalter table pet drop weight; 改变列 alter table tbl_name modify col_name type 例如,改变 weight 的类型: mysql alter table pet modify weight samllint; 另一种方法是: alter table tbl_name change old_col_name col_name type 例如: mysql alter

32、table pet change weight weight samllint; 给列更名 mysqlalter table pet change weight wei; 给表更名 alter table tbl_name rename new_tbl 例如,把 pet 表更名为 animal mysqlalter table pet rename animal; 改变表的类型 另外,可以为列增加或删除索引等属性,不再详述,请参阅附录。 3.4.6 用 DROP TABLE 语句删除数据表 DROP TABLE IF EXISTS tbl_name , tbl_name,. DROP TABL

33、E 删除一个或多个数据库表。所有表中的数据和表定义均被删除,故 小心使用这个命令! 在 MySQL 3.22 或以后版本,你可以使用关键词 IF EXISTS 类避免不存在表的一个 错误发生。 例如: mysqlUSE mytest; mysqlDROP TABLE guestbook; 或者,也可以同时指定数据库和表: mysqlDROP TABLE mytest. guestbook; 3.4.7 总结 本节讲述了有关表的大部分操作,现在将所述内容总结如下: MySQL 的表的三种类型 如何创建表、删除表 如何改变表的结构、名字 如何使用 mysqlshow 实用程序 3.5 向数据表插入

34、行记录 3.5.1 使用 INSERT 语句插入新数据 语法:INSERT INTO tbl_name (col_name,.) VALUES (pression,.), INSERT INTO tbl_name SET col_name=expression, . 让我们开始利用 INSERT 语句来增加记录,这是一个 SQL 语句,需要为它指定 希望插入数据行的表或将值按行放入的表。INSERT 语句具有几种形式: 可指定所有列的值: 例如: shell mysql u root p mysql use mytest; mysql insert into worker values(“to

35、m”,”); “INTO”一词自 MySQL 3.22.5 以来是可选的。(这一点对其他形式的 INSERT 语句也成立。)VALUES 表必须包含表中每列的值,并且按表中列的存放次序给出。 (一般,这就是创建表时列的定义次序。如果不能肯定的话,可使用 DESCRIBE tbl_name 来查看这个次序。) 使用多个值表,可以一次提供多行数据。 Mysqlinsert into worker values(tom,),(paul,); 有多个值表的 INSERT . VALUES 的形式在 MySQL 3.22.5 或以后版本中支持。 可以给出要赋值的那个列,然后再列出值。这对于希望建立只有几

36、个列需要初始设 置的记录是很有用的。 例如: mysqlinsert into worker (name) values (tom); 自 MySQL 3.22.5 以来,这种形式的 INSERT 也允许多个值表: mysqlinsert into worker (name) values (tom), (paul); 在列的列表中未给出名称的列都将赋予缺省值。 自 MySQL 3.22 .10 以来,可以 col_name = value 的形式给出列和值。 例如: mysqlinsert into worker set name=tom; 在 SET 子句中未命名的行都赋予一个缺省值。 使

37、用这种形式的 INSERT 语句不能插入多行。 一个 expression 可以引用在一个值表先前设置的任何列。例如,你能这样: mysql INSERT INTO tbl_name (col1,col2) VALUES(15,col1*2); 但不能这样: mysql INSERT INTO tbl_name (col1,col2) VALUES(col2*2,15); 3.5.2 使用 INSERTSELECT 语句插入从其他表选择的行 当我们在上一节学习创建表时,知道可以使用 select 从其它表来直接创建表,甚至 可以同时复制数据记录。如果你已经拥有了一个表,你同样可以从 selec

38、t 语句的配合中 获益。 从其它表中录入数据,例如: mysqlinsert into tbl_name1(col1,col2) select col3,col4 from tbl_name2; 你也可以略去目的表的列列表,如果你每一列都有数据录入。 mysqlinsert into tbl_name1 select col3,col4 from tbl_name2; INSERT INTO . SELECT 语句满足下列条件: 查询不能包含一个 ORDER BY 子句。 INSERT 语句的目的表不能出现在 SELECT 查询部分的 FROM 子句,因为这在 ANSI SQL 中被禁止让从你

39、正在插入的表中 SELECT。(问题是 SELECT 将可 能发现在同一个运行期间内先前被插入的记录。当使用子选择子句时,情况能 很容易混淆) 3.5.3 使用 replace、replaceselect 语句插入 REPLACE 功能与 INSERT 完全一样,除了如果在表中的一个老记录具有在一个唯 一索引上的新记录有相同的值,在新记录被插入之前,老记录被删除。对于这种情况, insert 语句的表现是产生一个错误。 REPLACE 语句也可以褐 SELECT 相配合,所以上两小节的内容完全适合 REPALCE.。 应该注意的是,由于 REPLACE 语句可能改变原有的记录,因此使用时要小心

40、。 3.5.4 使用 LOAD 语句批量录入数据 本章的前面讨论如何使用 SQL 向一个表中插入数据。但是,如果你需要向一个表 中添加许多条记录,使用 SQL 语句输入数据是很不方便的。幸运的是,MySQL 提供了 一些方法用于批量录入数据,使得向表中添加数据变得容易了。本节以及下一节,将介 绍这些方法。本节将介绍 SQL 语言级的解决方法。 1、基本语法 语法:LOAD DATA LOCAL INFILE file_name.txt REPLACE | IGNORE INTO TABLE tbl_name LOAD DATA INFILE 语句从一个文本文件中以很高的速度读入一个表中。如果指

41、 定 LOCAL 关键词,从客户主机读文件。如果 LOCAL 没指定,文件必须位于服务器上。 (LOCAL 在 MySQL3.22.6 或以后版本中可用。) 为了安全原因,当读取位于服务器上的文本文件时,文件必须处于数据库目录或可 被所有人读取。另外,为了对服务器上文件使用 LOAD DATA INFILE,在服务器主机 上你必须有 file 的权限。见第七章 数据库安全。 REPLACE 和 IGNORE 关键词控制对现有的唯一键记录的重复的处理。如果你指定 REPLACE,新行将代替有相同的唯一键值的现有行。如果你指定 IGNORE,跳过有唯 一键的现有行的重复行的输入。如果你不指定任何一

42、个选项,当找到重复键键时,出现 一个错误,并且文本文件的余下部分被忽略时。 如果你使用 LOCAL 关键词从一个本地文件装载数据,服务器没有办法在操作的当 中停止文件的传输,因此缺省的行为好像 IGNORE 被指定一样。 2、文件的搜寻原则 当在服务器主机上寻找文件时,服务器使用下列规则: 如果给出一个绝对路径名,服务器使用该路径名。 如果给出一个有一个或多个前置部件的相对路径名,服务器相对服务器的数据 目录搜索文件。 如果给出一个没有前置部件的一个文件名,服务器在当前数据库的数据库目录 寻找文件。 注意这些规则意味着一个像“./myfile.txt”给出的文件是从服务器的数据目录读取, 而作

43、为“myfile.txt”给出的一个文件是从当前数据库的数据库目录下读取。也要注意, 对于下列哪些语句,对 db1 文件从数据库目录读取,而不是 db2: mysql USE db1; mysql LOAD DATA INFILE ./data.txt INTO TABLE db2.my_table; 3、FIELDS 和 LINES 子句的语法 如果你指定一个 FIELDS 子句,它的每一个子句(TERMINATED BY, OPTIONALLY ENCLOSED BY 和 ESCAPED BY)也是可选的,除了你必须至少指定他 们之一。 如果你不指定一个 FIELDS 子句,缺省值与如果你

44、这样写的相同: FIELDS TERMINATED BY t ENCLOSED BY ESCAPED BY 如果你不指定一个 LINES 子句,缺省值与如果你这样写的相同: LINES TERMINATED BY n 换句话说,缺省值导致读取输入时,LOAD DATA INFILE 表现如下: 在换行符处寻找行边界 在定位符处将行分进字段 不要期望字段由任何引号字符封装 将由“”开头的定位符、换行符或“”解释是字段值的部分字面字符 LOAD DATA INFILE 能被用来读取从外部来源获得的文件。例如,以 dBASE 格式 的文件将有由逗号分隔并用双引号包围的字段。如果文件中的行由换行符终止

45、,下面显 示的命令说明你将用来装载文件的字段和行处理选项: mysql LOAD DATA INFILE data.txt INTO TABLE tbl_name FIELDS TERMINATED BY , ENCLOSED BY LINES TERMINATED BY n; 任何字段或行处理选项可以指定一个空字符串()。如果不是空,FIELDS OPTIONALLY ENCLOSED BY 和 FIELDS ESCAPED BY 值必须是一个单个字符。 FIELDS TERMINATED BY 和 LINES TERMINATED BY 值可以是超过一个字符。例如, 写入由回车换行符对(C

46、R+LF)终止的行,或读取包含这样行的一个文件,指定一个 LINES TERMINATED BY rn子句。 FIELDS OPTIONALLY ENCLOSED BY 控制字段的包围字符。对于输出(SELECT . INTO OUTFILE),如果你省略 OPTIONALLY,所有的字段由 ENCLOSED BY 字符包 围。对于这样的输出的一个例子(使用一个逗号作为字段分隔符)显示在下面: 1,a string,100.20 2,a string containing a , comma,102.20 3,a string containing a quote,102.20 4,a str

47、ing containing a , quote and comma,102.20 如果你指定 OPTIONALLY,ENCLOSED BY 字符仅被用于包围 CHAR 和 VARCHAR 字段: 1,a string,100.20 2,a string containing a , comma,102.20 3,a string containing a quote,102.20 4,a string containing a , quote and comma,102.20 注意,一个字段值中的 ENCLOSED BY 字符的出现通过用 ESCAPED BY 字符作为 其前缀来转义。也要注

48、意,如果你指定一个空 ESCAPED BY 值,可能产生不能被 LOAD DATA INFILE 正确读出的输出。例如,如果转义字符为空,上面显示的输出显 示如下。注意到在第四行的第二个字段包含跟随引号的一个逗号,它(错误地)好象要终 止字段: 1,a string,100.20 2,a string containing a , comma,102.20 3,a string containing a quote,102.20 4,a string containing a , quote and comma,102.20 FIELDS ESCAPED BY 控制如何写入或读出特殊字符。如果

49、 FIELDS ESCAPED BY 字符不是空的,它被用于前缀在输出上的下列字符: FIELDS ESCAPED BY 字符 FIELDS OPTIONALLY ENCLOSED BY 字符 FIELDS TERMINATED BY 和 LINES TERMINATED BY 值的第一个字符 ASCII 0(实际上将后续转义字符写成 ASCII0,而不是一个零值字节) 如果 FIELDS ESCAPED BY 字符是空的,没有字符被转义。指定一个空转义字符可 能不是一个好主意,特别是如果在你数据中的字段值包含刚才给出的表中的任何字符。 对于输入,如果 FIELDS ESCAPED BY 字符

50、不是空的,该字符的出现被剥去并且后 续字符在字面上作为字段值的一个部分。例外是一个转义的“0”或“N”(即,0 或 N,如果转义字符是“”)。这些序列被解释为 ASCII 0(一个零值字节)和 NULL。见 下面关于 NULL 处理的规则。 3.5.5 总结 为数据库装载数据是管理员的重要职责之一,正因为重要,所以 MySQL 提供的方 法也是非常繁多。其中主要的在本节已经列举: 1、 使用 INSERT、REPLACE 语句 2、 使用 INSERT/REPLACESELECT 语句 3、 使用 LOAD DATA INFILE 语句 4、 使用实用程序 mysqlimport(将在第五章介

51、绍) 3.6 查询数据表中的记录 除非最终检索它们并利用它们来做点事情,否则将记录放入数据库没什么好处。这 就是 SELECT 语句的用途,即帮助取出数据。SELECT 大概是 SQL 语言中最常用的 语句,而且怎样使用它也最为讲究;用它来选择记录可能相当复杂,可能会涉及许多表 中列之间的比较。本节介绍 Select 语句关于查询的最基本功能。 SELECT 语句的语法如下: SELECT selection_list选择哪些列 FROM table_list从何处选择行 WHERE primary_constraint 行必须满足什么条件 GROUP BY grouping_columns怎

52、样对结果分组 HAVING secondary_constraint行必须满足的第二条件 ORDER BY sorting_columns 怎样对结果排序 LIMIT count结果限定 注意:所有使用的关键词必须精确地以上面的顺序给出。例如,一个 HAVING 子句 必须跟在 GROUP BY 子句之后和 ORDER BY 子句之前。 除了词“SELECT”和说明希望检索什么的 column_list 部分外,语法中的每样东 西都是可选的。有的数据库还需要 FROM 子句。MySQL 有所不同,它允许对表达式 求值而不引用任何表。 3.6.1 普通查询 SELECT 最简单的形式是从一张表中

53、检索每样东西: mysql SELECT * FROM pet; 其结果为: +-+-+-+-+-+-+ | name | owner | species | sex | birth | death | +-+-+-+-+-+-+ | Fluffy | Harold | cat | f | 1993-02-04 | NULL | | Claws | Gwen | cat | m | 1994-03-17 | NULL | | Buffy | Harold | dog | f | 1989-05-13 | NULL | | Chirpy | Gwen | bird | f | 1998-09-1

54、1 | NULL | | Fang | Benny | dog | m | 1990-08-27 | NULL | | Bowser | Diane | dog | m | 1990-08-31 | 1995-07-29 | | Whistler | Gwen | bird | NULL | 1997-12-09 | NULL | | Slim | Benny | snake | m | 1996-04-29 | NULL | | Puffball | Diane | hamster | f | 1999-03-30 | NULL | +-+-+-+-+-+-+ 查询特定行: 你能从你的表中只

55、选择特定的行。例如,如果你想要验证你对 Bowser 的出生日期 所做的改变,像这样精选 Bowser 的记录: mysql SELECT * FROM pet WHERE name = Bowser; 其结果为: +-+-+-+-+-+-+ | name | owner | species | sex | birth | death | +-+-+-+-+-+-+ | Bowser | Diane | dog | m | 1990-08-31 | 1995-07-29 | +-+-+-+-+-+-+ 你可以对照前一个例子来验证。 查询特定列 如果你不想要看到你的表的整个行,就命名你感兴趣的列

56、,用逗号分开。例如,如 果你想要知道你的动物什么时候出生的,精选 name 和 birth 列: mysql SELECT name, birth FROM pet where owner=Gwen; 其结果为: +-+-+ | name | birth | +-+-+ | Claws | 1994-03-17 | | Chirpy | 1998-09-11 | | Whistler | 1997-12-09 | +-+-+ 进行表达式计算 前面的多数查询通过从表中检索值已经产生了输出结果。MySQL 还允许作为一个 公式的结果来计算输出列的值。表达式可以简单也可以复杂。下面的查询求一个简单表 达式的值(常量)以及一个涉及几个算术运算符和两个函

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论