本文目錄一覽:
- 1、mysql 視圖
- 2、MySQL中視圖的定義,原理和怎樣使用,創建
- 3、如何在MySQL中創建視圖?
- 4、MySQL如何創建一個數據庫的視圖設計
- 5、mysql數據庫視圖是什麼?什麼時候必須建視圖?我從網上查了,但是感覺還是很模糊
- 6、數據庫(mysql)關鍵知識
mysql 視圖
1、什麼是視圖
視圖:MySQL從5.0.1版本開始提供視圖功能。一種虛擬存在的表,行和列的數據來自定義視圖的查詢中使用的表,並且是在使用視圖時動態生成的,只保存了sql邏輯,不保存查詢結果
2、視圖應用場景
多個地方用到同樣的查詢結果該查詢結果使用的sql語句較複雜
4、視圖的好處
使用簡單安全數據獨立
5、創建或者修 改視圖
創建視圖的語法:
修改視圖的語法
6、視圖更新性
視圖的可更新性和視圖中查詢的定義有關係,以下類型的視圖是不能更新的。(1)包含以下關鍵字的sql語句:分組函數、distinct、group by、having、union或者union all(2)常量視圖(3)Select中包含子查詢(4)join(5)from一個不能更新的視圖(6)where子句的子查詢引用了from子句中的表
7、刪除視圖的語法
用戶可以一次刪除一個或者多個視圖,前提是必須有該視圖的drop權限。
8、查看視圖結構的語法
show tables;如果需要查詢某個視圖的定義,可以使用show create view命令進行查看
MySQL中視圖的定義,原理和怎樣使用,創建
為了不影響其他的數據庫表,新建一張數據庫表t_worker_info,代碼如下:createtablet_worker_info(idint(8)primarykeynotnullauto_increment,w_idint(10)notnull,w_namevarchar(20)notnull,w_ageint(3),w_sexvarchar(10),w_birthvarchar(20));創建t_worker_info後,查看一下數據結構,代碼如下:desct_worker_info;雙擊選中的數據庫,在Views鼠標右鍵“CreateView”,打開編輯窗口,並在窗口中輸入代碼,代碼如下:CREATEVIEW`view_worker_info`ASSELECT*FROMt_worker_info;查看創建視圖的基本信息,利用desc或describe語句,代碼如下:descview_worker_info;查看視圖信息,如存儲引擎、數據長度等,如果上述指標都為null,說明視圖是虛表,代碼如下:showtablestatuslike’view_worker_info’;查看創建視圖的詳細信息,需要用到showcreateview視圖名,代碼如下:showcreateviewview_worker_info;
如何在MySQL中創建視圖?
CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]\x0d\x0a VIEW view_name [(column_list)]\x0d\x0a AS select_statement\x0d\x0a [WITH [CASCADED | LOCAL] CHECK OPTION]\x0d\x0a\x0d\x0a該語句能創建新的視圖,如果給定了OR REPLACE子句,該語句還能替換已有的視圖。select_statement是一種SELECT語句,它給出了視圖的定義。該語句可從基表或其他視圖進行選擇。\x0d\x0a該語句要求具有針對視圖的CREATE VIEW權限,以及針對由SELECT語句選擇的每一列上的某些權限。對於在SELECT語句中其他地方使用的列,必須具有SELECT權限。如果還有OR REPLACE子句,必須在視圖上具有DROP權限。\x0d\x0a視圖屬於數據庫。在默認情況下,將在當前數據庫創建新視圖。要想在給定數據庫中明確創建視圖,創建時,應將名稱指定為db_name.view_name。\x0d\x0amysql CREATE VIEW test.v AS SELECT * FROM t;\x0d\x0a\x0d\x0a表和視圖共享數據庫中相同的名稱空間,因此,數據庫不能包含具有相同名稱的表和視圖。\x0d\x0a視圖必須具有唯一的列名,不得有重複,就像基表那樣。默認情況下,由SELECT語句檢索的列名將用作視圖列名。要想為視圖列定義明確的名稱,可使用可選的column_list子句,列出由逗號隔開的ID。column_list中的名稱數目必須等於SELECT語句檢索的列數。\x0d\x0aSELECT語句檢索的列可以是對錶列的簡單引用。也可以是使用函數、常量值、操作符等的表達式。\x0d\x0a對於SELECT語句中不合格的表或視圖,將根據默認的數據庫進行解釋。通過用恰當的數據庫名稱限定表或視圖名,視圖能夠引用表或其他數據庫中的視圖。\x0d\x0a能夠使用多種SELECT語句創建視圖。視圖能夠引用基表或其他視圖。它能使用聯合、UNION和子查詢。SELECT甚至不需引用任何錶。在下面的示例中,定義了從另一表選擇兩列的視圖,並給出了根據這些列計算的表達式:\x0d\x0amysql CREATE TABLE t (qty INT, price INT);\x0d\x0amysql INSERT INTO t VALUES(3, 50);\x0d\x0amysql CREATE VIEW v AS SELECT qty, price, qty*price AS value FROM t;\x0d\x0amysql SELECT * FROM v;\x0d\x0a+——+——-+——-+\x0d\x0a| qty | price | value |\x0d\x0a+——+——-+——-+\x0d\x0a| 3 | 50 | 150 |\x0d\x0a+——+——-+——-+\x0d\x0a\x0d\x0a視圖定義服從下述限制:\x0d\x0a· SELECT語句不能包含FROM子句中的子查詢。\x0d\x0a· SELECT語句不能引用系統或用戶變量。\x0d\x0a· SELECT語句不能引用預處理語句參數。\x0d\x0a· 在存儲子程序內,定義不能引用子程序參數或局部變量。\x0d\x0a· 在定義中引用的表或視圖必須存在。但是,創建了視圖後,能夠捨棄定義引用的表或視圖。要想檢查視圖定義是否存在這類問題,可使用CHECK TABLE語句。\x0d\x0a· 在定義中不能引用TEMPORARY表,不能創建TEMPORARY視圖。\x0d\x0a· 在視圖定義中命名的表必須已存在。\x0d\x0a· 不能將觸發程序與視圖關聯在一起。\x0d\x0a在視圖定義中允許使用ORDER BY,但是,如果從特定視圖進行了選擇,而該視圖使用了具有自己ORDER BY的語句,它將被忽略。\x0d\x0a對於定義中的其他選項或子句,它們將被增加到引用視圖的語句的選項或子句中,但效果未定義。例如,如果在視圖定義中包含LIMIT子句,而且從特定視圖進行了選擇,而該視圖使用了具有自己LIMIT子句的語句,那麼對使用哪個LIMIT未作定義。相同的原理也適用於其他選項,如跟在SELECT關鍵字後的ALL、DISTINCT或SQL_SMALL_RESULT,並適用於其他子句,如INTO、FOR UPDATE、LOCK IN SHARE MODE、以及PROCEDURE。\x0d\x0a如果創建了視圖,並通過更改系統變量更改了查詢處理環境,會影響從視圖獲得的結果:\x0d\x0amysql CREATE VIEW v AS SELECT CHARSET(CHAR(65)), COLLATION(CHAR(65));\x0d\x0aQuery OK, 0 rows affected (0.00 sec)\x0d\x0a \x0d\x0amysql SET NAMES ‘latin1’;\x0d\x0aQuery OK, 0 rows affected (0.00 sec)\x0d\x0a \x0d\x0amysql SELECT * FROM v;\x0d\x0a+——————-+———————+\x0d\x0a| CHARSET(CHAR(65)) | COLLATION(CHAR(65)) |\x0d\x0a+——————-+———————+\x0d\x0a| latin1 | latin1_swedish_ci |\x0d\x0a+——————-+———————+\x0d\x0a1 row in set (0.00 sec)\x0d\x0a \x0d\x0amysql SET NAMES ‘utf8’;\x0d\x0aQuery OK, 0 rows affected (0.00 sec)\x0d\x0a \x0d\x0amysql SELECT * FROM v;\x0d\x0a+——————-+———————+\x0d\x0a| CHARSET(CHAR(65)) | COLLATION(CHAR(65)) |\x0d\x0a+——————-+———————+\x0d\x0a| utf8 | utf8_general_ci |\x0d\x0a+——————-+———————+\x0d\x0a1 row in set (0.00 sec)\x0d\x0a\x0d\x0a可選的ALGORITHM子句是對標準SQL的MySQL擴展。ALGORITHM可取三個值:MERGE、TEMPTABLE或UNDEFINED。如果沒有ALGORITHM子句,默認算法是UNDEFINED(未定義的)。算法會影響MySQL處理視圖的方式。\x0d\x0a對於MERGE,會將引用視圖的語句的文本與視圖定義合併起來,使得視圖定義的某一部分取代語句的對應部分。\x0d\x0a對於TEMPTABLE,視圖的結果將被置於臨時表中,然後使用它執行語句。\x0d\x0a對於UNDEFINED,MySQL將選擇所要使用的算法。如果可能,它傾向於MERGE而不是TEMPTABLE,這是因為MERGE通常更有效,而且如果使用了臨時表,視圖是不可更新的。\x0d\x0a明確選擇TEMPTABLE的1個原因在於,創建臨時表之後、並在完成語句處理之前,能夠釋放基表上的鎖定。與MERGE算法相比,鎖定釋放的速度更快,這樣,使用視圖的其他客戶端不會被屏蔽過長時間。\x0d\x0a視圖算法可以是UNDEFINED,有三種方式:\x0d\x0a· 在CREATE VIEW語句中沒有ALGORITHM子句。\x0d\x0a· CREATE VIEW語句有1個顯式ALGORITHM = UNDEFINED子句。\x0d\x0a· 為僅能用臨時表處理的視圖指定ALGORITHM = MERGE。在這種情況下,MySQL將生成告警,並將算法設置為UNDEFINED。\x0d\x0a正如前面所介紹的那樣,通過將視圖定義中的對應部分合併到引用視圖的語句中,對MERGE進行處理。在下面的示例中,簡要介紹了MERGE的工作方式。在該示例中,假定有1個具有下述定義的視圖v_merge:\x0d\x0aCREATE ALGORITHM = MERGE VIEW v_merge (vc1, vc2) AS\x0d\x0aSELECT c1, c2 FROM t WHERE c3 100;\x0d\x0a\x0d\x0a示例1:假定發出了下述語句:\x0d\x0aSELECT * FROM v_merge;\x0d\x0a\x0d\x0aMySQL以下述方式處理語句:\x0d\x0a· v_merge成為t\x0d\x0a· *成為vc1、vc2,與c1、c2對應\x0d\x0a· 增加視圖WHERE子句\x0d\x0a所產生的將執行的語句為:\x0d\x0aSELECT c1, c2 FROM t WHERE c3 100;\x0d\x0a\x0d\x0a示例2:假定發出了下述語句:\x0d\x0aSELECT * FROM v_merge WHERE vc1 100) AND (c1
回答於 2022-11-16
MySQL如何創建一個數據庫的視圖設計
在 SQL 中,視圖是基於 SQL 語句的結果集的可視化的表。
視圖包含行和列,就像一個真實的表。視圖中的字段就是來自一個或多個數據庫中的真實的表中的字段。我們可以向視圖添加 SQL 函數、WHERE 以及 JOIN 語句,我們也可以提交數據,就像這些來自於某個單一的表。
例子
創建視圖
CREATE VIEW view_name AS
SELECT column_name(s)
FROM table_name
WHERE condition
mysql數據庫視圖是什麼?什麼時候必須建視圖?我從網上查了,但是感覺還是很模糊
視圖2個用處,一個是方便查詢,比如下面的例子:
SQL CREATE VIEW
2 v_sale_report_sum
3 AS
4 SELECT
5 sale_item,
6 SUM(sale_money) AS sale_money
7 FROM
8 sale_report
9 GROUP BY
10 sale_item;
View created.
SQL SELECT * FROM v_sale_report_sum;
不使用視圖的話,你每查詢一次,都要寫一段很長的 SQL 語句。又是SUM 又是GROUP BY的。
有了視圖以後,一行SQL就解決問題。
還有一個用處,就是安全方面上的設置需要。
比如 人力資源那裡,有一個員工表,裡面有
員工的姓名、性別、生日、籍貫、工作年限、工資、所屬部門 等信息。
人力資源的人,希望你幫忙寫一個2011年,工作排版表的程序,但是又不希望你“知道得太多”。
那麼就創建一個視圖
CREATE VIEW v_員工 AS
SELECT
姓名, 性別, 所屬部門
FROM
員工表
然後就給你一個 v_員工 的 檢索權限,讓你去寫 排班程序去了。
mysql 與 oracle 都有視圖
procedure 也就是存儲過程,也就是某些與數據庫操作比較緊密的操作,寫在存儲過程裡面,比寫在 java 或者 C# 之類的外部,效果要好一些。
例如一個百貨商店的數據庫,每天晚上營業結束了,要統計銷售額,然後計算每個商品分類下面,當天的營業額是多少,然後將統計數據,插入到 統計表中。
這些操作,基本上就是 SELECT SUM / GROUP BY , 然後 INSERT INTO 的操作。
直接在數據庫內部處理就可以了。
沒必要把一大堆查詢結果,先傳遞到外邊的一個 java 或者 c#寫的客戶端。
然後再通過 客戶端傳遞一大堆的 INSERT INTO 語句回來。
數據庫(mysql)關鍵知識
Mysql是目前互聯網使用最廣的關係數據庫,關係數據庫的本質是將問題分解為多個分類然後通過關係來查詢。 一個經典的問題是用戶借書,三張表,一個用戶,一個書,一個借書的關係表。當需要查詢某個用戶借書情況或者是書被那些人借了,就用關係查詢來實現。
關係數據庫範式
來自英文Normal form,簡稱NF。要想設計—個好的關係,必須使關係滿足一定的約束條件,滿足這些規範的數據庫是簡潔的、結構明晰的,同時,不會發生插入(insert)、刪除(delete)和更新(update)操作異常。總共有六種範式:第一範式(1NF)、第二範式(2NF)、 第三範式 (3NF)、巴斯-科德範式(BCNF)、 第四範式 (4NF)和 第五範式 (5NF,又稱完美範式)。
1NF是指數據庫表的每一列都是不可分割的原子數據項。2NF必須滿足1NF,要求數據庫表中的每行記錄必須可以被唯一地區分。3NF在2NF基礎上,任何非主 屬性 不依賴於其它非主屬性(在2NF基礎上消除傳遞依賴)。BCNF是在3NF基礎上,任何非主屬性不能對主鍵子集依賴(在3NF基礎上消除對主碼子集的依賴), 滿足BCNF不再會有任何由於函數依賴導致的異常,但是我們還可能會遇到由於多值依賴導致的異常。4NF的定義很簡單:已經是BC範式,並且不包含多值依賴關係。5NF處理的是無損連接問題,這個範式基本沒有實際意義,因為無損連接很少出現,而且難以察覺。而域鍵範式試圖定義一個終極範式,該範式考慮所有的依賴和約束類型,但是實用價值也是最小的,只存在理論研究中。
Catalog和Schema
是數據庫對象命名空間中的層次,主要用來解決命名衝突的問題。從概念上說,一個數據庫系統包含多個Catalog,每個Catalog又包含多個Schema,而每個Schema又包含多個數據庫對象(表、視圖、字段等)。但是Mysql的數據庫名就是Schema,不支持Catalog。
Mysql的數據庫引擎主要有兩種MyISAM和InnoDB,MyISAM支持全文檢索,InnoDB支持事務。
SQL中的通配符‘%’代表任意字符出現任意次數。‘_’代表任意字符出現一次。SQL與正則表達式結合查詢一般用在WHERE table_name REGEXP ‘^12.34’。子查詢是從裡到外執行。
數據庫聯結(join)涉及到外鍵,外鍵是指一個表的列是另一個表的主鍵,那麼它就是外鍵。笛卡爾積聯結(不指定聯結條件時)生成的記錄條目是單純的第一個表的行乘以第二個表的列數。用得最多的是等值聯結也叫內部聯結。
高級聯結還有自連接,是指查詢中的兩張表是同一張表,它通常作為外部語句用來代替從相同表中檢索數據時使用的子查詢。自然聯結使每個列只返回一次。外部聯結是指聯結包含了那些在相關表中沒有關聯行的行。例如列出所有產品及其訂購數量,包括沒有人訂購的產品。LEFT OUTER JOIN指選擇左邊表的所有行。
組合查詢是指採用UNION等將兩個查詢結果取並集。
視圖是查看存儲在別處的數據的一種工具,它本身並不包含數據,因此表的數據修改了,視圖返回的數據也將隨之修改,因此如果使用了複雜或嵌套視圖會對性能有較大的影響。視圖的作用之一是隱藏複雜的SQL通常會涉及到聯結查詢。
存儲過程類似於批處理,包含了一條或多條SQL語句。語法:
CREATE PROCEDURE name()
BEGIN
SQL
END
————————-
CALL name()//來調用存儲過程
游標有DECLARE定義,游標與存儲過程是綁定的,存儲過程處理完成,游標就會消失。游標被打開後可以使用FETCH語句訪問每一行。
觸發器是在某個時間發生時自動執行某條SQL語句。語法:
CREATE TRIGGER name AFTER INSERT ON talbe_name FOR EACH ROW
事務處理可以維護數據庫的完整性,保證批量的操作要麼完全執行,要麼完全不執行。包括事務、回退、提交、保留點幾個關鍵術語。ROLLBACK只能在一個事務處理內使用。他不能回退CREATE和DROP操作。使用COMMIT保證事務提交。複雜的事務處理需要部分提交或回退,因此我們需要使用保留點SAVEPOINT。可以使用ROLLBACK TO savepoint_name。保留點越多越好。保留點在事務執行完成後自動釋放。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/158554.html