Skip to content

Oracle数据库

3533字约12分钟

数据库oracle

2024-10-24

1.oracle的历史

1.文件型数据库

2.层状数据库

3.关系性数据库管理系统

3.1二维表存储数据

3.2表之间有外键关系

3.3符合实体关系模型

2.Oracle分类

1.历史版本 8i,9i,10g,11grid,12c

2.功能版本

1.企业版

2.标准版

3.Express快捷版

特点

1.安装包只有300M多 ,有1.5G多

2.免费进行开发、部署和分发

3.XE 将最多存储 4GB 的用户数据

4.最多使用 1GB 内存,并在主机上使用一个 CPU

5.只能建立1个数据库

3.数据库使用者角色

1.数据开发人员

2.DBA 数据库管理人员

3.BI(商业分析人员)

4.Oracle xe数据库的安装

image-20211018095345580

不要安装在中文路径(D:\oraclexe)

在本子上记录密码

1.启动oracle

image-20211018095742886

image-20211018100640833

2.查看数据库是否正常启动

使用SQl Plus连接数据库管理系统

默认2个用户

1.sys 系统中权限最高的用户 不能使用norma身份登录

2.system 系统中权限最高的用户 它可以使用norma身份登录

用户登录oracle有3个常用角色

1.sysdba 数据管理者

2.sysoper 数据库操作者

3.normal 普通身份登录

登录

image-20211018101624153

image-20211018101853881

查看监听状态

image-20211018102248329

image-20211018103138736

image-20211018105006938

3.sqlplus的使用

sqlplus命令

登录

退出

连接

断开连接 disconn

sql语句

PL Sql语句 (过程化SQL语句)

创建表空间

 create tableSpace TB_TEST2
    datafile 'D:\oraclexe\app\oracle\oradata\XE\TB_TEST2.dbf'
    size 10M
    autoextend on next 1m;

创建用户

create user test_user2
    identified by 123456
    --default tableSpace TB_TEST2;

授权

grant resource,connect to test_user2;

resource 用户角色表示的是 对象的所有者 增删改模式对象

connect用户角色表示的是 连接数据库,对对象进行CRUD 的权限

4.安装PL SQLDelvoper及PLD的使用

1.SQL窗口

2.命令窗口 执行sqlPlus

3.程序窗口 定义各种模式对象

5.varchar与varchar2的区别?

1.varchar是标准sql里面的, varchar2是oracle提供的独有的数据类型。

2.但是oracle准备在下一版本,不支持varchar类型。

3.varchar对于汉字占两个字节,对于数字,英文字符是一个字节,占的内存小,varchar2具体要看数据库使用的字符集

4.varchar对空串不处理,varchar2将空串当做null来处理。

3.Oracle的常见操作

1.生产系统中一个服务器一般=只使用一个Oracle数据库,一个数据库实例只能连接一个数据库,多个软件系统工作在同一个服务器,一定要共用数据库,为了区分模式对象,需要依据软件系统建立不同的用户

2.Oracle数据库不自动提交事务,执行ddl(数据定义语言)会自动提交事务

1.选择操作

横向选择部分行(在结果集中选出部分记录行)

关系运算:=,!=,<>,>,<,>=,<=,in,not in,is null,is not null,between..... and,like,

逻辑运算:not and or

is null 是判断结果是否为null的唯一条件,=null不可使用

like:模糊查找(%表示多个字符,_表示一个字符)关系运算的优先级高于逻辑运算

>some 等同于 >any 大于最小的
>all 大于最大的

exist按行匹配,不经过投影过程,效率略高

2.排序

结果集默认不排序,按照聚集索引及内容排序

order by子句,可以多个关键字排序,多个关键字使用逗号分开,每个关键字可单独设置排序规则(ASC升序(默认)DESC为降序)

一般只在结果集的末尾排序

3.分组

group by .... having........分组后的条件

分组的投影字段,要么是分组条件列,要么是聚合函数的列

having 执行在分组之后,

where子句先执行可以把结果集范围缩小,提高查询效率

having一般用于限制聚合列,分组用于消除重复

4.连接

笛卡儿积:行数为两表行数的乘积,列数为两表列数的和

等值连接:表1 join 表2 on 条件

行数由查询条件决定,列数为两表之和

推荐 inner join 表2 on 条件的写法

左外连接:outer join 表2 on 条件

记录数取决于连接条件,保证左表数据全部显示

左联与等联的区别:

1.都可以连接2表

2.都可以连接字段

3.若引用表等于被引用表,数据符合引用完整性,等联与左联无区别

若数据不符合规范,,左联更安全,总能保证左表的所有记录会被加载

(编号转名称是最常用的应用场景)

--DML 数据操纵语言
      --查
         -- 1.投影(对字段的操作)
            -- 1.1 选取全部字段
            select * from emp;
            -- 1.2 选取部分字段
            select empno from emp;
            select empno,ename from emp;
            -- 1.3 选取部分字段,并且调整顺序
            select ename,empno from emp;
            -- 1.4 可以使用函数,或者计算,产生表达式
            select substr(ename,1,2) from emp;
            --null做任何运算结果都是null
            select ename,sal,comm,sal+nvl(comm,0) from emp;
            -- 1.5 别名
            select ename,sal,comm,sal+nvl(comm,0) as 收入 from emp;
            select ename,sal,comm,sal+nvl(comm,0) as "收 入" from emp;
            select ename,sal,comm,sal+nvl(comm,0)  "收 入" from emp E;
            select ename,sal,comm,sal+nvl(comm,0)  "收 入" from emp as E;--不行,表的别名是没有as
            
            --1.6 常数列 
            select ename,1 常数列,sysdate,'abcd'  from emp;
            
            --1.7 剔重
            
            select distinct job from emp;--只按投影列表(选择的字段列表)来剔重
            select dist job from emp;-- 不行
            
            
         -- 2.选择
            -- 在结果集中选择出部分记录行
            
            select * from emp
                   where ;
           --关系运算 =,!=,<>,>,<,>=,<=,in,not in,is null ,is not null,between ...and ,like
           -- 逻辑运算 not and or
           -- 逻辑谓词 some any all exists
           
           = 是单的
           between ...and 是闭区间
           is null 是判别null的正确方式,不能用=null
           like 
           
           select * from emp
                   where comm=null ;--错
          select * from emp
                   where comm is null ;
           select * from emp
                   where ename like 'A';--错
           select * from emp
                   where ename like '%A%';
           select * from emp
                   where ename like 'A____';
             
            select * from emp
                   where deptno=10 or  deptno=20   
            select * from emp
                   where (deptno=10) or  (deptno=20)
                   
             
            select * from emp
                   where sal>some (select sal from emp where deptno=10) --任意一个    
            select * from emp
                   where sal>any (select sal from emp where deptno=10) --任意一个  
                           
            select * from emp
                   where sal>all (select sal from emp where deptno=10)   --全部        
                   
            select * from emp E1
                   where exists(select 1 from emp E2 where E1.Deptno=E2.deptno and E2.Deptno=10 )
            -- exists 按记录行匹配,不经过投影,所以效率高
            
                  
       -- 3.排序
        --结果集不排序,默认认为是无序的,是按照聚集索引,内容排列顺序
          select ename,job from emp
                 order by empno, job asc,ename desc --可以多个关键字排序 ,用逗号分开
                 --每个关键字是可以,单独设置升序(asc)降序(desc)
                 --可以使用没有投影的字段排序
                 --一般不在子查询中排序,只在结果集最后排序
          
       -- 4.分组
            --group by
            --having
            --分组的2个用处
                    --1.使用聚合函数  max,min,sum,count,avg
                    --2.剔重
                    
              select count(1) from emp --把所有记录视作一组
              
              --分组的投影字段,分组条件列,或者是聚合列
              select deptno,min(ename),count(1) from emp 
                    where  deptno>0 --where 先执行,能把结果集限制的更小,处理的数据更少,效率高
                    group by deptno
                    having count(1)>0 --having 分组条件列,或者是聚合列,在分组后执行
                                   -- having 一般只用于限制聚合列
             --(精确的)消除重复       
             select job,min(empno) from  emp  
                    group by  job   
                           
        -- 5.连接
         
            select * from emp
            select * from dept
            
            select * from emp,dept 
            --笛卡尔积
                   行数=2表之积,列数=2表之和
            --等联(内等联结)
                   行数=取决于连接条件,列数=2表之和
            select * from emp,dept
                   where emp.deptno=dept.deptno
                   
            select * from emp
                   inner join dept on emp.deptno=dept.deptno --推荐       
           select * from emp
                   inner join dept on emp.deptno!=dept.deptno       
           select * from emp
                    join dept on emp.deptno=dept.deptno       
                    
           --左联(左联结)
             行数=取决于连接条件,保证左表记录返回,列数=2表之和
           select * from emp
                   left outer join dept on emp.deptno=dept.deptno --推荐  
                   
            select * from dept
                   left outer join emp on emp.deptno=dept.deptno    
                    order by  emp.deptno 
            select * from dept
                   left join emp on emp.deptno=dept.deptno --推荐    
                    order by  emp.deptno 
                    
            select * from emp,dept
                   where emp.deptno=dept.deptno(+) --左联的古典写法       
                    
            左联与等连的区别?
            都可以连接2表
            连接字段
            如何引用表与被引用表,数据符合引用完整性的,等连和左联没区别
            数据不是那么规范,不符合引用完整性,左联更安全,总能保证左表的所有记录会被加载。
            !!!编号转名称,是连接的最主要场景
             --右联(就是左联的对称)      
              select * from emp
                   right outer join dept on emp.deptno=dept.deptno                    
               select * from emp
                   right  join dept on emp.deptno=dept.deptno
              select * from emp,dept
                   where emp.deptno(+)=dept.deptno --右联的古典写法    
                    
                             
             --全连接(左联+右联)
             --保证左表,右表记录都被加载
             select * from emp
                    full outer  join dept on emp.deptno=dept.deptno  
                    
             --自然连接(按2表相同字段名的列,等连)
            select * from emp
                    Natural join dept                 
        -- 6.子查询  
            --1.单行子查询
            select * from emp
                   where deptno=(
                     select deptno from Dept
                            where loc='DALLAS');
             --2.多行子查询
             select * from emp
                   where deptno in(
                     select deptno from Dept
                            where deptno>10);
            --3.多列子查询                            
            select * from   emp
                   where (ename,job)=( select ename,job from emp where empno=7369) 
                   
                   update   emp
                     set sal=0
                     where (ename,job)=( select ename,job from emp where empno=7369)             
            --4.标量子查询
              select ename,sal,5000-sal 差额 from   emp
              
              select ename,sal,(select max(sal) from emp)-sal 差额 from emp
            --5.相关子查询
            select ename,sal,deptno,
                   (select max(sal) from emp E1 where Emp.Deptno=E1.Deptno)-sal 差额 from emp
            
            --6.DDL子查询(复制表与数据)
            create table EmpInDept10
            as
            select empno,ename,sal from emp
                   where deptno=10
                   
           select * from EmpInDept10        
                                                           
        -- 7.联合
            -- 并集
            select * from emp
                   where deptno=10
            union --带剔重
            select * from emp
                      
            select * from emp
                   where deptno=10
            union all --不带剔重
            select * from emp
            --不需要字段一致,只要数据类型一致,字段数量一致
            select empno,ename from emp
                   where deptno=10
            union 
            select  empno,job from emp
                  
           --交集
           select * from emp
                   where deptno=10
            INTERSECT 
            select * from emp
            --差集
            select * from emp      
            minus 
            select * from emp
                   where deptno=10

4.Oracle常用函数

1.字符函数

1.ASCii('abcd')获取首字母的ASCII码

2.chr(n)获取n对应ASCII码的字符

3.concat(str1,str2)连接两个字符

4.instr(str1,str2[n])查找从n开始str2在str1中出现的位置,未找到为0;

5.length(Str)返回str的长度

6.lpad( str,n,char)格式化str,转为n位,不够的在左边补char,rpad类似

7.ltrim(str,str2)去除str1里面的str2

8.replace(str1,str2)去除str1里面的str2

9.replace(str1,str2,str3)将str1里面的str2用str3代替

10.substr(str ,n,l)截取字符,支持反向截取

2.数字函数

1.floor(n)向下取整

2.ceil(n)向上取整

3.round(n)绝对值四舍五入

4.round(n,l)保留l位小数四舍五入

5.mod(x,y)取x%y

6.power(x,y)取x^y

3.日期函数

1.current_date()|current_timestrap()|sysdate()|systimestrap()获取系统当前时间

2.month_between(date1,date2)获取两个date之间的月数

3.add_months(date,n)返回n个月后的日期

4.last_day(date)返回指定日期的月份的最后一天的日期

5.next_day(date)返回指定日期月份的后一天日期

4.转换函数

1.to_date(str,掩码)字符串转日期

2.to_char(str,掩码)

3.to_number(str,掩码)

5.其他函数

nvl(null,0)null保护

nvl(str,str1)使用str1代替str

nvl2(str,str1,str2)

三目运算

rownum>3表示显示查询结果的前两行

/*函数*/
--单行函数
  --字符函数
  --dual系统提供的测试表
    select 'abcdef' from dual;
    select ascii('abcdef') from dual;--97
    select ascii('a') from dual;
    
    select chr(97) from dual;--a
    
    select concat('ab','cd') from dual;--abcd
     select concat('ab','cd','ef') from dual;--错
     select 'ab'||'cd' from dual;--abcd
     select 'ab'+'cd' from dual;--错
     select 3+2 from dual;
     select '3'+'2' from dual;--自动转换
     select '3'+'2'+10 from dual;--自动转换
     
     select instr('abcdef','abc') from dual;--1
     select instr('abcdef','bbc') from dual;--0 
     select instr('abcdefabc','abc',2) from dual; 
    select instr('abcdefabc','abc',1,2) from dual; 
    
    select length('123456') from dual;
    
    select lpad('123',5,0) from dual;
    select lpad('123456',5,0) from dual;--截取,填充
    select rpad('123',5,0) from dual;
    select rpad('123456',5,0) from dual;
 
    select ltrim('   123456   ') from dual;
    
    select ltrim('123456','12') from dual;
    select ltrim('21232456','312') from dual;
    select trim('   21232456  ') from dual;
    
    
     select replace('1231245612','12') from dual;
    select replace('1231245612','12','*') from dual;
    
     select substr('12345678',2) from dual;
     select substr('12345678',2,3) from dual;
     select substr('12345678',-2) from dual;--反向截取
  
    
  --数学函数
     select floor(-3.14) from dual;-- -4
     select ceil(-3.14) from dual;-- -3
     select round(-3.14) from dual;-- -3
     select round(-3.14,1) from dual;-- -3.1
      select mod(8,5) from dual;-- 3
      select power(8,2) from dual;-- 64
      
  --日期函数
  select CURRENT_DATE from dual;--2021/10/19 11:36:46
  select SYSDATE from dual;--2021/10/19 11:37:18
  select CURRENT_TIMESTAMP(9) from dual;--19-10月-21 11.37.47.833000000 上午 +08:00
  select SYSTIMESTAMP(9) from dual;--19-10月-21 11.38.25.140000000 上午 +08:00
  
   select SYSDATE+1 from dual;--天
  select date'2021-10-19'- date'2021-10-16' from dual;
  select SYSDATE- date'2021-10-16' from dual;
   select months_between(date'2021-6-19', date'2021-10-16') from dual;
   select ADD_MONTHS(date'2021-6-19',3) from dual;
   
   select last_day(date'2021-10-16') from dual;
   select last_day(date'2020-02-16')-3 from dual;
   
   select next_day(sysdate,2) from dual;--下周一
   select next_day(sysdate,'星期一') from dual;--下周一
   
   select ROUND(sysdate,'year') from dual;
   select ROUND(sysdate,'month') from dual;
   
   select extract(day from sysdate) from dual;
   select extract(year from sysdate) from dual;
  
  --转换函数
  select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;
   select to_char(sysdate,'dd')+10 from dual;
   
   select to_date('2021-10-19 11:51:44','yyyy-mm-dd hh24:mi:ss') from dual;
   select to_char(1234567.879,'$000,000,000.00') from dual;
  select to_number('$001,234,567.88','$000,000,000.00') from dual;
 
  --其它函数
  
  select nvl(null,2) from dual;
  select empno,nvl(comm,0) from emp;
    select empno,nvl(comm,'a') from emp;--错
    --三目运算
   select nvl2(1,2,3) from dual; 
   
   --多选一结构
   select decode(5,1,'',2,'','爱咋咋') from dual;

6.分支结构

case 表名

​ when 值1 then 值1-1

​ when 值2 then 值2-1

​ when 值2 then 值2-1

​ else 默认值

end case

desc 表名 获取表结构

数值类型:无界定符

字符串:单引号界定

日期:date’字符串'/to_date函数

添加字段:alter table add 字段名 类型

批量插入:insert into 表名 select ........

删除数据:强烈建议先查看、备份再删除

分页:rownum伪列:是系统提供的特殊字段,用来表达结果集的序号

ininCap()函数首字母大写