oracle常用命令

解锁 scott用户

Cmd 命令下输入 sqlplus / as sysdba  进入 特权模式,然后更改 用户权限
alter user scott account unlock;

解锁scott用户时设置密码
alter user SCOTT account unlock identified by 123456;

创建用户,授权

创建用户tom 密码为13456

create user tom identified by 123456

授权tom登录权限

grant connect to tom

授权resource建表权限

 grant  resource to tom;

授权用户DBA权限

grant dba to testuser ;

授权创建视图权限

grant create any view to test;

给一个用户赋权限使用命令grant,回收权限使用命令 revoke

删除用户tom

drop user tom

删除带数据的tom

drop user tom cascade

查询scott 下的表

select  *  from  tab;

删除表

select 'drop table '||table_name||';' 
from cat 
where table_type='TABLE'

EXP数据库导出命令

exp 用户名/密码@localhost:1521/orcl file=E:/test.dmp full=y

DMP文件导入命令

imp 用户名/密码@localhost:1521/orcl file=E:/test.dmp full=y

删除数据为空的表数据

delete from cs_jsjd where cjdw is null; 

聚合函数的使用

聚合函数包含如下函数

avg count dense_rank rank first last max min sum grouping

group by 用于对查询结果分组统计
having子句用于限制分组显示结果

如何显示每个部门的平均工资和最高工资

SQL> select deptno,avg(sal),max(sal) from emp group by deptno;

显示每个部门的每种岗位的平均工资和最低工资

SQL> select deptno,job,avg(sal),max(sal) from emp group by deptno,job;

显示平均工资in低于2000的部门号和它的平均工资

SQL> select deptno,avg(sal),max(sal) from emp group by deptno having avg(sal)>2000;

对数据分组的总结

  • 分组函数只能出现在选择列表、having、order by 子句中
  • 如果在select语句中同时包含group by,having,order by 那么它们的顺序是group by , having ,order by

在选择列中如果有列,表达式和分组函数,那么这些列和表达式必须有一个出现在group by 子句中,否则就会出错

select deptno,avg(sal),max(sal) from emp group by deptno having avg(sal)<2000; 这里deptno就一定要出现在group by中

用decode 加统计行

表结构如下
CREATE TABLE "USER_CSCS"."CS_JKRB" 
(	"JKRB_ID" VARCHAR2(32 BYTE) DEFAULT sys_guid(), 
"KMDM" VARCHAR2(32 BYTE), 
"KMMC" VARCHAR2(32 BYTE), 
"BRFSE" VARCHAR2(32 BYTE), 
"BSZQ" VARCHAR2(32 BYTE), 
"ZJR" VARCHAR2(32 BYTE), 
"ZJSJ" VARCHAR2(32 BYTE) DEFAULT to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'), 
"XGR" VARCHAR2(32 BYTE), 
"XGSJ" VARCHAR2(32 BYTE)
)

with aa as
(
select kmdm,kmmc from cs_jkrb
)
select decode (grouping(t.kmdm),1,'合计',t.kmdm) kmdm,
decode (grouping(t.kmdm),1,' ',max(r.kmmc)) kmmc,
sum(t.brfse) 
from cs_jkrb t left join aa r on t.kmdm=r.kmdm
group by rollup(t.kmdm) 
order by t.kmdm;


select  decode (grouping(kmdm),1,'合计',kmdm) kmdm,kmmc,sum(brfse) from cs_jkrb group by rollup(kmdm,kmmc);

select  decode (grouping(kmdm),1,'合计',kmdm) kmdm,sum(brfse) from cs_jkrb group by rollup(kmdm);


with ds as
(select nsrsbh,rkrq,shuie from cs_drkxx),--地税
gs as (select nsrsbh,rkrq,shuie from cs_grkxx)--国税
select ds.nsrsbh,ds.rkrq,ds.shuie,gs.rkrq,gs.shuie from ds,gs
where ds.nsrsbh=gs.nsrsbh;

oracle合并查询

有时在实际应用中,为了合并多个select语句的结果可以使用集合操作符号 union,union all,intersect,minus

  • union 该操作符用于取得两个结果集的并集,使用该操作符时,会自动去掉结果集中重复行

    select ename,sal,job from emp where sal>2500 union select ename,sal,job from emp where job=’manager’

  • union all 该操作符与union相似,但不会取消重复行,而且不会排序

    select ename ,sal,job from emp where sal>2500 union all select ename,sal,job from where job=’manager’

  • intersect 使用该运算符取得两个结果集的交集

    select ename,sal,job from emp where sal>2500 intersect select ename,sal,job form emp where job=’manager’

  • minus 使用该操作符用于取得两个结果集的差集,它只会显示存在第一个集合中,而不存在第二个集合中的数据

    select ename,sal,job from emp where sal>2500 minus select ename,sal,job form emp where job=’manager’

复杂查询,子查询

如何显示高于自己部门的平均工资的员工的信息

第一步
1.	先求各个部门的平均工资和部门号
select deptno ,avg(sal) mysql from emp group by deptno;
2.	把上面的子查询看作一张子表
select a2.ename,a2.deptno,a2.sal,a1.mysql from emp a2 ,(select deptno,avg(sal) mysql from emp by deptno) a1 where a1.deptno=a2.deptno and a2.sal>a1.mysal;

查询与smith的部门和岗位完全相同的所有雇员

select  * from emp where (deptno,job)=(select deptno,job from emp where ename='SMITH');

在多行子查询中使用all操作符
如何显示工资比部门30的所有员工的工资高的员工的姓名、工资和部门号

select ename,job,sal from emp where sal>all(select sal from emp where deptno=30);
或是
select ename,job,sal from emp where sal>(select max(sal) from emp where deptno =30)
后者效率更高

在多行子查询中使用any操作符

如何显示工资比部门30的任意一个员工的工资高的员工的姓名、工资和部门号

select ename,sal,job from emp where sal>any(select sal from emp where deptno=30);
或者
select ename,job,sal from emp where sal> (select min(sal) from emp where deptno=30);

with as用法

Oracle数据库中,使用with语句可以实现子查询,提高语句执行的效率,当查询中多次用到某一部分时,可以用Oracle with语句创建一个公共临时表。因为子查询在内存临时表中,避免了重复解析,所以执行效率会提高不少。临时表在一次查询结束自动清除。

例子1
with 
q1 as (select 3+5 S from dual),
q2 as (select 3*5 M from dual),
q3 as (select S,M,S+M,S*M from q2,q1)
select * from q3;

例子2
with tt as(
select 'aaa' id, '高' value from dual union all
  select 'bbb' id, '低' value from dual union all
  select 'aaa' id, '低' value from dual union all
  select 'aaa' id, '高' value from dual union all
  select 'bbb' id, '低' value from dual union all
  select 'bbb' id, '高' value from dual)
select id, 
count(decode(value,'高',1))高,
count(decode(value,'高',1))低
from tt
group by id

例子3
with aa as
     (select zbbh, zbmc, dept_code,dept_name, bssj, #{bszq} bszqq from cs_zbinfo)
    select a.dept_name,
           a.zbmc,
           decode(b.log_date, '', '否', '是') sfbs,
           a.bszqq || '-' || a.bssj ybssj,
           b.log_date,
           case
             when b.log_date is not null and to_char(b.log_date,'yyyy-mm-dd')>a.bszqq || '-' || a.bssj then
                '超期完成'
             when b.log_date is not null and to_char(b.log_date,'yyyy-mm-dd')<a.bszqq || '-' || a.bssj then 
                '准时完成'
             when b.log_date is null and to_char(sysdate,'yyyy-mm-dd')<=a.bszqq || '-' || a.bssj then
                 '未到期'
             when b.log_date is null and to_char(sysdate,'yyyy-mm-dd')>a.bszqq || '-' || a.bssj then
                  '超期未完成'
           end bszt
      from aa a, cs_zblog b
     where a.zbbh = b.zbbh(+)
       and a.bszqq = b.bszq(+)

ORACLE 11G listener.ora配置文件

# listener.ora Network Configuration File: E:\app\Dreamer\product\11.2.0\dbhome_1\network\admin\listener.ora
# Generated by Oracle configuration tools.

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = CLRExtProc)
      (ORACLE_HOME = E:\app\Dreamer\product\11.2.0\dbhome_1)
      (PROGRAM = extproc)
      (ENVS = "EXTPROC_DLLS=ONLY:E:\app\Dreamer\product\11.2.0\dbhome_1\bin\oraclr11.dll")
    )
    (SID_DESC =
      (SID_NAME = ORCL)
      (ORACLE_HOME = E:\app\Dreamer\product\11.2.0\dbhome_1)
      (GLOBAL_DBNAME = ORCL)
      (ENVS = "EXTPROC_DLLS=ONLY:E:\app\Dreamer\product\11.2.0\dbhome_1\bin\oraclr11.dll")
    )
  )

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = Dream)(PORT = 1521))
    )
  )

ADR_BASE_LISTENER = E:\app\Dreamer

建表,默认值,注释

create  table CS_QYYD(
obj_id VARCHAR2(32) default sys_guid(),
yhmc   VARCHAR2(300),
yhdz   VARCHAR2(300),
tjsjq  VARCHAR2(32),
tjsjz  VARCHAR2(32),
bqs    NUMBER(18,2),
bnlj   NUMBER(18,2),
bszq   VARCHAR2(32),
zjr    VARCHAR2(32),
zjsj   VARCHAR2(32) default to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'),
xgr    VARCHAR2(32),
xgsj   VARCHAR2(32)
)
--给表加注释信息
comment on table CS_QYYD is '缴纳社保信息';

--给字段加注释信息
comment on column CS_QYYD.obj_id is 'ID';
comment on column CS_QYYD.yhmc  is '用户名称';
comment on column CS_QYYD.yhdz is '	用户地址	';
comment on column CS_QYYD.tjsjq is '统计时间起';
comment on column CS_QYYD.tjsjz is '	统计时间止	';
comment on column CS_QYYD.bqs is '本期数	';
comment on column CS_QYYD.bnlj is '本年累计数';
comment on column CS_QYYD.bszqm is '报送所属期';
comment on column CS_QYYD.zjr  is '增加人';
comment on column CS_QYYD.zjsj is '增加时间';
comment on column CS_QYYD.xgr is '修改人';
comment on column CS_QYYD.xgsj  is '修改时间';