關係型資料庫之SQL

zyhmz發表於2018-07-07

SQL最早的版本是由IBM開發的,它最初被稱為Sequel。Sequel發展至今,其名稱已經變為SQL(結構化查詢語句)。現在的關係型資料庫產品基本支援SQL語言,SQL已經明顯地確立了自己在作為標準的關係型資料庫語言的地位。

完整性約束

create table department
     ( dept_name varchar(20),
       building varchar(20),
       budget numberic(12,2),
       primary key(dept_name));
      )

所以create_table 命令的通用形式是:

create_table table:
      (
        A1,D1,
        A2, D2,
        ......
        An, Dn,
        <完整性約束1>,
        ......
        <完整性約束2>                
        );

SQL支援許多不同的完整性約束,我們來看看其中幾種簡單的約束,主鍵約束,外來鍵約束,非空約束:

primary key(A1,A2,A3,A4,A5): primary-key 宣告表示屬性A1,A2,A3,A4,A5構成關係的主碼。主碼屬性必須非空且唯一,也就是說沒有一個在主碼屬性上取空值,關係中也沒有兩個元組在所有主碼屬性上取值相同。

foreign key(A1, A2, A3, A4, A5)reference: foreign key 宣告表示關係中任意元組在屬性(A1, A2, A3, A4, A5)上的取值必須對應於關係s中某元組在主碼屬性上的取值。

not null: 一個屬性上的not null約束表明在該屬性上不允許空值。換句話說,此約束把空值排除在該屬性域之外。

insert,delete,drop,alter
首相看看insert的用法,這個命令可幫助我們將書資料載入到關係中,比如:

inster into instructor
       values (10211,‘paul‘ ‘math‘,40000 )

其次是drop和delete的區別

drop table r , 這個語句是從資料庫中刪除掉r的所有資訊,包括邏輯設計
delete table r,這個語句保留了關係r,但是刪除全部的元組

其次是alter命令, 這個指令為已有的關係增加屬性,:

alter table r add A D;
alter table drop A;

但是很多資料庫系統並不支援去掉屬性,儘管它們允許去掉整個表。

單關係查詢
先來一個最簡單的查詢,那就是從關係中找出所有的名字:

select name
from instructor

但是某些名字是重複的,我們想去重,我們可以將上述查詢語句重寫為:

select distinct name
from instructor; 

select還可以帶含有加減乘除等算術表示式,算術的物件可以是常數或者是元組的屬性,但是這並不會導致我們instructor關係的任何改變。

select ID,name,dept_name,salary * 1.1
from instructor;

where子句允許我們只選出那些在from子句的結果關係中滿足特定謂詞的元組。我們考慮查詢“所有在Computer Science 系並且工資超過70000美元的教師的名字“,該SQL語句可以寫為:

select name
from instructor
where dept_name = 'Comp.Sci' and salary > 70000;

SQL允許在where子句中使用邏輯連詞and, or 和 not。邏輯連詞的運算物件可以是包含比較運算子 <, <=, >, >=, = 和 <>的表示式。

多關係查詢
在我們前面的示例中,我都是隻對單關係表進行查詢。但是在我們日常對工作中,通常需要對多表進行查詢。比如說:找出所有教師的姓名,以及他們所在系的名稱和系所在建築的名稱。

select name, instructor.dept_name,builiding
from instructor, building
where instructor.dept_name = department.dept_name 

在instructor中,其外來鍵是dept_name, 被參照關係為department。

所以在這裡,我們要可以一種更通識的方式去記憶:
1. 為from子句中列出的關係產生笛卡爾積。什麼是笛卡爾積呢?通俗一點講,就是將兩張關係的全部元組遍歷合併為一張大表。
2. 在步驟1的結果上應用where子句中指定的邏輯。
3. 對於步驟2結果中的每個元組,輸出select子句中指定的屬性(或者表示式的結果)

自然連線
自然橋接的運算也是作用於兩個關係,併產生一個關係作為結果。在笛卡爾積上,是將第一個關係的每一個元組和第二個關係的所有元組都進行連線,但是自然連線只是考慮那些在兩個關係模式上中都出現的的屬性,並且其屬性的值都相同的元組對。自然連線可以幫助我寫出更簡潔的sql語句:

select name, course_id
from instructor, teaches
where instructor.ID = teaches.ID

自然連線可以幫助簡化語言:

select name, course_id
from instructor natural join teaches;

更名運算
有時候,我們可以想用instructor_name來代替屬性名name:

select name as instructor_name, course_id
from instructor, teaches
where instructor.ID = teaches.ID 

as 子句有時候在重新命名關係中特別有用,重新命名關係的一個原因是把一個長的關係名替換為一個短的,這在查詢的其他地方使用起來就更加方便了,我們來寫一個查詢“對於大學中 所有講授課程的的教師,找出他們的姓名以及所講述的的所有課程標示“:

select T.name , S.course_id
from instructor as T, teaches as S
where T.ID = S.ID

字串運算

字串串聯拼接:s || a
字串大小寫轉換:uppper(s), lower(s)
去掉字串後的空格: trim(s)
使用like操作符實現模式匹配:
- 百分號(%)可以匹配任意字串
- 下劃線(_) 匹配任意一個字元
這些運算子號可以進行一些組合,達到我們所期望的模式匹配,下面來舉一些例子
‘Intro%‘ 可以匹配任意以Intro打頭的子串
‘%Comp%‘可以匹配任何以包含‘Comp‘子串的字串
__‘匹配只含三個字元的字串
_%‘匹配至少含三個字元的字串

在SQL中我們可以用運算比較符like來表達模式,我們可以考慮‘找出所有建築名稱中包含子串‘Waston‘的所有系名‘:

select dept_name
from department
where building like '%Waston'

我們還會在like比較運算子中使用escape關鍵詞來定義轉義字元:

like 'ab\%cd%' escape '\' 匹配所有以‘ab%cd‘開頭的字串 

相關文章