Oracle 数据库基础知识总结

本文总结了Oracle数据库的基础知识,通过实例展示了如何使用更新(UPDATE)语句来修改数据,例如将名字为'abc'的学生的年龄增加2岁。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Oracle
数据库以表的形式存储文件、数据
Oracle 一般不区分大小写,但引号中的内容区分大小写。Oracle 只支持单引号,别名需要用双引号

数据库中的数据类型:
    1.数值类型 number(number(10)/number(38, 2))不写括号时,默认大小为38,括号第一个参数指定数据最大长度,第二个参数表示小数位数
    2.字符类型 varchar2(长度) 该类型后面必须有括号,里面写数据的最大长度
    3.时间类型 date,数据的默认格式 '26-4月-2017'
    4.char        默认长度为 1 字符
    5.blob
    6.clob
    7.long

建表:    1.create table 表名(列名 数据类型, ..., 列名 数据类型);    表名自定义
        例如:create table student(name varchar2(10), age number, sex char);
    2.create table 表名 as select ...    ---用已经存在的表的(部分)结构创建新表并添加数据

删除表:drop table 表名;

排序:order by desc/asc(默认)
拼接:||    --除了数字记得加单引号
去重:distinct 列名
运算符:+ - * /(这个除可以有小数,不是取整); mod(10,3)取余;
    > < >= <= !=  <> 后面两个是不等于
    and,or,not ...

插入数据:
    1.insert into 表名 values('abc', , 'm'); 数据类型对应表中的顺序,不写默认为null。
    2.insert into 表名(sex, age) values('f', 24); values括号中值的顺序对应表名括号中的列名顺序。
    3.把一个表中的(某些)数据添加/复制到另一个表中:
        insert into 表1 select * from 表2 (where ...);

删除数据:
    1.delete from 表名 where name = 'abc'; 删除名为abc的那一行数据
    2.delete from 表名; 删除该表所有数据,表还在,数据没了
    3.truncate table 表名;功能同 2,但这个是DDL语句,无法回滚,速度比 2 快;

删除列:drop column 列名
添加列:add(列名 类型 约束);
重命名表:rename 旧表名 to 新表名
重命名列:rename column 旧列名 to 新列名

修改数据:
    uptate 表名 set 列名=值,列名=值 where 子句;  不写where子句则修改整列。
    例如:update student set age = age + 2;    ---所有学生年龄都加了2岁

        update student set age = age + 2 where name = 'abc';  ---名为abc的学生的年龄加了2岁


查询数据:
    一、简单查询
    1.select * from 表名;  ---查询该表的所有数据
    2.select * from 表名 where name = 'abc';  ---查询abc的所有信息
    3.select name, sex from 表名 where age=24;  ---查询年龄为24的学生的姓名和性别

    二、子查询
        就是用一条查询语句的结果作为另一查询的条件
        all(多个值) -- >all大于最大的,<all小于最小的
        any(多个值) -- >any大于最小的,<any小于最大的

    分页查询:rownum:行号,系统自动添加的只能和 < 或 = 连用。
                如果自己显示写出来了,则也可以 >
        eg:select * from emp where rownum < 5;
        select * from (select emp.*,rownum r from emp) d where d.r >= 5 and d.r <= 10

    三、多表查询
    笛卡尔积(集)错误:一个表的一条记录连接了另一个表的多条记录
    1.内连接:只显示符合条件的记录
        等值连接:
        不等值连接:
        自连接:
    2.外连接:不仅显示符合条件的记录,也显示不符合条件的其他记录
        左外连接:(1)在右边表写(+)eg: ...where dept.deptno = emp.deptno(+),(2) ...from 表1 left (outer) join 表2 on 条件
        右外连接
        全外连接
    3.变形:
        cross join (差集) 类似笛卡尔积错误
        自然连接:natural join  --系统自己找连接条件,同列名就连接。没有同名列则无结果,有多个同名列则多连接,产生笛卡尔积错误
        join on 条件   --可以连接 n 个表。  ...from 表1 join 表2 on 条件 join 表3 on 条件 join 表4 on 条件....

过滤关键词(可用在查找删除修改等语句中)
    1. in()/not in()    ---值为/不为...
    例如:select * from student where age in(24,25,26);   ---查找年龄为24,25,26的这些学生
    2. between...and../not between...and...        ---是在/不在..之间
    例如:select * from student where age between 24 and 26;  ---查找年龄在24-26之间的学生的信息,包含24,26;
    3. is null/is not null        ---值为/不为空
    4. like 模糊查询(% 表示0至多个字符,_ 表示 1 个字符)
    例如:select * from student where name like %b%;    ---查询姓名中含有 b 的学生的所有信息。

约束:在建表时写在数据类型后面,或者后来设置也行。当设置了约束时,在插入数据时会进行检查,不符合约束条件不让添加。
    1. not null    设置了该约束条件的列名下的数据不能为空
    2. unique    唯一
    3. primary key     主键(不为空,且唯一),一般采用和对象无关的数字作主键;
    4. foreign key    外键(与另一个表的联系)
    5. check()     括号内自定义约束条件,比如指定某个范围
    
    约束写法一:创建表时添加(外键一般写在后面)
    例如:create table student(name varchar2(20) not null,
                    age number,
                    id numbmer primary key,
                    constraint 外键名 foreign key(name) references 父表(外键关联的列名)
                    );
    约束写法二:创建表之后添加
        1.alter table student add constraint 约束名(自定义) 约束(被约束列名);    ---not null 用第 2 种方式
        例如:alter table student add constraint age_con unique(age);
        2.alter table student modify(age not null/unique/primary key)    ---外键约束用第 1 种方式

    删除约束:alter table 表名 drop constraint 约束名;    (如果设置约束时没有设置约束名,系统会默认给一个)

    一个表中只有一个主键,可以有多个外键,可以用同表的有唯一约束的列作外键
    一个表中的一个字段可以有多个外键
        有外键关系的两个表,没有使用联级删除的情况下,增加数据时,需先增加被外键关联的表(父表)的数据,再增加外键所在的表的数据(子表);
    删除数据时,需先删除子表中对应的数据,再删除父表被关联的数据。
        联级删除:设置外键是在后面加上 on delete set null 删除父表被关联的数据时,子表相应的数据设置为空;
                        on delete cascade; 删除父表被关联的数据时,子表相应的数据被删除;

commit 提交;在一个客户端提交到数据库,另一个客户端才能访问
    有些语句自动提交:DDL语句
    有些语句手动提交:DML语句
rollback 回滚;返回上次提交的状态,类似撤销

单行函数:一行返回一个结果
    1.转换函数
    to_date(); eg:to_date('1234-5-6','yyyy/mm/dd');前面的参数是要转换成日期的字符串,后面的参数是要转换成的日期格式。
    注意:格式主要是要显示到月还是日,时分秒,/可以换成 -和英文下的其他特殊符号
    to_char();
    to_number();

    2.通用函数
    nvl();
    nvl2(); --类似 Java 的条件运算符;

    case 列名 when 值1 then 语句1
          when 值2 then 语句2
          esle 语句3
    end 名字(必须写)
    注意:后面的语句的结果的类型必须与语句1 的类型相同

    decode(
        列名,值1,语句1,
            值2,语句2,
            语句3
    )名字(必须写)

    字符:
    upper();
    lower();
    initcap('hello,world'); --将每个单词首字母大写
    cancat('a','b'); --拼接
    substr('aaaaaaaaaa',1,5); --截取,从 1 开始,截取一定长度的字串
    instr('hello', o);  -- o 出现的位置为 5;
    trim('h'from 'hhhabcdhhabch');  --去除两边的 h,得 abchhabc
    replace('abcd','b','m');      --用 m 替换 b
    lpad(salary, 10, '*'); 不足 10 位填充 * ,从左边填充
    rpad();

    数字
    trunc();截断,可以有第二位小数,表示保留的小数位数,可以是负数
        eg: select trunc(12345,-2) from dual; --输出 12300
    round();四舍五入,可以有第二位参数,表示保留的小数位数,可以是负数
        eg: select round(12345,-1) from dual; --输出12340
    mod();取余

    日期
    months_between();  --两日期相差的月份数
    add_months();
    next_day();
    last_day()

多行函数/聚合函数:多行返回一个结果
    min();max();avg();sum();count();

分组函数:group by
    having 类似 where ,但是 having 必须跟 group by 一起使用
    group by 后面可以接多个列名

视图:是映射了某个表中(数据)的一个虚表。
    优点:不占空间;可以只映射需要用的数据,不映射不想公开的数据,保证数据的安全性;
    创建视图:create view 视图名 select 子句(选择需要映射的数据)
    删除视图:drop view 视图名

索引:系统提供的一种对象,用来提高查询速度
    create index 索引名 on 表名(列名1,列名2)
    主键 或 unique 约束的列自动创建索引

    不要随意创建索引,索引是占空间的
    在数据量大的情况下,且某列的查询频繁时,为该列创建索引

    删除索引:drop index 索引名

    系统不使用索引的情况:
        A.模糊查询中在首位用了%;... like '%a';
        B.有 is null,is not null
        C.有not
        ....

序列:可以自增长的一串有序数字,通常用作主键
    创建:create sequence 序列名 (start with 值,increment by 值 (没增加几),maxvalue/minvalue, cycle/nocycle() 循环, cache 10/nocache 缓存 10个数字)
          简化版:create sequence 序列名;

    使用:序列名.currval: 序列现在的值
        序列名.nextval: 序列的下一个值
    注意:首先需要使用 nextval,才能使用 currval
    修改:alter sequence 序列名 increment by ... --不能修改起始值
    裂缝:产生原因:多个表共用一个序列;序列使用了缓存;回滚;系统异常
   
事物:并发执行的一个单位
    特点:ACID
    原子性:事务的步骤等要么全部执行完,要么一个也不执行
    一致性:数据库的状态保持一致
    持久性:数据持久保存在数据库中
    隔离性:事务之间共用一个数据库时不会相互干扰,每个事务都有自己的数据空间

设置回滚点:savepoint 回滚点名称
        rollback to 回滚点名称

并发情况下可能出现的问题:
    脏读:因为回滚
    不可重复读:因为修改
    幻读:因为增删

问题解决:锁
    隔离级别:1.read uncommitted: 问题都不解决
        2.read committed: 可防止脏读
        3.repeatable read: 可防止脏读和不可重复读
        4.serializable:都可防止

    Oracle 只支持2,4,默认2
    设置隔离级别:set transaction isolation level 隔离级别

共享锁:可以共同读取数据,无法修改数据
排它锁:一个时间段内只能一个事务访问
悲观锁:认为所有事务都会来修改数据,所以当一个事务来访问数据时,会加锁
乐观锁:认为所有事务都是来查询数据,不加锁。 --同过版本号+1判断数据有没有被修改;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值