abap视图字段限制_【第八章】视图
上一級目錄:Mosh_完全掌握SQL課程_學習筆記
其它相關:數據概要
【第八章】視圖
Views (時長18分鐘)
1. 創建視圖
Creating Views (5:36)
小結
就是創建虛擬表,自動化一些重復性的查詢模塊,簡化各種復雜操作(包括復雜的子查詢和連接等)
注意視圖雖然可以像一張表一樣進行各種操作,但并沒有真正儲存數據,數據仍然儲存在原始表中,視圖只是儲存起來的模塊化的查詢結果,是為了方便和簡化后續進一步操作而儲存起來的虛擬表。
案例
創建 sales_by_client 視圖
USE sql_invoicing;CREATE VIEW sales_by_client ASSELECT client_id,name,SUM(invoice_total) AS total_salesFROM clients cJOIN invoices i USING(client_id)GROUP BY client_id, name;-- 雖然實際上這里加不加上name都一樣若要刪掉該視圖用 DROP VIEW sales_by_client 或右鍵
創建視圖后可就當作 sql_invoicing 庫下一張表一樣進行各種操作
USE sql_invoicing;SELECT s.name,s.total_sales,phone FROM sales_by_client s JOIN clients c USING(client_id) WHERE s.total_sales > 500練習
創建一個客戶差額表視圖,可以看到客戶的id,名字以及差額(發票總額-支付總額)
USE sql_invoicing;CREATE VIEW clients_balance ASSELECT client_id,c.name,SUM(invoice_total - payment_total) AS balanceFROM clients cJOIN invoices USING(client_id)GROUP BY client_id2. 更新或刪除視圖
Altering or Dropping Views (2:52)
小結
修改視圖可以先DROP在CREATE,但最好是用CREATE OR REPLACE
視圖的查詢語句可以在編輯模式下查看和修改,但最好是保存為sql文件并放在源碼控制妥善管理
案例
想在上一節的顧客差額視圖的查詢語句最后加上按差額降序排列
法1. 先刪除再重建
USE sql_invoicing;DROP VIEW clients_balance; -- 若不存在這個視圖,用DROP會報錯CREATE VIEW clients_balance AS ……ORDER BY balance DESC法2. 用REPLACE關鍵字,即用 CREATE OR REPLACE VIEW clients_balance AS, 這個比較通用,不管現在這個視圖現在是否已經存在都不會出問題,推薦使用種這種方式。
USE sql_invoicing;CREATE OR REPLACE VIEW clients_balance AS……ORDER BY balance DESC方法
如何保存視圖的原始查詢語句?
法1.
(推薦方法) 將原始查詢語句保存為 views 文件夾下的和與視圖同名的 clients_balance.sql 文件,然后將這個文件夾放在源碼控制下(put these files under source control), 通常放在 git repository(倉庫)里與其它人共享,團隊其他人因此能在自己的電腦上重建這個數據庫
法2.
若丟失了原始查詢語句,要修改的話可點擊視圖的扳手按鈕打開編輯模式,可看到如下被MySQL處理了的查詢語句
MySQL在前面加了些莫名其妙的東西并且在所有庫名表名字段名外套上反引號防止名稱沖突(當對象名和MySQL里的關鍵字相同時確保被當作對象名而不是關鍵字),但這都不影響
直接做我們需要的修改,如加上ORDER BY balance DESC 然后點apply就行了
CREATE ALGORITHM = UNDEFINED DEFINER = `root`@`localhost` SQL SECURITY DEFINER VIEW `clients_balance` ASSELECT `c`.`client_id` AS `client_id`,`c`.`name` AS `name`,SUM((`invoices`.`invoice_total` - `invoices`.`payment_total`)) AS `balance`FROM(`clients` `c`JOIN `invoices` ON ((`c`.`client_id` = `invoices`.`client_id`)))GROUP BY `c`.`client_id`ORDER BY balance DESC法2是沒有辦法的辦法,當然最好還是將 views 保存為 sql 文件并放入源碼控制
3. 可更新視圖
Updatable Views (5:12)
小結
視圖除了可用在查詢語句SELECT中,也可以用在增刪改(INSERT DELETE UPDATE)語句中,但后者有一定的前提條件。
如果一個視圖的原始查詢語句中沒有如下元素:
1. DISTINCT 去重
2. 聚合函數/GROUP BY/HAVING (聚合函數和HAVING篩選通常是伴隨GROUP BY分組出現的)
3. UNION 縱向連接
則該視圖是可更新視圖(Updatable Views),可以增刪改,否則只能查。
另外,增(INSERT)還要滿足附加條件:視圖必須包含底層原表的所有必須字段
總之,一般通過原表修改數據,但當出于安全考慮或其他原因沒有某表的直接權限時,可以通過視圖來修改底層數據(?),前提是視圖是可更新的。
之后會將關于安全和權限的內容
案例
創建視圖(新虛擬表)invoices_with_balance(帶差額的發票記錄表)
USE sql_invoicing;CREATE OR REPLACE VIEW invoices_with_balance AS SELECT /* 這里有個小技巧,要插入表中的多列列名時,可從左側欄中連選并拖入相關列 */invoice_id, number, client_id, invoice_total, payment_total, invoice_date,invoice_total - payment_total AS balance,-- 新增列due_date, payment_date FROM invoices WHERE (invoice_total - payment_total) > 0 /* 這里不能用列別名balance,會報錯說不存在, 必須用原列名的表達式 之前講WHERE和HAVING作為事前篩選和事后篩選的區別時提到過 */該視圖滿足條件,是可更新視圖,故可以增刪改:
刪掉id為1的發票記錄
DELETE FROM invoices_with_balance WHERE invoice_id = 1將2號發票記錄的期限延后兩天
UPDATE invoices_with_balance SET due_date = DATE_ADD(due_date, INTERVAL 2 DAY) WHERE invoice_id = 2在視圖中用INSERT新增記錄的話還有另一個前提,即視圖必須包含其底層所有原始表的所有必須字段
例如,若這個 invoices_with_balance 視圖里沒有 invoice_date 字段(invoices 中的必須字段),那就無法通過該視圖向 invoices 表新增記錄,因為 invoices 表不會接受 invoice_date 字段為空的記錄
4. WITH CHECK OPTION 子句
THE WITH CHECK OPTION Clause (2:18)
小結
在視圖的原始查詢語句最后加上 WITH CHECK OPTION 可以防止執行那些會讓視圖中某些行(記錄)消失的修改語句。
案例
接前面的 invoices_with_balance 視圖的例子,該視圖與原始的 orders 表相比增加了balance(invouce_total - payment_total) 列,且只顯示 balance 大于0的行(記錄),若將某記錄(如2號訂單)的 payment_total 改為和 invouce_total 相等,則 balance 為0,該記錄會從視圖中消失:
UPDATE invoices_with_balance SET payment_total = invoice_total WHERE invoice_id = 2更新后會發現invoices_with_balance視圖里2號訂單消失。
但在視圖原始查詢語句最后加入 WITH CHECK OPTION 后,對3號訂單執行類似上面的語句后會報錯:
UPDATE invoices_with_balance SET payment_total = invoice_total WHERE invoice_id = 3-- Error Code: 1369. CHECK OPTION failed 'sql_invoicing.invoices_with_balance'5. 視圖的其他優點
Other Benefits of Views (2:37)
小結
三大優點:
簡化查詢、增加抽象層和減少變化的影響、數據安全性
具體來講:
了解這些優點,但不要盲目將他們運用在所有的情形中。
導航
下一章將講解儲存過程和函數
上一級目錄:Mosh_完全掌握SQL課程_學習筆記
其它相關:數據概要
總結
以上是生活随笔為你收集整理的abap视图字段限制_【第八章】视图的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php 开发一个聊天系统,ajax+ph
- 下一篇: iphone7尺寸_iPhone 12