初识oracle

        linux 下连接oracle
            实例:
            [root@VM_0_9_centos ~]# su - oracle
            Last login: Wed Dec 12 15:30:37 CST 2018
            [oracle@VM_0_9_centos ~]$  sqlplus /nolog

            SQL*Plus: Release 11.2.0.1.0 Production on Wed Dec 12 15:33:18 2018

            Copyright (c) 1982, 2009, Oracle.  All rights reserved.

            SQL>  connect /as sysdba
            Connected.
            SQL> select * from dual;

            D
            -
            X
        window下连接Oracle 
            实例:    
                C:\Users\23228>sqlplus
                SQL*Plus: Release 11.2.0.1.0 Production on 星期三 12月 12 15:55:48 2018
                Copyright (c) 1982, 2010, Oracle.  All rights reserved.
                请输入用户名:  system
                输入口令:
                连接到:
                Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
                With the Partitioning, OLAP, Data Mining and Real Application Testing options
                SQL> select * from dual;
                D
                -
                X
        

        windows下清屏host cls
        linux下清屏 host clear
        
        dual 表 伪表
        RowID  RowNum Level 伪列
        
        oracle中字符串的含义
            字符串可以是表中的一个字符,数字,日期
            单引号表示字符串
            双引号表示别名
            
        spool '路径'    开始录制
        spool off         结束录制
        
        查看表结构
            desc 表名;
        查看用户下的所有表
            select * from tab;
        oracle中的null值,永远!=null
            需要用到oracle函数中的nvl(字段名,0);
        
        关于oracle的取别名的区别
             select empno as "员工号",ename "姓名",sal 月薪,sal*12,comm,sal*12+nvl(comm,0) from emp;
             第一个和第二个没区别,第二个和第三个有区别,区别:没有引号可能会报错
        
        编辑上一条的sql语句,使用ed回车在文本中编辑
        
        去重
            distinct 
        
        连接符 ||
            concat()
        
        默认的时间格式
            DD-MON-RR
            
        修改系统的字典
            alter session|system set NLS_DATE_FORMAT='yyyy-mm-dd'
                session:修改当前会话
                system:系统管理人员修改系统全局
        查看系统的字典
            select * from v$nls_parameters;
            
        常用的select语句
            select * from emp where com between 100 and 200;
            select * from scott.emp where deptno in(10,20);
            select * from scott.emp where deptno is null;
            select * from scott.emmp where ename like '%j%'; (_表示一个占位符,%表示任意占位符)
            select * from scott.emmp where ename like '%\_%' escape  '\'; (定义转义字符让_具有其本身的含义)
        
        执行sql的时候使用where语句是从右边往左判断
        
            order by后面 + 列、表达式、别名、序号 DESC|ASC nulls last(如果有空值则放到最后)
            在oracle中null值最大
            
        修改页面大小
            set pagesize 20
            
        函数
            单行函数:1.字符函数:a.大小写控制函数,b.字符控制函数
                      2.数字函数:a.四舍五入:round() ,b.截断:trunc(),c.求余:mod()
                      3.日期:a.格式化:to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'),    b.日期只有减
                                c.months_between()两个日期相差的月数,                d.add_months()在某个日期上加上月数
                                e.next_day()指定日期的下一个日期,                    f.last_day()本月的最后一天
                      4.转化:a.隐式,b.显示:to_char(date,'format_model')
                                              to_number()
                      5.通用函数:适用于任何数据类型,同时适用空值
                                a.nvl(extr1,extr2)                                                    b.nvl2(a,b,c) 当a=null的时候,返回c,否则返回b
                                c.nullif(a,b)判断是否相等,a==b返回空,否则返回a                        d.coalesce(a,b,c....n) 从左往右找到第一个不为空的值
                      6.条件表达式:a.case            b.decode
                                例如:    
                                        case 需要判断的值 when 判断条件 then 条件成立执行的结果    
                                                          when 判断条件 then 条件成立执行的结果    
                                                          when 判断条件 then 条件成立执行的结果    
                                                          ...
                                                          else 其他结果
                                        end
                                        
                                        case when 判断的值<100 then 条件成立执行的结果
                                             when 判断的值>100 then 条件成立执行的结果
                                             else 其他结果
                                        end
                                        (sql语句通用)
                                        
                                例如:decode(需要判断的值,判断条件1,条件成立执行的结果1,判断条件2,条件成立执行的结果2,其他结果    )
                                
            多行函数:    自动过滤空值,在oracle中,多行函数是不会统计null值的。
                    1.count()
                        范例1: 
                        统计emp表中员工总人数 
                        select count(*) from emp; 
                        *号适用于表字段较少的情况下,如果字段较多,扫描多间多,效率低,
                        项目中提倡使用某一个非null唯一的字段,通常是主键
                        
                        范例2: 
                        统计公司有多少个不重复的部门 
                        select count(distinct deptno) from emp;
                    2.max和min 
                    3.sum和avg
                        范例1: 
                        按部门求出该部门平均工资,且平均工资取整数,采用截断 
                        select deptno “部门编号”,trunc(avg(sal),0) “部门平均工资” 
                        from emp 
                        group by deptno;

                        (继续)查询部门平均工资大于2000元的部门 
                        select deptno “部门编号”,trunc(avg(sal),0) “部门平均工资” 
                        from emp 
                        group by deptno 
                        having trunc(avg(sal),0) > 2000;
                    4.单引号和双引号出现的地方
                        单引号出现的地方如下: 
                        1)字符串,例如:’hello’ 
                        2)日期型,例如:’17-12月-80’ 
                        3)to_char/to_date(日期,’YYYY-MM-DD HH24:MI:SS’)

                        双引号出现的地方如下: 
                        1)列别名,例如:select ename “姓 名” from emp 
                        2)to_char/to_date(日期,’YYYY”年”MM”月”DD”日” HH24:MI:SS’)‘’号中的英文字符大小写不敏感
            
            分组数据:在select语句中所有未包含在组函数中的列都必须包含在group by子句中
                        where和having的区别:where后面不能使用多行函数
                        SQL优化 原则:3. 尽量使用where
                    
                      group by 的增强
                        group by rollup(a,b) :这条语句相当于分组三次
                                                第一次,a,b两个约束条件,即a相同,b也相同的分为同一组
                                                第二次,只是用a一个条件进行分组,把上一次形成的结果在进行分组,把a相同的分为一组
                                                第三次,没有约束条件,将整个表数据分为一组
                            例如:
                            SQL> select deptno,job,sum(sal) from emp group by deptno,job order by deptno;
                            单独使用分组查询
                             
                            DEPTNO JOB         SUM(SAL)
                            ------ --------- ----------
                                10 CLERK           1300
                                10 MANAGER         2450
                                10 PRESIDENT       5000
                                20 ANALYST         6000
                                20 CLERK           1900
                                20 MANAGER         2975
                                30 CLERK            950
                                30 MANAGER         2850
                                30 SALESMAN        5600
                             
                            已选择9行。
                             
                            SQL> select deptno,job,sum(sal) from emp group by rollup(deptno,job) order by deptno;
                             
                            DEPTNO JOB         SUM(SAL)
                            ------ --------- ----------
                                10 CLERK           1300 第一次分组的sum总和计算
                                10 MANAGER         2450
                                10 PRESIDENT       5000
                                10                 8750 第二次分组添加的计算
                                20 ANALYST         6000
                                20 CLERK           1900
                                20 MANAGER         2975
                                20                10875
                                30 CLERK            950
                                30 MANAGER         2850
                                30 SALESMAN        5600
                                30                 9400
                                                  29025 第三次分组添加的计算
                            所以rollup函数进行多次分组计算
                             
                            已选择13行。
                            
                            
                        break on 列名 skip 行数        :将该列下相同的只显示一次并不同的相隔行数  
                        break on null                 :撤销
    表连接:1.等值连接,不等值连接,外连接,自连接
        外连接:
            (+):代表连接方向
            主表的数据可以完全查出来
            左连接:左边的表是主表,右连接:右边的表是主表
            如果(+)在右边,是左连接(左边的表是主表);select  e.ename,e.deptno,d.dname from emp e ,dept d where e.deptno(+)=d.deptno
            如果(+)在左边,是右连接(右边的表是主表)例如:select  e.ename,e.deptno,d.dname from emp e ,dept d where e.deptno=d.deptno(+)
        自连接:
            通过表的别名,将同一张表视为多张表,不适合操作大表。
        层次查询:
            单表大数据量的时候使用这样的方法
            select [level], column, expr... from table
          [where condition]
          start with condition
          connect by [prior column1= column2 |
          column1 = prior column2];
            
            例如:
            select level,empno,ename,mgr
            from emp
            connect by prior empno=mgr
            start with mgr is null
            order by 1;
            :level 伪列
        
    子查询
        1.可以在主查询的where select having from后面使用子查询
        2.不可以在group by后面使用子查询
        3.主查询和子查询可以不是同一张表;只要子查询返回的结果 主查询可以使用即可
        4.一般不在子查询排序;但top-n分析问题中,必须对子查询排序
        5. 一般先执行子查询,再执行主查询;但相关子查询例外
        6. 单行子查询只能使用单行操作符;多行子查询只能使用多行操作符
        7.子查询中的null
        
        单行子查询,查询结果返回单条记录 
                例如  select empno,ename,(select job from emp where empno =7839) from emp
                而不能 select empno,ename,(select job from emp) from emp
                单行子查询只能使用单行操作符,例如>,<,>=,<=,<>,=
            查询结果返回多行记录(having与where的区别在于having能接收多行函数而where不行)
                例如:select deptno,min(sal) from emp
                group by deptno having min(sal)>(select distinct min(sal) from emp where deptno=10)
                而不能:select deptno,min(sal) from emp
                        group by deptno where min(sal)>(select distinct min(sal) from emp where deptno=10)
        
        多行子查询,多行子查询的操作符:in,any,all
                如果使用not in 则在子查询语句中不能有null
                any:大于任意值相当于大于最小值,小于任意值相当于小于最大值
                all:大于任意值相当于大于最大值,小于任意值相当于小于最小值
                select  * from emp where sal >  (select min(sal) from emp where deptno=30)
                ==select  * from emp where sal > any (select sal from emp where deptno=30)
        
                关于子查询结果中存在空值,则不能使用not in ,否则会导致整个查询结果为空值
                如果想要使用not in,首先确保子查询的结果没有空值,即在子查询中添加where xx is  not null
                例如  查询不是老板的员工信息:
                            select * from emp where empno not in(select mgr from emp where mgr is not null)
        
        相关子查询,相关子查询:将主查询中的值 作为参数传递给子查询
                 select empno,ename,sal,(select avg(sal) from emp where deptno=e.deptno) avgsal
                 from emp e
                 where sal > (select avg(sal) from emp where deptno=e.deptno);
                
                sql优化:多表查询优于子查询
                
    集合查询:
            并集:union/union all    相等的存在一次/相等的存在两次
            交集:intersect    同属于A与B
            差集:minus 只属于A不属于B
            
            sql优化:尽量使用 union all
            union =union all + distinct    
        
            参与运算的各个集合必须列数相同 且类型一致
            采用第一个集合作为最后的表头
            order by永远在最后
        
            例如:
                select deptno,job,sum(sal) from emp group by deptno,job
                union
                select deptno,to_char(null),sum(sal) from emp group by deptno
                union
                select to_number(null),to_char(null),sum(sal) from emp;
            相当于:select deptno,job,sum(sal) from emp group by rollup(deptno,job) order by deptno;
    
            sql优化:尽量不要使用集合运算
            
    sql执行时间的开关:set timing on 和set timing off
    
    
    sql的类型:
                1. DML(data manipulation language 数据操作语言):insert update delete select
                2. DDL(data definition language 数据定义语言): create table,alter table,drop table,truncate table, create/drop view,sequence,index,synonym(同义词)
                3. DCL(data control language 数据控制语言):grant(授权) revoke(撤销权限)
    
    地址符:& 使用地址符可用来二次输入
                例如:insert into emp(empno,ename,sal,deptno) values(&empno,&ename,&sal,&deptno);
            
            创建相同数据结构的表:create table emp10 as select * from emp where 1=2;
            一次性将查询的结果插入:insert into emp10 select * from emp where deptno=10;
            如果需要插入大量的数据则使用1. 数据泵(PLSQL程序:dbms_datapump) 2. SQL*Loader工具3. 外部表
            
            
            delete和truncate的区别:
            1. delete逐条删除;truncate先摧毁表 再重建
            2. (*)delete是DML(可以回滚) truncate是DDL(不可以回滚)
            3. delete不会释放空间 truncate会
            4. delete可以闪回(flashback)  truncate不可以(一个事物提交了之后,可以被撤销)
            5. delete会产生碎片 truncate不会

            碎片:数据库插入是从后往上插入,在第一个位置上是高水位线,这个位置专门用来插入输入的
                而删除数据的时候,某个数据删除,数据插入不会填充插入到删除数据的位置上,将还是在
                高水位线上插入,所以产生了碎片,碎片影响数据查询的速度。
                去掉碎片:1.alter table 表名 move;
                          2.数据的重新导出和导入;导出:exp,导入 imp ,增强导出 expdp 增强导入:impdp
            
            取消回显:set feedback off
            导入数据: @d:\temp\testdelete.sql
            
    事务:1. 起始标志:事务中第一条DML语句
          2. 结束标志:提交 显式 commit,            隐式 正常退出exit,DDL,DCL
                       回滚 显式 rollback,            隐式 非正常退出,掉电,宕机
                       
            控制事务:使用保存点:savepoint a 开始一个事务
                                 rollback to savepoint a 回滚
            
            事务的隔离级别:oracle 支持三种:READ COMMITED(读已提交数据),SERIALIZABLE(串行化),默认为:READ COMMITED
                            mysql 支持四种:默认:REPEATABLE READ(可重复读)
                            
                            oracle 还支持 readonly(只读的隔离级别) ,所以是三种
                                例如:SET TRANSACTION read only;设置只读 
    
    额外知识:关于rownum:1. rownum永远按照默认的顺序生成
                         2. rownum只能使用< <=;不能使用> >=
            
              临时表:  手动生成: create global temporary table *****
                        自动:排序
                        特点:当事务或者会话结束的时候,表中自动删除
                        
                        使用rownum可以实现分页,把rownum当作基表的列,作为子查询的表,然后可以排序
                        
                        创建一个基于事务的临时表
                        create global temporary table temptest1
                        (tid number,tname varchar2(20))
                        on commit delete  rows;
                        
                        在oracle中事务提交之后,表中的数据不一定会保存下来,原因是基于事务的临时表
                        
                        创建一个基于会话的临时表
                        create global temporary table temptest1
                        (tid number,tname varchar2(20))
                        on commit preserve rows;
                        
              行转列:wm_concat(varchar2) 组函数
                        例如:select deptno,wm_concat(ename) nameslist from emp group by deptno;
        
    Oracle的回收站    
                查看回收站:show recyclebin;
                清空回收站:purge recyclebin;
                查看回收站的表内容:
                例如:select * from "BIN$4tn/JLnaTb+dmYhRTzDM0w==$0";
                
        注意:管理员没有回收站
                
    闪回删除: oracle 10g:6种不同闪回  oracle11g:7种
            flashback table 表名 to before drop;
            flashback table "回收站表名" to before drop;(有双引号)
            flashback table 表名 to before drop rename to TESTSAVEPOINT_OLD;
            
            增加列
            alter table test1 add photo blob;
            修改列
            alter table test1 modify tname varchar2(40);
            删除列
            alter table test1 drop column photo;
            重命名列
            alter table test1 rename column tname to username;
            重命名表
            rename test1 to test2;
            删除表
            drop table test2;
            
    约束:约束是表一级的限制
          如果存在依赖关系,约束可以防止错误的删除数据
          约束的类型:
                not null    非空
                unique        唯一约束
                primary key  主键
                foreign key  外键
                check        检查
                
            例如:gender varchar2(2) check (gender in ('男','女'))
        外键约束:
                foreign key :在字表中,定义了一个标记的约束
                references:指定表和父表的列
                on delete cascade:当删除父表时,级联删除字表记录
                on delete set null:将子表的相关依赖记录的外键位置设置为null
        关键字:constraint 给约束起别名 
        
        例如:
         create table student
        (
           sid number constraint student_pk primary key,
           sname varchar2(20) constraint student_name_notnull not null,
           gender varchar2(2) constraint student_gender check (gender in ('男','女')),
           email varchar2(40) constraint student_email_unique unique
                              constraint student_email_notnull not null,
           deptno number constraint student_fk references dept(deptno) on delete set null        -- 设置外键
        );
        
    其他数据库对象
        1.表
        2.视图
            视图就是封装了一条复杂查询的语句,视图是一种虚表,视图建立在已有表的基础上,
            视图赖以建立这些表成为基表。
            可以通过修改视图来改变基表的数据。但是不建议。
            
            
            语法1:create view 视图名称 as 子查询
            语法2:create or replace view  as 子查询 视图约束
            
        视图约束:with check option; --通过视图只能操作看得到的数据
                  with read only;    --只读,可以屏蔽对视图的修改操作。
                  
         删除视图 drop view 视图名
             
        3.序列 sequence
            相当于mysql的自增,一个数组
            语法:create sequence 序列名
            
            查看当前序列:        序列名.currval         伪列
            查看下一个序列值:    序列名.nextval        伪列
            
            使用序列可能会有裂缝
                回滚,系统异常,多表同时使用一个序列
            将序列值装入内存可提高访问效率
            
            修改序列 alter sequence 
        
        4.索引  index
            增加查询的效率以及速度
            查看执行计划 :explain plan for 子查询
            
            创建索引: create index 索引名 on 表名(字段);
            
        5.同义词 synonym 
            给一个用户下的表创建一个表的别名,让其他用户可以操作
            首先查看当前用户:show user
            创建同义词:create [public] synonym 别名 for  对象;
            删除同义词:drop synonym 别名;
         

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值