oracle-in/exists 悠悠 2023-10-18 15:59 116阅读 0赞 #### 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 条件;
还没有评论,来说两句吧...