sql必知必会学习记录(十五)- 操作数据
sql必知必会学习记录(十五)- 操作数据
1. 插入数据
- 插入完整的行;
- 插入行的一部分;
- 插入多行;
- 插入某些查询的结果
插入完整的行
INSERT INTO 表名 VALUES(val1,val2.....);
INSERT INTO Customers VALUES(NULL,
'Pep E. LaPew',
'1100 Main Street',
'Los Angeles',
'CA',
190046',
'USA',
NULL,
NULL);
各个列必须以它们在表定义中出现的次序填充。第一列custid为NULL。这是因为每次插入一个新行时,该列由MySQL自动增量。你不想给出一个值(这是MySQL的工作),又不能省略此列(如前所述,必须给出每个列),所以指定一个NULL值(它被MySQL忽略,MySQL在这里插入下一个可用的cust_id值)。但是这种方法在更改表结构之后,原来的sql语句就不能用了。
INSERT INTO cuStomers(cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country,cust_contact, cust_email)VALUES('Pep E. LaPew','1100 Main Street',
'Los Angeles', 'CA',190046','USA', NULL, NULL);
上面的SQL,其优点是,即使表的结构改变,此INSERT语句仍然能正确工作。你会发现cust_id的NULL值是不必要的,cust_id列并没有出现在列表中,所以不需要任何值。使用这种语法,还可以省略列。这表示可以只给某些列提供值,给其他列不提供值
不管使用哪种INSERT语法,都必须给出VALUES的正确数目。如果不提供列名,则必须给每个表列提供一个值。如果提供列名,则必须对每个列出的列给出一个值。如果不这样,将产生一条错误消息,相应的行插入不
如果表的定义允许,则可以在INSERT操作中省略某些列。省略的列必须满足以下某个条件。
-
该列定义为允许NULL值(无值或空值)。
-
在表定义中给出默认值。这表示如果不给出值,将使用默认值。
如果对表中不允许NULL值且没有默认值的列不给出值,则MySQL将产生一条错误消息,并且相应的行插入不成功。
数据库经常被多个客户访问,对处理什么请求以及用什么次序处理进行管理是MySQL的任务。INSERT操作可能很耗时(特别是有很多索引需要更新时),而且它可能降低等待处理的SELECT语句的性能。
如果数据检索是最重要的(通常是这样),则你可以通过在INSERT和INTO之间添加关键字LOW_PRIORITY,指示MySQL降低INSERT语句的优先级,如下所示:INSERT LOW_PRIORITY INTO
这也适用于UPDATE和DELETE语句。
一次插入多条数据
其中单条INSERT语句有多组值,每组值用一对圆括号括起来,用逗号分隔。此技术可以提高数据库处理的性能,因为MySQL用单条INSERT语句处理多个插入比使用多条INSERT语句快。
INSERT INTO cuStomers(cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country)
VALUES(
'Pep E. LaPew',
'1100 Main Street',
'Los Angeles', 'CA',
'190046',
'USA'
),
('M. Martian',
'142 Galaxy Way',
'New York',
'NY',
'11213',
'USA'
);
插入检索出的数据
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;
MySQL不关心SELECT返回的列名。它使用的是列的位置,因此SELECT中的第一列(不管其列名)将用来填充表列中指定的第一个列,第二列将用来填充表列中指定的第二个列,如此等等。这对于从使用不同列名的表中导入数据是非常有用的。SELECT语句可包含WHERE子句以过滤插入的数据
2. 更新数据
update的语法:
update 表名 set 列名= 值,列名=值 where 过滤条件
**IGNORE关键字 **如果用UPDATE语句更新多行,并且在更新这些行中的一行或多行时出一个现错误,则整个UPDATE操作被取消(错误发生前更新的所有行被恢复到它们原来的值)。为了即使是发生错误,也继续进行更新,可使用IGNORE关键字,如下所示:UPDATE IGNORE customers…
3. 删除数据
delete的语法:
DELETE FROM 表名 where 过滤条件 //如果省略了过滤条件,则是删除表中的所有数据
如果想从表中删除所有行,不要使用DELETE。可使用TRUNCATE TABLE语句,它完成相同的工作,但速度更
快(TRUNCATE实际是删除原来的表并重新创建一个表,而不是逐行删除表中的数据)。