oracle---sql语句学习

1exists语句查找两个表关联后,关联上或没关联上的数据比如A,b表的ID是关联的,想找A表的ID没有在B表的ID中出现过得数据SELECT * FROM A WHERE NOT EXISTS (SELECT * FROM B WHERE A.ID=B.ID)
2Or语句表示2个并列的关系,或者的意思由于使用or语句会出现搜索效率的下降,建议把or语句换成union语句SELECT * FROM A WHERE ID =3 UNION SELECT * FROM A WHERE NAME LIKE '10%'
3IF语句表示条件的判断,写入分支选择在存储过程或者复杂的语句中使用IF 条件判断 THEN
   执行的分支语句;
ELSE
   执行的分支语句;
END IF;
4execute immediate执行语句由于在存储过程中,有些表是执行前才创建的,所以这个存储过程中有些语句在写的时候是会报错的,说没有目标表。这个时候需要把这个语句用单引号括起来,在前面加上execute immediateexecute 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
7dblink远程连接尽量把数据从远程拉到本地,再进行查询等操作,远程效率低CREATE TABLE A AS SELECT * FROM A@DBLINK
8||字符串连接使用双竖线来进行字符串拼接SELECT A||B FROM TABLE
9CONCAT(a,b)函数字符串连接把ab字符串连接显示SELECT CONCAT(A,B) FROM TABLE
10WHERE使用日期判断日期的大小日期越大,表示时间越晚select ename,sal,hiredate from emp where hiredate>'01-1 月-82';
11BETWEEN--AND判断取值范围包括两端的值,是个闭区间SELECT * FROM TABLE WHERE AGE BETWEEN 20 AND 50;
12LIKE通配符有% 和 _两种下划线表示单个字符,%表示多个字符SELECT * FROM TABLE WHERE NAME LIKE 'HU%' OR NAME LIKE 'HUAN_'
13ORDER BY排序ASC正序,DESC倒序NULL数据正序排在最后select ename,sal*12 年收入 from emp order by 年收入 desc;
可以对select语句中的别名用来排序
14Insert 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
15Insert all多表插入无条件insert all
into sal_h values(ename,hiredate,sal)
into mgr_h values(ename,mgr,sal)
select ename,hiredate,mgr,sal from emp;
15Insert 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;
16Insert 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;
17update更新数据update scott.employee set deptno=
(select deptno from scott.emp where empno=7788)
where job=(select job from emp where empno=7788);
18merge条件分支更新用于根据条件确定是执行 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);
19CROSS JOIN生成2张表的笛卡尔积select d.dname,e.ename from dept d CROSS JOIN emp e;
20NATURAL JOIN 基于同名列执行相等连接select e.ename,e.sal,d.dname from dept d NATURAL JOIN emp e;
21using 使用 using 子句建立相等连接简化了相等连接的语句,作用等同于tabA.col=tabB.colselect e.ename,d.dname from dept d JOIN emp e USING(deptno);
22on使用 ON 子句建立连接,连接列名称不同时select e.ename,e.sal,d.dname from emp e JOIN dept d ON e.deptno=d.deptno AND e.deptno=10;
23left join返回满足条件的数据和不满足条件的左边表的数据意味着右边的字段可能是空select a.dname,b.ename from dept a LEFT JOIN emp b
ON a.deptno=b.deptno AND a.deptno=10;
24right join返回满足条件的数据和不满足条件的右边表的数据意味着左边的字段可能是空select a.dname,b.ename from dept a RIGHT JOIN emp b
ON a.deptno=b.deptno AND a.deptno=10;
25full join返回满足条件的数据,和不满足条件的左边和右边的数据意味着左和右边的字段可能是空select a.dname,b.ename from dept a FULL JOIN emp b
ON a.deptno=b.deptno AND a.deptno=10;
26Having限制分组结果相当于对分组函数的结果做where条件搜索select deptno,avg(sal),max(sal) from emp group by deptno having avg(sal)<2500;
27ROLLUP额外生成横向小记和总计select deptno,job,avg(sal) from emp group by rollup(deptno,job);
28CUBE额外生成横向统计,纵向统计和总计统计select deptno,job,avg(sal) from emp group by cube(deptno,job);
29GROUPING SETS合并多个分组的统计结果select deptno,job,avg(sal) from emp group by grouping sets(deptno,job);
30多个 grouping setsselect 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');
36with使用 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);

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值