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实际是删除原来的表并重新创建一个表,而不
是逐行删除表中的数据)。
posted @ 2025-04-25 22:53  JDamaze  阅读(32)  评论(0)    收藏  举报