zoukankan      html  css  js  c++  java
  • Oracle基础操作

    -- 创建表空间

    create tablespace Test --表空间的名字
    datafile 'c: est.dbf' -- 位置
    size 100m -- 大小
    autoextend on -- 允许自动扩容
    next 10m; -- 每次扩容10m

    -- 删除表空间 drop

    drop tablespace itheima


    --- 创建用户
    create user hogan
    identified by hogan
    default tablespace Test;

    -- 用户授权才能登录
    -- Oracle 数据中常用角色
    -- connect 连接角色,基本角色
    -- resource 开发者角色
    -- dba 超级管理员角色


    -- 给hogan用户授权dba角色
    grant dba to hogan;

    -- 创建表

    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,'xaom');
    commit;

    --修改
    update person set pname='xiaoming' where pname='小明';
    commit;


    --删除
    -- 删除表中全部记录
    delete from person
    -- 删除表结构
    drop table person
    --先删除表在创建表,等同于删除表中所有记录;
    ---在数据量比较大的情况之下,尤其是在表中带有索引的情况下,该操作的效率较高。
    -- 索引能够提高查询效率,但是影响增删改查
    truncate table person


    select * from person;


    --- 序列:默认从1开始,一次递增,只要是用来给主键赋值使用的
    create sequence s_person;

    --- 序列:默认从1开始,一次递增,只要是用来给主键赋值使用的
    create sequence s_person;
    select s_person.nextval from dual;
    select s_person.currval from dual;


    --- 添加记录
    insert into person (pid, pname ) values (s_person.nextval, 'xiaoqin');
    commit;
    select * from person;


    -- scott 用户,密码默认tiger ,初学者适用
    -- 解锁scott 用户
    alter user scott account unlock;
    --解锁密码,也可以用来重置密码
    alter user scott identified by tiger;


    -- 查询

    --单行函数:作于单行,返回一个值
    --字符函数
    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; --求余函数

    -- 日期函数
    -- 查询出emp所有员工入职距离现在多少天
    select sysdate -e.hiredate from emp e;
    ---明天这个时候的时间
    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 (sysdate -e.hiredate)/7 from emp e;

    --转换函数 date--》char
    select to_char (sysdate, 'yyyy-mm-dd hh:mi:ss') from dual; --此函数带零,加上fm零就可以去掉
    select to_char (sysdate, 'fm yyyy-mm-dd hh:mi:ss') from dual;
    select to_char (sysdate, 'fm yyyy-mm-dd hh24:mi:ss') from dual;--24小时计数

    --- char --> date
    select to_date ( '2020-2-6 7:14:40', 'fm yyyy-mm-dd hh24:mi:ss') from dual;--24小时计数

    -- 通用函数
    -- 算出emp中所有员工的年薪
    select emp.sal*12 from emp;
    select emp.sal from emp;

    ---当算术运算中有null值是,用nvl排除
    select sal*12+nvl(comm,0 )from emp;


    --- 添加表达式
    ---条件表达式的通用写法(orcal和mysql)
    ---给emp中表中员工起中文名字
    select ename ,
    case ename
    when 'SMITH' then '曹贼'
    when 'ALLEN' then '诸葛'
    when 'JONES' then '山贼'
    -- else '无名'
    end
    from emp;


    -- 判断emp员工工资,高于3000显示高收入,1500-3000中等收入,其余低收入
    --范围判断,case后面的值放到比较符号前面
    select sal,ename,
    case
    when sal>3000 then '高收入'
    when sal>1500 then '中等收入'
    else '低收入'
    end
    from emp e;

    --orcale 专用条件表达式
    select ename ,
    decode(ename,
    'SMITH' ,'曹贼',
    'ALLEN' ,'诸葛',
    'JONES' ,'山贼',
    '无名' )
    from emp;

    --- 起别名, Oracle中除了起别名都用单引号,别名可以不加引号
    select ename ,
    decode(ename,
    'SMITH' ,'曹贼',
    'ALLEN' ,'诸葛',
    'JONES' ,'山贼',
    '无名' ) 中文名
    from emp;

    -- 多行函数【聚合函数】: 作用于多行,返回一个值
    --count返回表中有多少条数据,count(1) 等价于count(*)
    select count(1) from emp; --查询总数量
    select sum(sal) from emp; -- 总和
    select min(sal) from emp; -- 最小值
    select max(sal) from emp; -- 最大值
    select avg(sal) from emp; -- 平均值


    -- 分组查询
    -- 查询出每个部门的平均工资
    ---分组查询中出现在group by后面的原始列才能出现在select后面
    -- 没有出现在group by 后面的列,想在select后面,必须加上聚合函数。
    select e.deptno,avg(e.sal)
    from emp e
    group by e.deptno

    -- 查询平均工资高于2000的部门
    --- 所有条件都不能使用别名来判断,查询的时候先看条件
    select emp.deptno, avg(sal) avsal
    from emp
    group by emp.deptno
    having avg(emp.sal)>2000

    select ename,sal from emp where sal > 200;

    -- 查询出每个部门工资高于800的员工的平均工资

    select emp.deptno, avg(sal)
    from emp
    where sal>800
    group by emp.deptno
    -- where 是过滤分组前的数据,having是过滤分组后的数据
    -- 表现形式:where必须在group by 之前,having是在group by之后

    -- 查询出每个部门工资高于800的员工的平均工资,在查询出平均工资高于2000的部门
    select emp.deptno,avg(sal)
    from emp
    where sal>800
    group by emp.deptno
    having avg(sal)>2000;


    --- 多表查询的概念
    -- 笛卡尔积; 两张表的数据相乘
    select * from emp ,dept;

    -- 等值连接
    select *
    from emp,dept
    where emp.deptno=dept.deptno;

    -- 内连接<=>等值连接
    select *
    from emp inner join dept
    on emp.deptno=dept.deptno;


    --查询出所有部门,以及部门下的员工信息【外连接】
    select *
    from emp e right join dept d
    on e.deptno=d.deptno;

    --查询出所有员工信息以及所对应的部门
    select *
    from emp e left join dept d
    on e.deptno=d.deptno;


    --- 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;

    --员工姓名及部门,员工领导姓名及部门
    select e1.ename,d1.dname,e2.ename,d2.dname
    from emp e1,emp e2,dept d1,dept d2
    where e1.empno=e2.mgr and e1.deptno=d1.deptno and e2.deptno=d2.deptno;

    -- 子查询
    -- 子查询返回一个值
    -- 查询出工资和Scott一样的员工信息 。。当不能保证为null时用in
    select * from emp where emp.sal=(
    select sal from emp where emp.ename='SCOTT');

    -- 返回一个集合
    -- 查询出工资和10号部门任意员工工资一样的员工信息
    select sal
    from emp
    where sal
    in (
    select sal from emp where emp.deptno=10);

    -- 返回张表
    -- 查询每个部门的最低工资和员工姓名、部门名称
    ---先查询出每个部门最低工资
    select deptno,min(sal) msal
    from emp
    group by deptno
    -- 再三表联查
    select e.ename,e.sal,d.dname
    from (select deptno,min(sal) msal
    from emp
    group by deptno) t,emp e, dept d
    where t.deptno=e.deptno
    and t.msal=e.sal
    and e.deptno=d.deptno;

    -- oracle中的分页
    -- rownum行号,当我们做select操作的时候没查询出一行记录,就会再改行上加上
    ---一个行号,
    -- 行号从1开始依次递增,不能跳着走
    -- emp表工资倒叙排列,每页五条记录,查询第二页
    -- 排序操作会影响rownum的顺序

    select rownum,emp.* from emp
    order by sal desc;

    -- 先排序再加行号,如果涉及排序和rownum 可以选择先排序再查询
    select rownum ,t.* from(
    select rownum,emp.* from emp order by sal desc) t;

    -- -- emp表工资倒叙排列,每页五条记录,查询第二页
    -- rownum不能大于一个正数

    select * from (
    select * from(
    select rownum rn,t.* from (
    select e.* from emp e order by sal desc) t)
    where rn<11
    ) where rn>5;


    -- 视图:提供一个查询的窗口,所有数据来自于原表
    -- 创建一个视图【必须有dba权限】

    -- 查询语句创建表
    create table emp as select * from scott.emp;
    select * from emp;

    -- 创建视图
    create view e_emp as select ename,job from emp;


    -- 查询视图(视图是可以改变的)
    select * from e_emp;
    update e_emp set job='CLERK' where ename='MANAGER';
    commit;


    --只读视图
    create view r_emp as select ename,job from emp with read only;

    -- 1.视图可以屏蔽敏感字段;2.保证总部和分部数据及时统一;3.


    -- 索引:在表的列上构建二叉树,达到大幅度提高查询效率的目的,但是会影响增删改的效率


    -- 单列索引
    -- 创建单列索引,
    create index idx_ename on emp(ename);
    select * from emp where ename='SMITH';
    select * from emp;
    -- 单行函数,模糊查询都会影响索引的触发

    -- 复合索引
    --创建复合索引,复合索引中第一列为优先检索列,如果触发复合索引必须包含优先检索列中的原始值
    create index idx_enamejob on emp(ename,job);
    select * from emp where enmae='SCOTT' and job='xx'; --触发复合索引
    select * from emp where enmae='SCOTT' or job='xx'; -- 不触发索引
    select * from emp where enmae='SCOTT' ; --- 触发单列索引

    --p1/sq1编程语言
    --p1/sq1病程语言是利sq1语言的扩展,使得sq1语言具有过程化编程的特性。
    --p1/sq1编程语方比一般的过程化编程语言,更加灵活高效。
    --p1/sq1编程语言主要用来新写存能过程和存储函数等。


    declare
    i number(2) := 10; -- 表示数字2 用‘:=’来赋值
    s varchar2(10) :='小明';
    ena emp.ename%type; -- 直接提取表中数据格式大小(引用型变量)
    emprow emp%rowtype; -- 记录型变量
    begin
    dbms_output.put_line(i);
    dbms_output.put_line(s);
    select ename into ena from emp where empno=7788; -- 查 询语句赋值 into
    dbms_output.put_line(ena);
    select * into emprow from emp where empno=7788; -- 查询语句赋值 into,把一行赋值变量
    dbms_output.put_line('名字:'||emprow.ename||'工作:'||emprow.job); -- 输出连接符应‘||’

    end;

    -- pl/sql中的if判断


    select * from emp;
    insert into person values(1,'小明');

    -- 解决中文乱码问题
    select userenv('language') from dual;
    select * from V$NLS_PARAMETERS

    中文乱码问题解决
    1.查看服务器端编码
    select userenv('language') from dual;
    我实际查到的结果为:AMERICAN_AMERICA.ZHS16GBK
    2.执行语句 select * from V$NLS_PARAMETERS
    查看第一行中PARAMETER项中为NLS_LANGUAGE 对应的VALUE项中是否和第一步得到的值一样。
    如果不是,需要设置环境变量.
    否则PLSQL客户端使用的编码和服务器端编码不一致,插入中文时就会出现乱码.
    3.设置环境变量
    计算机->属性->高级系统设置->环境变量->新建
    设置变量名:NLS_LANG,变量值:第1步查到的值, 我的是 AMERICAN_AMERICA.ZHS16GBK
    4.重新启动PLSQL,插入数据正常

    -- 多行函数:作用于多行,返回一个值

  • 相关阅读:
    547. Friend Circles
    399. Evaluate Division
    684. Redundant Connection
    327. Count of Range Sum
    LeetCode 130 被围绕的区域
    LeetCode 696 计数二进制子串
    LeetCode 116 填充每个节点的下一个右侧节点
    LeetCode 101 对称二叉树
    LeetCode 111 二叉树最小深度
    LeetCode 59 螺旋矩阵II
  • 原文地址:https://www.cnblogs.com/hoganhome/p/12287132.html
Copyright © 2011-2022 走看看