SQL 之 修改数据
2016-10-06 19:57
134 查看
关键字:INSERT INTO , VALUES , DELETE , TRUNCATE TABLE , UPDATE
修改数据:
(1)插入新的行
(2)删除表中的行
(3)更新表中指定的行与列已有的数据
一、修改策略
修改数据的机制十分直接,意味着非常危险。实际中有各种可以帮助防止灾难性错误的策略。
(1)删除行时,可以使用软删除技术,这并不是真正从物理上删除行,可以用表中一个特定的列来标记每行是否有效还是无效。我们只把一个行标记为无效,而不是删除它。这样,如果删除是误操作,你可以通过修改有效/无效列很容易恢复它。
(2)插入操作,当增加一行时,可以在一个特定的列中标记准确的插入日期和时间。如果后来认为是错误插入,可以很快通过找到特定时间范围内添加的所有行,并且删除它们。
(3)更新操作,通常用一个单独的表来保存事务所要更新的数据。如果出错,可以回到事务表中来找到数据修改之前和之后的值,并且用来撤销之前的任何错误。
二、插入数据
每个表默认有一个自增型的数字(主键),可以不为这行指定数值,插入时只要提供其它字段的值:
1. 插入指定数据
INSERT INTO Customers
(FirstName, LastName, State)
VALUES
('Virginia', 'Jones', 'OH'),
('Clark', 'Woodland', 'CA')
针对本例,Oracle不允许在VALUES后面指定多个行,所以要分开两条语句
顺序方面,VALUES后面的记录的每个字段只需要和INSERT INTO后面的columnlist中所列出的顺序相对应。
列的防止顺序不重要。FirstName, LastName, State可以打乱,插入的行只需要对应就好。
一般格式:
INSERT INTO tableName
(columnlist)
VALUES
(RowValue1),
(RowValue2),
(重复任意次)
RowValue1的列需要和columnlist对应。
插入一行时某列(如果允许为NULL)没有提供值则赋值为NULL。
2. 插入由SELECT语句获取的数据
如果另一个表包含想要插入的数据,可以:
INSERT INTO
Customers
(FirstName, LastName, State)
SELECT
Name1,
Name2,
State
FROM CustomerTransactions
WHERE State = 'RI'
INSERT INTO tableName1
(columnlist1)
SELECT
(columnlist2)
FROM ableName2
WHERE condition
columnlist2的列需要和columnlist1对应(类型对应或者类型可以兼容,不是列名对应,列名不重要)。
三、删除数据
DELETE
FROM Table
WHERE condition
可以使用COUNT来验证删除的结果。(行数减少?)
如果要删除一个表中所有的数据,使用TRUNCATE TABLE更快(不记录事务的结果,日志是数据库用于恢复数据的一种机制)。
TRUNCATE TABLE Customers
等价于
DELETE FROM Customers
TRUNCATE TABLE重新设置自增型的列的当前值,DELETE语句则不会。
四、更新数据
UPDATE table
SET column1 = expression1,
column2 = expression2
(repeat any number of times)
WHERE condition
更新多个列,用逗号分隔表达式,但SET只出现一次。PS:WHERE子句是必须的,否则全部行都修改.
SQL是一行一行地去更新,检查每一行的每一列然后确定要不要按照表达式更新。
实际上更常见的还是用一个表的数据去更新另一个表的数据:
比如用CustomerTransaction的State和Zip列的数值去更新Customers表的相应列(两个表通过CustomerID关联)
分析:
子查询
可以看出这是个关联子查询(单独执行会出错,没有Customers.CustomerID)子查询从CustomerTransactions表中获取数据(State列的数据),并通过CustomerID来匹配两个表。
最后WHERE子句的逻辑和整个UPDATE语句的查询逻辑相关,EXISTS操作符和另一个相关的子查询一起使用,以判断针对Customers表中的每个CustomerID,CustomerTransactions表中是否存在对应的行。
如果没有这个WHERE子句的话,CustomerID表中在CustomerTransactions表没有匹配的行也会被修改(为NULL)。也就是,WHERE子句使得我们只对在CustomerTransactions表中有匹配数据的客户进行更新。
修改数据:
(1)插入新的行
(2)删除表中的行
(3)更新表中指定的行与列已有的数据
一、修改策略
修改数据的机制十分直接,意味着非常危险。实际中有各种可以帮助防止灾难性错误的策略。
(1)删除行时,可以使用软删除技术,这并不是真正从物理上删除行,可以用表中一个特定的列来标记每行是否有效还是无效。我们只把一个行标记为无效,而不是删除它。这样,如果删除是误操作,你可以通过修改有效/无效列很容易恢复它。
(2)插入操作,当增加一行时,可以在一个特定的列中标记准确的插入日期和时间。如果后来认为是错误插入,可以很快通过找到特定时间范围内添加的所有行,并且删除它们。
(3)更新操作,通常用一个单独的表来保存事务所要更新的数据。如果出错,可以回到事务表中来找到数据修改之前和之后的值,并且用来撤销之前的任何错误。
二、插入数据
每个表默认有一个自增型的数字(主键),可以不为这行指定数值,插入时只要提供其它字段的值:
1. 插入指定数据
INSERT INTO Customers
(FirstName, LastName, State)
VALUES
('Virginia', 'Jones', 'OH'),
('Clark', 'Woodland', 'CA')
针对本例,Oracle不允许在VALUES后面指定多个行,所以要分开两条语句
顺序方面,VALUES后面的记录的每个字段只需要和INSERT INTO后面的columnlist中所列出的顺序相对应。
列的防止顺序不重要。FirstName, LastName, State可以打乱,插入的行只需要对应就好。
一般格式:
INSERT INTO tableName
(columnlist)
VALUES
(RowValue1),
(RowValue2),
(重复任意次)
RowValue1的列需要和columnlist对应。
插入一行时某列(如果允许为NULL)没有提供值则赋值为NULL。
2. 插入由SELECT语句获取的数据
如果另一个表包含想要插入的数据,可以:
INSERT INTO
Customers
(FirstName, LastName, State)
SELECT
Name1,
Name2,
State
FROM CustomerTransactions
WHERE State = 'RI'
INSERT INTO tableName1
(columnlist1)
SELECT
(columnlist2)
FROM ableName2
WHERE condition
columnlist2的列需要和columnlist1对应(类型对应或者类型可以兼容,不是列名对应,列名不重要)。
三、删除数据
DELETE
FROM Table
WHERE condition
可以使用COUNT来验证删除的结果。(行数减少?)
如果要删除一个表中所有的数据,使用TRUNCATE TABLE更快(不记录事务的结果,日志是数据库用于恢复数据的一种机制)。
TRUNCATE TABLE Customers
等价于
DELETE FROM Customers
TRUNCATE TABLE重新设置自增型的列的当前值,DELETE语句则不会。
四、更新数据
UPDATE table
SET column1 = expression1,
column2 = expression2
(repeat any number of times)
WHERE condition
更新多个列,用逗号分隔表达式,但SET只出现一次。PS:WHERE子句是必须的,否则全部行都修改.
SQL是一行一行地去更新,检查每一行的每一列然后确定要不要按照表达式更新。
实际上更常见的还是用一个表的数据去更新另一个表的数据:
比如用CustomerTransaction的State和Zip列的数值去更新Customers表的相应列(两个表通过CustomerID关联)
UPDATE Customers SET Customers.State = (SELECT CustomerTransactions.State FROM CustomerTransactions WHERE CustomerTransactions.CustomerID = Customers.CustomerID), Customers.Zip = (SELECT CustomerTransactions.Zip FROM CustomerTransactions WHERE CustomerTransactions.CustomerID = Customers.CustomerID) WHERE EXISTS (SELECT * FROM CustomerTransactions WHERE CustomerTransactions.CustomerID = Customers.CustomerID)
分析:
子查询
SELECT CustomerTransactions.State FROM CustomerTransactions WHERE CustomerTransactions.CustomerID = Customers.CustomerID
可以看出这是个关联子查询(单独执行会出错,没有Customers.CustomerID)子查询从CustomerTransactions表中获取数据(State列的数据),并通过CustomerID来匹配两个表。
最后WHERE子句的逻辑和整个UPDATE语句的查询逻辑相关,EXISTS操作符和另一个相关的子查询一起使用,以判断针对Customers表中的每个CustomerID,CustomerTransactions表中是否存在对应的行。
如果没有这个WHERE子句的话,CustomerID表中在CustomerTransactions表没有匹配的行也会被修改(为NULL)。也就是,WHERE子句使得我们只对在CustomerTransactions表中有匹配数据的客户进行更新。
相关文章推荐
- SQL根据一个表的数据修改另一表数据的语句
- SQL:拷贝原有数据生成新纪录并修改其中一些字段的值
- 用sql命令修改数据表中的一个字段为非空(not null)的语句
- SQL命令修改数据
- 利用修改AccessDataSource的sql语句来检索数据
- 如何使用 ADO Stream 对象访问和修改 SQL Server BLOB 数据
- 在SQL中修改视图中的数据会受到哪些限制
- LINQ to SQL 系列 如何使用LINQ to SQL插入、修改、删除数据
- LINQ to SQL 系列 如何使用LINQ to SQL插入、修改、删除数据
- 在SQL中修改视图中的数据会受到哪些限制
- 在修改数据的SQL语句中使用OUTPUT子句带来的好处
- SQL 字段取字符位置与循环修改数据
- 在SQL中修改视图中的数据会受到哪些限制
- 【LINQ专题】使用LINQ to SQL插入、修改、删除数据
- SQL 使用XML数据修改语言
- 用SQL语句修改MSSQL数据库表字段的默认值(downmoon)
- 如何用sql语句修改数据表中字段,实现identity(100,1)
- SQL XML DML 数据修改
- SQL 中对XML数据的修改
- SQL语言基础--数据插入修改删除