1. 程式人生 > 實用技巧 >資料庫工程師下午試題2 : SQL語句

資料庫工程師下午試題2 : SQL語句

#五大約束

  1、主鍵約束(Primay Key Coustraint) 唯一性,非空性--------- primary key
  2、唯一約束(Unique Counstraint)唯一性,可以空,但只能有一個----------------------- unique
  3、檢查約束(Check Counstraint)對該列資料的範圍、格式的限制(如:年齡、性別等) ---------------------check (salary >= 190)
  4、預設約束(Default Counstraint)該資料的預設值
  5、外來鍵約束(Foreign Key Counstraint)需要建立兩表間的關係並引用主表的列

主鍵:唯一表示,不能為空 eno char(4) primary key

外來鍵: cno char(4) references company(cno)

檢查約束: salary int check(salary >= 150)

主鍵(在最後):primary key (eno,cno)

外來鍵(在最後):foreign key (x1) references tb1(x1)

預設約束:sex char(4) default “男”

#建立檢視

可以使用 create view 語句來建立檢視。

CREATE VIEW <檢視名> AS <SELECT語句>

1. 建立view預設情況下,建立的檢視和基本表的欄位是一樣的

create view stu_view as 
select * from Students

2.也可以通過指定檢視欄位的名稱來建立檢視。

create view stu_view(eno,cno,cname) as 
select eno,cno,cname  from  Students

在使用檢視時,可能使用者不需要了解基本表的結構,更接觸不到實際表中的資料,從而保證了資料庫的安全。

#建立觸發器

觸發器是與表有關的資料庫物件,在滿足定義條件時觸發,並執行觸發器中定義的語句集合。觸發器的這種特性可以協助應用在資料庫端確保資料的完整性。

舉個例子,比如你現在有兩個表【使用者表】和【日誌表】,當一個使用者被建立的時候,就需要在日誌表中插入建立的log日誌,如果在不使用觸發器的情況下,你需要編寫程式語言邏輯才能實現,但是如果你定義了一個觸發器,觸發器的作用就是當你在使用者表中插入一條資料的之後幫你在日誌表中插入一條日誌資訊。當然觸發器並不是只能進行插入操作,還能執行修改,刪除。

CREATE TRIGGER trigger_name trigger_time trigger_event ON tb_name FOR EACH ROW trigger_stmt
trigger_name:觸發器的名稱
tirgger_time:觸發時機,為BEFORE或者AFTER
trigger_event:觸發事件,為INSERT、DELETE或者UPDATE
tb_name:表示建立觸發器的表明,就是在哪張表上建立觸發器
trigger_stmt:觸發器的程式體,可以是一條SQL語句或者是用BEGIN和END包含的多條語句
所以可以說MySQL建立以下六種觸發器:
BEFORE INSERT,BEFORE DELETE,BEFORE UPDATE
AFTER INSERT,AFTER DELETE,AFTER UPDATE

BEFORE和AFTER引數指定了觸發執行的時間,在事件之前或是之後

FOR EACH ROW表示任何一條記錄上的操作滿足觸發事件都會觸發該觸發器

前面的tb_name 定義在修改的檔案表上, 後面需要用到另外一個表,即修改的表,因為前面的tb_name改變而改變的表:即

begin
    trigger_event houmian_table
    set x=y
    where  nrow.nn= houmian_table.nn
end

#建立儲存過程

SQL語句需要先編譯然後執行,而儲存過程(Stored Procedure)是一組為了完成特定功能的SQL語句集,經編譯後儲存在資料庫中,使用者通過指定儲存過程的名字並給定引數(如果該儲存過程帶有引數)來呼叫執行它。簡單來說 有點像 函式

#ALTER用法

#常用語法

ALL運算子是一個邏輯運算子,它將單個值與子查詢返回的單列值集進行比較。
ALL運算子必須以比較運算子開頭,例如:>,>=,<,<=,<>,=,後跟子查詢。
如下,對於ALL運算子的條件和描述說明:

條件描述
c > ALL(…) c列中的值必須大於要評估為true的集合中的最大值。
c >= ALL(…) c列中的值必須大於或等於要評估為true的集合中的最大值。
c < ALL(…) c列中的值必須小於要評估為true的集合中的最小值。
c <= ALL(…) c列中的值必須小於或等於要評估為true的集合中的最小值。
c <> ALL(…) c列中的值不得等於要評估為true的集合中的任何值。
c = ALL(…) c列中的值必須等於要評估為true的集合中的任何值。

ANY運算子是一個邏輯運算子,它將值與子查詢返回的一組值進行比較。 ANY運算子必須以比較運算子:>,>=,<,<=,=,<>開頭,後跟子查詢。
如下,對於ANY運算子的條件和描述說明:

條件描述
x = ANY (…) c列中的值必須與集合中的一個或多個值匹配,以評估為true。
x != ANY (…) c列中的值不能與集合中的一個或多個值匹配以評估為true。
x > ANY (…) c列中的值必須大於要評估為true的集合中的最小值。
x < ANY (…) c列中的值必須小於要評估為true的集合中的最大值。
x >= ANY (…) c列中的值必須大於或等於要評估為true的集合中的最小值。
x <= ANY (…) c列中的值必須小於或等於要評估為true的集合中的最大值。

sum(xx) 求總和

avg(xx) 求平均

count(*) 求個數

select x1,x2,x3 from y1,y2 where y1.no=y2.no and y2.sex='nan' group by department having count(*) >= all (select count(*) from y2 group by department)

select x1,x2,x3
 from y1,y2 
where y1.no=y2.no and y2.sex='nan' 
group by department 
having count(*) >= all (
                                    select count(*) from y2 
                                    group by department)

in 在list裡面

not in