oracle两表关联更新 oracle表关联更新表字段
如何批量修改oracle数据库中某一个表中的某一列数据?
VALUES (t_record.deptno, t_record.dname, t_record.loc);的方法是批量修改,即每次修改5000条(一次修改不要超过一万条,否则影响性能).
oracle两表关联更新 oracle表关联更新表字段
oracle两表关联更新 oracle表关联更新表字段
end
虽然在11g中,我们也可以选择使用merge命令,但你的这种情况先修改一部分然后看看影响,毕竟在生产环境作这样的作风险很大。
视图有三种,简单视图不包括函数,复杂视图包含了分组函数等附加的内容,连接视图是基于多个表的。如果是误作,还是请DBA来恢复,虽然这样做会被挨骂,但总比错上加错,连挨骂的机会都没有要好得多。
如果对这些修改真的有信心,而只是从性能考虑,那可以用下面的方法(pk_col 是表的主键):
merge into xxx aa
using (select pk_col from xxx) bb
on (aa.pk_col=bb.pk_col)
when matched then
update EAMS_MASTER set state=000 这样就能把001全部修改成000
update EAMS_MASTER set state=000 where 字段=值 修改条件下的值=000(加粗位置是条件)
update EAMS_MASTER set state = '000' where state = '001' 根据我提供的内容写语句,不要写通用的语句,我会分辨不出哪个对哪个。这句话没有理解
update EAMS_MASTER set state = '000' where state = '001' 就是这样呀,我感觉这不是批量修改
update EAMS_MASTER set state = '000' where state = '001'
update EAMS_MASTER set state = '000' where state = '001'
oracle怎么将一个表中的long数据类型的值更新到另一个表中
create or replace trigger tri0很高兴回答你的问题
下边是我写的一代码,你只需把表名,字段名完执行下就可以(我已经试过),主要用到了MERGE INTO语句。
============================ start =================================
begin
MERGE INTO B、 单表查询:根据WHERE条件过滤表中的记录,形成中间表(这个中间表对用户是不可见的);然后根据SELECT的选择列选择相应的列进行返回最终结果。
USING A
ON (A.c=B.c and A.d=B.d)
WHEN MATCHED THEN
set long字段名 = A.long字段名 ;
commit;
exception
when others then
ROASLLBACK;
dbms_output.put_line('errors!!!');
end;
============================ end ==================================
如果还有问题请提出来,或者扣我267873,谢谢!
祝学习愉快!
oracle里面更新作能带有四则运算吗
Oracle数据库基本作
1.概述
Oracle数据库客户端一般需要安装在上,可以在端作,一般我们可以用sql dloper工具远程连接到数据库,先行建立数据库,然后对表进行增删改查。也可以使用MyEclispse的DB Broswer工具进行连接数据库并进行简单的增删改查。
2.SQL语句
Data Definition Language(DDL):
主要用于建立、修改、删除数据库对象(表),不需要事务的参与CREATE:创建表
CREATE TABLE emp(
id NUMBER(10),
name VARCHAR2(20),
gender CHAR(1),
birth DATE,
salary NUMBER(6,2),
);
DESC :查询表结构
DESC emp;
RENAME:重命名表名
DROP:删除表
ALTER:列(字段)作
ALTER TABLE employee MODIFY (name VARCHAR2(40) DEFAULT 'CLERK' );DROP:删除字段
ALTER TABLE employee DROP (birth);
Data Manipulation Language(DML)
用于对数据记录进行作,包括插入,删除,修改。需要commit才能真正确认作,如果需要撤销则rollback。
INSERT INTO:插入数据
INSERT INTO employee(id, name, salary) VALUES(1001, 'rose', 5500);UPDATE…SET..:更新数据
UPDATE employee SET salary = 8500 WHERE name = 'ROSE';DELETE FROM:删除记录
DELETE FROM employee WHERE job is null;
Transaction Control Language(TCL)
事务控制语言,包括commit提交,rollback回滚,sepoint保存点(可以回退到指定保存点)。在sql dloper中为图标。
Data Query Language(DQL)
SQL基础查询:
WHERE子句:执行顺序为自下而上、从右到左。将能过滤掉数量记录的条件写在WHERE 子句的最右。
GROUP BY:执行顺序从左往右分组,在GROUP BY前使用WHERE将不需要的记录在GROUP BY之前过滤掉。
HAVING 子句:消耗资源。尽量避免使用,HAVING 会在检索出所有记录之后才对结果集进行过滤,需要排序等作。
SELECT子句:少用号,尽量取字段名称。ORACLE 在解析的过程中, 通过查询数据字典将号依次转换成所有的列名, 消耗时间。
ORDER BY子句:执行顺序为从左到右排序,消耗资源。
也就是从哪张表中以什么样的限制条件确定数据内容,再通过分组与进一步限制分组条件得到一个处理过的数据,选择出来,如有需要,则对选择的数据进行排序。
FROM子句:
From后接表名,from前可以可以是,但是不建议(查询效率低),一般接要查询的字段名。分组函数,字段和表名都可以使用别名,不加引号数据库中为大写,加引号别名可以用空格小写等。
WHERE子句:
当查询条件中和数字比较,可以使用单引号引起,也可以不用,当和字符及日期类型的数据比较,则必须用单引号引起。
使用条件判断:>,<,<=,<=,!=,<>,=。
SELECT ename, sal FROM emp WHERE sal< 2000;SELECT ename, sal, job FROM emp WHERE job = 'SALESMAN';SELECT ename, sal, hiredate FROM emp
WHERE hiredate>todate('2002-1-1','YYYY-MM-DD');使用AND/OR关键字
如果希望返回的结果必须满足多个条件,应该使用AND逻辑作符连接这些条件如果希望返回的结果满足多个条件之一即可,应该使用OR逻辑作符连接这些条件SELECT ename, sal, job FROM emp
WHERE sal> 1000 AND job = 'CLERK';
使用LIKE条件
使用IN/NOT IN
SELECT ename, job FROM emp WHERE job IN ('MANAGER', 'CLERK');使用BETWEEN 1 AND 2
用来查询符合(1,2)值域范围之内的数据,通常查询数字和日期类型的数据范围。
SELECT ename, sal FROM emp
WHERE sal BETWEEN 1500 AND 3000;
使用IS NULL和IS NOT NULL
条件筛选值为空的记录,空值不能用‘=’来判断。
使用ANY和ALL条件
在比较运算符中,可以出现ALL和ANY,表示“全部”和“任一”,> ANY : 大于最小< ANY:小于> ALL:大于< ALL:小于最小SELECT empno, ename, job, sal, deptno
FROM emp WHERE
sal> ANY (SELECT sal FROM emp WHERE job = 'SALESMAN');查询条件中使用算术表达式
当查询需要对选出的字段进行进一步计算,可以在数字列上使用算术表达式(+、-、、/)。表达式符合四则运算的默认优先级,如果要改变优先级可以使用括号。
SELECT ename, sal, job FROMempWHERE ename = UPPER('rose');SELECT ename, sal, job FROM empWHERE sal 12 >100000;使用DISTINCT过滤重复
DISTINCT必须紧跟SELECT,后面可以有多个字段,表示过滤掉多个字段都重复的选项,第二例中不显示重复的deptno和job相同的记录。
SELECT DISTINCT deptno FROM emp;
SELECT DISTINCT deptno, job FROM emp;
使用ORDER BY子句
SELECT ename, sal FROM emp
ORDER BY sal DESC;
Order by多个列,每个列需要单独指定排序规则,先按照个字段排序,当个字段的值相同时,再按照第二个字段的值排序。
聚合函数分组函数
当需要统计的数据并不能在表里直观列出,而是需要根据现有的数据计算得到结果,这种功能可以使用聚合函数来实现。
因为是多行数据参与运算返回一行结果,也称作分组函数、多行函数、函数。用到的关键字:GOURP BY 按什么分组,HAVING进一步限制分组结果MAX和MIN
用来取得列或者表达式的最小值,包括数字,字符和日期。
SELECT MAX(sal) max_sal, MIN(sal) min_sal FROM emp;AVG和SUM
用来统计列或者表达式的平均值和求和,只能处理数字类,并且平均值忽略NULL。
SELECT AVG(sal) g_sal, SUM(sal) sum_sal FROM emp;COUNT
用来计算表中的记录条数,同样忽略NULL。
SELECT COUNT(job) total_num FROM emp;
空值的作
NVL(expr1, expr2):将NULL转变为非NULL值。如果expr1为NULL,则取值expr2, expr2是非空值。
NVL2(expr1, expr2, expr3):和NVL函数功能类似,都是将NULL转变为非空值。NVL2用来判断expr1是否为NULL,如果不是NULL,返回expr2,如果是NULL,返回expr3。
GROUP BY子句
Group by是表示对表中某个字段进行分组,值相同为一组,而分组函数的意思则是对这每一个组进行计算,平均值或是最小值。
HAVING子句
是对分组后的结果进行进一步的限制,HAVING子句必须紧跟在GROUP BY子句后,不能单独存在。限制分组条件不能放在WHERE子句中。
SELECT deptno, MAX(sal) max_sal FROM emp
GROUP BY deptno HAVING MAX(sal) >4000;
SQL关联查询:
概述,在实际应用中,往往我们所需要的数据是分布在不同的表上的,我们想要获取数据必须跨表格查询。
SELECT table1.column, table2.column
FROM table1, table2
WHERE table1.column1 = table2.column2;
SELECT table1.column, table2.column
FROM table1JOIN table2
ON(table1.column1 = table2.column2);
关联查询有三种连接方式
内连接返回关联表中所有满足条件的记录(也称等值连接)外连接返回一些不满足条件的记录,外连接有左外连接,右外连接和全外连接三种形式其中左外连接返回左边所有记录而不必管右边是否匹配,如不匹配则为NULL值,右外连接返回右边所有记录而不必管左边的记录是否匹配,如不匹配则默认NULL,全外连接返回左边和右边所有的数据,左右边不匹配的数据,对应的其他字段值为NULL,格式如下
JOIN ON式
SELECT table1.column, table2.column
FROM table1 [LEFT | RIGHT | FULL] JOIN table2ON table1.column1 = table2.column2;
WHERE式
Select from de a,bl b where a.id=b.id(+);+号的位置和意义
‘+’号加在哪个表,哪个表就是关联表,另一张表就是基表。基表全部显示,关联表匹配显示。+在左边就是右外连接,+在右边就是左外连接。
自连接:
SELECT worker.empnow_empno,worker.enamew_ename, mar.empnom_empno, mar.enamem_enameFROM emp worker join emp mar
ON worker.mgr = mar.empno;
SQL高级查询:
子查询:
子查询用在WHERE里
在SELECT中,往往WHERE的限制条件并不是一个确定的值,而是来源于另一个查询结果,即需要在另一个查询结果的基础上进行查询,这个时候为另一个查询提供数据的查询就叫做子查询。
SELECT e.ename, e.job FROM emp e
WHERE e.job = (SELECT job FROM emp WHERE ename = 'SCOTT');可以与多行/单行比较作符混合使用。
子查询用在HAVING子句
SELECT deptno, MIN(sal) min_sal FROM emp GROUP BY deptnoHAVING MIN(sal) > (SELECT MIN(sal) FROM emp WHERE deptno = 30);表示分组条件需要满足的条件。可以把子查询当成一个结果。
子查询用在FROM部分
子查询用在FROM子句中,子查询可称为行内视图或者匿名试图,可以把它当成一张单独的表,用别名进行标识。
子查询用在SELECT子句中
可以认为是外连接的一张表现
分页查询:
ROWNUM
伪列,返回标识行数据顺序的数字,伪列并不是真正的列数据,只是用来显示行数,并不能单独作为一列进行分组作。
ROWNUM的结果从行数据之上开始,每查询到一条数据则指针下移一个,所以只有查询到数据后才能够出现伪列数字,因此不能直接用在where里,如果要利用ROWNUM截取结果集的部分数据,可以将含有ROWNUM伪列的SELECT子句放在FROM内,作为视图,供外部的SELECT语句使用,此时的伪列已形成顺序数据,可以进行分组函数作。
也就是将ROWNUM先作为行内视图的一个列,在主查询中就可以使用这个列值作为条件。
SELECT FROM (SELECT ROWNUMrn , e. FROM emp e )WHERE rn BETWEEN 8 AND 10;
使用子查询和ROWNUM进行分页
分页作需要有一个作为分页标准的数据,该数据线进行排序,排序的结果作为视图被父查询用伪列标识顺序数字,然后在最外面的查询对伪列进行分页。
如:
(SELECT ROWNUMrn , t. FROM
(SELECT empno,ename,sal FROM emp
ORDER BY sal DESC) t
)WHERE rn BETWEEN 8 AND 10;
DECODE函数
DECODE (expr, search1, result1[, search2, result2…][, default])它用于比较参数expr的值,如果匹配到哪一个search条件,就返回对应的result结果,可以有多组search和result的对应关系,如果任何一个search条件都没有匹配到,则返回default的值。default参数是可选的,如果没有提供default参数值,当没有匹配到时,将返回NULL。
SELECT ename, job, sal,
DECODE(job, 'MANAGER', sal 1.2,
'ANALYST', sal 1.1,
'SALESMAN', sal 1.05,
sal) bonus
FROM emp;
SELECT deptno, dname, loc
FROM dept
ORDER BY
DECODE(dname, '研发部',1,'市场部',2,'销售部',3), loc;分组函数
ROW_NUMBER
ROW_NUMBER()
RANK() OVER( PARTITION BY col1 ORDER BY col2)功能与上相同,不同在于存在并列,并列第二跳过第三直接第四的规则。
DENSE_RANK
如果有并列第二,下一个排序将是三。
高级分组函数
ROLLUP
如果对两个字段rollup,那么个字段相同的值会当成一组,如果有分组函数求和,就会对字段所有的数据求和,单独成行。此时第二字段值为空。可以用于统计年度销售(工资)和。
CUBE
CUBE函数对字段进行排列统计,比如三个字段的CUBE运算,将三个字段排列成6种情况具体需要使用的时候再参考百度。
GROUPING只能在使用ROLLUP或CUBE的查询中使用。当需要在返回空值的地方显示某个值时,GROUPING()就非常有用。案例情况复杂,具体使用时再说。
作
UNION、UNION ALL、INTERSECT、MINUS
Union表示取多次SELECT结果的并集,如果去掉重复的数据。
Union All与union功能一样,只是它不会去掉重复的数据,会全部显示。
Intersect表示相交,多次查询后去相同的数据,即同时满足两个查询条件的数据Minus表示集,即将个结果集中的数据,减去第二个结果集的数据。即满足个查询条件,而不满足第二查询条件的数据。
Data Control Language(DCL):
用于执行权限的授予和收回作、创建用户等,包括授予(GRANT)语句,收回(REVOKE)语句,CREATE USER语句,其中GRANT用于给用户或角色授予权限, REVOKE用于收回用户或角色已有的权限。DCL语句也不需要事务的参与,是自动提交的。
3.视图、索引、序列、约束
视图
视图本质上是一条SELECT语句,当SELECT子查询在from子句中,可以把SELECT子句的结果当作一个视图。视图本身只是基表的映射,只是把基表中的数据显示出来,可以把视图当成表看待,所有作都与表作极其相似。
视图的优劣点:
如果需要经常执行某项复杂查询,可以基于这个复杂查询建立视图,此后查询此视图即可,简化复杂查询;视图本质上就是一条SELECT语句,所以当访问视图时,只能访问到所对应的SELECT语句中涉及到的列,对基表中的其它列起到安全和保密的作用,可以限制数据访问。
同时因为视图本质是基表的数据,所以对视图的作会影响到基表从而不安全。这里可以使用WITH READ ONLY来限制对视图的DML语言。
SELECT empno, ename, sal, deptno FROM empWHERE deptno = 10
WITH READ ONLY;
使用DCL语句可以授权用户创建视图的权限,
GRANT CREATE VIEW TO tarena;
创建简单视图
CREATE VIEW v_emp_10
SELECT empno, ename, sal, deptno
FROM emp
WHERE deptno = 10;
查询视图
SELECT id, name, salary FROM v_emp_10;
对视图的DML作
简单视图可以进行DML作,但是作的对象必须是基表里视图包含的字段,即对视图可见。而且简单视图的DML作会对影响基表数据。
WITH CHECK OPTION短语表示,通过视图所做的修改,必须在视图的可见范围内,无论是INSERT UPDATE DELETE作都必须在视图范围内,超过视图范围不可用。
CREATE [OR REPLACE] VIEW view_name[(alias[, alias…])]
AS subquery
[WITH CHECK OPTION];
删除视图
DROP VIEW v_emp_10;
对视图的删除不会导致基表数据的丢失,不会影响基表数据。
序列
序列(SEQUENCE)是一种用来生成数字值的数据库对象。序列的值由Oracle程序按递增或递减顺序自动生成,通常用来自动产生表的主键值,是一种高效率获得键值的途径。
序列是的数据库对象,和表是的对象,序列并不依附于表。
通常情况下,一个序列为一个表提供主键值,但一个序列也可以为多个表提供主键值。
CREATE SEQUENCE [schema.]sequence_name
[ START WITH i ] [ INCREMENT BY j ]
[ MAXVALUE m | NOMAXVALUE ]
[ MINVALUE n | NOMINVALUE ]
[ CYCLE | NOCYCLE ][ CACHE p | NOCACHE ]
创建一个序列,起始数据是100,步进是10:
CREATE SEQUENCE emp_seq
START WITH 100
INCREMENT BY 10;
NEXTVAL:获取序列的下个值
CURRVAL:获取序列的当前值
当序列创建以后,必须先执行一次NEXTVAL,之后才能使用CURRVAL。
获取序列的个值,并且使用序列值为EMP表插入新的记录:
删除序列
DROP SEQUENCE emp_seq;
索引
创建索引
CREATE [UNIQUE] INDEX index_name
ON table(column[, column…]);
index_name表示索引名称
table表示表名
column表示列名,可以建立单列索引或复合索引UNIQUE表示索引
CREATE INDEX idx_emp_job_sal ON emp(job, sal);可以增加函数
CREATE INDEX emp_ename_upper_idx
ON emp(UPPER(ename));
重建索引,提高索引空间利用率
ALTER INDEX index_name REBUILD;
删除索引
DROP INDEX idx_emp_ename;
为提升查询效率,创建和使用索引的原则:
1.为经常出现在WHERE子句中的列创建索引
2.为经常出现在ORDER BY、DISTINCT后面的字段建立索引。如果建立的是复合索引,索引的字段顺序要和这些关键字后面的字段顺序一致3.为经常作为表的连接条件的列上创建索引
4.不要在经常做DML作的表上CREATE OR REPLACE VIEW v_emp_10建立索引
5.不要在小表上建立索引
6.限制表上的索引数目,索引并不是越多越好
7.删除很少被使GRANT CREATE VIEW TO tarena;用的、不合理的索引
约束
CONSTRAINT
非空约束(Not Null),简称NN
创建表时添加约束
CONSTRAINT employees_hiredate_nn NOT NULL修改表时增加非空约束
ALTSELECT O.ID,O.ORDER_NUMBER,O.CUSTOMER_ID,C.ID,C.NAMEER TABLE employees
MODIFY (eid NUMBER(6) NOT NULL);
修改表时取消非空约束
ALTER TABLE employees
MODIFY (eid NUMBER(6));
性约束(Unique),简称UK
oracle 触发器插入和更新时,怎么作
WHERE条件:在有ON条件的SELECT语句中是过滤中间表的约束条件。在没有ON的单表查询中,是限制物理表或者中间查询结果返回记录的约束。在两表或多表连接中是限制连接形成最终中间表的返回结果的约束。新手路过···顺便写下···
GROUPING()after insert or update on
scott.FZR
begin关联有两种方式:
if :new.BM_ID!<> :old.BM_ID
insert into BM(BM.BM_ID=FZR.BM_ID) values(:new.BM_ID);
raise_application_error(-20005,'插入了新的记录');
else
update FZR(BM_ID,LEADER)values(:new.BM_ID,:new.LEADER);
raise_application_error(-20005,'更新了新的记录');
end;
/
oracle数据库update语句的疑问
OVER (PARTITION BY deptno ORDER BY empno)根据deptno分组,在分组内根据empno内排序,比ROWNUM功能更强。可以直语句12:语句11在DB2下的等价实现。还不知道DB2是否支持语句11呢!接从结果集中取出子集RANK你的语句太混乱了,按照你的意思你需要明确几点。
SELECT O.ID,O.ORDER_NUMBER,O.CUSTOMER_ID,C.ID,C.NAME1.使用b表数据更新a表,那么where条件是什么,也就是说,更新a表中哪些数据,用b表中的哪些数据更新,二者的关系是什么。从你的语句中我看不出b表和a表的关联。
2.找到关联条件后,通过关联条件查出的b表数据是否,如果不,还是会出现“返回值多于一行”的错误。
按照你的表结构和数据,设A表和B表中的name列,以name作为关联,可以这样写来实现你的更新目的:
update A set cou2 = (select B_cou1 from B where B.B_name = A.name) where name in (select B_name from B where B.B_name = A.name)
这条语句必须满足name在a、b表中的条件,才能使用。
cou2=(select B_cou1 from B where(条件1)) where name=(select B_name from B where(条件1))
可以改成
update A a set cou2= b.b_cou1
where exists
(select from B b where b_name = a.name and (条件1) )
update A set cou2=(select b_cou1 from B where (条件1) and A.name=B.B_NAME)
update A set cou2=(select b_cou1 from B where A.name=B.B_NAME)
求UPDATE语句,现在单行子查询返回多个行
--将游标向下移1行update b
where c."姓名" = b."姓名"set b."对应年限" =
(select c."更新年限"
from
(select count(1) as "更新年限",a."姓名"
from a
group by a."姓名"
) c
)where b."姓名" in
(select c."姓名"
from
(select count(1) as "更新年限",a."姓名"
from a
group by a."姓名"
) c
在执行UPDATE 语句的时候,如果关联表更新的时候,下面几条语句
1--只能在DB2,ORACLE下执行,SQL SERVER 报"a"语法错
UPDATE MAM_SUBJECTITEM a SET a.ICON_FILE= (SELECT c.FIELD_1 FROM MCM_NAVIGATION c WHERE a.OBJ_ID=c.ID)
2--1中去除缩写名,DB2,ORACLE和 SQL SERVER 都能执行
UPDATE MAM_SUBJECTITEM SET ICON_FILE= (SELECT FIELD_1 FROM MCM_NAVIGATION WHERE OBJ_ID=ID)
3--只能在SQL SERVER 中执行,DB2,ORACLE不能执行,报"from"语法错,
UPDATE Mon a.tag2 = b.tagAM_SUBJECTITEM SET ICON_FILE=c.FIELD_1
FROM MCM_NAVIGATION AS c
WHERE MAM_SUBJECTITEM.OBJ_ID=c.ID
----------------
你的问题,如果在 SQL SERVER 下可以:
update B set 对应年限=C.num
from (select count(1) as num,姓名 from A group by A.姓名) as C
where c. 姓名=B.姓名
用table1表x1字段,更新至table2中y1字段,两表字段关联字段均为:x9,分别列出sybase、oracle更新语句。
FROM 子句:执行顺序为从后往前、从右到左。数据量较少的表尽量放在后面。看这里吧!!看可不可以! desc table_name 可以查询表的结构 select field_name,... from ... 可以查询字段的值 select from all_tables where table_name like 'in_dname IN VARCHAR2,%' select from all_tab_columns where table_name=''
UPDATEoracle 将表中所有字段拼接成一个字符串给另一个表的一个字段
ALTER TABLE employee ADD (birth DATE DEFAULT sysdate);MODITY:修改字段拼接字段 select 字段1||字段2||字段3... from a;
SELECT FROMupdate b set X字段=(select 字段1||字段ADD:增加字段2||字段3... from a);
一楼只说对了一半,正确的应该是这样子的:
update b set X字段=(select 字段1||字段2||字段3... from a where a.主键列=b.主键列);
update 表1 set col1=
(select col1||col2||col3 from 表2 where 查询条件 )
where 查询条件
其中||为oracle 中的字符串连接符
a b 两张表要关联吧,不然更新时会整张表更新为同一数据,因为update的时候没有条件,oracle下你用merge into吧
Oracle如何从一个表取时间值去更新另一个表?
WHERE <搜索条件,,SELECT >update course set s_data=(select s_dat查询语句的执行顺序e from Student where s_no = 'sooo1'),s_course =( select s_course from Student where s_no = 'sooo1') where s_no = 's0001'
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系 836084111@qq.com 删除。