#數據庫常用對象
#1. 建立表
create table stu(
id number(6),
name varchar2(20),
sex number(1),
age number(3),
sdate date,
grade number(2) default 1,
class number(4),
email varchar2(50)
);
#2.刪除表
drop table stu;
#3.五個約束條件
#(1)非空約束(not null) (這裏name not null)
create table stu(
id number(6),
name varchar2(20) not null,
sex number(1),
age number(3),
sdate date,
grade number(2) default 1,
class number(4),
email varchar2(50)
);
#可以定義字段級約束,也可以定義表級約束
create table stu(
id number(6),
name varchar2(20) constraint stu_name_nn not null,
sex number(1),
age number(3),
sdate date,
grade number(2) default 1,
class number(4),
email varchar2(50)
);
name constraint stu_name_nn not null
如果在name字段中插入一個null值,則會出現如下錯誤:無法將 NULL 插入 ("DYS"."STU"."NAME");
#(2)唯一約束(unique)
create table stu(
id number(6) unique,
name varchar2(20) constraint stu_name_nn not null,
sex number(1),
age number(3),
sdate date,
grade number(2) default 1,
class number(4),
email varchar2(50)
);
如果在id字段中插入重複的值,則會顯示如下錯誤:違反唯一約束條件
字段級約束,缺點是如果設兩個字段爲約束條件,則不能實現目的
create table stu(
id number(6) ,
name varchar2(20) ,
sex number(1),
age number(3),
sdate date,
grade number(2) default 1,
class number(4),
email varchar2(50),
constraint uq_stu_unique unique(id, email)
);
constraint uq_stu_unique unique(id, email), 這樣設的話可以把兩個字段聯合在一起.
唯一約束中的表級約束
constraint stu_name_email_unique unique(name, email);
#(3)主鍵約束(primary key)
主鍵(primary key),可以唯一標識整條記錄,非空且唯一.
create table stu(
id number(6) primary key,
name varchar2(20) ,
sex number(1),
age number(3),
sdate date,
grade number(2) default 1,
class number(4),
email varchar2(50)
);
#(4)外鍵約束(foreign key)
create table class (
id number(4) primary key,
name varchar2(20) not null
);
create table stu(
id number(6) primary key,
name varchar2(20) ,
sex number(1),
age number(3),
sdate date,
grade number(2) default 1,
class number(4) references class(id),
email varchar2(50)
);
class number(4) references class(id) 這條是表stu的外鍵參照表class的主鍵
如果向表stu插入數據的時候,insert into stu(id,name,class, email)values(1,'a',1000,'a');
則會出現如下錯誤:違反完整約束條件 (DYS.SYS_C005763) - 未找到父項關鍵字
表級約束:
constraint stu_class_fk foreign key(class) references class(id),
create table stu(
id number(6) primary key,
name varchar2(20) ,
sex number(1),
age number(3),
sdate date,
grade number(2) default 1,
class number(4) ,
email varchar2(50),
constraint stu_class_fk foreign key(class) references class(id)
);
先向表class中插入數據: insert into class values(1000,'LI');
再向表stu中插入數據: insert into stu(id,name,class, email) values(1,'a',1000,'a');
被參考的字段必須是主鍵
#(5)check約束
delete from class where id = 1000; #這個值被參考了,(違反完整約束條件)
#4.修改表結構
alter table stu add(addr varchar2(100)); #增加字段
alter table stu drop(addr);
alter table stu add(addr varchar2(100));
alter table stu modify(addr varchar2(150)); #修改字段
注意:修改後的精度必須能允許先前的精度, 比如number(50)--> number(25), 可能會截取了一些數據.
增加或者刪除約束條件:
delete from class; #不能刪,因爲違反完整約束條件 (DYS.STU_CLASS_FK),有外鍵約束
如果把約束條件刪除了後可以刪除表中的數據
alter table stu drop constraint stu_class_fk;
然後再刪除表中的數據
delete from class; #這時就可以刪除了
#5.數據字典
desc user_tables;
#查看有什麼表
select table_name from user_tables;
#查看有哪些視圖
select view_name from user_views;
#查看有哪些約束條件
select constraint_name from user_constraints;
#顯示約束條件的結構
desc user_constraints;
#數據字典存在一個表中,這個表稱爲dictionary
#顯示數據字典表中的結構
desc dictionary;
#查看數據字典中的表
select table_name from dictionary;
select table_name from dictionary where table_name like 'USER%'order by tab
le_name;
#6.索引
desc stu;
#創建索引
create index idx_stu_email on stu(email);
#刪除索引
drop index idx_stu_email;
#從數據字典中查看有哪些索引
select index_name from user_indexes;
#建立索引後,插入數據慢了,因既要在表中插入數據,又要在索引中插入, 但是讀數據卻比較快. 索引也會佔用空間,不要輕易建立.
#7.視圖
#視圖, 就是子查詢
#建立索引
create view v$_stu as select id, name, age from stu;
#查看索引
desc v$_stu;
#查看數據字典中的視圖
select view_name from user_views;
desc v$dept_avg_sal_info;
#視圖是可以更新數據的.一般不建議在視圖中更新數據.
#8.序列
#序列是oracle數據庫中獨特的,產生唯一的不間斷的序列, 一般用作主鍵
#創建表
create table article(id number, title varchar2(1024), content long);
#創建索引
create sequence seq; #此時會出現權限不足的現象
#連接到數據庫管理員
conn sys/dys as sysdba;
#授權給用戶創建序列的權限
grant create sequence to dys;
#然後再創建序列
create sequence seq;
#序列在內部已經作好了線程同步了,不會出現數據不一致的現象
#查看序列的下一個值
select seq.nextval from dual;
#向表article中插入數據
insert into article values(seq.nextval, 'a', 'b');
#查看錶article中的數據
select * from article;
#刪除序列
drop sequence seq;
#一個序列對應於一個字段
#9.數據庫的三範式
#數據庫設計的三範式,是要追求不存在冗餘字段, 同樣的數據不存在第二遍
#範式:是數據庫設計的規則
#第一範式的第一要求是要有主鍵,第二要求是列不可分,即在列上不能重複. 比如出生年月和年齡, 這是一種重複
#第二範式:當一張表中有多個字段組合作爲主鍵時,非主鍵的字段不能夠依賴於部分主鍵.
#第三範式:存在傳遞依賴
#在設計數據庫時只要做到三範式就可以了.