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','*')