【Oracle】曾经的Oracle学习笔记(8-15)

一、数据库建模

二、建表

三、数据库字典

四、DML语句

五、视图

六、索引

七、序列

八、DDL语句

Lesson 8 Overview of Data Modeling and Database Design
-----------------------------------------------------------------------------
数据库建模

E-R图

Entity 实体
对象实体
业务实体

Relationship 关系(这里指的是实体与实体之间)

ER图中:
# 唯一
* 非空

#* 唯一非空

o 没有任何约束

one-to-one
one-to-many

may be

must be

建表的时候要遵循的范式

第一范式:表中要一个可以做主键的字段(非空唯一)

第二范式:表中每一列的值都是不可分割的

第三范式:表中的某一个列不能依赖于其他非主键列(即非主键列的值得修改不会影响其他列上的值)

Lesson 9 Creating Tables
------------------------------------

建表

create table 表名(
列名1 数据类型 列级约束,
列名2 数据类型 列级约束,
列名3 数据类型 列级约束,
列名4 数据类型 列级约束
);

create table 表名(
列名1 数据类型 列级约束,
列名2 数据类型 列级约束,
列名3 数据类型 列级约束,
列名4 数据类型 列级约束,
表级约束1,
表级约束2
);

注:列级约束和表级约束都是可以不写的。
create table 表名(
列名1 数据类型,
列名2 数据类型,
列名3 数据类型,
列名4 数据类型
);

约束是指这个列上面的值要遵循什么样的要求。

主键约束
外键约束
唯一约束
非空约束
check约束

常用的数据类型:

number
varchar2
char
date

建表
create table student(
id number primary key,
name varchar2(200) not null,
age number,
birthday date
);

删除表
drop table 表名;
drop table student;

create table customer(
id number primary key,
name varchar2(20) not null,
age number,
email varchar2(100) unique,
gender char check(gender in(‘f‘,‘m‘))
);

drop table customer;

constraint关键字
-------------------------
建表的时候可以给约束起一个名字,这个名字起的规律一般会是:表名_列名_约束名

如果没有给约束起名字,那么系统也会给这个约束起一个默认的名字,只不过这个默认的名字我们看了之后不知道它是哪张表里面的哪个列上面的什么约束。

create table customer(
id number constraint cus_id_pk primary key,
name varchar2(20) not null,
age number,
emile varchar2(100) unique,
gender char check(gender in(‘f‘,‘m‘))
);

查看当前用户所创建的约束
select constraint_name
from user_constraints;

references关键字
-----------------------
外键的约束,引用某表的主键。

create table t_order(
id number primary key,
price number not null,
customer_id number references customer(id)
);

这个时候直接删除customer表会报错
因为这个表的主键id已经被t_order表引用过去做了外键
drop table customer;

1.可以先删除order表,再删除customer表
2.使用cascade constraints命令:
drop table customer cascade constraints;
这样可以把customer表直接删除掉,同时也把order表所声明的外键约束也删除了

使用表级约束:
create table customer(
id number,
name varchar2(20) not null,
age number,
email varchar2(100),
gender char,
constraint cus_id_pk primary key(id),
constraint cus_email_un unique(email),
constraint cus_gender_ck check(gender in(‘f‘,‘m‘))
);

create table t_order(
id number,
price number not null,
customer_id number,
constraint order_id_pk primary key(id),
constraint order_cus_id_fk foreign key(customer_id) references customer(id)
);

注意:not null 约束只能声明为列级约束

1.表级约束和列级约束所写的位置不一样
2.not null约束不能用表级约束来声明
3.表级约束和列级约束声明语法稍有所不同
4.如果要声明的约束为联合主键、联合外键、联合唯一的时候,就一定要用表级约束

//声明的一个主键
//联合外键和联合唯一约束也是类似的写法.
create table t_order(
id number,
price number not null,
customer_id number,
constraint order_id_pk primary key(id,price),
constraint order_cus_id_fk foreign key(customer_id) references customer(id)
);

Lesson 10 Orcale Data Ditionary
-------------------------------------
数据库字典
作用:帮助用户了解当前数据库的一些信息或是对象的信息以及用户的信息

view 视图

USER 开头的视图里面存放着用户自己拥有的对象
ALL 开头的视图存放着用户有权限查看的对象
DBA 开头的视图存放着数据库所有的对象
V$ 开头的视图存放数据库运行的一些性能属性数据

DICTIONARY
TABLE_PRIVILEGES
IND

通过desc命令来了解这些视图中列的信息,然后再去查询混视图找到想要的信息

Lesson11 Manipulating Data
------------------------------------
DML语句

insert
update
delete
commit
savepoint
rollback

DML语句 :这个语句会修改数据库表中的数据
insert update delelte

create table student (
id number primary key,
name varchar2(20) not null,
age number
);

//这样表示向student表中全部插入数据
//插入数据的顺序是按照建表的时候列的顺序
insert into student values(1,‘tom‘,20);

//这样是可以自己控制向表中那些列插入数据,以及插入数据的顺序
insert into student (id,name) values(2,‘jerry‘);

DML语句执行的时候会产生事务,事务不提交,那么我对数据所做的修改都是不能生效的,
事务提交,那么之前对数据的修改就全部生效了(保存到硬盘上了)
事务回滚,那么之前对数据的修改全部撤销.

例如:
1 修改数据1
2 修改数据2
3 修改数据3
4 修改数据4
5 提交事务

在执行第一行DML语句的时候,就会产生了事务,之后的第2 3 4 行执行的DML也会放进第一行所产生的事务里面,然后第五事务一提交,那么这个事务里面的所有操作全部生效了.
如果是第五行是回滚了事务,那么这个事务里面的所有操作全部撤销。

每个事务之间都是独立的,相互不影响,一个事务里面的所有操作要么同时成功,要么同时失败(撤销)。

注意:提交事务的命令commit,回滚事务的命令式rollback,DDL语句也能把事务提交,相当于commit的效果。

例如:
1 修改数据1
2 修改数据2
3 修改数据3
4 修改数据4
5 执行DDL语句
6 rollback

这里的第六行回滚是没有用的,因为第五行执行了DDL语句,已经把事务给提交了。

create table student (
id number primary key,
name varchar2(20) not null,
age number
);

insert语句
--------------------------
//这样表示向student表中全部插入数据
//插入数据的顺序是按照建表的时候列的顺序
insert into student values(1,‘tom‘,20);

//这样是可以自己控制向表中那些列插入数据,以及插入数据的顺序
insert into student (id,name) values(2,‘jerry‘);

insert into student(id,name,age) values(&id,‘&name‘,&age);

update语句
-----------------
修改表中所有数据
update student
set name = ‘terry‘;

修改某一些数据
update student
set name = ‘terry‘
where id = 2;

若事务未提交,则此数据会锁住,其他终端不能对此修改,若修改,则卡在那里,除非到事务提交,则其他终端才能正常修改。

delete语句
-----------------
//删除表中所有数据
delete from student;

//加入where条件限制,删除某些数据
delete from student
where id=2;

savepoint 回滚点
------------------

DML语句1
savepoint A
DML语句2
savepoint B
DML语句3

rollback to A/B

这个时候可以通过这个回滚点让事务回滚到指定的位置,如果不指定回滚点而是直接rollback,那么事务会一下子回滚完(撤销整个事务)

lesson 14 view 视图
-----------------------
视图 view:
作用1:隐藏表中的重要数据
作用2:代替一些比较长的sql语句

//创建视图
create view v_student
as
select *
from student
where id = 2;

//查看视图内容
select *
from v_student;

视图分为俩类:
简单视图:
视图所代表的sql中如果没有group by语句,没有组函数,查询的只有一张表,那么这样的视图就是简单视图.
复杂视图
视图所代表的sql中如果有group by语句,或者有组函数,或者查询的是多张表,那么这样的视图就是复杂视图.

简单视图和复杂视图的区别:
1.简单视图可以修改,复杂视图不能修改。
2.通过简单视图可以修改原来表中的数据,通过复杂视图是不能修改原来的数据的。

Lesson 15 index 索引
-----------------------------
作用:提高在表查询数据的效率

index是建立在列上面的

条件:
1.这个列中的数据会经常被用作查询数据的条件
2.这个列上的数据不会经常的改动

注意:
1.有主键约束的列或者有唯一性约束性的列上面,系统会默认的加上索引。
2.在一个表中,索引并非是越多越好
3.在表中的某一个列加入上了合适的索引,那么也只有在数据量很大的时候,才能有所体现出这个查询的效率。
4.索引一点建立成功,那么之后这个索引就有系统来管理,我们自己是控制不了的。

索引的种类:
B-tree
位图
反序
函数

建立索引的格式:

create index 索引名
on 表名(列名);

删除索引
drop index 索引名;

Lesson 13 Creating Sequences 序列
-------------------------------
作用:帮我们生成主键列的值(非空唯一)

创建序列:
一般不需要设置sequence的属性,使用默认的方式去创建就可以了.
create sequence 序列名;

如果需要设置属性,那么就加上下面的语句.
[INCREMENT BY n] 每次拿出值加多少
[START WITH n] 初始值从几开始
[{MAXVALUE n | NOMAXVALUE}] 最大值
[{MINVALUE n | NOMINVALUE}] 最小值
[{CYCLE | NOCYCLE}] 到了最大值后是否循环
[{CACHE n | NOCACHE}] 每次在缓存里面放多少个值.

例子:
create sequence my_seq;

//获得序列中的下一个值
//这个值对应当前这个序列来说,肯定是非空唯一
select my_seq.nextval
from dual;

//查询序列中当前的值是多少
select my_seq.currval
from dual;

//在插入表中的主键列的时候会经常使用到序列
insert into student(id,name,age) values(my_seq.nextval,‘tom‘,20);
insert into student(id,name,age) values(my_seq.nextval,‘&name‘,&age);

drop sequence 序列名;

SYNONYM 同义词
synonym

student

my_stu

//给表student创建一个同义词
create synonym my_stu
for student;

//因为一般用户没有创建public synonym
的权限,所有我们需要用dba的身份登录到数据库中去创建
//sqlplus "/as sysdba"
create public synonym my_stu
for tom.student;

grant select on my_stu to public;//授权

一个新的用户至少有一个什么权限才能登录到数据库里面?
create session

Lesson 12 Altering Tables 修改表结构
------------------------------------------------
表结构的修改:

alter

在表中添加一个新的列
alter table student
add birthday date;

删除表的某列
alter table student
drop column birthday;

修改表的名字:
rename student to mystudent;

修改表中某列的类型
ALTER TABLE student
MODIFY (name VARCHAR2(500));

让约束失效:
必须知道约束的名字
ALTER TABLE s_emp
DISABLE CONSTRAINT s_emp_id_pk CASCADE;

让失效的约束再次生效
ALTER TABLE s_emp
ENABLE CONSTRAINT s_emp_id_pk;

rownum 伪列
-----------------------------------
rownum特点:
1.rownum是一个隐藏的行号
2.oracle里面独有,其他数据库没有
3.每个表里面或者查询的结果里面都存在

rownum的操作特点:
1.能够<任何数,
2.只能>0,大于的数不是0的话拿不到任何数据
3.只能=1,等于的数不是1的话拿不到任何数据

select rownum,last_name
from s_emp
where rownum>0;

select rownum,last_name
from s_emp;

我有数十万条数据的地址,看清是数十万条数据,必须要能够批量查询
我要提供数据样本供客户查询,但暂时不能给他显示具体的数字牌号
我希望能把这些数字隐藏掉或替换成*号,该如何实现呢?

数据表格式如:南京路123弄456号7890室
希望查询后显示:南京路***弄***号****室

该如何写该select语句呢?

select replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(地址,‘0‘,‘*‘),‘1‘,‘*‘),‘2‘,‘*‘),‘3‘,‘*‘),‘4‘,‘*‘),‘5‘,‘*‘),‘6‘,‘*‘),‘7‘,‘*‘),‘8‘,‘*‘),‘9‘,‘*‘)

时间: 2024-10-15 12:10:57

【Oracle】曾经的Oracle学习笔记(8-15)的相关文章

Oracle之PL/SQL学习笔记

自己在学习Oracle是做的笔记及实验代码记录,内容挺全的,也挺详细,发篇博文分享给需要的朋友,共有1w多字的学习笔记吧.是以前做的,一直在压箱底,今天拿出来整理了一下,给大家分享,有不足之处还望大家批评指正. PL/SQL定义:PL/SQL是由Oracle开发,专门用于Oracle的程序设计语言. PL---Procedural Language. SQL—Structure QueryLanguage.PL/SQL包括过程化语句和SQL语句     PL/SQL的单位:块. 一个块中可以嵌套

Oracle之PL/SQL学习笔记之触发器

Oracle之PL/SQL学习笔记之触发器 触发器是许多关系数据库系统都提供的一项技术.在ORACLE系统里,触发器类似过程和函数,都有声明,执行和异常处理过程的PL/SQL块. 触发器在数据库里以独立的对象存储,它与存储过程和函数不同的是,存储过程与函数需要用户显示调用才执行,而触发器是由一个事件来启动运行. 即触发器是当某个事件发生时自动地隐式运行.并且,触发器不能接收参数.所以运行触发器就叫触发或点火(firing).ORACLE事件指的是对数据库的表进行的INSERT. UPDATE及D

Oracle之PL/SQL学习笔记之数据类型(三)

Oracle之PL/SQL学习笔记之数据类型(三) 所有的编程语言中变量是使用最频繁的.PL/SQL作为一个面向过程的数据库编程语言同样少不了变量,利用变量可以把PL/SQL块需要的参数传递进来,做到动态执行程序,同时也可以利用变量在PL/SQL内部进行值得传递,甚至可以把值传递出去,最终返回给用户,由此可见,变量是PL/SQL不可或缺的一部分. 1. Oracle预定义的普通数据类型(常见的数据类型) 类型 子类 说明 Oracle中的范围 char Character,String Rowi

【大话存储II】学习笔记(15章),文件级集群系统

[大话存储II]学习笔记(15章),块级集群存储系统里面分析的主要是块集群系统,同样文件级存储也可以集群化. 因为NAS系统的前端网络是以太网,速度比较低,导致NAS主要用于一些非关键业务中,比如文件共享.但是一些特殊应用也需要多主机同时访问某个大文件,比如3D渲染集群等.如果我们使用块集群存储系统,则会存在一个问题,需要在应用程序上引入文件锁,而NAS的文件系统一般都自带有文件锁机制,所以还不如把NAS存储系统进行集群化. 在谈怎么样把NAS系统进行集群化之前,我们说说集群文件系统的架构.集群

作为一个新手的Oracle(DBA)学习笔记【转】

一.Oracle的使用 1).启动 *DQL:数据查询语言 *DML:数据操作语言 *DDL:数据定义语言 DCL:数据控制语言 TPL:事务处理语言 CCL:指针控制语言 1.登录 Win+R—cmd—>sqlplus “/as sysdba” //以sysdba用户登录,这样可以管理权限,添加用户等 Win+R—cmd—>sqlplus username/password //以指定用户名密码登录 win+R —> cmd —–> sqlplus //按照提示,输入用户名密码 

Oracle的UTL_FILE.FOPEN学习笔记

Oracle提供的文件操作包UTL_FILE包中的UTL_FILE.FOPEN负责打开一个文件. UTL_FILE.FOPEN(location in varchar2, filename in varchar2, open_mode in varchar2) return FILE_TYPE; Location 是路径参数, FILENAME 是文件名, OPEN_MODE是打开模式,'R'是读文本,'W'是写文本,'A'是附加文本,参数不分大小写,如果指定'A'但是文件不存在,它会用'W'先

Oracle之PL/SQL学习笔记之序言(一)

1. PL/SQL是什么? PL/SQL也是一种程序语言,叫做过程化SQL语言(Procedural Language/SQL).PL/SQL是Oracle数据库对SQL语句的扩展.在普通SQL语句的使用上增加了编程语言的特点,所以PL/SQL把数据操作和查询语句组织在PL/SQL代码的过程性单元中,通过逻辑判断.循环等操作实现复杂的功能或者计算.PL/SQL 只有 Oracle 数据库有. 2. PL/SQL的优点 1. 提高应用程序的运行性能 传统的java程序传递sql到Oracle服务器

FW:Oracle之PL/SQL学习笔记

看到一个关于Oracle系列文章,基本集中在一些基础知识的汇总. 比较适合新员工培训和知识汇总回顾.记录之前不了解或者不确定的知识 http://my.oschina.net/KingPan/blog?catalog=504011 1.得到序列的下一个值或当前值 select your_sequence.nextval from dual;--获得序列your_sequence的下一个值 select your_sequence.currval from dual;--获得序列your_sequ

【大话存储II】学习笔记(15章),块级集群存储系统

存储系统演变 存储系统一直以来都是一个总的控制器加上几串磁盘扩展柜存在的,但是随着数据量的快速增加,性能受限于控制器,所以要提升整体的处理能力,主要有两种方法: 最简单的是在单个控制器中加入更多的CPU.内存等,就如同PC机性能不够了,就加内存.换SSD等.这种扩展方式称为带内扩展,Scale-up 这种方式的问题是,随着CPU数量的增多,耗费的设计成本会越来越大.比如说在多CPU的系统中,我们需要花费大量的精力来保证CPU之间的通信.可见[大话存储]多CPU架构变迁, SMP,NUMA,MPP

Linux学习笔记(15)-信号量

在多线程或者多进程编程中,有一个非常需要关注的东西,那就是同步以及互斥问题. 同步是指多个进程之间的协作,而互斥是指多个进程之间,为了争夺有限的资源,而进行的竞争. 理论很高端,但经过自己几天的学习,发现操作系统中,线程的信号量还是比较简单易懂的-- ---------------------------------------- 信号量是用来解决线程间同步或互斥的一种机制,也是一个特殊的变量,变量的值代表着当前可以利用的资源. 如果等于0,那就意味着现在没有资源可用. 根据信号量的值可以将信号