zoukankan      html  css  js  c++  java
  • Oracle简单应用

    Oracle简单应用

    1、体系结构

    2、表空间

    ORACLE数据库的逻辑单元。 数据库---表空间。 一个表空间可以与多个数据文件(物理结构)关联,一个数据库下可以建立多个表空间,一个表空间可以建立多个用户、一个用户下可以建立多个表。

    2.1、创建表空间

    create tablespace gec_name_space 
    datafile 'E:oracle_tablespacegec.dbf' 
    size 100m 
    autoextend on 
    next 10m
    
    • gec_name_space为表空间名称
    • datafile 指定表空间对应的数据文件
    • size 后定义的是表空间的初始大小
    • autoextend on 自动增长 ,当表空间存储都占满时,自动增长
    • next 后指定的是一次自动增长的大小

    3、用户

    3.1、创建用户

    create user gecuser 
    identified by 1111 
    default tablespace gec_name_space
    
    • user 后面是用户名
    • identified by 后边是用户的密码
    • default tablespace 后边是表空间名称,oracle 数据库与其它数据库产品的区别在于,表和其它的数据库对象都是存储在用户下的

    3.2、用户赋予权限

    新创建的用户没有任何权限,登陆后会提示

    Oracle 中已存在三个重要的角色

    • connect:是授予最终用户的典型权利,最基本的
    • resource:是授予开发人员的
    • dba:拥有全部特权,是系统最高权限,只有 DBA才可以创建数据库结构,并且系统权限也需要DBA授出,且 DBA用户可以操作全体用户的任意基表,包括删除
    grant connect to gecuser
    

    4、数据类型

    5、表

    5.1、创建表

    create table person( pid number(10), name varchar2(10), gender number(1) default 1, birthday date );
    

    5.2、插入表数据

    insert into person(pid, name, gender, birthday) values(1, '张三', 1, to_date('1999-12-22', 'yyyy-MM-dd'));
    

    5.3、删除表

    DROP TABLE 表名
    

    5.4、修改表

    在 sql中使用 alter 可以修改表

    • 添加列

      ALTER TABLE 表名称 ADD(
          列名 1 类型 [DEFAULT默认值],
          列名 2 类型[DEFAULT 默认值]...)
      alter table person add(address varchar2(10));
      
    • 修改列类型

      ALTER TABLE 表名称 MODIFY(
          列名 1 类型[DEFAULT 默认值],
          列名 2 类型[DEFAULT 默认值]...)
      alter table person modify(address varchar2(20));
      
    • 修改列名

       ALTER TABLE 表名称 RENAME 列名 1 TO 列名 2
      

    6、序列

    在很多数据库中都存在一个自动增长的列,如果现在要想在 oracle中完成自动增长的功能,则只能依靠序列完成,所有的自动增长操作,需要用户手工完成处理。

    • 范例:创建一个 seqpersonid的序列,验证自动增长的操作

      CREATE SEQUENCE seqpersonid; 
      nextval :取得序列的下一个内容 
      currval :取得序列的当前内容 
      select seqpersonid.nextval from dual;
      select seqpersonid.currval from dual; 
      insert into person (pid, pname) values (s_person.nextval, '小明');
      

    7、单行函数

    单行函数:作用于一行,返回一个值。

    7.1、字符函数

    接收字符输入返回字符或者数值

    • 把小写的字符转换成大小的字符

    • 把大写字符变成小写字符

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

    7.2、数值函数

    • 四舍五入函数:ROUND():默认情况下 ROUND 四舍五入取整,可以自己指定保留的位数

      select round(56.16, -2) from dual;---四舍五入,后面的参数表示保留的位数 
      select trunc(56.16, -1) from dual;---直接截取,不在看后面位数的数字是否大于5.
      

    7.3、日期函数

    ----查询出emp表中所有员工入职距离现在几天。 
    select sysdate-e.hiredate from emp e; --sysdate:当前日期
    ----算出明天此刻 
    select sysdate+1 from dual; 
    ----查询出emp表中所有员工入职距离现在几月。 
    select months_between(sysdate,e.hiredate) from emp e;
    ----查询出emp表中所有员工入职距离现在几年。 
    select months_between(sysdate,e.hiredate)/12 from emp e; 
    ----查询出emp表中所有员工入职距离现在几周。 
    select round((sysdate-e.hiredate)/7) from emp e;
    

    8、转换函数

    ---条件表达式 
    ---条件表达式的通用写法,mysql和oracle通用 
    ---给emp表中员工起中文名 
    select e.ename, 
    	case e.ename 
    		when 'SMITH' then '曹贼' 
    		when 'ALLEN' then '大耳贼' 
    		when 'WARD' then '诸葛小儿' 
    		else '无名' 
    			end 
    from emp e;
    

    9、通用函数

    9.1、空值处理nvl

    ---算出emp表中所有员工的年薪 
    ----奖金里面有null值,如果null值和任意数字做算术运算,结果都是null。 
    select e.sal*12+nvl(e.comm, 0) from emp e;
    

    9.2、Decode函数

    ----oracle专用条件表达式 
    select e.ename, 
    	decode(e.ename,
               'SMITH', '曹贼', 
               'ALLEN', '大耳贼',
               'WARD', '诸葛小儿',
               '无名') "中文名" 
    from emp e;
    

    10、多行函数(聚合函数)

    10.1、统计记录总数count()

    select count(1) from emp;---查询总数量
    

    10.2、最小值查询min()

    select min(sal) from emp;---最低工资
    

    10.3、最大值查询 max()

    select max(sal) from emp;---最大工资
    

    10.4、查询平均值avg()

    select avg(sal) from emp;---平均工资
    

    10.5、求和函数sum()

    select sum(sal) from emp;---工资总和
    

    11、分组查询

    ---查询出每个部门的平均工资 
    ---分组查询中,出现在group by后面的原始列,才能出现在select后面 
    ---没有出现在group by后面的列,想在select后面,必须加上聚合函数。
    ---聚合函数有一个特性,可以把多行记录变成一个值。 
    select e.deptno, avg(e.sal), e.ename from emp e group by e.deptno; 
    ---查询出平均工资高于2000的部门信息 
    select e.deptno, avg(e.sal) asal from emp e group by e.deptno having avg(e.sal)>2000; 
    ----where是过滤分组前的数据,having是过滤分组后的数据。 
    ---表现形式:where必须在group by之前,having是在group by之后。 
    ---查询出每个部门工资高于800的员工的平均工资
    ---然后再查询出平均工资高于2000的部门 
    select e.deptno, avg(e.sal) asal from emp e where e.sal>800 group by e.deptno having avg(e.sal)>2000;
    

    12、多表查询

    语法: SELECT {DISTINCT} *|列名.. FROM 表名 别名,表名 1 别名{WHERE 限制条件 ORDER BY 排序字段 ASC|DESC...}

    范例:查询员工表和部门表

    select * from emp e,dept d where e.deptno=d.deptno
    

    12.1、外连接(左右连接)

    使用(+)表示左连接或者右连接,当(+)在左边表的关联条件字段上时是右连接,如果是在右边表的关联条件字段上就是左连接

    select e.empno,e.ename,d.deptno,d.dname
    from empe,dept d 
    where e.deptno(+) =d.deptno
    

    参考资料:https://www.cnblogs.com/hehaiyang/p/4745897.html

    12.2、子查询

    select * from emp t1 
    where t1.sal>(
        select t.sal from emp t where t.empno=7654)
    

    13、分页查询

    ROWNUM:表示行号,实际上此是一个列,但是这个列是一个伪列,此列可以在每张表中出现

    ----emp表工资倒叙排列后,每页五条记录,查询第二页。
    ----rownum行号不能写大于一的正数。 
    select * from( 
        select rownum rn, tt.* from( 
            select * from emp order by sal desc ) tt where rownum<11
        ) where rn>5
    

    参考资料:https://www.cnblogs.com/wuxu/p/11198764.html

    记得快乐
  • 相关阅读:
    纪中集训 Day 2
    纪中集训 Day1
    纪中集训 Day 0?
    BZOJ 1033: [ZJOI2008]杀蚂蚁antbuster(模拟)
    BZOJ 3527: [Zjoi2014]力(FFT)
    wikioi 3132 高精度乘法(FFT)
    BZOJ 1085: [SCOI2005]骑士精神(A*算法)
    BZOJ 1009 :[HNOI2008]GT考试(KPM算法+dp+矩阵快速幂)
    BZOJ 1019 :[SHOI2008]汉诺塔(递推)
    BZOJ 1021 :[SHOI2008]Debt 循环的债务 (DP)
  • 原文地址:https://www.cnblogs.com/Y-wee/p/13898906.html
Copyright © 2011-2022 走看看