Oracle 数据库基础知识总结

xiaoxiao2021-02-28  88

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判断数据有没有被修改;
转载请注明原文地址: https://www.6miu.com/read-76980.html

最新回复(0)