數據庫基本語法複習

一、創建表

語法

create table 表名(
列名 數據類型 約束條件
列名 數據類型 約束條件

....
表級約束條件
);

如,定義一個學生表

create table student(
Sno char(9) primary key,
Sname char(20) unique,
Ssex char(2),
Sage smallint,
Sdept char(20)
);

注意 括號裏最後一行不加逗號

二、修改基本表

1.添加列

alter table 表名 add [column] 新列名 數據類型 [完整性約束];

2.添加表級約束

alter table 表名 add 表級約束;

3.添加列約束條件

alter table 表名 modify 列名 數據類型 約束條件

4.刪除列

alter table 表名 drop 列名 [cascade|restrict];

使用cascade關鍵字會自動刪除引用了該列的其他對象,如視圖;如果使用restrict,如果該列被其他對象引用,則拒絕刪除該列

默認條件下是restrict

 

5.刪除約束 

1.通過modify 來刪除not null default check等約束

alter table 表名 modify 列名 數據類型 不加約束條件

原理:原來有約束條件 現在修改它,不加約束條件,覆蓋掉原有數據定義

alter table 表名 drop 約束名

注意:刪除主鍵、外鍵、unique只能用這種方法

6.修改列名、數據類型

alter table 表名 change 列名 新列名 數據類型

change不可修改約束條件

 

alter table 表名 modify 列名 數據類型 約束條件

modify可以修改 數據類型 約束條件

7。完整性約束命名子句

constraint 完整性約束條件名 完整性約束條件

例如
alter table 表名 add constraint 約束名 約束條件;

給外鍵 以及 unique等約束起名 便於刪除這些約束 

三、刪除基本表

drop table 表名 [cascade|restrict];

默認是restrict,要刪除的表不能被其他表的約束應用,不能有視圖,不能有觸發器,不能有存儲過程或函數

使用cascade 將刪除與該表有聯繫的所有對象

 

四、建立索引

create [unique|cluster] index 索引名 on 表名(列名[次序],...);

unique指唯一索引

cluster 表示要建立的索引是聚簇索引

如SC表按學號升序 課程號降序建立索引表

create unique index SCno on SC(Sno asc,Cno desc);

五、修改索引

alter index 舊索引名 rename to 新索引名

六、刪除索引

drop index 索引名

七、數據查詢

1.基本語法

select [all|destinct] 目標列表達式
from 表名或視圖
where 條件表達式
group by 分組
having 分組條件
order by 排序條件

destinct 是將查詢結果去重

2.注意事項

select 後面的目標表達式是指 有關相關列參與的表達式

如查詢出全體學生姓名及其出生年份

select name,2020-age
from student;

這個2020-age就是目標列表達式,select會將運算的結果展示出來

還可以起別名

select name,2020-age [as] 出生年份

注意 如果別名中有空格 需要加引號將整個別名包含

3.選取表中的若干元組

使用where條件進行篩選

使用between and 或者 not between and 前者包含邊界 後者不包含邊界

使用in關鍵字,如 where Sdept in(‘CS’,'MA','IS'); 也有not in

字符匹配

[not] like '匹配串' [escape '轉碼字符'];

默認的轉碼字符有 % _

前者是代表任意長度的字符串 如 a%b 表示以a開頭以b結尾的任意長度的字符串

後者則表示任意單個字符,如a_b表示以a開頭以b結尾的 長度爲3的字符串

若要篩選的字符串中有% 或者 _ 則需要使用轉碼字符  escape後面定義轉碼字符 然後在字符串的%或_前面加上這個轉碼字符

4.order by 子句

默認升序 如需降序可使用desc關鍵字

對於空值,若升序則含空值的元組最後顯示,若降序則含空值的元組最先顯示

5.聚集函數

count(*) 統計元組個數 不跳過空值
count([all|dinstinct]列名) 統計對應列的元組個數 去除空值
count(1) 也是統計元組個數  相當於給表添加了一列1 然後計算1的個數
sum([all|dinstinct]列名) 計算一列數值的總和 (該列必須是數值列)
avg([all|dinstinct]列名) 計算一列數值的平均值 (該列必須是數值列)
max([all|dinstinct]列名) 計算最大值
min([all|dinstinct]列名) 計算最小值

 

6.連接查詢

連接分爲內連接 和 外連接

在內連接中只有滿足條件的元組纔會輸出,有時候 我們需要將不滿足條件的元組也輸出,這意味着不滿足條件的元組的某些列是NULL,這時需要使用外連接纔可以。

1.等值連接

sql 92語法 使用where作爲連接條件

select 列名錶達式
from 表1 別名,表2 別名
where 表1連接屬性 = 表2連接屬性;

sql99語法

select 列名錶達式
from 表1 別名 [inner] join 表2 別名
on 條件;

 注意 當表與自己連接時 要使用不同的別名

2.外連接

sql99語法纔有

使用outer join 即可

具體還可分爲左外連接和右外連接

左外連接 left join 將左邊的表當作主表 右邊的表當作從表  null只會出現在從表中

右外連接 right join 將右邊的表當作主表 右邊的表當作從表  null只會出現在從表中

3.多表連接

sql92語法

select 列名錶達式
from 表一 別名,表二 別名, 表三 別名
where 表一連接屬性 = 表二連接屬性 and 表二連接屬性 = 表三連接屬性;

sql99語法

select 列名錶達式
from 表一 別名 join 表二 別名 on 條件 join 表三 別名 on 條件;

4.嵌套查詢

帶in謂詞的子查詢

如查詢和劉晨一個系學習的學生信息

select *
from student
where sdept in(
select sdept
from student
where name = '劉晨'
);

本例中 子查詢的查詢條件不依賴於父查詢,稱爲不相關子查詢

如果子查詢的查詢條件不依賴於父查詢,稱爲相關子查詢

相關子查詢

找出每個同學超過他自己選修課平均成績的課程號

select Sno,Cno
from SC x
where grade>=(
select avg(grade)
from SC y
where x.Sno = y.Sno
);

執行步驟如下

  1. 從外層循環中取SC的一個元組x,將x的Sno值傳給內層查詢
  2. 執行內層查詢,得到值,用該值代替內層查詢,返回給外層查詢
  3. 執行外層查詢

帶ANY(SOME)或 ALL謂詞的子查詢

這個就是在where後加一個any謂詞,只要子查詢的返回結果任意一個符合where中的條件即可輸出當前元組

ALL就是所有結果都符合纔可以輸出當前元組

 

七、數據更新

 

1.插入數據

insert into 表名(屬性列,..)
values(要插入的對應列的數據,..);

也可以

insert into values(所有列依次對應的數據)

 

2.插入子查詢的結果

insert into 表名(屬性列)
子查詢;

例如,將每個系學生的平均年齡保存到數據庫中

insert into Dept_age(Sdept,Avg-age)
select Sdept,avg(Sage)
from Sdudent
group by Sdept;

 

3.修改數據

語法

update 表名
set 列名 = 表達式,...
where 條件表達式;

 

可以帶子查詢

4.刪除數據

語法

delete
from 表名
where 條件表達式;

 

可以帶子查詢

注意truncate也可以刪除表,但是它也會刪除表的結構。

語法

truncate 表名;

 

  1. TRUNCATE TABLE 在功能上與不帶 WHERE 子句的 DELETE 語句相同:二者均刪除表中的全部行。但 TRUNCATE TABLE 比 DELETE 速度快,且使用的系統和事務日誌資源少。
  2. DELETE 語句每次刪除一行,並在事務日誌中爲所刪除的每行記錄一項。TRUNCATE TABLE 通過釋放存儲表數據所用的數據頁來刪除數據,並且只在事務日誌中記錄頁的釋放。
  3. TRUNCATE TABLE 刪除表中的所有行,但表結構及其列、約束、索引等保持不變。新行標識所用的計數值重置爲該列的種子。如果想保留標識計數值,請改用 DELETE。如果要刪除表定義及其數據,請使用 DROP TABLE 語句。
  4. 對於由 FOREIGN KEY 約束引用的表,不能使用 TRUNCATE TABLE,而應使用不帶 WHERE 子句的 DELETE 語句。由於 TRUNCATE TABLE 不記錄在日誌中,所以它不能激活觸發器。
  5. TRUNCATE TABLE 不能用於參與了索引視圖的表。
  6. 對用TRUNCATE TABLE刪除數據的表上增加數據時,要使用UPDATE STATISTICS來維護索引信息。
  7. 如果有ROLLBACK語句,DELETE操作將被撤銷,但TRUNCATE不會撤銷。

 

八、空值的處理

 

判斷一個值是否爲空值 不能使用= 可以使用 is null 或者 <=>(只有在mysql裏纔有) 來判斷

(還有一個<>,這個時不等於的意思)

空值與另一個值的算數運算爲空值,空值與另一個值的比較運算爲unkonwn

 

九、視圖

1.定義視圖

create or replace view 視圖名 [列名]
as 子查詢
[with check option]


在with check option的選項下,可以總結爲
1.update,要保證數據update之後能被視圖查詢出來,也就是要符合where的條件
2.insert,保證insert的數據能被視圖查詢出來
3.delete,有無 with check option都一樣4.      對於沒有where字句的視圖,使用with check option是多餘的

 

例如

create view is_student
as
select sno,sname,sage
from student
where sdept='IS'
with check option;

 

由於加上了with check option ,以後對該視圖進行插入 修改 刪除的時候,關係數據庫管理系統會自動加上sdept = 'IS'的條件

 

2.帶表達式的視圖

create view BT_S(Sno,Sname,Sbirth)
as
select Sno,Sname,2020-Sage
from student;

3.刪除視圖

drop view 視圖名[cascade];

默認不使用 cascade

4.查詢視圖

視圖定義完後,用戶就可以像對基本表一樣使用他了

注意事項

含有group by的視圖,在進行篩選時,不能使用where 而要使用 having

 

5.更新視圖

視圖是不實際存儲數據的虛表,因此對視圖的跟新最終要轉換爲對基本表的更新。

注意事項

並不是所有的視圖都可以更新

若視圖是由兩個以上基本表導出的,則此視圖不允許更新

1,如果更新視圖的字段來自字段表達式或者是常數,則不允許對視圖進行Insert、update操作(但可以進行delete操作)。因爲,假設用字段表達式或者是常數對視圖進行了更新,那麼視圖的相關行或列就與基本表中的相關行或列不一致,或者在基本表中根本找不到,對視圖的更新實質上是對基本表的更新,因此和基本表的不一致的視圖是毫無意義的。(不允許Insert操作也是同樣的道理)
​2,如果更新字段來自庫函數,則不允許對視圖進行Insert、update操作(但可以進行delete操作)。舉個例,如果當前視圖只是某個基本表中的一部分,而現在要用sum函數對視圖進行更新,那麼sum就會將基本表中滿足條件的值都相加,而其實視圖中只包含滿足條件的一部分,這樣就會出現錯誤。
3,更新字段包含group by,distinct等函數,這跟2的解釋是一樣的。
4,​若視圖來自兩個及以上的基本表,則不允許更新。這是因爲如果要更新這樣的視圖,那麼就會涉及到多個基本表的同時修改,這會導致數據庫的存取非常複雜,因此,在現有的關係數據庫系統中,只支持來自單個表的視圖的更新。
5,在一個不允許更新的視圖上定義的視圖​不允許更新。

 

九、安全性控制

 

1.授權

grant 權限
on 對象類型 對象名
to 用戶
[with grant option];

使用了with grant option 後 用戶可以將該權限授權給其他用戶

如,把查詢student表的權限授予給用戶UI

grant select
on table student
to UI;

把查詢student表的權限授予給全體用戶

grant select
on table student
to public;

把查詢student表和修改學生學號的權限授予給UI

grant update(Sno),select
on table student
to UI;

 授予增刪改查所有權限

grant all privileges
on table student
to UI;

 2.回收權限

revoke 權限
on 對象類型 對象名
from 用戶[cascade|restrict];
默認是restrict
使用cascade後 收回該用戶的權限以及該用戶授權出去的該權限

 

3.創建數據庫模式的權限

 

只有系統的超級用戶才能創建一個新的數據庫用戶

有三種權限 DBA|RESOURCE|CONNECT,默認爲CONNECT

CONNECT:不能創建新用戶,不能創建模式、基本表,只能登錄數據庫

RESOURCE:可以創建基本表和視圖,不能創建模式和新的用戶,可以使用grant授予權限

DBA:超級用戶,可以創建新的模式,新的用戶,新的表,新的視圖。

 

4.數據庫角色

數據庫角色是被命名的一組與數據庫操作相關的權限,角色是權限的集合

創建角色

create role 角色名

給角色授權

grant 權限
on 對象類型 對象名
to 角色;

將一個角色授予其他的角色或用戶

grant 角色
to 角色名
[with admin option]; 
with admin option
與with grant option 一樣的效果

 

5.審計 

對修改SC的表結構以及SC的數據的操作進行審計

audit alter,update
on SC;

對修改SC的表結構以及SC的數據的操作進行審計

noaudit alter,update
on SC;

十、斷言

通過聲明斷言來指定更具一般性的約束。可以定義涉及多個表或者聚集操作的比較複雜的完整性約束

1.創建斷言

create assertion 斷言名 斷言子句

如,限制每一門課程最多60名學生選修

create assertion SC_CNUM1
check (60>=all(select count(*) from SC group by con));

2.刪除斷言 

drop assertion 斷言名;

 

 

十一、觸發器

觸發器是用戶定義在關係表上的一類由事件驅動的特殊過程。

任何用戶對標的增刪改操作都由服務器自動激活觸發器,在關係數據庫管理系統核心層進行集中的完整性控制。

1.定義觸發器

create trigger 觸發器名
[BEFORE|AFTER] 觸發事件 on 表名
REFERENCIG NEW|OLD ROW as 變量
[when 觸發條件] 觸發動作體

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章