zoukankan      html  css  js  c++  java
  • Oracle语句

    select * from dept
    
    select * from emp1 where job='SALESMAN'AND ename like '李%'
    
    select e.sal,e.ename from emp e where to_char(e.hiredate,'YYYY')<'2011'
    
    select * from emp e where e.ename like '李%' and e.job='clerk' or e.job='MAG'
    
    select * from emp e where e.ename like '李%' and (e.job='clerk' or e.job='MAG')
    
    select * from emp e where (e.ename like '王%' or e.ename like '李%') 
    
    --复制表结构及数据
    
    create table dept1 as
    select rownum as num,t.* from dept t
    
    --只复制表结构
    
    CREATE TABLE dept1 AS 
    SELECT t.* FROM dept t WHERE 1=2

    --删除表数据 truncate table dept1 select * from dept1 --删除表 drop table dept1 --删除表数据,需要提交 delete dept1 --修改数据 SELECT t.*,ROWID FROM dept1 t SELECT * FROM dept FOR UPDAT --两表合并数据,去除重复行 SELECT e.* FROM emp1 e UNION SELECT a.* FROM emp a --两表合并数据 SELECT e.* FROM emp1 e UNION ALL SELECT a.* FROM emp a --EMP1表数据减去EMP表数据,差集 SELECT e.* FROM emp1 e MINUS SELECT a.* FROM emp a --EMP1表数据与EMP表数据的交集 SELECT e.* FROM emp1 e INTERSECT SELECT a.* FROM emp a --去重 SELECT DISTINCT e.ename FROM emp1 e SELECT DISTINCT t.cdate,t.upperdeptno FROM dept t SELECT DISTINCT e.ename,e.empno FROM emp1 e --新建DEPT3,直插入dept表中内码大于5的 CREATE TABLE dept3 AS SELECT t.* FROM dept t WHERE t.deptno>5--rownum SELECT ROWNUM,t.* FROM dept t WHERE ROWNUM<4

    --查询部门创建时间最早的前3条记录 select * from ( select * from dept t order by t.cdate) where rownum<4

    --查询当前用户下用户表名包含DEPT字母的所有表 SELECT * FROM user_tables where table_name like '%DEPT%'

    --查询201或202部门下的所有人 SELECT * FROM EMP E WHERE E.deptno IN (201,202) SELECT * FROM EMP E WHERE e.deptno=201 OR e.deptno=202

    --查询不在201或202部门下的所有人 SELECT * FROM EMP E WHERE E.deptno NOT IN (201,202) SELECT * FROM EMP E WHERE E.deptno!=201 AND E.deptno!=202

    --工资在500~1500 SELECT * FROM EMP E WHERE sal BETWEEN 500 AND 1500

    --查询工资最高的2~5条记录 SELECT ename,sal,r FROM (SELECT ename,sal,ROWNUM r FROM (SELECT ename,sal FROM emp ORDER BY NVL(sal,0) DESC)) WHERE r>=2 AND r<=5

    --查询工作岗位是办事员的工资最高的人员名称 SELECT * FROM EMP E WHERE E.SAL=( SELECT MAX(E.SAL) FROM EMP E WHERE E.JOB='CLERK') --查询工作岗位是办事员的姓名和年薪 SELECT e.ename as 姓名, nvl(e.sal,0)*12+nvl(e.comm,0) AS 年薪 FROM EMP E WHERE E.JOB='CLERK'

    --复制表结构及数据 create table emp1 as select rownum as num,t.* from emp t --等于 SELECT * FROM EMP E WHERE E.sal=500

    --不等于 SELECT * FROM EMP E WHERE E.sal!=500 SELECT * FROM EMP E WHERE E.sal<>500 SELECT * FROM EMP E WHERE E.sal^=500

    --小于等于500 SELECT * FROM EMP E WHERE E.sal<=500

    --sal为空 SELECT * FROM EMP E WHERE nvl(E.sal,0)<=500

    --查询存在于DEPT表中所有人员 SELECT * FROM emp1 e WHERE EXISTS(SELECT 1 FROM dept d WHERE d.deptno=e.deptno) SELECT e.* FROM emp1 e,dept d WHERE e.deptno=d.deptno --查询不存在于DEPT表中所有人员 select * from emp1 e where not exists ( select 1 from dept1 d where d.deptno=e.deptno) --复制表结构 create table emp2 as select * from emp where 1=2

    --使用日期函数 --转成字符串 SELECT t.deptno,t.dname,to_char(t.cdate,'YYYY-mm-dd hh24:mi:ss') cdateyear FROM dept t --转成日期 SELECT to_date('2013-10-13','YYYY-MM-DD') FROM dual select to_date('2013-10-15','YYYY-MM-DD') from dual --查询当前时间 SELECT SYSDATE FROM dual SELECT SYSDATE FROM dept SELECT to_char(SYSDATE,'YYYY-MM-DD') FROM dual --列别名时,可以加as,也可以不加as SELECT NVL(e.sal,0)*12+NVL(e.comm,0) AS 年薪 FROM emp1 e SELECT NVL(e.ename,'无名氏') FROM emp1 e --如果雇佣日期为空赋值为明天 SELECT to_char(nvl(e.hiredate,SYSDATE+1),'YYYY-MM-DD') FROM emp1 e select nvl(e.hiredate,to_date(to_char(sysdate,'yyyy-mm-dd'), 'YYYY-MM-DD')) from emp1 e --连接字符串 SELECT '此员工的姓名为 :['|| e.ename || ']' FROM emp1 e SELECT '['|| e.ename || '的岗位是:]' || e.job FROM emp1 e --where语句使用 查询姓刘的经理信息 SELECT e.ename FROM emp1 e WHERE e.job='MANAGER' AND e.ename LIKE '刘%'

    --查询姓名中包含飞的经理 SELECT e.ename FROM emp1 e WHERE e.job='MANAGER' AND e.ename LIKE '%飞%'

    --查询雇用日期在2011年前的所有人员信息 SELECT * FROM emp1 e WHERE to_char(hiredate,'yyyy')<'2011'

    --查询姓刘或姓李的人员信息 SELECT * FROM emp1 e WHERE e.ename LIKE '刘%' OR e.ename LIKE '李%'

    --查询所有办事员和经理的信息 SELECT * FROM emp1 e WHERE e.job IN ('MANAGER','CLERK') --为空 select * from emp1 e where e.ename is null

    --不为空 select * from emp1 e where e.ename is not null

    --查询人员表当中姓王或者姓李的,并且雇佣日期在2011年之前的人员编号、姓名及岗位 select e.empno,e.ename,e.job from emp1 e where (e.ename like '王%' or e.ename like '李%') and to_char(e.hiredate,'yyyy')<'2011'

    --工资降序,奖金将序 select * from emp1 e order by nvl(e.sal,0) desc,e.comm desc --根据别名进行排序 select nvl(e.sal,0)*12+nvl(e.comm,0) as 年薪 from emp1 e order by 年薪 desc --根据列位置进行排序 SELECT to_char(deptno) as temp,dname FROM dept UNION SELECT empno,ename FROM emp ORDER BY 1

    --UNION的SQL也可以根据别名进行排序 SELECT to_char(deptno) as temp,dname FROM dept UNION SELECT empno,ename FROM emp ORDER BY temp select max(e.sal),min(e.sal),avg(e.sal),sum(e.sal),count(*) from emp1 e select e.job,count(*),min(e.empno) from emp1 e group by e.job --查询人员表中姓李的存在重名的人员名称及人数 select e.ename,count(*) from emp1 e where e.ename like '李%' group by e.ename having count(*)>1--统计每个部门最高工资,单列分组统计 select e.deptno,max(nvl(e.sal,0)) from emp1 e group by e.deptno order by max(nvl(e.sal,0)) desc,e.deptno asc --根据最高工资倒序和部门编号升序排序, --统计每个部门每个岗位最高工资 ,多列分组统计 select e.deptno,e.job,max(nvl(e.sal,0)) from emp1 e group by e.deptno,e.job having max(nvl(e.sal,0))>2000 --只显示最高工资大于2000的分组数据 --相等连接、内连接,查询人员姓名及所属部门名称 select e.ename,d.dname from emp1 e ,dept1 d where e.deptno=d.deptno --查询人员姓名及上级领导姓名 select e.ename,a.ename from emp1 e ,emp1 a where e.mgr=a.empno --左外连接,以左表为主,显示人员表的所有内容 select e.ename,nvl(d.dname,'无所属部门') from emp1 e LEFT JOIN dept1 d ON e.deptno=d.deptno --左外连接,以左表为主,显示部门表的所有内容 select e.ename,d.dname,d.deptno from dept1 d LEFT JOIN emp1 e ON d.deptno=e.deptno --右外连接,以右表为主,显示部门表的所有内容 select e.ename,nvl(d.dname,'无所属部门') from emp1 e right JOIN dept1 d ON e.deptno=d.deptno --(+)以部门表为主,显示部门表的所有内容,看+号对面 select e.ename,d.dname from emp1 e ,dept1 d where e.deptno(+)=d.deptno --(+)以人员表为主,显示人员表的所有内容 select e.ename,d.dname from emp1 e ,dept1 d where e.deptno=d.deptno(+) --完全外连接,将两个表都不满足条件的数据都查询出来 select e.ename,d.dname,d.deptno from dept1 d full JOIN emp1 e ON d.deptno=e.deptno --子查询,在WHERE语句当中使用子查询 select d.dname from dept1 d where d.deptno=(select deptno from emp1 e where e.ename ='刘鹏飞') = select e.ename,d.dname from dept1 d ,emp1 e where d.deptno=e.deptno and e.ename ='刘鹏飞'

    --子查询,在WHERE语句使用返回多条记录使用IN select d.dname from dept1 d where d.deptno in (select deptno from emp1 e where e.ename like '王%') --子查询,返回多列数据 SELECT ename,job,sal,deptno FROM emp WHERE (deptno,job)=(SELECT deptno,job FROM emp WHERE ename='刘鹏飞') = SELECT ename,job,sal,deptno FROM emp WHERE ename='刘鹏飞'

    --在INSERT语句里使用子查询 insert into emp(empno,ename,deptno,job) select e.empno,e.ename,203,e.job from emp1 e where e.ename='小王'

    --在UPDATE语句里使用子查询,通过查询EMP表里小王的所属部门,修改EMP1表里小王的所属部门 update emp1 e set e.deptno=(select a.deptno from emp a where a.empno=7950) where e.empno=7950; commit; --提交 --在CREATE里使用子查询 create table emp3 as select * from emp1 --SQL常用函数 --ASCII 返回指定字符对应的十进制数 SELECT ASCII('A') A,ASCII('a') a,ASCII('0') zero,ASCII(' ') SPACE FROM dual --char和ascii相反,给出整数,返回对应的字符 SELECT CHR(65),CHR(97) FROM dual --连接字符串 SELECT '此员工的姓名为:【' || e.ename || '' FROM emp1 e --连接两个字符串 SELECT CONCAT('此员工的姓名为:',e.ename) FROM emp1 e --返回第二个字符串在第一个字符串中出现的位置 SELECT INSTR('AABBASCAB','AB') FROM dual --如果没有返回0 SELECT INSTR('AABBASCAB','ABC') FROM dual SELECT e.ename,INSTR(e.ename,'') FROM emp1 e --从第二个位置查找 SELECT INSTR('AABBASCAB','ABC'2) FROM dual --从第二个位置查找,出现的第二次的位置 SELECT INSTR('AABBASCAB','ABC'22) FROM dual --返回字符串的长度,字节的长度 SELECT LENGTH(e.ename),LENGTHB(e.ename) FROM emp1 e --返回字符串的小写 SELECT LOWER('ABCdddd') FROM dual --返回字符串的大写 SELECT UPPER('ABCdddd') FROM dual --去空格 SELECT LTRIM(' ABCdddd ') FROM dual SELECT RTRIM(' ABCdddd ') FROM dual SELECT TRIM(' ABCdddd ') FROM dual --去左侧字符 SELECT LTRIM('ABCdddd','AB') FROM dual --去右侧字符 SELECT RTRIM('ABCdddd','d') FROM dual SELECT LTRIM(e.ename,'') FROM emp1 e --从第3个位置取8个字符 select substr('13088888888',3,8) from dual SELECT SUBSTR(e.ename,2,LENGTH(e.ename)-1) FROM emp1 e --将JOB字段当中的CL字符修改为AL select replace(e.job,'CL','AL') from emp1 e --四舍五入,将sal字段四舍五入,保留2位小数 select round(e.sal,2) from emp1 e where e.empno=7369 SELECT round('13.5562',2) FROM dual --截取数字 SELECT TRUNC('13.5562',2) FROM dual --给当前日期加2个月 select ADD_MONTHS(sysdate,2) from dual --给指定的日期加2个月 select ADD_MONTHS(to_date('2013-5-25','yyyy-mm-dd'),2) from dual SELECT to_char(nvl(ADD_MONTHS(e.hiredate,-1),ADD_MONTHS(SYSDATE,-1)),'yyyy-mm-dd') FROM emp1 e --求当前月份最后一天 select last_day(sysdate) from dual; --查询今年二月份的最后一天 select last_day(To_date('2017-02','yyyy-mm')) from dual select last_day(To_date('2017-02-01','yyyy-mm-dd')) from dual --查询明年当前月份的最后一天 SELECT last_day(ADD_MONTHS(SYSDATE,12)) FROM dual --返回特定日期之后的第一个工作日所对应的日期 select NEXT_DAY(sysdate,'星期一') from dual --返回当前用户 select user from dual --查询人员表中最高工资 select max(e.sal) 最高工资 from emp1 e --非常好用,相当于IF elsif ,如果JOB字段的值为clerk则显示办事员,如果为SALESMAN则显示销售员,否则全部显示领导 select decode(e.job,'CLERK','办事员','SALESMAN','销售员','领导') from emp1 e --最基本的插入语句,建议大家要把列名列出来 insert into emp1(num,empno,ename,deptno,job) values(18,8888,'小李',203,'CLERK') --插入数据采用默认值 insert into emp1(num,empno,ename,deptno,job,hiredate) values(18,8888,'小李',203,default,sysdate) --查询所有人员姓名及所属部门名称,还有上级领导的姓名及所属部门名称 select e.ename,d.dname,a.ename,b.dname from dept1 d, emp1 e ,emp1 a,dept1 b where d.deptno=e.deptno and e.mgr=a.empno and a.deptno=b.deptno --分解上面4个表的SQL --1查询所有人员姓名及所属部门名称 select e.ename,d.dname from dept1 d, emp1 e where d.deptno=e.deptno --2查询所有人员姓名及所属部门名称及所属领导姓名 select e.ename,d.dname,a.ename from dept1 d, emp1 e,emp1 a where d.deptno=e.deptno and e.mgr=a.empno --3查询所有人员姓名及所属部门名称及所属领导姓名和部门名称 select e.ename,d.dname,a.ename,b.dname from dept1 d, emp1 e,emp1 a,dept1 b where d.deptno=e.deptno and e.mgr=a.empno and a.deptno=b.deptno select * from emp1 --更新王刚1的工资为2200 update emp1 e set e.sal = 2200 where e.ename='王刚1' update emp1 e set e.sal=e.sal + e.sal * 0.2 where e.ename='王刚1'--多列更新 update emp1 e set e.sal=e.sal + e.sal * 0.2,e.comm=e.comm+ e.comm * 0.2 where e.ename='王刚1' insert into emp1(num,empno,ename,deptno) values(22,8899,'小刘1',203) --给小刘1的岗位设成默认值 update emp1 e set e.job=default where e.ename='小刘'

    --重点记忆,在更新数据或删除数据时,一定要先查询数据,确认返回行是否正确。

    select * from emp1 e where e.ename= '小刘'

    --通过子查询修改字段值 update emp1 e set e.sal=(select a.sal from emp1 a where a.ename='王刚2') where e.ename='小刘'--删除指定的数据 delete from emp1 e where e.ename='小刘1'--删除整个表的数据 delete from emp3 --免提交删除整个表的数据 truncate table emp3 --创建人员表视图 create view v_emp1 as select e.empno,e.ename,d.dname,d.upperdeptno,e.mgr,a.ename mgrname from emp1 e,dept1 d,emp1 a where e.deptno=d.deptno and e.mgr=a.empno --视图的应用跟表的应用类似,也可以进行连接 select r.*,d.dname from v_emp1 r ,dept1 d where r.upperdeptno=d.deptno --创建一个复杂视图 --注意:修改表结构会对引用它的视图、触发器有影响。 create or replace view v_emp1_sal as select f.*,d.dname from dept1 d, (select e.deptno,max(e.sal) as hsal,min(e.sal) msal,avg(e.sal) asal from emp1 e group by e.deptno) f where d.deptno=f.deptno --从当前用户视图字典表查询新建的视图,视图名是大写,所以本SQL语句查询不到数据 SELECT * FROM user_views u where u.view_name like '%emp1%'--将视图名称转为小写,可以查询出数据 SELECT * FROM user_views u where lower(u.view_name) like '%emp1%'--可以显示是否允许在特定视图列上执行DML操作 SELECT * FROM user_updatable_columns s where s.table_name like '%EMP1%'--创建序列 CREATE SEQUENCE deptno_seq START WITH 1 INCREMENT BY 1 MAXVALUE 99 CACHE 10; --查询deptno_seq的下一个值 select deptno_seq.nextval from dual; --查询deptno_seq的当前值 select deptno_seq.currval from dual --在插入语句中使用序列3 insert into emp1(num,empno)values(99,deptno_seq.nextval) --创建一个同义词 create or replace synonym dlv3emp for dlv3.emp --使用同义词 select * from dlv3emp --游标的定义、使用、关闭 declare cursor zb_cursor is select ZB_INCODE from TWZ_CGMX_ZBLY where xh=v_xh; zb_record zb_cursor%rowtype; begin open zb_cursor; fetch zb_cursor into zb_record; while zb_cursor%found loop v_bill_incode:=zb_record.ZB_INCODE; p_zb_liyong_delete(v_bill_incode); fetch zb_cursor into zb_record; end loop; close zb_cursor; end; --创建一个函数 --函数的意义:根据输入参数的部门内码获得部门名称 create or replace function f_get_dept_name(in_deptno number) return varchar2 is v_dname dept.dname%type; begin select t.dname into v_dname from dept t where t.deptno=in_deptno; return(v_dname); end f_get_dept_name; --使用自定义的函数 select e.ename, f_get_dept_name(e.deptno) from emp e --与下面这句SQL返回值相同 select e.ename,d.dname from emp e ,dept d where e.deptno=d.deptno --创建一个存储过程 --该存储过程的含义: --将人员表中经理职位并且年薪大于7万的人员信息插入到MANAGER表中,输出参数是插入的条数 create or replace procedure p_manager_update(o_ename_num out number) is begin select to_number(count(1)) into o_ename_num from emp e where nvl(e.sal,0)*12+nvl(e.comm,0) > 70000 and e.job='MANAGER'; insert into MANAGER(INCODE,ENAME,CREATE_DATE) select deptno_seq.nextval,e.ename,sysdate from emp e where nvl(e.sal,0)*12+nvl(e.comm,0) > 70000 and e.job='MANAGER'; commit; end p_manager_update; --在COMMONAD WINDOWS里执行 exec p_manager_update; --如何使用游标 --如果MANAGER表里已经存在员工,不插入,如果不存在,再插入 create or replace procedure p_manager_update2(o_ename_num out number) is begin declare --向MANAGER插入一条记录就+1,最终值就是输出参数 v_num number(3); v_empno varchar2(20); v_ename varchar2(20); v_emp_num number(3); begin v_num:=0; declare cursor zb_cursor is select e.empno,e.ename from emp e where nvl(e.sal,0)*12+nvl(e.comm,0) > 70000 and e.job='MANAGER'; zb_record zb_cursor%rowtype; begin open zb_cursor; fetch zb_cursor into zb_record; while zb_cursor%found loop --从record中取出员工编号及员工姓名 v_empno:=zb_record.empno; v_ename:=zb_record.ename; select count(*) into v_emp_num from manager m where m.empno=v_empno; if v_emp_num=0 then insert into MANAGER(INCODE,ENAME,CREATE_DATE,empno) values(deptno_seq.nextval,v_ename,sysdate,v_empno); v_num := v_num+1; end if; fetch zb_cursor into zb_record; end loop; close zb_cursor; end; o_ename_num :=v_num; commit; end; end p_manager_update2; --新生成一张表emp_his CREATE TABLE emp_his AS SELECT * FROM EMP WHERE 1=2; --创新一个触发器,当删除EMP表前将删除的记录插入到emp_his表中 CREATE OR REPLACE TRIGGER tr_del_emp BEFORE DELETE --指定触发时机为删除操作前触发 ON emp FOR EACH ROW --说明创建的是行级触发器 BEGIN --将修改前数据插入到日志记录表 del_emp ,以供监督使用。 INSERT INTO emp_his(deptno , empno, ename , job ,mgr , sal , comm , hiredate ) VALUES( :old.deptno, :old.empno, :old.ename , :old.job,:old.mgr, :old.sal, :old.comm, :old.hiredate ); END; --在cmd下输入如下命令,导出全库数据库 --exp 用户名/密码@网络服务名 file=导出文件存放路径及名称 full=y (表示全库导出) exp dlv3/dlv3@ydme file=e:20131106full.dmp full=y --将数据库中的表table1和table2导出 exp dlv3/dlv3@ydme file=e:20131106dlv3table.dmp tables=(table1,table2) --将数据库中dlv3用户与dlv2用户的所有对象导出 exp dlv3/dlv3@ydme file=e:20131106dlv3dlv2.dmp owner=(dlv3,dlv2) --将E:20131106dlv3.dmp 备份文件导入,将dlv3用户下的emp1和dept1表导入到DLV2用户下 imp dlv2/ffffff@ydme fromuser=dlv3 touser=dlv2 tables=(emp1,dept1) log=e:20131106.log file=E:20131106dlv3.dmp --将E:20131106dlv3.dmp 备份文件导入,将dlv3用户下所有对象导入到DLV2用户下 imp dlv2/ffffff@ydme fromuser=dlv3 touser=dlv2 log=e:20131106.log file=E:20131106dlv3.dmp
    谢谢大家的阅读,阅读后记得关注一下呦!
  • 相关阅读:
    JB开发之二 [jailbreak,越狱开发研究]
    iOS9 Https技术预研
    Tweak和app交互方案【进程通信】
    iOS设备抓包终极解决方案(支持https)
    Anti-Anti dylib(反 反-dylib钩子(Anti-tweak))
    Hook ptrace 调试加入了ptrace函数的程序
    How do I determine if I'm being run under the debugger?
    个人整理的一些iOS Entitlements
    SQLite在多线程环境下的应用
    别的程序员是怎么读你的简历的
  • 原文地址:https://www.cnblogs.com/bhy-1116/p/8314297.html
Copyright © 2011-2022 走看看