Oracle SQL语句学习汇总

本文介绍了 Oracle SQL 中常用的函数及操作技巧,包括字符串处理、数学运算、日期操作、集合操作等,并展示了如何进行高效的查询优化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

select Upper('abcd') from dual; --小写转大写 select Lower('ABCD') from dual; --大写转小写 select initcap(LOC) from DEPT; --将第一个字母变成大写 select concat('a','b') from dual; --连接字符串 select substr('abcdef',-3,3) from dual; --截取字符串函数 select length('abcdefg') from dual; --计算字符串长度 select replace('abcd','b','B') from dual; --字符串替换函数 select instr('ABCABCDABCDE','C',4,2) from dual; --字符串包含函数 select lpad('mzl',10,'@#$') from dual; --左填充函数 select rpad('mzl',10,'@#$') from dual; --右填充函数 select trim(' txt ') from dual; --过滤首尾空格 select round(4.12,1) from dual; --返回按指定位数进行四舍五入的数值 select mod(-20,3) from dual; --求余函数 返回值与被除数的符号一致 select trunc(412.13,-2) from dual; --不对指定小数前或后的部分做相应舍入选择处理,而统统截去 select months_between(sysdate,hiredate) from emp4; --计算雇佣日期到当前时间的相差月份 select add_months(sysdate,1) from dual; --增加月份函数 select last_day(sysdate) from dual; --返回某个时间值的当月最后一天 select next_day(sysdate,'星期二')from dual; --返回符合条件的下一天时间 select to_char(sysdate,'yyyy-mm-dd')from dual; --把系统时间转换为字符串类型 select to_char(sysdate,'D') from dual; --返回当前时间是星期几 select to_number('236')+to_number('658') from dual; --字符类型转化为数字类型 select to_date('2011-4-13','YYYY-MM-DD') from dual; --字符类型转化为日期类型 select nvl(comm,0) from emp4; --如果第一个参数为空,则返回第二个参数。第二个参数表示是第一个参数的替换对象。 select nullif(6+9,8+10)from dual; --如果表达式1和表达式2的值相等返回值为null 否则返回表达式1的值 select empno, ename, sal, comm, nvl2(comm, sal+comm, sal) total from emp4; --如果参数表达式expr1值为NULL,则NVL2()函数返回参数表达式expr3的值; --如果参数表达式expr1值不为NULL,则NVL2()函数返回参数表达式expr2的值。 select empno, ename, sal, comm, coalesce(sal+comm, sal, 0) from emp4; --依次考察各参数表达式,遇到非null值即停止并返回该值 select empno,ename,job, --case表达式 case job when 'CLERK' then '办事员' when 'SALESMAN' then '售货员' when 'ANALYST' then '统计员' else '打字员' end 职位 from emp4; select empno 工号,ename 姓名,sal 薪水, --decode表达式 decode(job,'CLERK','办事员', 'SALESMAN','销售员', 'ANALYST','统计员', '未知' ) 职位 from emp4; select lpad(initcap(trim(' dad ')),10,'@#$') from dual; --单行函数嵌套 select count(*) from emp4; --统计函数 select max(sal) from emp4; --最大值函数 select min(sal) from emp4; --最小值函数 select avg(sal) from emp4; --平均值函数 select deptno 部门编号, avg(nvl(mgr,0))平均值 from emp4 where mgr>7500 group by deptno; --group by 分组函数 --出现在SELECT列表中的字段或者出现在order by 后面的字段,如果不是包含在分组函数中,那么该字段必须同时在GROUP BY子句中出现。 --包含在 GROUP BY子句中的字段则不必须出现在SELECT列表中。 --可使用where字句限定查询条件 不允许在 WHERE 子句中使用分组函数。 --可使用Order by子句指定排序方式 select deptno 部门编号, avg(nvl(mgr,0))平均值 from emp4 where mgr>7500 group by deptno having avg(mgr)>7730; --having函数 从group by 函数中获取符合条件的值 select deptno 部门编号, avg(nvl(mgr,0))平均值 from emp4 where mgr>7500 group by deptno order by deptno desc; --order by 函数 默认升序排列(asc) 降序排列可以在其后加上desc; select * from emp4,dept4; --笛卡尔积 select a.ename 用户名,a.job 工作,b.dname 部门名称 from emp4 a,dept4 b where a.deptno=b.deptno; --等值连接查询 select a.ename 姓名,a.job 工作,a.sal 薪水 from emp4 a,dept4 b where sal between 3000 and 5000; --非等值连接 select a.ename,a.job,b.sal,b.hiredate from emp4 a,emp4 b where a.mgr=b.deptno; --自连接 select a.deptno,a.ename,a.job from emp4 a ,dept4 b where a.deptno=b.deptno(+); --左外连接 select a.deptno,a.ename,a.job from emp4 a,dept4 b where a.deptno(+)=b.deptno; --右外连接 select * from emp4 union select * from emp6; --并集,所有的内容都查询,重复的显示一次 select * from emp4 union all select * from emp6; --并集,所有的内容都显示,包括重复的 select * from emp4 intersect select * from emp6; --交集:只显示重复的 select * from emp4 minus select * from emp6; --差集:只显示对方没有的(跟顺序是有关系的) select sal from emp4 where sal > ( select sal from emp4 where ename = 'JAMES' ); --单行子查询 select * from emp4 where job in (select job from emp4 where ename = 'MARTIN' or ename = 'SMITH'); select * from emp4 where sal > all(select avg(sal) from emp4 group by deptno); select * from emp4 where sal > any(select avg(sal) from emp4 group by deptno); --多行子查询 select * from emp4 where rownum <= 5 order by sal desc; --查询前n行数据并进行排序 select sal from emp4 where sal > 1000 and exists ( select sal from emp4 group by deptno ); --EXISTS:指定一个子查询,检测行的存在。 --如果外层的主查询记录较少,子查询中的表大,又有索引时使用exists。 select sal from emp4 where sal not in ( select sal from emp4 where job <> 'CLERK' ); --如果子查询得出的结果集记录较少,主查询中的表较大且又有索引时应该用in, Select * from (select * from emp4 order by dbms_random.value()) where rownum<=6; --随机返回5条记录 select * from emp4 order by comm desc nulls first; --处理空值排序 select * from (select row_number() over (order by ename) rn,ename from emp4) x where mod(rn,2)=1; --查询跳过表中的偶数行 select ename,sal,max(sal) over(),min(sal) over() from emp4; --查询员工信息和其中工资最高最低的员工 select ename,sal,sum(sal) over(), sum(sal) over(order by ename) from emp4; --连续求和 select deptno,sal ,sum(sal) over (partition by deptno order by ename) as s from emp4; --分部门连续求和 select ename,sal,lead(sal) over(order by sal) aaa ,lag(sal) over(order by sal) bbb from emp4; --得到当前行上一行或者下一行的数据 Select to_char(hiredate,'yyyy'),avg(sal) from emp4 group by to_char(hiredate,'yyyy'); --根据子串分组 select add_months(trunc(sysdate,'y'),12)-trunc(sysdate,'y') from dual; --确定一年中的天数 select * from all_tab_columns where table_name='EMP4'; --查询EMP4表中所有字段(列) select table_name ,comments from dictionary where table_name like '%TABLE%'; --在oracle中描述数据字典视图 alter table emp4 add phone varchar(20); --添加字段 alter table emp4 modify phone varchar(18); --修改字段 alter table emp4 drop column phone; --删除字段 truncate table emp4; --清空表数据 drop table emp4; --删除表emp4 rename emp4 to emp5; --重命名表emp4为emp5 insert into emp4 (empno,ename,job,mgr,hiredate,sal,comm,deptno) values ('2','LJL','WORKER','9000',to_date('2011-2-14','yyyy-mm-dd'),'5000','','03'); insert into emp4 values('01','MZL','ENGIEER','8000',to_date('2011-2-18', 'yyyy-mm-dd'),'6000','0','02'); --插入数据 delete from emp; --清空表数据 create table test1(eid number(10), name varchar2(20),birth date,salary number(8,2)); insert into test1 values (1001, '张三', '20-5月-70', 2300); insert into test1 values (1002, '李四', '16-4月-73', 6600); select * from test1; create table test2(eid number(10), name varchar2(20),birth date,salary number(8,2)); select * from test2; merge into test2 using test1 on(test1.eid = test2.eid ) when matched then update set name = test1.name, birth = test1.birth, salary = test1.salary when not matched then insert (eid, name, birth, salary) values(test1.eid, test1.name, test1.birth, test1.salary); select * from test2; --merge 命令可以用来用一个表中的数据来修改或者插入到另一个表。插入或者修改的操作取决于on子句的条件。 --该语句可以在同一语句中执行两步操作,可以减少执行多条insert 和update语句。 --merge是一个确定性的语句,即不会在同一条merge语句中去对同一条记录多次做修改操作。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值