SQL必知必會讀書筆記(三)

2021-09-19 10:35:38 字數 4271 閱讀 9810

sql 除了可以對列名和計算字段使用別名,還允許給表名起別名。這樣做有兩個主要理由:

 縮短 sql 語句;

 允許在一條 select 語句中多次使用相同的表。

用自聯結而不用子查詢

自聯結通常作為外部語句,用來替代從相同表中檢索資料的使用子查詢語句。雖然最終的結果是相同的,但許多 dbms 處理聯結遠比處理子查詢快得多。應該試一下兩種方法,以確定哪一種的效能更好。

事實上,我們迄今為止建立的每個內聯結都是自然聯結,很可能永遠都不會用到不是自然聯結的內聯結。

使用聯結和聯結條件

在總結討論聯結的這兩課前,有必要彙總一下聯結及其使用的要點。 

 注意所使用的聯結型別。一般我們使用內聯結,但使用外聯結也有效。

 關於確切的聯結語法,應該檢視具體的文件,看相應的 dbms 支援何種語法(大多數 dbms 使用這兩課中描述的某種語法)。

 保證使用正確的聯結條件(不管採用哪種語法),否則會返回不正確的資料。

 應該總是提供聯結條件,否則會得出笛卡兒積。

 在乙個聯結中可以包含多個表,甚至可以對每個聯結採用不同的聯結型別。雖然這樣做是合法的,一般也很有用,但應該在一起測試它們前分別測試每個聯結。這會使故障排除更為簡單。

主要有兩種情況需要使用組合查詢:

 在乙個查詢中從不同的表返回結構資料;

 對乙個表執行多個查詢按乙個查詢返回資料

union規則

可以看到,union 非常容易使用,但在進行組合時需要注意幾條規則。

 union 必須由兩條或兩條以上的 select 語句組成,語句之間用關鍵字union分隔(因此,如果組合四條select語句,將要使用三個union關鍵字)

 union 中的每個查詢必須包含相同的列、表示式或聚集函式(不過,各個列不需要以相同的次序列出)。

 列資料型別必須相容:型別不必完全相同,但必須是 dbms 可以隱含轉換的型別(例如,不同的數值型別或不同的日期型別)。

union 從查詢結果集中自動去除了重複的行;這是 union 的預設行為,如果願意也可以改變它。事實上,如果想返回所有的匹配行,可使用union all而不是 union。

union 與 where

這一課一開始我們說過,union 幾乎總是完成與多個 where 條件相同的工作。union all 為 union 的一種形式,它完成 where 子句完成

不了的工作。如果確實需要每個條件的匹配行全部出現(包括重複行),就必須使用 union all,而不是 where。

插入及系統安全

使用 insert 語句可能需要客戶端/伺服器 dbms 中的特定安全許可權。在你試圖使用 insert 前,應該保證自己有足夠的安全許可權。

總是使用列的列表

不要使用沒有明確給出列的 insert 語句。給出列能使 sql **繼續發揮作用,即使表結構發生了變化。

省略列

如果表的定義允許,則可以在 insert 操作中省略某些列。省略的列必須滿足以下某個條件。

 該列定義為允許 null 值(無值或空值)。

 在表定義中給出預設值。這表示如果不給出值,將使用預設值

省略所需的值

如果表中不允許有 null 值或者預設值,這時卻省略了表中的值,dbms 就會產生錯誤訊息,相應的行不能成功插入。

插入多行

insert 通常只插入一行。要插入多行,必須執行多個 insert 語句。insert select是個例外,它可以用一條insert插入多行,不管select語句返回多少行,都將被 insert 插入。

select * 

into custcopy 

from customers;

在使用select into時,需要知道一些事情:

 任何 select 選項和子句都可以使用,包括 where 和 group by;

 可利用聯結從多個表插入資料

 不管從多少個表中檢索資料,資料都只能插入到乙個表中。

進行表的複製

select into 是試驗新 sql 語句前進行表複製的很好工具。先進行複製,可在複製的資料上測試 sql **,而不會影響實際的資料。

下面是許多 sql 程式設計師使用 update 或 delete 時所遵循的重要原則。

 除非確實打算更新和刪除每一行,否則絕對不要使用不帶 where 子句的 update 或 delete 語句。

 保證每個表都有主鍵(如果忘記這個內容,請參閱第 12 課),盡可能像 where 子句那樣使用它(可以指定各主鍵、多個值或值的範圍)

 在 update 或 delete 語句使用 where 子句前,應該先用 select 進行測試,保證它過濾的是正確的記錄,以防編寫的 where 子句不正確。

 使用強制實施引用完整性的資料庫(關於這個內容,請參閱第 12 課),這樣 dbms 將不允許刪除其資料與其他表相關聯的行。

 有的 dbms 允許資料庫管理員施加約束,防止執行不帶 where 子句的 update 或 delete 語句。如果所採用的 dbms 支援這個特性,應該使用它。

利用 create table 建立表,必須給出下列資訊:

 新錶的名字,在關鍵字 create table 之後給出;

 表列的名字和定義,用逗號分隔;

 有的 dbms 還要求指定表的位置。

sql 允許指定預設值,在插入行時如果不給出值,dbms 將自動採用預設值。預設值在 create table 語句的列定義中用關鍵字default指定。

複雜的表結構更改一般需要手動刪除過程,它涉及以下步驟:

(1) 用新的列布局建立乙個新錶;

(2) 使用 insert select 語句,從舊表複製資料到新錶。有必要的話,可以使用轉換函式和計算字段;

(3) 檢驗包含所需資料的新錶;

(4) 重新命名舊表(如果確定,可以刪除它);

(5) 用舊表原來的名字重新命名新錶;

(6) 根據需要,重新建立觸發器、儲存過程、索引和外來鍵。

下面是檢視的一些常見應用

 重用 sql 語句。

 簡化複雜的 sql 操作。在編寫查詢後,可以方便地重用它而不必知道其基本查詢細節。

 使用表的一部分而不是整個表。

 保護資料。可以授予使用者訪問表的特定部分的許可權,而不是整個表的訪問許可權。

 更改資料格式和表示。檢視可返回與底層表的表示和格式不同的資料。

效能問題

因為檢視不包含資料,所以每次使用檢視時,都必須處理查詢執行時需要的所有檢索。如果你用多個聯結和過濾建立了複雜的檢視或者嵌

套了檢視,效能可能會下降得很厲害。因此,在部署使用了大量檢視的應用前,應該進行測試。

下面是關於檢視建立和使用的一些最常見的規則和限制。

 與表一樣,檢視必須唯一命名(不能給檢視取與別的檢視或表相同的名字)。

 對於可以建立的檢視數目沒有限制。

 建立檢視,必須具有足夠的訪問許可權。這些許可權通常由資料庫管理人員授予。

 檢視可以巢狀,即可以利用從其他檢視中檢索資料的查詢來構造檢視。所允許的巢狀層數在不同的 dbms 中有所不同(巢狀檢視可能會嚴重降低查詢的效能,因此在產品環境中使用之前,應該對其進行全面測試)。

 許多 dbms 禁止在檢視查詢中使用 order by 子句。

 有些 dbms 要求對返回的所有列進行命名,如果列是計算字段,則需要使用別名(關於列別名的更多資訊,請參閱第 7 課)。

 檢視不能索引,也不能有關聯的觸發器或預設值。

 有些 dbms 把檢視作為唯讀的查詢,這表示可以從檢視檢索資料,但不能將資料寫回底層表。詳情請參閱具體的 dbms 文件。

 有些 dbms 允許建立這樣的檢視,它不能進行導致行不再屬於檢視的插入或更新。例如有乙個檢視,只檢索帶有電子郵件位址的顧客。如果更新某個顧客,刪除他的電子郵件位址,將使該顧客不再屬於檢視。這是預設行為,而且是允許的,但有的 dbms 可能會防止這種情況發生。

檢視極大地簡化了複雜 sql 語句的使用。利用檢視,可一次性編寫基礎的 sql,然後根據需要多次使用

SQL必知必會》讀書筆記

慎用 檢索所有列 一般而言,除非你確實需要表中的每一列,否則最好別使用 萬用字元。雖然使用萬用字元能讓你自己省事,不用明確列出所需列,但檢索不需 要的列通常會降低檢索和應用程式的效能。使用萬用字元有乙個大優點。由於不明確指定列名 因為星號檢索每一列 所以能檢索出名字未知的列。2.關於distinct...

SQL必知必會 讀書筆記

資料庫 database 儲存有組織的資料的容器 表 table 某種特定型別資料的結構化清單 同乙個資料庫中表名是唯一的哦 模式 schema 關於資料庫和表的布局及特性的資訊 列 column 表中的乙個字段。所有表都是有乙個或多個列組成的 資料型別 datatype 所允許的資料的型別。每個表...

《SQL必知必會》讀書筆記

第1章 了解sql 第2章 檢索資料 第3章 排序檢索資料 第4章 過濾資料 不等於 小於 小於等於 第5章 高階資料過濾 第6章 用萬用字元進行過濾 第7章 建立計算字段 第8章 使用資料處理函式 第9章 彙總資料 第10章 分組資料 第11章 使用子查詢 第12章 聯結表 第13章 建立高階聯結...