1 | exists语句 | 查找两个表关联后,关联上或没关联上的数据 | 比如A,b表的ID是关联的,想找A表的ID没有在B表的ID中出现过得数据 | SELECT * FROM A WHERE NOT EXISTS (SELECT * FROM B WHERE A.ID=B.ID) |
2 | Or语句 | 表示2个并列的关系,或者的意思 | 由于使用or语句会出现搜索效率的下降,建议把or语句换成union语句 | SELECT * FROM A WHERE ID =3 UNION SELECT * FROM A WHERE NAME LIKE '10%' |
3 | IF语句 | 表示条件的判断,写入分支选择 | 在存储过程或者复杂的语句中使用 | IF 条件判断 THEN |
执行的分支语句; | ||||
ELSE | ||||
执行的分支语句; | ||||
END IF; | ||||
4 | execute immediate | 执行语句 | 由于在存储过程中,有些表是执行前才创建的,所以这个存储过程中有些语句在写的时候是会报错的,说没有目标表。这个时候需要把这个语句用单引号括起来,在前面加上execute immediate | execute immediate 'INSERT INTO RD_CROSSWALK_INFO_RP b(pid) |
SELECT pid FROM RD_CROSSWALK_INFO@DBUNI ' | ||||
5 | (+) | 进行两个表的关联查询,显示全部内容 | 比如A、B的ID是关联的,想把B的name字段加到A表中,但是B表的ID是比A表少的,如果不适用这个加号,会导致B表没有的ID数据丢失,使用加号,表示B表没有的ID会用空来表示,不放加号的表会显示所有行 | SELECT A.ID,B.NAME FROM A ,B WHERE A.ID=B.ID(+) |
6 | /*+ PARLLEL(8)*/ | 并行操作 | 对于多个cpu和多核CPU,可以使用并行操作,来加快速度,括号中是并行数,不要超过cpu的逻辑数,会造成没有响应 | SELECT /*+ PARLLEL(8)*/ PID FROM A |
7 | dblink | 远程连接 | 尽量把数据从远程拉到本地,再进行查询等操作,远程效率低 | CREATE TABLE A AS SELECT * FROM A@DBLINK |
8 | || | 字符串连接 | 使用双竖线来进行字符串拼接 | SELECT A||B FROM TABLE |
9 | CONCAT(a,b)函数 | 字符串连接 | 把ab字符串连接显示 | SELECT CONCAT(A,B) FROM TABLE |
10 | WHERE使用日期 | 判断日期的大小 | 日期越大,表示时间越晚 | select ename,sal,hiredate from emp where hiredate>'01-1 月-82'; |
11 | BETWEEN--AND | 判断取值范围 | 包括两端的值,是个闭区间 | SELECT * FROM TABLE WHERE AGE BETWEEN 20 AND 50; |
12 | LIKE通配符 | 有% 和 _两种 | 下划线表示单个字符,%表示多个字符 | SELECT * FROM TABLE WHERE NAME LIKE 'HU%' OR NAME LIKE 'HUAN_' |
13 | ORDER BY排序 | ASC正序,DESC倒序 | NULL数据正序排在最后 | select ename,sal*12 年收入 from emp order by 年收入 desc; |
可以对select语句中的别名用来排序 | ||||
14 | Insert into | 变量插入数据 | 脚本 loademp.sql: | accept no prompt '请输入雇员号:' accept name prompt '请输入雇员名:' accept title prompt '请输入雇员岗位:' accept d_no prompt '请输入部门号:' insert into emp(empno,ename,job,hiredate,deptno) values(&no,'&name','&title',SYSDATE,&d_no); 运行:SQL> @c:\loademp |
15 | Insert all | 多表插入 | 无条件 | insert all into sal_h values(ename,hiredate,sal) into mgr_h values(ename,mgr,sal) select ename,hiredate,mgr,sal from emp; |
15 | Insert all | 多表插入 | 有条件 | insert all when sal>1000 then into sal_h values(ename,hiredate,sal) when mgr>7700 then into mgr_h values(ename,mgr,sal) select ename,hiredate,mgr,sal from emp; |
16 | Insert First | 多表插入 | 对于INSERT ALL,插入第一张表的数据,如果满足第二张表的条件,也会插入。 而INSERT FIRST不同,满足第一条插入条件的数据是不会进行随后的判断的 | insert first when sal>3000 then into sal_h values(ename,hiredate,sal) when sal>1000 then into mgr_h values(ename,mgr,sal) select ename,hiredate,mgr,sal from emp; |
17 | update | 更新数据 | update scott.employee set deptno= (select deptno from scott.emp where empno=7788) where job=(select job from emp where empno=7788); | |
18 | merge | 条件分支更新 | 用于根据条件确定是执行 update 还是 insert, 如果行存在,执行 update; 如果行不存在,执行 insert | merge into new n using emp e on (n.empno=e.empno) when matched then update set n.sal=e.sal when not matched then insert (n.empno,n.ename,n.sal,n.comm) values (e.empno,e.ename,e.sal,e.comm); |
19 | CROSS JOIN | 生成2张表的笛卡尔积 | select d.dname,e.ename from dept d CROSS JOIN emp e; | |
20 | NATURAL JOIN | 基于同名列执行相等连接 | select e.ename,e.sal,d.dname from dept d NATURAL JOIN emp e; | |
21 | using | 使用 using 子句建立相等连接 | 简化了相等连接的语句,作用等同于tabA.col=tabB.col | select e.ename,d.dname from dept d JOIN emp e USING(deptno); |
22 | on | 使用 ON 子句建立连接,连接列名称不同时 | select e.ename,e.sal,d.dname from emp e JOIN dept d ON e.deptno=d.deptno AND e.deptno=10; | |
23 | left join | 返回满足条件的数据和不满足条件的左边表的数据 | 意味着右边的字段可能是空 | select a.dname,b.ename from dept a LEFT JOIN emp b ON a.deptno=b.deptno AND a.deptno=10; |
24 | right join | 返回满足条件的数据和不满足条件的右边表的数据 | 意味着左边的字段可能是空 | select a.dname,b.ename from dept a RIGHT JOIN emp b ON a.deptno=b.deptno AND a.deptno=10; |
25 | full join | 返回满足条件的数据,和不满足条件的左边和右边的数据 | 意味着左和右边的字段可能是空 | select a.dname,b.ename from dept a FULL JOIN emp b ON a.deptno=b.deptno AND a.deptno=10; |
26 | Having | 限制分组结果 | 相当于对分组函数的结果做where条件搜索 | select deptno,avg(sal),max(sal) from emp group by deptno having avg(sal)<2500; |
27 | ROLLUP | 额外生成横向小记和总计 | select deptno,job,avg(sal) from emp group by rollup(deptno,job); | |
28 | CUBE | 额外生成横向统计,纵向统计和总计统计 | select deptno,job,avg(sal) from emp group by cube(deptno,job); | |
29 | GROUPING SETS | 合并多个分组的统计结果 | select deptno,job,avg(sal) from emp group by grouping sets(deptno,job); | |
30 | 多个 grouping sets | select deptno,job,mgr,sum(sal) from emp group by grouping sets(deptno),grouping sets(job,mgr); | ||
31 | 单行子查询 | 括号里的内容就是子查询 | 单行子查询使用=号连接 | select ename,sal,deptno from emp where deptno= (select deptno from emp where ename='SCOTT') AND ename<>'SCOTT' |
32 | 多行子查询 | 使用IN,ALL,ANY连接判断 | select ename,job,sal,deptno from emp where job IN (select distinct job from emp where deptno=10); | |
33 | 多行子查询 | select ename,sal,deptno from emp where sal>all (select sal from emp where deptno=30); | ||
34 | 多行子查询 | select ename,sal,deptno from emp where sal>any (select sal from emp where deptno=30); | ||
35 | 多列子查询 | select ename,job,sal,deptno from emp where(deptno,job)= (select deptno,job from emp where ename='WARD'); | ||
36 | with | 使用 WITH 为子查询定义名称,重复使用 | WITH dept_sum AS (select d.dname,sum(e.sal) total from dept d,emp e where d.deptno=e.deptno group by d.dname), dept_avg_sum AS (select sum(total)/count(*) avg_sum from dept_sum) select dname,total from dept_sum where total>(select avg_sum from dept_avg_sum); |
oracle---sql语句学习
最新推荐文章于 2024-09-18 14:51:26 发布