oracle-in/exists

oracle-in/exists

-- 非相关子查询(Uncorrelated Sub-Query)
SELECT * FROM STAFF WHERE COMPANYID IN
(
SELECT COMPANYID FROM COMPANY WHERE TELNO='88888888'
);
 
-- 相关子查询(Correlated Sub-Query)
SELECT * FROM STAFF U WHERE EXISTS
(
SELECT * FROM COMPANY C WHERE TELNO='88888888' AND U.COMPANYID=C.COMPANYID
);

SELECT * FROM COMPANY
-- 这个是MySQL的语法
INSERT INTO COMPANY(COMPANYID,TELNO) VALUES(1,'88888888'),(2,'88888888')
-- 在Oracle中运行后会出现错误
-- > ORA-00933: SQL 命令未正确结束
-- 插入多条需要使用insert all以及多条into tablename(col,col,...) values(value,value,...)
-- 最后需要加上select语句,如果values中的值跟选择的表没有关系的话,随便写一个dual就可以了
-- 可以使用该语句插入从select语句中选择的列
/*
create table sales_input_table (
prod_id        number(9,0),
amt_mon        number(9,6),
amt_tue        number(9,6),
amt_wed        number(9,6),
amt_thu        number(9,6),
amt_fri        number(9,6)
);
insert into sales_input_table values (1, 100.0, 200.0, 300.0, 400.0, 500.0);

CREATE TABLE sales (
prod_id        number(9,0),
time_id        date,
amount         number(9,0)
);
 
INSERT ALL
INTO sales (prod_id, time_id, amount) VALUES (prod_id, CURRENT_DATE, amt_mon)
INTO sales (prod_id, time_id, amount) VALUES (prod_id, CURRENT_DATE + 1, amt_tue)
INTO sales (prod_id, time_id, amount) VALUES (prod_id, CURRENT_DATE + 2, amt_wed)
INTO sales (prod_id, time_id, amount) VALUES (prod_id, CURRENT_DATE + 3, amt_thu)
INTO sales (prod_id, time_id, amount) VALUES (prod_id, CURRENT_DATE + 4, amt_fri)
SELECT prod_id, amt_mon, amt_tue, amt_wed, amt_thu, amt_fri FROM sales_input_table;
*/
INSERT ALL  INTO COMPANY(COMPANYID,TELNO) VALUES(1,'88888888')
INTO COMPANY(COMPANYID,TELNO) VALUES(2,'88888888')
SELECT 1 FROM DUAL;

SELECT * FROM STAFF;

INSERT ALL  INTO STAFF(USERID,COMPANYID,TELNO) VALUES(1,1,'11110000')
INTO STAFF(USERID,COMPANYID,TELNO) VALUES(2,1,'00002222')
SELECT 1 FROM DUAL;
/*
select * from T1 where exists(select b from T2 where T1.a = T2.a); 
【当T1数据量小而T2数据量非常大的时候,此句效率高】 
exists中数据存在则说明where条件成立; 不存在或报语法错误,则where不成立,相当于执行了select * from T1

select * from T1 where T1.a in(select T2.a from T2); 
【当T1数据量非常大而T2数据量小时,此句效率高】 
in后面搜索出来的字段内容要与T1相对应,T1和T2两个表中的a字段表达意义应是一样的才行,否则没意义。

select name from employee where name not in (select name from student); 
select name from employee where not exists (select name from student); 
第二句的sql效率要高于第一句; 
通过使用EXISTS,Oracle会首先检查主查询,然后运行子查询直到它找到第一个匹配项,这就节省了时间。Oracle在执行IN子查询时,首先执行子查询,并将获得的结果列表存放在一个加了索引的临时表中。在执行子查询之前,系统先将主查询挂起,待子查询执行完毕,存放在临时表中以后再执行主查询。这也就是使用EXISTS比使用IN通常查询速度快的原因。
当前这一小段注释来自
作者:Advancer-lbh 
原文:https://blog.csdn.net/u013709087/article/details/72870013 
*/
-- Oracle 多字段查询
SELECT * FROM STAFF WHERE (USERID,COMPANYID) IN (
SELECT USERID,COMPANYID FROM STAFF 
);
/*
这里可以从其他表选择多个条件,然后使用in进行条件where进行判断选择
*/

-- Oracle 多字段更新
UPDATE EMPLOYEE SET (BIRTHDAY,DEGREE)=
(
-- 此处是相关子查询
)
WHERE 条件;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值