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

SELECT * FROM dept WHERE ROWNUM<4 ORDER BY cdate 错误
--查询当前用户下用户表名包含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)) /* nvl  没有数据的也统计上*/ WHERE r>=2 AND r<=5
SELECT ename,sal,r FROM(SELECT ename,sal,ROWNUM r
       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'   --只保留年份yyyy

--工资降序,奖金将序

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

        Group by

--
Group by语句中,select后只能跟聚合函数和分组变量(group by中)
--  group by.......having.....
--查询人员表中姓李的存在重名的人员名称及人数
--select...from...where...group by...having...order by...

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的分组数据         连接 --1.相等连接、内连接,查询人员姓名及所属部门名称 select e.ename,d.dname from emp1 e ,dept1 d where e.deptno=d.deptno --2. 内连接 查询人员姓名及上级领导姓名 select e.ename,a.ename from emp1 e ,emp1 a where e.mgr=a.empno --3.左外连接,以左表为主,显示人员表的所有内容,当没有部门时候显示无所属部门 select e.ename,nvl(d.dname,'无所属部门') from emp1 e LEFT JOIN dept1 d ON e.deptno=d.deptno --4.左外连接,以左表为主,显示部门表的所有内容 select e.ename,d.dname,d.deptno from dept1 d LEFT JOIN emp1 e ON d.deptno=e.deptno --5.右外连接,以右表为主,显示部门表的所有内容 select e.ename,nvl(d.dname,'无所属部门') from emp1 e right JOIN dept1 d ON e.deptno=d.deptno --6.(+)以部门表为主,显示部门表的所有内容,看+号对面 select e.ename,d.dname from emp1 e ,dept1 d where e.deptno(+)=d.deptno --7.(+)以人员表为主,显示人员表的所有内容 select e.ename,d.dname from emp1 e ,dept1 d where e.deptno=d.deptno(+) --8.完全外连接,将两个表都不满足条件的数据都查询出来 select e.ename,d.dname,d.deptno from dept1 d full JOIN emp1 e ON d.deptno=e.deptno         子查询 --1.子查询,在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 ='刘鹏飞' --2.子查询,在WHERE语句使用返回多条记录使用IN select d.dname from dept1 d where d.deptno in (select deptno from emp1 e where e.ename like '王%') --3.子查询,返回多列数据 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='刘鹏飞' --4.在INSERT语句里使用子查询 insert into emp(empno,ename,deptno,job) select e.empno,e.ename,203,e.job from emp1 e where e.ename='小王' --5.在UPDATE语句里使用子查询,通过查询EMP表里小王的所属部门,修改EMP1表里小王的所属部门 update emp1 e set e.deptno=(select a.deptno from emp a where a.empno=7950) where e.empno=7950; commit; --提交 --6.在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 13.55
SELECT TRUNC('13.5562',1) FROM dual   13.5
SELECT TRUNC('13.5562',-1) FROM dual   10
--给当前日期加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   
  
        DDL(创建、插入、更新)

--1.最基本的插入语句,建议大家要把列名列出来

insert into emp1(num,empno,ename,deptno,job) values(18,8888,'小李',203,'CLERK')

--2.插入数据采用默认值

insert into emp1(num,empno,ename,deptno,job,hiredate)
  
values(18,8888,'小李',203,default,sysdate)

--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

--分解上面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

        更新update

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='王刚'
--多列更新 

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  
  
        视图

--1.创建人员表视图 查询人员和部门名称以及上级领导的名字和部门名
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 --2.创建一个复杂视图 --注意:修改表结构会对引用它的视图、触发器有影响。 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表中 set serveroutput on; 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;
DELETE emp WHERE empno=7788;
DROP TABLE emp_his;
DROP TRIGGER del_emp;

CREATE OR REPLACE TRIGGER tr_emp_sal_comm
BEFORE UPDATE OF salary, commission_pct
OR DELETE
ON HR.employees
FOR EACH ROW
WHEN (old.department_id = 80)
BEGIN
CASE
WHEN UPDATING ('salary') THEN
IF :NEW.salary < :old.salary THEN


RAISE_APPLICATION_ERROR(-20001, '部门80的人员的工资不能降');
END IF;
WHEN UPDATING ('commission_pct') THEN


IF :NEW.commission_pct < :old.commission_pct THEN
RAISE_APPLICATION_ERROR(-20002, '部门80的人员的奖金不能降');
END IF;
WHEN DELETING THEN
RAISE_APPLICATION_ERROR(-20003, '不能删除部门80的人员记录');
END CASE;
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

 

本文转载于 https://www.cnblogs.com/bhy-1116/p/8314297.html

posted @ 2018-06-21 14:14  东篱下  阅读(681)  评论(0编辑  收藏  举报