MySQL增删改查
插入(增):
插入完整的行
把数据插入表中的最简单的方法是使用基本的INSERT语法,它要求指定表名和被插入到新行中的值。下面举一个例子:
INSERT INTO Customers
VALUES(NULL,
'Pep E. LaPew',
'100 Main Street',
'Los Angeles',
'CA',
'90046',
'USA',
NULL,
NULL);
没有输出 INSERT语句一般不会产生输出。
虽然这种语法很简单,但并不安全,应该尽量避免使用。上面的SQL
语句高度依赖于表中列的定义次序,并且还依赖于其次序容易获得的信
息。即使可得到这种次序信息,也不能保证下一次表结构变动后各个列
保持完全相同的次序。因此,编写依赖于特定列次序的SQL语句是很不安
全的。如果这样做,有时难免会出问题。
编写INSERT语句的更安全(不过更烦琐)的方法如下:
INSERT INTO Customers(cust_name,
cust_address,
cust_city,
cust_state,
cust_zip,
cust_country,
cust_contact,
cust_email)
VALUES('Pep E. LaPew',
'100 Main Street',
'Los Angeles',
'CA',
'90046',
'USA',
NULL,
NULL);
你会发现cust_id的NULL值是不必要的,
cust_id列并没有出现在列表中,所以不需要任何值。
仔细地给出值 不管使用哪种INSERT语法,都必须给出
VALUES的正确数目。如果不提供列名,则必须给每个表列提供
一个值。如果提供列名,则必须对每个列出的列给出一个值。
如果不这样,将产生一条错误消息,相应的行插入不成功。
总是使用列的列表 一般不要使用没有明确给出列的列表的
INSERT语句。使用列的列表能使SQL代码继续发挥作用,即使
表结构发生了变化。
使用这种语法,还可以省略列。这表示可以只给某些列提供值,给
其他列不提供值。(事实上你已经看到过这样的例子:当列名被明确列出
时,cust_id可以省略。
提高整体性能 数据库经常被多个客户访问,对处理什么请
求以及用什么次序处理进行管理是MySQL的任务。INSERT操
作可能很耗时(特别是有很多索引需要更新时),而且它可能
降低等待处理的SELECT语句的性能。
如果数据检索是最重要的(通常是这样),则你可以通过在
INSERT和INTO之间添加关键字LOW_PRIORITY,指示MySQL
降低INSERT语句的优先级,如下所示:
INSERT LOW_PRIORITY INTO
插入多个行
INSERT可以插入一行到一个表中。但如果你想插入多个行怎么办?
可以使用多条INSERT语句,甚至一次提交它们,每条语句用一个分号结
束,如下所示:
INSERT INTO customers(cust_name,
cust_address,
cust_city,
cust_state,
cust_zip,
cust_country)
VALUES('Pep E. LaPew',
'100 Main Street',
'Los Angeles',
'CA',
'90046',
'USA');
INSERT INTO customers(cust_name,
cust_address,
cust_city,
cust_state,
cust_zip,
cust_country)
VALUES('M. Martian',
'42 Galaxy Way',
'NEW York',
'NY',
'11213',
'USA');
或者,只要每条INSERT语句中的列名(和次序)相同,可以如下组
合各语句:
INSERT INTO customers(cust_name,
cust_address,
cust_city,
cust_state,
cust_zip,
cust_country)
VALUES('Pep E. LaPew',
'100 Main Street',
'Los Angeles',
'CA',
'90046',
'USA'
),
(
'M. Martian',
'42 Galaxy Way',
'NEW York',
'NY',
'11213',
'USA'
);
其中单条INSERT语句有多组值,每组值用一对圆括号括起来,
用逗号分隔。
提高INSERT的性能 此技术可以提高数据库处理的性能,因
为MySQL用单条INSERT语句处理多个插入比使用多条INSERT
语句快。
新例子的说明 这个例子把一个名为custnew的表中的数据
导入customers表中。为了试验这个例子,应该首先创建和填
充custnew表。custnew表的结构与附录B中描述的customers
表的相同。在填充custnew时,不应该使用已经在customers
中使用过的cust_id值(如果主键值重复,后续的INSERT操作
将会失败)或仅省略这列值让MySQL在导入数据的过程中产
生新值。
INSERT INTO customers(cust_id,
cust_contact,
cust_email,
cust_name,
cust_address,
cust_city,
cust_state,
cust_zip,
cust_country)
SELECT cust_id,
cust_contact,
cust_email,
cust_name,
cust_address,
cust_city,
cust_state,
cust_zip,
cust_country
FROM custnew;
这个例子导入了cust_id(假设你能够确保cust_id的值不重复)。你
也可以简单地省略这列(从INSERT和SELECT中),这样MySQL就会生成
新值。
更新(改)
更新表中特定行;
更新表中所有行。
不要省略WHERE子句 在使用UPDATE时一定要注意细心。因为
稍不注意,就会更新表中所有行。在使用这条语句前,请完
整地阅读本节。
UPDATE语句非常容易使用,甚至可以说是太容易使用了。基本的
UPDATE语句由3部分组成,分别是:
要更新的表;
列名和它们的新值;
确定要更新行的过滤条件。
举一个简单例子。客户10005现在有了电子邮件地址,因此他的记录
需要更新,语句如下:
UPDATE customers
SET cust_email = 'elmer@fudd.com'
WHERE cust_id = 10005;
UPDATE语句以WHERE子句结束,它告诉MySQL更新哪一行。没有
WHERE子句,MySQL将会用这个电子邮件地址更新customers表中所有
行,这不是我们所希望的。
更新多个列的语法稍有不同:
UPDATE custmoers
SET cust_name = 'The Fudds',
cust_email = 'elmer@fudd.com'
WHERE cust_id = 10005;
在更新多个列时,只需要使用单个SET命令,每个“列=值”对之间
用逗号分隔(最后一列之后不用逗号)。在此例子中,更新客户10005的
cust_name和cust_email列。
在UPDATE语句中使用子查询 UPDATE语句中可以使用子查
询,使得能用SELECT语句检索出的数据更新列数据。关于子
查询及使用的更多内容,请参阅第14章。
IGNORE关键字 如果用UPDATE语句更新多行,并且在更新这些
行中的一行或多行时出一个现错误,则整个UPDATE操作被取消
(错误发生前更新的所有行被恢复到它们原来的值)。为即使是发
生错误,也继续进行更新,可使用IGNORE关键字,如下所示:
UPDATE IGNORE customers...
为了删除某个列的值,可设置它为NULL(假如表定义允许NULL值)。
如下进行:
UPDATE customers
SET cust_email = NULL
WHERE cust_id = 10005;
其中NULL用来去除cust_email列中的值。
删除数据
为了从一个表中删除(去掉)数据,使用DELETE语句。可以两种方
式使用DELETE:
从表中删除特定的行;
从表中删除所有行。
不要省略WHERE子句 在使用DELETE时一定要注意细心。因为
稍不注意,就会错误地删除表中所有行。
下面的语句从customers表中删除一行:
DELETE FROM customers
WHERE cust_id = 10006;
DELETE不需要列名或通配符。DELETE删除整行而不是删除列。为了
删除指定的列,请使用UPDATE语句。
删除表的内容而不是表 DELETE语句从表中删除行,甚至是
删除表中所有行。但是,DELETE不删除表本身。
更快的删除 如果想从表中删除所有行,不要使用DELETE。
可使用TRUNCATE TABLE语句,它完成相同的工作,但速度更
快(TRUNCATE实际是删除原来的表并重新创建一个表,而不
是逐行删除表中的数据)。
浙公网安备 33010602011771号