8.2 使用 MySQL 数据库

346 篇文章 0 订阅
334 篇文章 1 订阅

8.2 使用 MySQL 数据库
前面大致介绍了一些MySQL 的管理知识,下面进入到具体学习阶段,为了方便学习,
首先介绍在MySQL 中如何进行代码注释。
MySQL 服务器支持“#到该行结束”、“--到该行结束”以及“/* 行中间或多个行*/” 的
注释方式,如下所示:
mysql> SELECT 1+1; # 这个注释直到该行结束
mysql> SELECT 1+1; -- 这个注释直到该行结束
mysql> SELECT 1 /* 这是一个在行中间的注释 */ + 1;
mysql> SELECT 1+
/*
这是一个
多行注释的形式
*/
8.2.1 插入数据
通常在学习SQL 语句的时候,总是先学习SELECT 语句,但是由于本章创建的数据库
中表中的记录都是空的,为了方便使用SELECT 查询语句,要先学会如何向数据库插入记录。
在 MySQL 中,要插入数据,使用INSERT 命令。INSERT 命令的格式如下所示:
INSERT [LOW_PRIORITY | DELAYED] [IGNORE]
[INTO] tbl_name [(col_name,...)]
VALUES ((expression | DEFAULT),...),(...),...
[ ON DUPLICATE KEY UPDATE col_name=expression, ... ]
或者:
INSERT [LOW_PRIORITY | DELAYED] [IGNORE]
[INTO] tbl_name [(col_name,...)]
SELECT ...
第8 章 MySQL 数据库 231
或者:
INSERT [LOW_PRIORITY | DELAYED] [IGNORE]
[INTO] tbl_name
SET col_name=(expression | DEFAULT), ...
[ ON DUPLICATE KEY UPDATE col_name=expression, ... ]
INSERT 将新行插入到一个已存在的表中。INSERT ... VALUES 形式的语句基于明确的值
插入记录行。INSERT ... SELECT 形式的语句从另一个或多个表中选取出值,并将其插入。
tbl_name 是记录将要被插入的表。
列名列表或SET 子句指出语句指定的值赋给哪个列:如果在INSERT ... VALUES 或
INSERT ... SELECT 中没有指定列列表,那么所有列的值必须在VALUES()列表中或由
SELECT 提供。如果不知道表的列的次序,可以使用DESCRIBE tbl_name 来决定。
任何没有明确指定一个值的列均会被设置为它的缺省值。举例来说,如果指定了一个列
列表没有指定表中所有的列,未指定的列将被设置为它们的缺省值。
一个 expression 可以引用先前在值列表中设置的任何列。例如:
mysql> INSERT INTO tbl_name (col1,col2) VALUES(15,col1*2);
但是不能:
mysql> INSERT INTO tbl_name (col1,col2) VALUES(col2*2,15);
如果指定关键词LOW_PRIORITY,INSERT 的执行将会被延迟,直到没有其他客户端正
在读取表。在这种情况下,客户端不得不等待插入语句被完成,如果表被频繁地使用,那么
这将会花费很长一段时间。这与INSERT DELAYED 让客户端立即继续执行正好相反。
如果在一个有许多条记录行值的INSERT 中指定关键词IGNORE,任何在表中现有的
PRIMARY 或UNIQUE 键上重复的记录行均会被忽略而不被插入。如果不指定IGNORE,当
有任何记录行在一个现有的键值上重复时,插入均会被中止。可以通过函数mysql_info()测定
共有多少记录行被插入到表中。
如果指定 ON DUPLICATE KEY UPDATE 子句,并且被插入的一个记录行在PRIMARY
或UNIQUE 键上将会产生一个重复值,那么记录行将被更新。举例来说:
mysql> INSERT INTO table (a,b,c) VALUES (1,2,3)
--> ON DUPLICATE KEY UPDATE c=c+1;
假设列a 被定义为 UNIQUE,并且已存在了一个1,它将与下面的语句产生同样的结果:
mysql> UPDATE table SET c=c+1 WHERE a=1;
如果列b 也是惟一的,UPDATE 命令将要被写成:
mysql> UPDATE table SET c=c+1 WHERE a=1 OR b=2 LIMIT 1;
并且如果a=1 或者b=2 匹配几个记录行,只有一个记录行将被更新。大体上,在有多重
UNIQUE键的表上,应该尽量避免使用ON DUPLICATE KEY 子句。当使用了ON DUPLICATE
KEY UPDATE 后,DELAYED 选项将被忽略。
如果 MySQL 被设置为使用DONT_USE_DEFAULT_FIELDS 选项,INSERT 语句将产生
一个错误,除非为所有需要一个非NULL 值的列明确指定值。
通过使用 mysql_insert_id 函数可以找到用于一个AUTO_INCREMENT 列的值。
如果使用 INSERT ... SELECT 或一个INSERT ... VALUES 语句插入多值列,可以使用函
数mysql_info()得到查询的信息,格式如下:
Records: 100 Duplicates: 0 Warnings: 0
Duplicates 指出因与某些现有的惟一索引值重复而不能被插入的记录行数目。Warnings
232 PHP 网络编程技术与实例
指出在尝试插入的列值中,某些方面可能有问题的数目。在下列任何一个条件下,警告都会
发生。
(1)向一个定义为NOT NULL 的列中插入NULL 值。该列被设置为它的缺省值。
(2)将一个超出列范围的值赋给一个数字列。该值被剪切到该范围内的适当的端点。
(3)将一个例如'10.34 a'的值赋给一个数字列。尾部的无用信息将被剥离,保留数字部分
并将其插入。如果该值根本就不是一个数字,该列将被设置为0。
(4)将一个超出了列最大长度的字符串插入到一个CHAR、VARCHAR、TEXT 或BLOB
列中。该值将被剪切到该列的最大长度。
(5)将一个对列类型不合法的值插入到一个日期或时间列中。
1.INSERT ... VALUES 语句
INSERT ... VALUES 是最常用的语句。下面将通过实例来介绍如何将记录添加到数据库
中,这里主要演示向前面创建的bookstore 数据库中的各个表中添加记录。
(1)向categories 数据库表添加数据。
insert into categories (name) values ('Programming');
insert into categories (name) values ('Databases');
insert into categories (name) values ('HTML & Web design');
以上向categories 表中添加了3 条记录,因为categories 的第一个字段category_id 是自动
编号的,因此插入记录的时候只需要插入一个字段。
(2)向items 数据库表添加记录。
insert into items (category_id, name, author, price, product_url, image_url,
notes, is_recommended)
values(2, 'Web Database Development : Step by Step', 'Jim Buyens', 39.99,
'http://www.amazon.com/exec/obidos/ASIN/0735609667/yessoftware',
'images/books/0735609667.jpg', 'As Web sites continue to grow in complexity and
in the volume of data they must present, databases increasingly drive their content.
WEB DATABASE DEVELOPMENT FUNDAMENTALS is ideal for the beginning-to-intermediate
Web developer, departmental power user, or entrepreneur who wants to step up to
a database-driven Web site-without buying several in-depth guides to the different
technologies involved. This book uses the clear Microsoft(r) Step by Step tutorial
method to familiarize developers with the technologies for building smart Web sites
that present data more easily. ', 1);
以上向iterm 表添加了一条记录,用于保存图书的详细信息。
(3)向members 表添加记录。
insert into members (member_login, member_password, member_level, first_name,
last_name, email) values ('admin', 'admin', 2, 'Administrator', 'Account',
'admin@localhost');
insert into members (member_login, member_password, member_level, first_name,
last_name, email) values ('guest', 'guest', 1, 'Guest', 'Account',
'guest@localhost');
由于手工添加记录比较烦琐,所以笔者已经将所有要插入记录的语句保存成bookstore.sql
文件,读者只需要使用以下命令执行该文件即可。
mysql>source d:\bookstore.sql;
提示 路径需按照实际设定修改。
第8 章 MySQL 数据库 233
2.INSERT ... SELECT 语句
使用 INSERT ... SELECT 语句,可以从一个或多个表中读取多个记录行,并将其快速地
插入到一个表中,如下所示:
INSERT INTO tblTemp2 (fldID) SELECT tblTemp1.fldOrder_ID FROM tblTemp1 WHERE
tblTemp1.fldOrder_ID > 100;
提示
INSERT 语句中的目标表不能在SELECT 查询部分的FROM 子句中出现,
因为在ANSI SQL 中,禁止从正在插入的表中选择。
8.2.2 查询数据
进行数据查询,使用SELECT 关键字,其使用格式如下:
SELECT [STRAIGHT_JOIN]
[SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT]
[SQL_CACHE | SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS] [HIGH_PRIORITY]
[DISTINCT | DISTINCTROW | ALL]
select_expression,...
[INTO {OUTFILE | DUMPFILE} 'file_name' export_options]
[FROM table_references
[WHERE where_definition]
[GROUP BY {unsigned_integer | col_name | formula} [ASC | DESC], ...]
[HAVING where_definition]
[ORDER BY {unsigned_integer | col_name | formula} [ASC | DESC] ,...]
[LIMIT [offset,] rows | rows OFFSET offset]
[PROCEDURE procedure_name(argument_list)]
[FOR UPDATE | LOCK IN SHARE MODE]]
SELECT 用于检索从一个或多个表中选出的行。select_expression 表示希望检索的列。下
面通过实例来介绍SELECT 语句的应用。
(1)检索表中的全部记录。从单独一个表中检索全部记录是最简单的应用,如下所示:
以上语句从 categories 表中查询出所有记录。
(2)从表中获取指定列的数据。一个数据库表中可能含有很多的列,但是许多列是不需
要的,此时可以指定需要检索和查询的列,如下所示:
以上只查询出列名为 name 的所有记录。用户可以指定多个列。多个列之间可以用逗号
234 PHP 网络编程技术与实例
隔开,如下所示:
以上从 members 表中查询member_id、member_login 以及member_password 三个字段的
所有记录。
(3)获取指定条件的记录。很多时候,需要显示的并不是所有的记录,尤其是在记录很
多的时候。只有设定了查询条件,查询才有实际意义。比如要查找一个名为“张三”的人,
此时需要对查询语句进行设定。设定查询语句,是通过WHERE 子句来实现的。
最简单的查询条件即“=”(等于),用来查询完全符合设定条件的记录,如下所示:
以上是从数据库表 categories 表中查询出字段name 值为“Databases”的记录,从执行结
果可以看出已经找到了结果。
其实 Where 子句功能非常强大,用户可以进行更多项复杂的条件查询。表8-13 所示列出
了常用的Where 子句的比较运算符。
表 8-13 常用的Where 子句比较运算符
运 算 符 名 称应 用运 算 符 名 称应 用
= 等于会员编号=3 IS NULL n/a 会员编号IS NULL
> 大于会员编号>3 BETWEEN n/a 会员编号BETWEEN 1 AND 10
< 小于会员编号<3 IN n/a 会员编号 IN (1,2,3,)
>= 大于等于会员编号>=3 NOT IN n/a 会员名称NOT IN ('CAT','DOG')
<= 小于等于会员编号<=3 LIKE 模式匹配会员名称 LIKE ('jerry %')
!=或者<> 不等于会员编号!=3 NOT LIKE 模式匹配会员名称NOT LIKE ('jerry %')
IS NOT NULL n/a 会员编号IS NOT NULL REGEXP 常规表达式会员名称正则表达式
以上介绍了 Where 子句常用的条件比较符号,下面通过实例来学习这些常用的比较子句。
如果要获取会员编号大于 1 的记录,如下所示:
以上查询出来一条结果,从结果看,因为 member_id 为2,大于1,所以记录被检索。
如果要获取会员编号为 1 或者为3 的记录,如下所示:
第8 章 MySQL 数据库 235
以上语句使用了 in 关键字来查询,当有很多个并列项的时候,使用该关键字非常方便,
尤其在进行多个字符串检索的时候,如下所示:
如果要检索在一定范围内的记录,可以使用 between…and 语句,如下所示:
以上是查询 category_id 的值为1 和5 之间的记录。
很多时候,例如在网络书店买书,很可能用户不知道每本书的全名,而只知道其中的关
键字,此时需要模糊查询。模糊查询的时候,使用关键字like,如下所示:
其中'Dav%'表示所有以'Dav'开头的字符串都会被检索,而如果想查询以'pig'结尾的字符
串,可以使用'%pig'来查询,如果是想查询中间为'pig'的字符串,可以使用'%pig%'来查询。
(4)AND 关键字。AND 关键字主要用于连接多个Where 查询子句,很多时候,查询需
要多个条件成立才可以。例如要查询图书书名为包含“PHP”,同时图书编号小于“9”的书
籍记录,可以使用AND 关键字连接两个查询字符串。
236 PHP 网络编程技术与实例
以上通过 AND 关键字连接了两个条件查询语句,当然可以同时并列多个查询条件。AND
关键字表示所有连接的条件都必须符合,如果一条不符合,则不会被检索到。
(5)OR 关键字。OR 关键字和AND 关键字一样,也是连接多个查询条件。通过OR 关
键字连接的多个条件,只要其中的一个条件符合,就会被检索出来。
例如要检索图书编号等于 15 的书籍记录,或者书名为“php”且图书编号不为9 的书籍
记录,可以使用OR 关键字,如下所示:
以上同时使用了 AND 关键字和OR 关键字,其中括号中的两个条件必须同时成立才可
以生效,即书名中含有“php”且图书编号不能为9。另外图书编号为15 的记录,则也符合
查询要求。
(6)使用字段别名关键字AS。在进行数据查询的时候,为了方便显示或者便于用户理
解,可以将查询的字段名称显示成想要的名称。例如在查询图书名称的时候,列名仅为
“name”,一般人不会知道到底是什么名称,可以使用字段别名关键字AS 来显示指定,如下
所示:
以上使用了“name as category_name”语句,则在显示结果的时候,会用category_name 代
替name。尤其是进行多表查询的时候,如果两个表都有相同的字段,更需要使用别名来处理。
(7)从多个表中获取记录。前面介绍的都是简单的从一个表中获取记录,但是很多时候,
尤其是按照规范的方法设计的数据库,在进行查询的时候,需要涉及到多表查询。
要执行多表操作,必须通过SQL 语句将两个表关联起来,进行关联查询。例如现在要查
询一些图书信息并且需要显示图书的分类名称,就需要进行多表查询。因为在图书信息表
items 中没有图书分类名称的信息,只有图书分类编号,因此要获得图书分类名称,必须同时
在图书分类信息表(categories 表)中关联查询,如下所示:
第8 章 MySQL 数据库 237
以上查询了书籍的图书分类名称,图书编号和图书名称。可以看到,在进行多表查询
的时候,使用了“表名.字段”的格式,这样做是为了防止MySQL 查询错误,因为很可能
存在多个表的字段名称相同,如items 表的书名字段为name,而categories 表的分类名称也
为name,为了区分,必须要在字段前面添加表的名称。如果字段名称在表中是惟一的,则
可以省略表名。
在查询条件中,增加了一条“categories.category_id= items.category_id”,这个条件是关
联两个表的,表示查询的条件是items 表中的图书分类编号category_id 必须和categories 表
中的图书分类编号一样。如果不这样关联,则出现的结果肯定不是我们想像的那样,如下
所示:
从上面可以看出,如果不设定关联条件,则会出现意想不到的结果,此时会将所有的图
书分类名称显示出来。
(8)多表查询。多表查询同两个表查询原理基本类似,只是在进行表关联的时候需要设
置多个关联条件。为了演示多表查询,首先需要向orders 表中插入一条记录(因为目前
bookstore.sql 文件中的orders 表中没有记录),如下所示:
mysql> insert into orders (member_id,item_id,quantity)
-> values (1,5,1);
Query OK, 1 row affected (0.05 sec)
以上向orders 表插入了一条订购记录,接下来需要查询该订单中的会员名称、书籍名称
以及书籍分类名称的信息,需要从多个表中进行查询,如下所示:
以上的查询语句比较复杂,需要从 4 个表中来联合查询记录,同两个表的查询原理是一
致的。
(9)查找不匹配记录。查找不匹配记录,在SQL 中被称为左关联。在前面的介绍的查询
中,都是与条件相匹配的记录被查询出来,但是很多时候需要查询没有匹配的记录。例如从
来没有下订单的会员、从来没有卖出去的书籍等。
左关联就是在两个表之间指定的关联条件下匹配的数据行。如果右边的表中没有匹配行,
结果中就会增加一行,该行右边的列为NULL。左关联通过关键字“LEFT JOIN…ON”来实
现,如下所示:
238 PHP 网络编程技术与实例
以上通过左关联查询所有客户的订单记录,从结果中可以看出,虽然会员“guest”从来
没有订购记录,但是还是被列出来了。
如果想查询从来没有订购记录的客户,则只要增加一个判断语句即可,如下所示:
从上面可以看出,只需要增加条件判断语句“where orders.order_id is null”即可查询出
所有下过订单的会员了。
以上“members.member_id=orders.member_id”条件从句,还可以使用另外一种表达方法,
即用using 关键字,如下所示:
如果被查询的两个表的关键字段,即“member_id”是一样的,则可以省略“members.
member_id=orders.member_id”语句,用“using (member_id)”代替。
(10)通过ORDER BY 对记录进行排序。数据库中的数据可能是杂乱无章的,很多时候,
需要查询显示的结果按照一定的字段或者原则进行排序,此时可以使用ORDER BY 进行记
录排序。
如果要对 items 表中的图书价格字段price 进行排序,可以进行如下操作:
以上按照升序对图书的价格进行排序,如果要对图书价格进行降序排列,则可以用关键
第8 章 MySQL 数据库 239
字 DESC,如下所示:
另外可以同时对多个字段进行排序,如下所示:
从结果可以看出,如果不对item_id 进行降序排列,默认的情况下,出现的结果是3、2、
1、4(item_id 字段),而如果增加对item_id 排序,则结果不同。多字段排序,是按照先后顺
序进行的,在本例中,首先是按照price 进行排序,然后再对item_id 进行排序。
(11)常用的统计函数。在操作数据库的时候,经常需要获取数据库记录中的一些统计数
据,比如平均值、最大值、最小值和记录数等。
常用的统计函数如表 8-14 所示。
表 8-14 常用统计函数
名 称说 明
AVG(字段名) 获取指定列的平均值
COUNT(字段名) 如果指定一个字段,则会统计该字段中非空记录的数量。如果在前面增加 DISTINCT,则会统
计不同值的记录数,相同值的当作一条记录。如果使用COUNT(*)则会统计包含空值的所有记
录数。
MIN(字段名) 获取指定字段的最小值
MAX(字段名) 获取指定字段的最大值
STD(字段名) 指定字段的标准背离值
STDDEV(字段名) 与 STD 相同
SUM(字段名) 指定字段所有记录的总和
要统计 items 表中item_id 的最大值和最小值以及价格的最大值和最小值,如下所示:
240 PHP 网络编程技术与实例
接下来统计平均价格、价格总数以及总记录数,如下所示:
(12)通过GROUP BY 分组显示记录。很多时候,需要对有相同性质的记录进行分组统
计查询,如统计每个作者写作的书籍数量、每个会员采购记录等,此时通过分组查询比较方
便,分组查询是通过GROUP BY 关键字进行的。
如果要按照价格来分类统计每种价格的书籍种类,可以通过如下方法:
以上按照价格进行统计,从中可以看出,价格为39.99 元的书有5 本,36 元的有2 本……。
(13)HAVING 子句。前面介绍GROUP BY 的用法,如果需要针对GROUP BY 设置限
制条件,则不能使用Where 子句,必须使用HAVING 子句来设置。
例如要按照价格超过 35 元的书籍进行统计,必须要设定条件,如下所示:
(14)LIMIT 关键字。通过LIMIT 关键字可以设定要返回的记录数。该关键字不是标准
SQL 中的,而是MySQL 的扩展标准,因此采用该关键字不能适用其他数据库。
LIMIT 的用法如下所示:
第8 章 MySQL 数据库 241
以上表示从查询的记录集中的第 2 行开始(注意行的索引是从0 开始的,实际上是第3
条记录)显示3 条记录。
(15)使用子查询。所谓子查询就是嵌套在另外一个查询内部的查询。尽管大多数的子查
询都可以通过连接和临时表来实现,但是通过子查询则更容易理解和编写。
子查询最常见的用法就是将一个子查询的结果作为另外一个查询的条件,如下所示:
以上查询出图书编号 item_id 最大的图书的信息。
在进行子查询的时候,需要用到操作符,如 ANY、IN、SOME 或者ALL。具体含义如
表8-15 所示。
表 8-15 常用操作符
名 称示 例说 明
ANY SELECT field1 FROM table1 where field1 > ANY (SELECT field1 FrOM
table2)
如果同子查询的任何记录比较都
为真,则返回TRUE
IN SELECT field1 FROM table1 where field1 IN (SELECT field1 FrOM table2) 等价于 =ANY
SOME SELECT field1 FROM table1 where field1 > SOME (SELECT field1 FrOM
table2)
和ANY 含义一样
ALL SELECT field1 FROM table1 where field1 > ALL (SELECT field1 FrOM table2) 如果同子查询的全部记录比较为
真,则返回TRUE
下面演示一个 IN 操作符的应用,如下所示:
以上查询所有下过订单的会员的信息。子查询是从订单表中查询有订单的会员编号
member_id,关键字DISTINCT 表示去掉重复的记录,因为有的会员可能多次下过订单。
(16)关联子查询。所谓关联子查询中,指可以在内部查询中使用外部查询的结果,如下
所示:
242 PHP 网络编程技术与实例
以上查询了所有有被订购记录的书籍信息。这里使用了关键字EXISTS,如果查询还没
有订购记录的书籍信息,可以使用NOT EXIST(细心的读者会发现通过左关联也可以实现)。
在上面的查询中,子查询中使用了外部查询的表集items,这就是关联子查询。如果外部
查询中没有包含的表,则不能引用。
(17)将子查询作为临时表。有些时候,可以将子查询的结果作为一个临时的表放在FROM
后面来进行查询,如下所示:
以上是将“select * from members where member_login='admin'”子查询作为一个临时表,
注意在使用临时表的时候,必须要为该子查询创建一个别名。
SELECT 也可以被用于检索没有引用任何表的计算列。如下所示:
8.2.3 编辑记录
前面介绍了数据的插入和查询,接下来介绍如何在数据库中编辑数据。通过UPDATE 语
句可以实现,该语句的格式如下:
UPDATE [LOW_PRIORITY] [IGNORE] tbl_name
SET col_name1=expr1 [, col_name2=expr2 ...]
[WHERE where_definition]
[ORDER BY ...]
[LIMIT rows]
或者:
UPDATE [LOW_PRIORITY] [IGNORE] tbl_name [, tbl_name ...]
SET col_name1=expr1 [, col_name2=expr2 ...]
[WHERE where_definition]
UPDATE 以新的值更新现存表中行的列。SET 子句指出要修改哪个列和它们应该给定的
值。WHERE 子句如果被给出,指定哪个记录行应该被更新。否则,所有的记录行被更新。
如果ORDER BY 子句被指定,记录行将被以指定的次序更新。
如要将订单表 orders 中的订单数量全部改成5,如下所示:
第8 章 MySQL 数据库 243
mysql> update orders set quantity=5;
Query OK, 2 rows affected (0.11 sec)
Rows matched: 2 Changed: 2 Warnings: 0
以上显示两条记录被修改了,如果此时查看orders 表,会发现订单表中所有的订单数量
都被改成5 了,如下所示:
以上通过 UPDATE 修改记录的时候,没有设定条件,所以将所有的记录都修改了,如果
指定了限制条件,则只会修改符合条件的记录,如下所示:
mysql> update orders set quantity=1
-> where order_id=1;
Query OK, 1 row affected (0.03 sec)
Rows matched: 1 Changed: 1 Warnings: 0
以上将order_id 等于1 的订购数量quantity 修改成1,而order_id 等于2 的记录不会被改
变,从其返回的修改记录数量“1 row affected”也可以看出,结果如下:
如果指定关键词 LOW_PRIORITY,UPDATE 的执行将被延迟,直到没有其他的客户端
正在读取表。
如果指定关键词 IGNORE,该更新语句将不会异常终止,即使在更新过程中出现重复键
错误。导致冲突的记录行将不会被更新。
如果在一个表达式中从 tbl_name 中访问一个列,UPDATE 使用列的当前值。比如想要将
订单数量全部增加1,可以使用如下语句:
mysql> update orders set quantity=quantity+1;
Query OK, 2 rows affected (0.05 sec)
Rows matched: 2 Changed: 2 Warnings: 0
以上就直接引用了字段quantity 当前的值,然后在当前值上面增加1,查询结果如下:
从上面可以看出,quantity 的数量都增加了1。
UPDATE 赋值是从左到右计算的。首先看下面的语句:
mysql> update orders set quantity=quantity*2,
-> quantity=quantity+1;
244 PHP 网络编程技术与实例
Query OK, 2 rows affected (0.03 sec)
Rows matched: 2 Changed: 2 Warnings: 0
以上UPDATE 语句同时进行了两次编辑,首先将当前记录乘以2,然后在结果上再增加
1。在执行的时候,是按照从左到右的顺序进行的,如下所示:
从上面的结果可以看出,quantity 首先被乘2,然后再增加了1。
UPDATE 返回实际被改变的记录行数目。函数mysql_info()返回被匹配并更新的记录行
数目,以及在UPDATE 期间发生的警告的数目。
可以使用 LIMIT #来确保只有给定的记录行数目被更改。
mysql> update orders set quantity=1 limit 1;
Query OK, 1 row affected (0.02 sec)
Rows matched: 1 Changed: 1 Warnings: 0
以上语句将第一条记录的quantity 修改成了1,如下所示:
如果一个 ORDER BY 子句被使用,记录行将以指定的次序被更新。只有连同LIMIT 一
起才有用。
同时用户也可以执行一个包含多个表的 UPDATE 的操作:
UPDATE table_1,table_2 SET table_1.field_1=table_2.field_1 WHERE
table_1.id=table_2.id;
注意 多表 UPDATE 不可以使用ORDER BY 或LIMIT。
8.2.4 删除记录
当出现错误数据或者某些数据已经失去意义的时候,需要将数据从数据库中删除。删除
数据使用DELETE 语句来实现,该语句的格式如下:
DELETE [LOW_PRIORITY] [QUICK] FROM table_name
[WHERE where_definition]
[ORDER BY ...]
[LIMIT rows]
或者
DELETE [LOW_PRIORITY] [QUICK] table_name[.*] [, table_name[.*] ...]
FROM table-references
[WHERE where_definition]
或者:
DELETE [LOW_PRIORITY] [QUICK]
第8 章 MySQL 数据库 245
FROM table_name[.*] [, table_name[.*] ...]
USING table-references
[WHERE where_definition]
DELETE 从table_name 中删除where_definition 中给定条件的记录行,并返回删除的记录数目。
如要删除 orders 表中的第1 条记录,则可以使用下面的语句:
mysql> delete from orders where order_id=1;
Query OK, 1 row affected (0.03 sec)
从执行结果可以看出,1 条记录被删除了。
如果发出一个没有WHERE 子句的DELETE,所有的记录行将被删除。如果以
AUTOCOMMIT 模式执行它,那么类似于TRUNCATE。
下面的语句将删除 orders 表中的所有记录,由于没有使用WHERE 条件,所以不知道到
底被删除了多少条记录,结果返回0,如下所示:
mysql> delete from orders;
Query OK, 1 row affected (0.01 sec)
此时如果查询该表,则会显示没有记录。
当然如果使用 DELETE 删除整个表的数据效率并不高,推荐使用TRUNCATE 语句,该
方法可以快速地删除表中的内容。
因为前面已经删除了 orders 表中的记录,为了方便演示,下面插入两条记录,如下所示:
mysql> insert into orders (member_id,item_id,quantity)
-> values (1,1,1);
Query OK, 1 row affected (0.06 sec)
mysql> insert into orders (member_id,item_id,quantity)
-> values (2,2,2);
Query OK, 1 row affected (0.03 sec)
接着进行查询,如下所示:
可以看出,两条记录已经被插入,接下来使用 TRUNCATE 语句删除数据库表数据,如
下所示:
mysql> truncate orders;
Query OK, 2 rows affected (0.05 sec)
如果删除时指定关键词LOW_PRIORITY,DELETE 的执行将被延迟,直到没有其他的
客户端正在读取表。
如果指定关键词 QUICK,那么在删除过程中存储引擎将不会归并索引页,这可能会加速
某些类型的删除操作。
在 MySQL 中,删除的记录被放在一个链接表中维护,以后的INSERT 操作将重新使用
删除后的记录位置。为了回收闲置的空间,并减小文件尺寸,使用OPTIMIZETABLE 语句或
myisamchk 实用程序重新组织表。OPTIMIZE TABLE 使用比较容易,但是myisamchk 更快点。
如果一个 ORDER BY 子句被使用,记录行将以指定的次序删除,只有连同LIMIT 一起
才有用。
246 PHP 网络编程技术与实例
DELETE 语句的LIMIT rows 选项是MySQL 特有的,它告诉服务器在控制权被返回到客
户端之前可被删除的最大记录行数目。这可以用来确保一个特定的DELETE 命令不会占用太
长的时间。可以简单地重复使用DELETE 命令,直到被影响的记录行数目小于LIMIT 值。
从 MySQL 4.0 开始,在DELETE 语句中可以指定多个表,用于从一个表中删除依赖于多
表中的特殊情况的记录行。然而,在多表删除中,不能使用ORDER BY 或LIMIT。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值