zoukankan      html  css  js  c++  java
  • Java SSM入门(十二)——Oracle(一)(增删改查)

    iwehdio的博客园:https://www.cnblogs.com/iwehdio/

    1、Oracle入门

    • Oracle体系结构:

      • 数据库:Oracle数据库的物理存储。
      • 实例:一个实例由一系列的后台进程和内存结构组成。一个数据库可以有n个实例。
      • 用户:用户是在实例下建立的,不同实例可以建相同名字的用户。用户是管理表的基本单位。
      • 表空间:一个数据库在逻辑上被划分为一个到若干个表空间。一个表空间中可以有多个用户。
      • 数据文件:是数据库的物理存储单位,数据库的数据存储在表空间,真正是存在数据文件中。
    • 创建表空间:

      • 必须有超级管理员的权限。
      -- 创建表空间,名为iwehdio
      create tablespace iwehdio
      -- 数据文件的位置
      datafile 'd:oracleoracle.dbf'
      -- 大小100m,不足时自动增长,每次增长10m
      size 100m
      autoextend on
      next 10m;
      
    • 删除表空间:drop tablespace iwehdio

    • 创建用户:

      -- 创建用户
      create user iwehdio0
      -- 密码
      identified by hhh
      -- 关联表空间
      default tablespace iwehdio;
      
    • 给用户授权:

      • 常用角色:
        • connect :连接角色,基本角色。
        • resource :开发者角色。
        • dba :超级管理员角色。
      • 给用户授权:grant dba to iwehdio0
      • 切换用户:在Session下先 log off 再 log on。

    2、建表和增删改

    • Oracle数据类型:

      • Varchar / varchar2 :表示一个字符串。后边写()中表示长度。常用的是varchar2。
      • NUMBER :NUMBER(n)表示一个长度为n的整数,NUMBER(m,n)表示一个小数,总长度m,小数n。
      • DATA :表示日期类型。
      • CLOB:大对象文本数据类型。
      • BLOB:大对虾二进制数据。
    • 建表:

      -- 创建表,名称在前类型在后
      create table person(
             pid number(20),
             pname varchar2(10)
      );
      
    • 修改表结构:

      • 添加一列:alter table person add (gender number(1)),添加多列时在括号中由逗号分隔。
      • 修改列的类型:alter table person modify (gender char(1)),修改多列时在括号中由逗号分隔。
      • 修改列的名称:alter table person rename column gender to sex
      • 删除一列:alter table person drop column sex
    • 数据的增删改:

      • 添加数据:insert into person (pid,pname) values (1,'小明')
      • 修改数据:update person set pname = 'ming' where pid = 1
      • 删除数据:
        • delete from person:删除表中所有记录。
        • drop table person:删除表结构。
        • truncate table person:先删除表,再次创建表。
      • 增删改之后,都要用commit提交数据。
    • 序列的使用:

      • 默认从1开始,依次递增,用来给主键赋值使用。
      • 序列不是真的属于任何一张表,但是可以逻辑和表做绑定。
      • 创建序列:create sequence s_person
      • 查询序列:select s_person.nextval from dualdual代表虚表,只是为了补全语法,没有任何意义。
      • 一次增加几:increment by n
      • 从几开始:start with n
    • scott 用户:

      • 用户名 scott,密码 tiger。

      • 解锁scott用户:

        • 解锁用户:alter user scott account unlock
        • 解锁密码:alter user scott identified by tiger

    3、查询

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

      • 字符函数:
        • 把小写转换为大写:select upper('yes') from dual
        • 把大写转换为小写:select lower('YEs') from dual
      • 数值函数:
        • 四舍五入,参数为保留的位数:select round(26.18,1) from dual
        • 直接截取:select trunc(26.18,1) from dual
        • 求余:select mod(10,3) from dual
      • 日期函数:
        • 查询与今天距离的天数:select sysdate-e.hiredate from emp e
        • 查询明天此刻:select sysdate+1 from dual
        • 查询与今天距离的月数:select months_between(sysdate,e.hiredate) from emp e
      • 转换函数:
        • 日期转换为字符串:select to_char(sysdate,'yyyy-mm-dd hh:mi:ss')from dual。24小时格式为hh24。
        • 字符串转日期:select to_date('2020-06-27 07:17:44','yyyy-mm-dd hh:mi:ss')from dual
      • 通用函数:
        • nvl函数,如果为null则选取第二个值:select e.sal*12+nvl(e.comm,0) 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
    • 条件表达式:

      • 为emp表中的人取别名(相等判断时):

        select e.ename,
               case e.ename
                 when 'SMITH' then '曹'
                   when 'ALLEN' then '孙'
                     else '刘'
                       end
        from emp e
        
      • case 是所要比对的字段,else 可以没有,但end 必须有。

      • 为emp表中的人划分收入(不等判断时):

        select e.sal,
               case 
                 when e.sal>3000 then '高'
                   when e.sal>1500 then '中'
                     else '低'
                       end
        from emp e
        
      • case 后不写字段。

      • Oracle专用条件表达式:

        select e.ename,
               decode(e.ename,
                  'SMITH' , '曹',
                    'ALLEN' , '孙',
                      '刘') "别名"
        from emp e
        
      • Oracle中除了起别名,都用单引号。起别名可以用双引号或者不用引号。

    • 分组查询:

      • 查询每个部门的平均工资:

        select e.deptno,avg(e.sal)
        from emp e
        group by e.deptno
        
      • 分组查询中,出现在 group by 后面的原始列,才能出现在 select 后。其他的列要出现在 select 后必须加上多行函数。

      • 查询高于2000的工资的部门:

        select e.deptno,avg(e.sal)
        from emp e
        group by e.deptno
        having avg(e.sal)>2000
        
      • 在条件字段中,不能使用别名。

      • 查询每个部门工资高于800的员工的平均工资:

        select e.deptno,avg(e.sal)
        from emp e
        where e.sal >800
        group by e.deptno
        
      • where 条件是在 group by之前,having 条件是在 group by 之后。

    • 多表查询中的概念:

      • 笛卡尔积:两张表中的所有记录匹配相乘。

      • 等值连接(内连接):在笛卡尔积的基础上,使用where 进行相等条件匹配。

      • 外连接:按那个表中的主键作为主列。

      • Oracle中专用外连接:

        select *
        from emp e,dept d
        where e.deptno(+) = d.deptno
        
      • (+) 在左边就是右外连接,在右边就是左外连接。

    • 自连接:

      • 查询出员工姓名和其领导姓名:

        select e1.ename, e2.ename
        from emp e1, emp e2
        where e1.mgr = e2.empno
        
      • e1是员工表,e2是领导表。

      • 自连接就是站在不同角度,把一张表看作多张表。

      • 查询出员工姓名及其所属部门和其领导姓名及其所属部门:

        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
        
    • 子查询:

      • 子查询返回一个值:

        • 查询出工资和scott一样的员工信息:

          select * from emp where sal = 
          (select sal from emp where ename = 'SCOTT')
          
      • 子查询返回一个集合:

        • 查询出工资和10号部门任意员工一样的员工信息:

          select * from emp where sal in
          (select sal from emp where deptno = 10)
          
      • 子查询返回一张表:

        • 查询出每个部门最低工资和最低工资员工姓名和所在部门名称:

          select  t.deptno,t.msal,e.ename,d.dname
          from emp e, dept d,(select deptno,min(sal) msal 
                              from emp e 
                              group by deptno) t
          where t.deptno = e.deptno
          and t.msal = e.sal
          and e.deptno = d.deptno
          
    • 分页查询:

      • mp表工资倒序排列:
      select rownum, t.* from (
      select * from emp e order by e.sal desc) t
      
      • emp表工资倒序排列后,每页五条记录,查询第二页:

        select * from(
          select rownum rn, t.* from (
          select * from emp e order by e.sal desc) t
          where rownum < 11
        ) where rn > 5
        
      • rownum是行号,每次查询出一条记录就加一个行号。

      • 排序操作会影响rownum的顺序。

      • rownum 不能写大于一个正数,因为其从1开始无法满足。


    iwehdio的博客园:https://www.cnblogs.com/iwehdio/
  • 相关阅读:
    1
    webpack
    webpack32
    41324
    124
    CSS 32
    Git 分支管理
    Git 标签管理
    datetime的timedelta对象
    unittest中的testCase执行顺序
  • 原文地址:https://www.cnblogs.com/iwehdio/p/13200035.html
Copyright © 2011-2022 走看看