Oracle 实战

2019-07-12  本文已影响0人  楊柯林

1 Oralce体系结构

oracle体系结构如下

以上,上对象对待下对象都是1:n的关系,但是表空间对用户又是n:1的关系,实际是n:n的关系

2 Oracle 对用户及表结构操作

创建表空间

   create tablespace itheima47    //表空间名称
   datafile 'c:/itheima47.dbf'    //对应的物理地址
   size 100m                      //初始化大小
   autoextend on                  //自动拓展  
   next 10m                       //每次拓展空间
2.1删除表空间
    drop tablespace 表空间名称
2.2创建用户
   create user tencent          --用户名
   identified by tencent        --密码
   default tablespace tencent   --默认使用的表空间
2.3 授权 connect resource dba
   grant dba to itheima47         --给用户授权DBA
2.4 Oracle库
No 数据类型 描述
1 Varchar, varchar2 表示一个字符串
2 NUMBER NUMBER(n)表示一个整数,长度是n NUMBER(m,n):表示一个小数,总长度是 m,小 数是 n,整数是 m-n
3 DATA 表示日期类型
2.5 修改表结构
--添加一列
   alter table user1 add (phoneNum number)
   --修改列的类型或长度
   alter table user1 modify  (phoneNum varchar2(20))
   --修改列名
   alter table user1 rename column phoneNum to address
   --删除一列
   alter table user1 drop column address
   
  --删除表
   drop table user1
2.6 表数据的增删改

oracle涉及到表变化的由于事务管理等级不同,必须要提交事务才可以发生表变化

--添加 
   insert into 表(字段1,字段2) values(值1,值2);
   commit;
   --更新
   update 表 set 字段=新值 where 条件;
   commit;
   --删除
   delete from 表;          --delete和truncate删除的区别:delete删除的数据可以被回滚,会产生碎片,而truncate不会
   commit;                  --原理:delete删除是逐条删除  truncate直接把表摧毁再创建
   
   truncate table 表    
2.7 序列
--概念:连续增长的数字
     --作用:用来生成主键
     --dual: 伪表/虚表:为了补全语法
     --注意问题:序列第一次使用必须是nextval ****
     --语法:   
      create sequence 序列名
           
      create sequence id;
      
      select id.nextval from dual;   --取到序列的下个值
      select id.currval from dual;   --取到序列的当前值
           
      
       create sequence id --序列键
       increment by 5    --步长
       start with  3 --开始值
       
       
       select id.nextval from dual;

       ----添加一条记录
        insert into person (pid, pname) values (s_person.nextval, '小明');
        commit;
2.8 scott用户
----scott用户,密码tiger。
--解锁scott用户
alter user scott account unlock;
--解锁scott用户的密码【此句也可以用来重置密码】
alter user scott identified by tiger;
--切换到scott用户下

3 单行函数

作用于一行,返回一个值

      --字符函数
      upper(): 转大写
      lower(): 转小写

select upper('yes') from dual;--YES
select lower('YES') from dual;--yes

select length('abcd') from dual;     --计算长度
select concat('abc','d') from dual;  --拼接
      
select ('公司名称:'||'传智播客') from dual;   --oracle独有拼接

      --数值函数
      round(): 四舍五入
      trunc(): 截取
      mod():   取余

select round(56.16, -2) from dual;---四舍五入,后面的参数表示保留的位数
select trunc(56.16, -1) from dual;---直接截取,不在看后面位数的数字是否大于5.
select mod(10, 3) from dual;---求余数
     --日期函数
      sysdate : 当前时间
      months_between():计算两个时间段间隔了多个个月
     --转换函数
      to_char(): 转换成字符串
      to_date():转换成日期
     --通用函数
      select 1+nvl(null,3)  from dual;  --nvl:空值处理
      select 1+nvl(3,6) from dual;
      -- 数据库遇到空值会一直视为null,此刻需要这样处理

---条件表达式
---条件表达式的通用写法,mysql和oracle通用
---给emp表中员工起中文名
select e.ename, 
       case e.ename  --对哪行取别名
         when 'SMITH' then '史密斯'
           when 'ALLEN' then '艾伦'
             when 'WARD' then '沃德'
               --else '无名'
                 end
from emp e;
---判断emp表中员工工资,如果高于3000显示高收入,如果高于1500低于3000显示中等收入,
-----其余显示低收入
select e.sal, 
       case e.sal
         when e.sal>3000 then '高收入'
           when e.sal>1500 then '中等收入'
               else '低收入'
                 end
from emp e;
----oracle中除了起别名,都用单引号。
----oracle专用条件表达式
select e.ename, 
        decode(e.ename,
          'SMITH',  '史密斯',
            'ALLEN',  '艾伦',
              'WARD',  '沃德',
                '无名') "中文名"             
from emp e;

--多行函数【聚合函数】:作用于多行,返回一个值。
select count(1) from emp;---查询总数量
select sum(sal) from emp;---工资总和
select max(sal) from emp;---最大工资
select min(sal) from emp;---最低工资
select avg(sal) from emp;---平均工资

4 分组查询

--分组查询
     --语法:
     select * from 表  where 分组前条件 group by 分组条件 having 分组后条件 
     --注意问题:
        --1.select后面出现的普通字段必须要在group by后面出现
        --2.where和having后面不能使用别名
        --sql执行顺序:
           from  where  group by    having  select  order by
     
     ---查询出每个部门资高于800的员工的平均工资
     ---然后再查询出平均工资高于2000的部门
     select e.deptno 部门编号,avg(e.sal) 平均工资
     from emp e
     where  e.sal>800
     group by e.deptno
     having avg(e.sal)>2000

多表查询

   -- 查询员工姓名 员工所在部门  领导姓名 领导所在部门
     select e1.ename 员工姓名,d1.dname 员工所在部门名,e2.ename 领导姓名,d2.dname 领导所在部门
     from emp e1,emp e2 ,dept d1,dept d2
     where e1.mgr = e2.empno
     and e1.deptno = d1.deptno
     and e2.deptno = d2.deptno
(非常重点)分页查询
 --分页查询 **
    -- rownum : 行号,每查询一行记录,就会添加一个行号
            --:行号只能从1开始,不能跳过  *****
            
    --需求1: 查询emp表中前5条记录
       select rownum,e.* from emp e where rownum<6
    --需求2: 查询emp表中5条之后的记录
       select rownum,e.* from emp e where rownum > 5
       --上面查询没有结果
       --原因:rownum不能使用> = >=   原理:rownum生成时机
       --解决:改变rownum的时机 (先生成rownum,再取值)
       
       select * from 
       (select rownum r,e.* from emp e) e1 where r>5 and r<11
    --需求3: 查询emp表工资排名最高的第6到第10号员工
       select * from emp e order by e.sal desc
    
       select * from 
       (select rownum r,e.* from emp e order by e.sal desc) e1 where r>5 and r<11 
       --上面的查询结果是错误的
       --原因:先生成了rownum   再排序   再取值
       --解决: 先排序  再生成rownum  再取值
       select * from 
       (select rownum r,e1.* from 
       (select * from emp e order by e.sal desc) e1) e2 where r>5 and r<11 

rownum不能使用> = >=
行号只能从1开始,不能跳过
因此将行号取成别名

oracle 最重要区别于mysql就是序列以及分页查询

上一篇 下一篇

猜你喜欢

热点阅读