• 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,插入数据正常

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

  • 相关阅读:
    系统学习DOM事件机制
    混合编程:域、桥与型变
    分层语言的混合编程
    投资第一定律
    元编程(运行时)模型
    泛型的第一性:同构、集合、抽象
    元编程沉思录
    思想是什么?经过严密的逻辑论证的观点的体系。
    编程语言概念的层次性与解释系统
    元编程沉思录(草稿)
  • 原文地址:https://www.cnblogs.com/hoganhome/p/12287132.html
Copyright © 2020-2023  润新知