在mysql中 创建视图需要使用_语句_在MySQL中创建视图的X种方式
在本教程中,您將學(xué)習(xí)如何使用CREATE VIEW語(yǔ)句在MySQL中創(chuàng)建視圖。
CREATE VIEW語(yǔ)句簡(jiǎn)介
要在MySQL中創(chuàng)建新視圖,請(qǐng)使用CREATE VIEW語(yǔ)句。 在MySQL中創(chuàng)建視圖的語(yǔ)法如下:CREATE
[ALGORITHM = {MERGE | TEMPTABLE | UNDEFINED}]
VIEW [database_name].[view_name]
AS
[SELECT statement]
讓我們更詳細(xì)地查看了解以上語(yǔ)法。
視圖處理算法
算法屬性允許您控制MySQL在創(chuàng)建視圖時(shí)使用的機(jī)制。MySQL提供三種算法:MERGE,TEMP TABLE和UNDEFINED。
- 使用MERGE算法,MySQL首先將輸入查詢(xún)與定義視圖的SELECT語(yǔ)句組合成單個(gè)查詢(xún)。 然后MySQL執(zhí)行組合查詢(xún)以返回結(jié)果集。如果SELECT語(yǔ)句包含聚合函數(shù),如:MIN, MAX, SUM, COUNT, AVG或DISTINCT, GROUP BY, HAVING, LIMIT, UNION, UNION ALL,子查詢(xún) 等等則不允許MERGE算法。如果SELECT語(yǔ)句沒(méi)有引用表,則也不允許MERGE算法。如果不允許MERGE算法,MySQL將算法更改為UNDEFINED。 注意,輸入查詢(xún)和視圖定義中的查詢(xún)到一個(gè)查詢(xún)的組合被稱(chēng)為視圖決議。
- 使用TEMP TABLE算法,MySQL首先根據(jù)定義視圖的SELECT語(yǔ)句創(chuàng)建一個(gè)臨時(shí)表,然后對(duì)該臨時(shí)表執(zhí)行輸入查詢(xún)。因?yàn)镸ySQL必須創(chuàng)建一個(gè)臨時(shí)表來(lái)存儲(chǔ)結(jié)果集,并將數(shù)據(jù)從基表移動(dòng)到臨時(shí)表,TEMP TABLE算法的效率低于MERGE算法。此外,使用TEMP TABLE算法的視圖不可更新。UNDEFINED是創(chuàng)建視圖時(shí)未指定顯式算法的默認(rèn)算法。UNDEFINED算法讓MySQL做出選擇使用MERGE或TEMP TABLE算法。MySQL優(yōu)先選擇MERGE算法再到TEMP TABLE算法,因?yàn)镸ERGE算法更有效率。
視圖名稱(chēng)
在數(shù)據(jù)庫(kù)中,視圖和表共享相同命名空間,因此,視圖和表不能具有相同的名稱(chēng)。 此外,視圖的名稱(chēng)必須遵循表命名規(guī)則。
SELECT語(yǔ)句
在SELECT語(yǔ)句中,可以從數(shù)據(jù)庫(kù)中存在的任何表或視圖查詢(xún)數(shù)據(jù)。SELECT語(yǔ)句必須遵循幾個(gè)規(guī)則:
- SELECT語(yǔ)句可以在WHERE子句中包含子查詢(xún),但不能在FROM子句中。
- SELECT語(yǔ)句不能引用任何變量,包括局部變量,用戶(hù)變量和會(huì)話(huà)變量。
- SELECT語(yǔ)句不能引用預(yù)處理語(yǔ)句的參數(shù)。
注意,SELECT語(yǔ)句不需要引用任何表。
創(chuàng)建MySQL視圖示例
創(chuàng)建簡(jiǎn)單視圖
讓我們來(lái)看看 order_detail 表。可以創(chuàng)建一個(gè)表示每個(gè)訂單的總銷(xiāo)售額的視圖。CREATE VIEW SalePerOrder AS
SELECT
order_id, SUM(buy_number * price) total
FROM
studymysql.order_detail
GROUP by order_id
ORDER BY total DESC;
如果使用SHOW TABLES命令查看studymysql數(shù)據(jù)庫(kù)中的所有表,我們還會(huì)看到SalesPerOrder視圖顯示在列表中。SHOW TABLES;
這是因?yàn)橐晥D和表共享同一個(gè)命名空間。如要知道哪個(gè)對(duì)象是視圖或表,請(qǐng)使用SHOW FULL TABLES命令,如下所示:
結(jié)果集中的 table_type 列指定哪個(gè)對(duì)象是視圖,哪個(gè)對(duì)象是表(基表)。
如果我們要查詢(xún)每個(gè)銷(xiāo)售訂單的總銷(xiāo)售額,只需要按照如下所示對(duì)SalePerOrder視圖執(zhí)行一個(gè)簡(jiǎn)單的SELECT語(yǔ)句:SELECT
*
FROM
salePerOrder;
執(zhí)行上面的語(yǔ)句,結(jié)果如下 -
基于一個(gè)視圖來(lái)創(chuàng)建視圖
MySQL允許您基于一個(gè)視圖來(lái)創(chuàng)建另一個(gè)視圖。例如,您可以基于SalesPerOrder視圖創(chuàng)建名為大銷(xiāo)售訂單的視圖,以顯示總數(shù)大于150,000的銷(xiāo)售訂單,如下所示:CREATE VIEW BigSalesOrder AS
SELECT
order_id, ROUND(total,2) as total
FROM
saleperorder
WHERE
total > 150000;
現(xiàn)在,我們可以從BigSalesOrder視圖中查詢(xún)數(shù)據(jù),如下所示:SELECT
order_id, total
FROM
BigSalesOrder;
執(zhí)行上面的語(yǔ)句,結(jié)果如下 -
使用join創(chuàng)建視圖
以下是使用INNER JOIN創(chuàng)建視圖的示例。視圖包含訂單號(hào),客戶(hù)名稱(chēng)和每個(gè)訂單的總銷(xiāo)售額。CREATE VIEW customerOrders AS
SELECT
o.order_number,
c.customer_name,
SUM(buy_number * price) total
FROM
studymysql.order_detail d
INNER JOIN
studymysql.order o ON o.order_id = d.order_id
INNER JOIN
studymysql.customer c ON c.customer_id = o.customer_id
GROUP BY o.order_number
ORDER BY total DESC;
要從customerOrders視圖中查詢(xún)數(shù)據(jù),請(qǐng)使用以下查詢(xún):SELECT
*
FROM
customerOrders;
執(zhí)行上面的語(yǔ)句,結(jié)果如下 -
使用子查詢(xún)創(chuàng)建視圖
下面說(shuō)明如何使用子查詢(xún)創(chuàng)建視圖。該視圖包含價(jià)格高于所有產(chǎn)品的平均價(jià)格的產(chǎn)品。CREATE VIEW aboveAvgProducts AS
SELECT
product_code, product_name, price
FROM
studymysql.product
WHERE
price >
(SELECT
AVG(price)
FROM
studymysql.product)
ORDER BY price DESC;
從上述aboveAvgProducts視圖中查詢(xún)數(shù)據(jù)很簡(jiǎn)單,如下所示:SELECT
*
FROM
aboveAvgProducts;
在本教程中,我們向您展示了如何使用CREATE VIEW語(yǔ)句創(chuàng)建視圖。
相關(guān)教程MySQL中的視圖
數(shù)據(jù)庫(kù)視圖簡(jiǎn)介
管理MySQL中的視圖
MySQL學(xué)習(xí)QQ群:418407075
總結(jié)
以上是生活随笔為你收集整理的在mysql中 创建视图需要使用_语句_在MySQL中创建视图的X种方式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 图像加噪c语言,[转载]使用imnois
- 下一篇: Html软件进度计划,施工进度计划表软件