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',2,2) 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