update语句
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
update语句
篇一:SQL语句中UPDATE的三种用法
SQL语句中的更新语句update是最常用的语句之一,下面将为您介绍update语句的三种使用方法,供您参考,希望对您有所帮助。
一、环境:
MySQL-5.0.41-win32
Windows XP professional
二、建立测试环境:
DROP TABLE IF EXISTS t_test;
CREATE TABLE t_test (
bsbigint(20) NOT NULL auto_increment,
usernamevarchar(20) NOT NULL,
passwordvarchar(20) default NULL,
remarkvarchar(200) default NULL,
PRIMARY KEY (bs)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=gbk;
INSERT INTO t_test VALUES
(1,'lavasoft','123456',NULL);
INSERT INTO t_test VALUES (2,'hello',NULL,NULL);
INSERT INTO t_test VALUES (3,'haha',zz,tt);
三、测试
1、set一个字段
在表t_test中设置第二条记录(bs为2)的password为'***'。
updatet_test t
sett.password = '***'
where t.bs = 2;
2、set多个字段
在表t_test中设置第一条记录(bs为1)的password为'*'、remark为'*'。
updatet_test t
sett.password = '*', t.remark = '*'
where t.bs = 1;
3、set null值
在表t_test中设置第三条记录(bs为3)的password为null、remark为null。
updatet_test t
sett.password = null, t.remark = null
where t.bs = 3;
这个是按照标准语法写的,在不同的数据库系统中,update还有更多的写法,但是标准写
法都是支持的。
以上三个例子为了说明情况,每次都更新一行。
在实际中,可以通过where语句约束来控制更新行数。
篇二:update语句
Oracle的update语句优化研究
一、update语句的语法与原理
1. 语法
单表:UPDATE 表名称SET 列名称= 新值WHERE 列名称= 某值
如:updatet_join_situationsetjoin_state='1'whereyear=& #39;2011'
更新年度为“2011”的数据的join_state字段为“1”。
如果更新的字段加了索引,更新时会重建索引,更新效率会慢。
多表关联,并把一个表的字段值更新到另一个表中的字段去:
update 表a set a.字段1 = (select b.字段1 from 表b where a.字段2=b.字段2) where exists(select 1 from 表b where a.字段2=b.字段2)oracle的更新语句不通MSSQL那么简单易写,就算写出来了,但执行时可能会报
这是由于set哪里的子查询查出了多行数据值,oracle规定一对一更新数据,所以提示出错。
要解决这样必须保证查出来的值一一对应。
2. 原理
Update语句的原理是先根据where条件查到数据后,如果set中有子查询,则执行子查询把值查出来赋给更新的字段,执行更新。
如:update 表a set a.字段1 = (select b.字段1 from 表b where a.字段2=b.字段2) where exists(select 1 from 表b where a.字段2=b.字段2)。
查表a的所有数据,循环每条数据,验证该条数据是否符合exists(select 1 from 表b where a.字段2=b.字段2)条件,如果是则执行(select b.字段1 from 表 b where a.字段2=b.字段2)查询,查到对应的值更新a.字段1中。
关联表更新时一定要有
exists(select 1 from 表b where a.字段2=b.字段2)这样的条件,否则将表a的其他数据的字段1更新为null值。
二、提高oracle更新效率的各种解决方案
1. 标准update语法
当你需要更新的表是单个或者被更新的字段不需要关联其他表带过来,则最后选择标准的update语句,速度最快,稳定性最好,并返回影响条数。
如果where条件中的字段加上索引,那么更新效率就更高。
但对需要关联表更新字段时,
update的效率就非常差。
2. inline view更新法
inline view更新法就是更新一个临时建立的视图。
如:update (select
a.join_stateasjoin_state_a,
b.join_stateasjoin_state_b
fromt_join_situation a, t_people_info b
wherea.people_number=b.people_number
anda.year='2011'anda.city_number='M00000 'anda.town_number='M51000')
setjoin_state_a=join_state_b
括号里通过关联两表建立一个视图,set中设置好更新的字段。
这个解决方法比写法较直观且执行速度快。
但表B的主键一定要在where条件中,并且是以“=”来关联被更新表,否则报一下错误:
3.merge更新法
merge是oracle特有的语句,语法如下:
MERGE INTO table_name alias1
USING (table|view|sub_query) alias2
ON (join condition)
WHEN MATCHED THEN
UPDATE table_name
SET col1 = col_val1,
col2 = col2_val
WHEN NOT MATCHED THEN
INSERT (column_list) VALUES (column_values);
它的原理是在alias2中Select出来的数据,每一条都跟alias1进行ON (join condition)的比较,如果匹配,就进行更新的操作(Update),如果不匹配,就进行插入操作(Insert)。
执行merge不会返回影响的行数。
Merge语句的写法比较繁琐,并且最多只能两个表关联,复杂的语句用merge更新法将力不从心且效率差。
4.快速游标更新法
语法如:
begin
forcrin (查询语句) loop –-循环
--更新语句(根据查询出来的结果集合)
endloop; --结束循环
end;
oracle支持快速游标,不需要定义直接把游标写到for循环中,这样就方便了我们批量更新数据。
再加上oracle的rowid 物理字段(oracle默认给每个表都有rowid这个字段,并且是唯一索引),可以快速定位到要更新的记录上。
例子如下:
--3.281
begin
forcrin
(selecta.rowid,b.join_statefromt_join_situationa,t_people_info b wherea.people_number=b.people_number
anda.year='2011'anda.city_number='M00000 'anda.town_number='M51000') loop
updatet_join_situationsetjoin_state=cr.join_statewhere
rowid = cr.rowid;
endloop;
end;
--1.641
mergeintot_join_situation a
using t_people_info b
on (a.people_number=b.people_number
and a.year='2011'anda.city_number='M00000 9;anda.town_number='M51000') whenmatchedthenupdateset a.join_state=b.join_state
篇三:sql的update语句功能非常强大
语法
UPDATE
{
table_name WITH ( <
table_hint_limited > [ ...n ] )
| view_name
| rowset_function_limited
}
SET
{ column_name = { expression |
DEFAUL T | NULL }
| @variable = expression
| @variable = column = expression
} [ ,...n ]
{ { [ FROM { < table_source > } [ ,...n ] ]
[ WHERE
< search_condition > ] }
|
[ WHERE CURRENT OF
{ { [ GLOBAL ] cursor_name } |
cursor_variable_name }
[ OPTION ( < query_hint > [
,...n ] ) ]
< table_source > ::=
table_name [ [ AS ] table_alias ] [
WITH ( < table_hint > [ ,...n ] ) ]
| view_name [ [ AS ] table_alias ]
| rowset_function [ [ AS ] table_alias
]
| derived_table [ AS ] table_alias [
( column_alias [ ,...n ] ) ]
| < joined_table >
< joined_table > ::=
< table_source > < join_type > < table_source > ON < search_condition > | < table_source > CROSS JOIN <
table_source >
| < joined_table >
< join_type > ::=
[ INNER | { { LEFT | RIGHT | FULL
} [OUTER] } ]
[ < join_hint > ]
< table_hint_limited > ::= { FASTFIRSTROW
| HOLDLOCK
| PAGLOCK
| READCOMMITTED
| REPEATABLEREAD
| ROWLOCK
| SERIALIZABLE
| TABLOCK
| TABLOCKX
| UPDLOCK
}
< table_hint > ::=
{ INDEX ( index_val [ ,...n ] )
| FASTFIRSTROW
| HOLDLOCK
| NOLOCK
| PAGLOCK
| READCOMMITTED
| READPAST
| READUNCOMMITTED
| REPEATABLEREAD
| ROWLOCK
| SERIALIZABLE
| TABLOCK
| TABLOCKX
| UPDLOCK
}
< query_hint > ::=
{ { HASH | ORDER } GROUP
| { CONCAT | HASH | MERGE }
UNION
| {LOOP | MERGE | HASH } JOIN
| FAST number_rows
| FORCE ORDER
| MAXDOP
| ROBUST PLAN
| KEEP PLAN
}
参数
table_name
需要更新的表的名称。
如果该表不在当前服务器或数据库中,或不为当前用户所有,这个名称可用链接服务器、
数据库和所有者名称来限
定。
WITH ( < table_hint_limited > [ ...n ] )
指定目标表所允许的一个或多个表提示。
需要有WITH 关键字和
圆括号。
不允许有READPAST、NOLOCK 和READUNCOMMITTED。
有关表提示的信息,请参见FROM。
view_name
要更新的视图的名称。
通过view_name 来引用的视图必须是可
更新的。
用UPDATE 语句进行的修改,至多只能影响视图的
FROM 子句所引用的基表中的一个。
有关可更新视图的更多信息,请参见CREATE VIEW。
rowset_function_limited
OPENQUERY 或OPENROWSET 函数,视提供程序功能而定。
有关提供程序所需功能的更多信息,请参见OLE DB 提供程序的
UPDATE 和DELETE 语句要求。
有关行集函数的更多信息,请参见OPENQUERY 和OPENROWSET。
SET
指定要更新的列或变量名称的列表。
column_name
含有要更改数据的列的名称。
column_name 必须驻留于UPDATE 子句中所指定的表或视图中。
标识列不能进行更新。
如果指定了限定的列名称,限定符必须同UPDATE 子句中的表或视图的名称相匹配。
例如,下面的内容有效:UPDATE authors
SET authors.au_fname = 'Annie'
WHERE au_fname = 'Anne'
FROM 子句中指定的表的别名不能作为SET column_name 子
句中的限定符使用。
例如,下面的内容无效:
UPDATE titles
SET t.ytd_sales = t.ytd_sales + s.qty
FROM titles t, sales s
WHERE t.title_id = s.title_id
AND s.ord_date = (SELECT MAX(sales.ord_date)
FROM sales)
若要使上例合法,请从列名中删除别名t。
UPDATE titles
SET ytd_sales = t.ytd_sales + s.qty
FROM titles t, sales s
WHERE t.title_id = s.title_id
AND s.ord_date = (SELECT MAX(sales.ord_date)
FROM sales)
expression
变量、字面值、表达式或加上括弧的返回单个值的subSELECT 语句。
expression 返回的值将替换column_name 或
@variable 中的现有值。
DEFAULT
指定使用对列定义的默认值替换列中的现有值。
如果该列没有默认值并且定义为允许空值,这也可用来将列更改为NULL。
@variable
已声明的变量,该变量将设置为expression 所返回的值。
SET @variable = column = expression 将变量设置为
与列相同的值。
这与SET @variable = column, column = expression 不同,后者将变量设置为列更新前的值。
FROM < table_source >
指定用表来为更新操作提供准则。
有关更多信息,请参见FROM。
table_name [[AS] table_alias ]
为更新操作提供准则的表的名称。
如果所更新表与FROM 子句中的表相同,并且在FROM 子句中对该表只有一个引用,则指定或不指定table_alias 均可。
如
果所更新表在FROM 子句中出现了不止一次,则对该表的一个(且仅仅一个)引用不能指定表的别名。
FROM 子句中对该表的所有其它引用都必须包含表的别名。
view_name [ [ AS ] table_alias ]
为更新操作提供准则的视图的名称。
带INSTEAD OF UPDATE 触发器的视图不能是含有FROM 子句的UPDATE 的目标。
WITH ( < table_hint > [ ...n ] )
为源表指定一个或多个表提示。
有关表提示的信息,请参见本卷的FROM。
rowset_function [ [AS] table_alias ]
任意行集函数的名称和可选别名。
有关行集函数列表的信息,请参见行集函数。
derived_table
是从数据库中检索行的子查询。
derived_table 用作对外部查询的输入。
column_alias
替换结果集内列名的可选别名。
在选择列表中放入每个列的一个别名,并将整个列别名列表用圆括号括起来。
由两个或更多表的积组成的结果集,例如:
SELECT *
FROM tab1 LEFT OUTER JOIN tab2 ON tab1.c3 =
tab2.c3
RIGHT OUTER JOIN tab3 LEFT OUTER JOIN
tab4
ON tab3.c1 = tab4.c1
ON tab2.c3 = tab4.c3
对于多个CROSS 联接,请使用圆括号来更改联接的自然顺序。
指定联接操作的类型。
INNER
指定返回所有相匹配的行对。
废弃两个表中不匹配的行。
如果未指定联接类型,则这是默认设置。
LEFT [OUTER]
指定除所有由内联接返回的行外,所有来自左表的不符合指定条件的行也包含在结果集内。
来自左表的输出列设置为NULL。
RIGHT [OUTER]
指定除所有由内联接返回的行外,所有来自右表的不符合
指定条件的行也包含在结果集内。
来自右表的输出列设置为NULL。
FULL [OUTER]
如果来自左表或右表的某行与选择准则不匹配,则指定在结果集内包含该行,并且将与另一个表对应的输出列设置为NULL。
除此之外,结果集中还包含通常由内联接返回的所有行。
指定联接提示或执行算法。
如果指定了,也必须明确指定INNER、LEFT、RIGHT 或FULL。
有关联接提示的更多信息,请参见FROM。