資料庫系統概念學習 04 SQL高階

2022-09-12 16:12:30 字數 3492 閱讀 4018

繼續sql的深入學習,涉及到sql查詢的複雜形式、檢視定義、事務、完整性約束和許可權。

1.join表示式

在之前有講過natural join,因避免遍歷計算笛卡爾積而相比較傳統的where子句效率更高;在指定關注的屬性時使用join ... using ...句式,此外,join有個很有用的謂詞修飾on,對於內連線(inner join)而言,on的意義等同於where:

select *

from student join takes on student.id = takes.id;

等效於

select *

from student, takes

where student.id = takes.id;

然而,對於外連線(outer join)則不然。外連線分為左外連線(left outer join)、右外連線(right outer join)和全外連線(full outer join),分別對左表、右表或者兩個表在內連線運算中丟棄的項進行補齊,丟失的屬性用null替代。預設情況下,natural join就是指的natural inner join,而內連線、左外連線、右外連線、全連線都是可以與natural、using和on進行配合。

**2. **檢視

從資料庫儲存資料的資料抽象(data abstraction)而言,邏輯層提供的關係因為許可權等原因並不能直接被使用者使用,一般需要再抽象一層檢視層,這個在概述中有過提及。事實上,檢視是虛擬的表,即該錶並不進行具體儲存,而是在每次訪問時才去執行相關操作,通過邏輯層獲得檢視層的表,因此稱之為虛表。譬如:

create view physics_fall_2015 as

select course.course_id, sec_id, building, room_number

from course, section

where course.course_id = section.course_id

and course.dept_name = 'physics'

and section.semester = 'fall'

and section.year = '2009'

也可以顯式的定義檢視的屬性,如:

create view dept_total_salary(dept_name, total_salary) as

select dept_name, sum(salary)

from instructor

group by dept_name;

然而在大資料量儲存,尤其是有些應用需要高頻訪問某些檢視時,需要對檢視進行物化,即物化檢視(materialized view),然而sql標準卻沒有給出具體物化的方式,各個資料庫的實現也各有不同。檢視作為一種表(儘管是虛表 virtual relation),可以進行插入、刪除、更新操作,但是需要滿足一下條件:

3.事務

事務是完成乙個邏輯任務的操作序列,但是這個操作序列被視作乙個有機整體,要麼都做,要麼都不做,即原子性(atomic)。當乙個事務做完之後,要麼進行commit work,要麼進行rollback work,sql標準並沒有給出明確的要求。

4.完整性約束

資料庫的完整性約束指的是對資料庫做出的任何更改都不喪失資料庫的一致性。除了在建立**時候,對資料取值範圍的約定外,還有not null、uniquecheck,以及引用完整性約束等。sql標準規定的deferrableassertion特性在具體的資料庫實現中支援有限。

**5. **sql資料型別和模式

sql除了支援varchar(n)、char(n)、smallint等型別外,還對時間型別進行支援,如date、time、timestamp等,並且可以根據需要自定義型別,如:

create type dollars as numeric(8,2) final;

create table department(

dept_name varchar(20),

building varchar(15),

budget dolloars);

如果是相同種基本型別的,可以使用cast e as t進行型別轉換;此外,sql還提供了建立索引機制,在查詢關鍵碼時提高了效率:

create index name_idx on user(id)
可以使用drop type和alter type更改型別,可以使用create domain增加型別的限制,最為方便的是create table ... like ...句式:

create table temp_instructor like instructor;
建立的temp_instructor具有與instructor相同的schema。sql和其它的程式語言一樣,也有命名空間(namespace)這麼一說,即catalogs、schemas、relations可以確定**而不引起歧義。

grant select on department to amit;

grant update(budget) on department to amit;

revoke select on department from amit;

revoke update(budget) on department from amit;

而對於引用限制:

grant references(dept_name) on department to mary;
這使得使用者mary可以根據關係department建立外來鍵dept_name;此外,為了傳遞派生許可權的許可權,可以通過with grant option實現:

grant select on department to amit with grant option;
這樣使用者amit除了可以對department進行select操作外,還可以向其他使用者分派select許可權。然而許可權分配存在這樣乙個問題,即如果某位爺給小弟分配了許可權,根據繼承關係,當這位爺不幹了被revoke了許可權後,那位倒霉的小弟同樣沒了許可權,這當然太不開心了,為此,sql指定了role這麼個角色,將許可權分配給role,再由role繼續分派下去,這樣即使某位爺離開後,role依然存在,分配的許可權自然也存在,所謂「鐵打的營盤,流水的兵」:

create role instructor;

grant select on department to instructor with grant option;

真心感覺sql標準這套規則確實紛繁複雜,難怪並沒有資料庫進行完全實現。

《資料庫系統概念》學習筆記 一

1.關於外來鍵約束的sql問題 按照書上寫的sql語句 在建表寫外來鍵約束的時候 reference後面沒有指明是參照關係的哪個屬性 我的資料庫版本是mysql5.6 報錯 解決方法 referecnce後面需要指明被約束的屬性 即使屬性是參照關係的主鍵 仍然需要寫上 2.關於自然連線的語句理解 自...

資料庫學習04 SQL學習 增 刪 查 改

在前面資料庫學習03裡面也學到了資料庫的建立,以及表的建立,還有一些相關操作,接下來我們就可以像表裡面插入資料,03裡面不懂的,在本章節,將會細化。一 增 增 顧名思義,無非就是在表中插入資料,前面也提到了,向表中插入資料的語法為 insert 表名 values 值 第一步 我們先來建立乙個資料庫...

《資料庫系統概念》學習筆記 第一章

其實存 運算元據用作業系統支援的檔案系統就可以了,但是這樣的的話用久了會有問題 以學校 院系 老師 學生 課程的關係儲存來舉例 資料冗餘和不一致 可能乙個學生的基本資訊既存在這個自動化學院的資料夾下也在宇航學院的資料夾下。然後學生的 改了,且只有自動化學院下的資料改了,就diff了 資料訪問困難 需...