1、数据库建模sql
2、建表数据库
3、数据库字典缓存
4、DML语句session
5、视图oracle
6、索引less
7、序列函数
8、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','*')