SQL語法2

SQL SELECT語句用來從數據庫表獲取數據返回表形式數據的結果。這些結果表被稱爲結果集。

語法

SELECT語句的基本語法如下:

SELECT column1, column2, columnN FROM table_name;

這裏, column1, column2...是要獲取其值的表的字段。 如果你想獲取所有可用字段,那麼可以使用下面的語法:

SELECT * FROM table_name;

例子:

考慮CUSTOMERS表具有以下記錄:

+----+----------+-----+-----------+----------+
| ID | NAME     | AGE | ADDRESS   | SALARY   |
+----+----------+-----+-----------+----------+
|  1 | Ramesh   |  32 | Ahmedabad |  2000.00 |
|  2 | Khilan   |  25 | Delhi     |  1500.00 |
|  3 | kaushik  |  23 | Kota      |  2000.00 |
|  4 | Chaitali |  25 | Mumbai    |  6500.00 |
|  5 | Hardik   |  27 | Bhopal    |  8500.00 |
|  6 | Komal    |  22 | MP        |  4500.00 |
|  7 | Muffy    |  24 | Indore    | 10000.00 |
+----+----------+-----+-----------+----------+

下面是一個例子,這將獲取CUSTOMERS表中可用的客戶的ID, Name 和 Salary:

SQL> SELECT ID, NAME, SALARY FROM CUSTOMERS;

這將產生以下結果:

+----+----------+----------+
| ID | NAME     | SALARY   |
+----+----------+----------+
|  1 | Ramesh   |  2000.00 |
|  2 | Khilan   |  1500.00 |
|  3 | kaushik  |  2000.00 |
|  4 | Chaitali |  6500.00 |
|  5 | Hardik   |  8500.00 |
|  6 | Komal    |  4500.00 |
|  7 | Muffy    | 10000.00 |
+----+----------+----------+

如果你想獲取CUSTOMERS表中的所有字段,那麼可使用以下查詢:

SQL> SELECT * FROM CUSTOMERS;

這將產生以下結果:

+----+----------+-----+-----------+----------+
| ID | NAME     | AGE | ADDRESS   | SALARY   |
+----+----------+-----+-----------+----------+
|  1 | Ramesh   |  32 | Ahmedabad |  2000.00 |
|  2 | Khilan   |  25 | Delhi     |  1500.00 |
|  3 | kaushik  |  23 | Kota      |  2000.00 |
|  4 | Chaitali |  25 | Mumbai    |  6500.00 |
|  5 | Hardik   |  27 | Bhopal    |  8500.00 |
|  6 | Komal    |  22 | MP        |  4500.00 |
|  7 | Muffy    |  24 | Indore    | 10000.00 |
+----+----------+-----+-----------+----------+

表達式是一個或多個值,運算符和SQL函數計算結果的值的組合。

SQL表達式與公式相似,他們編寫查詢語言。您也可以使用它們來查詢數據庫中的特定的數據集。

語法

考慮SELECT語句的基本語法如下:

SELECT column1, column2, columnN 
FROM table_name 
WHERE [CONDITION|EXPRESSION];

有不同類型的SQL表達式,其中可提到如下面:

SQL - 布爾表達式:

SQL布爾表達式提取匹配單個值爲基礎的數據。下面是語法:

SELECT column1, column2, columnN 
FROM table_name 
WHERE SINGLE VALUE MATCHTING EXPRESSION;

考慮CUSTOMERS表具有以下記錄:

SQL> SELECT * FROM CUSTOMERS;
+----+----------+-----+-----------+----------+
| ID | NAME     | AGE | ADDRESS   | SALARY   |
+----+----------+-----+-----------+----------+
|  1 | Ramesh   |  32 | Ahmedabad |  2000.00 |
|  2 | Khilan   |  25 | Delhi     |  1500.00 |
|  3 | kaushik  |  23 | Kota      |  2000.00 |
|  4 | Chaitali |  25 | Mumbai    |  6500.00 |
|  5 | Hardik   |  27 | Bhopal    |  8500.00 |
|  6 | Komal    |  22 | MP        |  4500.00 |
|  7 | Muffy    |  24 | Indore    | 10000.00 |
+----+----------+-----+-----------+----------+
7 rows in set (0.00 sec)

下面是簡單的例子,顯示SQL布爾表達式的用法:

SQL> SELECT * FROM CUSTOMERS WHERE SALARY = 10000;
+----+-------+-----+---------+----------+
| ID | NAME  | AGE | ADDRESS | SALARY   |
+----+-------+-----+---------+----------+
|  7 | Muffy |  24 | Indore  | 10000.00 |
+----+-------+-----+---------+----------+
1 row in set (0.00 sec)

SQL - 數字表達式:

這個表達式用來在任何查詢執行任何數學運算。下面是語法:

SELECT numerical_expression as  OPERATION_NAME[FROM table_name
WHERE CONDITION] ;

這裏數值表達式被用於數學表達式或任何公式。 下面是一個簡單的例子,顯示SQL數字表達式的用法:

SQL> SELECT (15 + 6) AS ADDITION
+----------+
| ADDITION |
+----------+
|       21 |
+----------+
1 row in set (0.00 sec)

還有像一些內置函數avg(), sum(), count()等,執行了被稱爲數據計算對錶或特定的表列集合體。

SQL> SELECT COUNT(*) AS "RECORDS" FROM CUSTOMERS; 
+---------+
| RECORDS |
+---------+
|       7 |
+---------+
1 row in set (0.00 sec)

SQL - 日期表達式:

日期表達式返回當前系統日期和時間值:

SQL>  SELECT CURRENT_TIMESTAMP;
+---------------------+
| Current_Timestamp   |
+---------------------+
| 2009-11-12 06:40:23 |
+---------------------+
1 row in set (0.00 sec)

另一個日期表達式如下:

SQL>  SELECT  GETDATE();
+-------------------------+
| GETDATE                 |
+-------------------------+
| 2009-10-22 12:07:18.140 |
+-------------------------+
1 row in set (0.00 sec)

HAVING子句允許您指定過濾器的條件,分組結果會出現在最終結果。

WHERE子句所選列的條件,而由GROUP BY子句條件創建分組的HAVING子句。

語法

下面是HAVING子句在查詢中的位置:

SELECT
FROM
WHERE
GROUP BY
HAVING
ORDER BY

HAVING子句必須遵循GROUP BY子句中的查詢,如果使用也必須先於ORDER BY子句。 下面是SELECT語句,包括HAVING子句的語法:

SELECT column1, column2
FROM table1, table2
WHERE [ conditions ]
GROUP BY column1, column2
HAVING [ conditions ]
ORDER BY column1, column2

例子:

考慮CUSTOMERS表具有以下記錄:

+----+----------+-----+-----------+----------+
| ID | NAME     | AGE | ADDRESS   | SALARY   |
+----+----------+-----+-----------+----------+
|  1 | Ramesh   |  32 | Ahmedabad |  2000.00 |
|  2 | Khilan   |  25 | Delhi     |  1500.00 |
|  3 | kaushik  |  23 | Kota      |  2000.00 |
|  4 | Chaitali |  25 | Mumbai    |  6500.00 |
|  5 | Hardik   |  27 | Bhopal    |  8500.00 |
|  6 | Komal    |  22 | MP        |  4500.00 |
|  7 | Muffy    |  24 | Indore    | 10000.00 |
+----+----------+-----+-----------+----------+

下面是示例,這將顯示記錄age大於或等於2的數據量:

SQL > SELECT ID, NAME, AGE, ADDRESS, SALARY
FROM CUSTOMERS
GROUP BY age
HAVING COUNT(age) >= 2;

這將產生以下結果:

+----+--------+-----+---------+---------+
| ID | NAME   | AGE | ADDRESS | SALARY  |
+----+--------+-----+---------+---------+
|  2 | Khilan |  25 | Delhi   | 1500.00 |
+----+--------+-----+---------+---------+

子查詢

子查詢或內部查詢或嵌套查詢在另一個SQL查詢的查詢和嵌入式WHERE子句中。

子查詢用於返回將被用於在主查詢作爲條件的數據,以進一步限制要檢索的數據。

子查詢可以在SELECT,INSERT,UPDATE使用,而且隨着運算符如DELETE語句 =, <, >, >=, <=, IN, BETWEEN 等.

這裏有一些規則,子查詢必須遵循:

  • 子查詢必須被圓括號括起來。

  • 子查詢只能在有一列的SELECT子句中,除非多個列中的子查詢,以比較其選定列主查詢。

  • ORDER BY不能在子查詢中使用,主查詢可以使用ORDER BY。GROUP BY可以用來在子查詢中如ORDER BY執行相同的功能。

  • 返回多於一個行子查詢只能用於具有多個值運算符,如IN操作。

  • SELECT列表中不能包含到值計算到任何引用 BLOB, ARRAY, CLOB, 或NCLOB.

  • 子查詢不能立即封閉在一組函數。

  • BETWEEN 操作符不能與子查詢使用;然而,操作符BETWEEN可以在子查詢中使用。

子查詢SELECT語句:

子查詢最頻繁使用的SELECT語句。其基本語法如下:

SELECT column_name [, column_name ]
FROM   table1 [, table2 ]
WHERE  column_name OPERATOR      
      (SELECT column_name [, column_name ]
      FROM table1 [, table2 ]
      [WHERE])

例子:

考慮CUSTOMERS表具有以下記錄:

+----+----------+-----+-----------+----------+
| ID | NAME     | AGE | ADDRESS   | SALARY   |
+----+----------+-----+-----------+----------+
|  1 | Ramesh   |  35 | Ahmedabad |  2000.00 |
|  2 | Khilan   |  25 | Delhi     |  1500.00 |
|  3 | kaushik  |  23 | Kota      |  2000.00 |
|  4 | Chaitali |  25 | Mumbai    |  6500.00 |
|  5 | Hardik   |  27 | Bhopal    |  8500.00 |
|  6 | Komal    |  22 | MP        |  4500.00 |
|  7 | Muffy    |  24 | Indore    | 10000.00 |
+----+----------+-----+-----------+----------+

現在,讓我們檢查下使用子查詢SELECT語句:

SQL> SELECT * 
     FROM CUSTOMERS 
     WHERE ID IN (SELECT ID 
                  FROM CUSTOMERS 
                  WHERE SALARY > 4500) ;

這將產生以下結果:

+----+----------+-----+---------+----------+
| ID | NAME     | AGE | ADDRESS | SALARY   |
+----+----------+-----+---------+----------+
|  4 | Chaitali |  25 | Mumbai  |  6500.00 |
|  5 | Hardik   |  27 | Bhopal  |  8500.00 |
|  7 | Muffy    |  24 | Indore  | 10000.00 |
+----+----------+-----+---------+----------+

子查詢的INSERT語句:

子查詢,也可以使用INSERT語句。INSERT語句使用從子查詢返回的數據插入到另一個表中。在子查詢中的所選擇的數據可以與任何類型的字符,日期或數字函數進行修改。

其基本語法如下:

INSERT INTO table_name [ (column1 [, column2 ]) ]
           SELECT [ *|column1 [, column2 ]
           FROM table1 [, table2 ]
           [ WHERE VALUE OPERATOR ]

示例:

考慮CUSTOMERS_BKP表的結構相似於CUSTOMERS表。考慮CUSTOMERS_BKP表的結構相似於CUSTOMERS表。

SQL> INSERT INTO CUSTOMERS_BKP
     SELECT * FROM CUSTOMERS 
     WHERE ID IN (SELECT ID 
                  FROM CUSTOMERS) ;

子查詢的UPDATE語句:

子查詢可以與UPDATE語句一起使用。單個或多個表中的列可以使用帶有UPDATE語句子查詢時被更新。

其基本語法如下:

UPDATE table
SET column_name = new_value[ WHERE OPERATOR [ VALUE ]
   (SELECT COLUMN_NAME
   FROM TABLE_NAME)
   [ WHERE) ]

示例:

假設,我們的CUSTOMERS_BKP表是CUSTOMERS表的備份。

下面的例子是在CUSTOMERS表更新0.25倍薪水,其年齡大於或等於27所有的客戶:

SQL> UPDATE CUSTOMERS
     SET SALARY = SALARY * 0.25
     WHERE AGE IN (SELECT AGE FROM CUSTOMERS_BKP
                   WHERE AGE >= 27 );

這將影響到兩行,最後CUSTOMERS表將有以下記錄:

+----+----------+-----+-----------+----------+
| ID | NAME     | AGE | ADDRESS   | SALARY   |
+----+----------+-----+-----------+----------+
|  1 | Ramesh   |  35 | Ahmedabad |   125.00 |
|  2 | Khilan   |  25 | Delhi     |  1500.00 |
|  3 | kaushik  |  23 | Kota      |  2000.00 |
|  4 | Chaitali |  25 | Mumbai    |  6500.00 |
|  5 | Hardik   |  27 | Bhopal    |  2125.00 |
|  6 | Komal    |  22 | MP        |  4500.00 |
|  7 | Muffy    |  24 | Indore    | 10000.00 |
+----+----------+-----+-----------+----------+

子查詢的DELETE語句:

子查詢可配合使用像上述的任何其他語句DELETE語句。

其基本語法如下:

DELETE FROM TABLE_NAME[ WHERE OPERATOR [ VALUE ]
   (SELECT COLUMN_NAME
   FROM TABLE_NAME)
   [ WHERE) ]

示例:

假設,我們的CUSTOMERS_BKP表是CUSTOMERS表的備份。

下面的示例將刪除CUSTOMERS表記錄其年齡大於或等於27所有的客戶:

SQL> DELETE FROM CUSTOMERS
     WHERE AGE IN (SELECT AGE FROM CUSTOMERS_BKP
                   WHERE AGE > 27 );

這將影響到兩行,最後CUSTOMERS表將有以下記錄:

+----+----------+-----+---------+----------+
| ID | NAME     | AGE | ADDRESS | SALARY   |
+----+----------+-----+---------+----------+
|  2 | Khilan   |  25 | Delhi   |  1500.00 |
|  3 | kaushik  |  23 | Kota    |  2000.00 |
|  4 | Chaitali |  25 | Mumbai  |  6500.00 |
|  6 | Komal    |  22 | MP      |  4500.00 |
|  7 | Muffy    |  24 | Indore  | 10000.00 |
+----+----------+-----+---------+----------+


JOIN鏈接

SQL Join聯接子句用於在兩個或更多在數據庫中的表的記錄組合。JOIN是通過使用從兩個表字段共通的值組合連接起來。

考慮下面的兩個表中,(a)CUSTOMERS表如下:

+----+----------+-----+-----------+----------+
| ID | NAME     | AGE | ADDRESS   | SALARY   |
+----+----------+-----+-----------+----------+
|  1 | Ramesh   |  32 | Ahmedabad |  2000.00 |
|  2 | Khilan   |  25 | Delhi     |  1500.00 |
|  3 | kaushik  |  23 | Kota      |  2000.00 |
|  4 | Chaitali |  25 | Mumbai    |  6500.00 |
|  5 | Hardik   |  27 | Bhopal    |  8500.00 |
|  6 | Komal    |  22 | MP        |  4500.00 |
|  7 | Muffy    |  24 | Indore    | 10000.00 |
+----+----------+-----+-----------+----------+

(b)另一個表的命令如下:

+-----+---------------------+-------------+--------+
|OID  | DATE                | CUSTOMER_ID | AMOUNT |
+-----+---------------------+-------------+--------+
| 102 | 2009-10-08 00:00:00 |           3 |   3000 |
| 100 | 2009-10-08 00:00:00 |           3 |   1500 |
| 101 | 2009-11-20 00:00:00 |           2 |   1560 |
| 103 | 2008-05-20 00:00:00 |           4 |   2060 |
+-----+---------------------+-------------+--------+

現在,讓我們在SELECT語句中聯接這兩個表如下:

SQL> SELECT ID, NAME, AGE, AMOUNT
        FROM CUSTOMERS, ORDERS
        WHERE  CUSTOMERS.ID = ORDERS.CUSTOMER_ID;

這將產生以下結果:

+----+----------+-----+--------+
| ID | NAME     | AGE | AMOUNT |
+----+----------+-----+--------+
|  3 | kaushik  |  23 |   3000 |
|  3 | kaushik  |  23 |   1500 |
|  2 | Khilan   |  25 |   1560 |
|  4 | Chaitali |  25 |   2060 |
+----+----------+-----+--------+

在這裏,值得注意的是,在WHERE子句中加Join。幾家運算符可以用來連接表,如=, <, >, <>, <=, >=, !=, BETWEEN, LIKE, 和 NOT; 他們都可以被用來連接表。然而,最常見的運算符是等於符號。

SQL Join 類型:

在SQL連接有不同類型可用:

  • INNER JOIN: 返回記錄當兩個表有匹配。

  • LEFT JOIN: 返回左表中所有的行,即使右表中沒有匹配。

  • RIGHT JOIN: 返回右表中所有的行,即使有在左表中沒有匹配。

  • FULL JOIN: 返回表中匹配的所有行。

  • SELF JOIN: 是用來連接表本身,如果表有兩張表,暫時改名至少在一個表中的SQL語句。

  • CARTESIAN JOIN: 返回來自兩個或更多個聯接的表的記錄的集合的笛卡爾乘積。


ORDER BY子句

SQL ORDER BY子句用於按升序或降序排序數據在一列或多列的基礎上。一些數據庫默認排序查詢結果按升序排列。

語法

ORDER BY子句的基本語法如下:

SELECT column-list 
FROM table_name 
[WHERE condition] 
[ORDER BY column1, column2, .. columnN]
[ASC | DESC];

您可以在ORDER BY子句使用多列。確保任何列使用排序,column應該是在column-list中。

例子:

考慮CUSTOMERS表具有以下記錄:

+----+----------+-----+-----------+----------+
| ID | NAME     | AGE | ADDRESS   | SALARY   |
+----+----------+-----+-----------+----------+
|  1 | Ramesh   |  32 | Ahmedabad |  2000.00 |
|  2 | Khilan   |  25 | Delhi     |  1500.00 |
|  3 | kaushik  |  23 | Kota      |  2000.00 |
|  4 | Chaitali |  25 | Mumbai    |  6500.00 |
|  5 | Hardik   |  27 | Bhopal    |  8500.00 |
|  6 | Komal    |  22 | MP        |  4500.00 |
|  7 | Muffy    |  24 | Indore    | 10000.00 |
+----+----------+-----+-----------+----------+

下面是一個例子,將結果通過NAME和SALARY升序排序:

SQL> SELECT * FROM CUSTOMERS
     ORDER BY NAME, SALARY;

這將產生以下結果:

+----+----------+-----+-----------+----------+
| ID | NAME     | AGE | ADDRESS   | SALARY   |
+----+----------+-----+-----------+----------+
|  4 | Chaitali |  25 | Mumbai    |  6500.00 |
|  5 | Hardik   |  27 | Bhopal    |  8500.00 |
|  3 | kaushik  |  23 | Kota      |  2000.00 |
|  2 | Khilan   |  25 | Delhi     |  1500.00 |
|  6 | Komal    |  22 | MP        |  4500.00 |
|  7 | Muffy    |  24 | Indore    | 10000.00 |
|  1 | Ramesh   |  32 | Ahmedabad |  2000.00 |
+----+----------+-----+-----------+----------+

下面是一個例子,這將結果通過NAME降序排序:

SQL> SELECT * FROM CUSTOMERS
     ORDER BY NAME DESC;

這將產生以下結果:

+----+----------+-----+-----------+----------+
| ID | NAME     | AGE | ADDRESS   | SALARY   |
+----+----------+-----+-----------+----------+
|  1 | Ramesh   |  32 | Ahmedabad |  2000.00 |
|  7 | Muffy    |  24 | Indore    | 10000.00 |
|  6 | Komal    |  22 | MP        |  4500.00 |
|  2 | Khilan   |  25 | Delhi     |  1500.00 |
|  3 | kaushik  |  23 | Kota      |  2000.00 |
|  5 | Hardik   |  27 | Bhopal    |  8500.00 |
|  4 | Chaitali |  25 | Mumbai    |  6500.00 |


group by

SQL GROUP BY子句用於協同SELECT語句用來安排相同的數據分組。

GROUP BY子句在SELECT語句的WHERE子句之後並ORDER BY子句之前。

語法

GROUP BY子句的基本語法如下。GROUP BY子句中必須遵循WHERE子句中的條件,如果使用必須先於ORDER BY子句。

SELECT column1, column2
FROM table_name
WHERE [ conditions ]GROUP BY column1, column2
ORDER BY column1, column2

例子:

考慮到CUSTOMERS表具有以下記錄:

+----+----------+-----+-----------+----------+
| ID | NAME     | AGE | ADDRESS   | SALARY   |
+----+----------+-----+-----------+----------+
|  1 | Ramesh   |  32 | Ahmedabad |  2000.00 |
|  2 | Khilan   |  25 | Delhi     |  1500.00 |
|  3 | kaushik  |  23 | Kota      |  2000.00 |
|  4 | Chaitali |  25 | Mumbai    |  6500.00 |
|  5 | Hardik   |  27 | Bhopal    |  8500.00 |
|  6 | Komal    |  22 | MP        |  4500.00 |
|  7 | Muffy    |  24 | Indore    | 10000.00 |
+----+----------+-----+-----------+----------+

如果你想知道每個客戶的薪水的總額,使用GROUP BY查詢如下所示:

SQL> SELECT NAME, SUM(SALARY) FROM CUSTOMERS
     GROUP BY NAME;

這將產生以下結果:

+----------+-------------+
| NAME     | SUM(SALARY) |
+----------+-------------+
| Chaitali |     6500.00 |
| Hardik   |     8500.00 |
| kaushik  |     2000.00 |
| Khilan   |     1500.00 |
| Komal    |     4500.00 |
| Muffy    |    10000.00 |
| Ramesh   |     2000.00 |
+----------+-------------+

現在,讓我們有如下表,客戶表中有以下重名記錄:

+----+----------+-----+-----------+----------+
| ID | NAME     | AGE | ADDRESS   | SALARY   |
+----+----------+-----+-----------+----------+
|  1 | Ramesh   |  32 | Ahmedabad |  2000.00 |
|  2 | Ramesh   |  25 | Delhi     |  1500.00 |
|  3 | kaushik  |  23 | Kota      |  2000.00 |
|  4 | kaushik  |  25 | Mumbai    |  6500.00 |
|  5 | Hardik   |  27 | Bhopal    |  8500.00 |
|  6 | Komal    |  22 | MP        |  4500.00 |
|  7 | Muffy    |  24 | Indore    | 10000.00 |
+----+----------+-----+-----------+----------+

現在如果你想知道的薪水對每個客戶的總金額,使用GROUP BY查詢將如下:

SQL> SELECT NAME, SUM(SALARY) FROM CUSTOMERS
     GROUP BY NAME;

這將產生以下結果:

+---------+-------------+
| NAME    | SUM(SALARY) |
+---------+-------------+
| Hardik  |     8500.00 |
| kaushik |     8500.00 |
| Komal   |     4500.00 |
| Muffy   |    10000.00 |
| Ramesh  |     3500.00 |
+---------+-------------+

視圖

視圖無非是存儲在數據庫中的相關名稱的SQL語句。視圖實際上是一個表中的預定義的SQL查詢形式的組合物。

視圖可以包含一個表中的所有行或從表中選擇部分行。視圖可以從一個或多個表取決於書面SQL查詢來創建。

視圖是一種虛擬表,讓用戶做到以下幾點:

  • 用戶或用戶類別的找到天然或直觀的結構數據的方式。

  • 限制訪問的數據,使得用戶可以看到,(有時)修改確實需要或不需要更多。

  • 彙總可從表中的數據生成各種報告。

創建視圖:

使用CREATE VIEW語句創建數據庫視圖。 視圖可以從一個單一的表,多個表或另一視圖中創建。

要創建視圖,用戶必須根據具體的實施有相應的系統權限。

CREATE VIEW基本的語法如下:

CREATE VIEW view_name AS
SELECT column1, column2.....FROM table_name
WHERE [condition];

可以包括在正常使用的SQL SELECT查詢類似的方式,在SELECT語句中的多個表。

例子:

考慮CUSTOMERS表具有以下記錄:

+----+----------+-----+-----------+----------+
| ID | NAME     | AGE | ADDRESS   | SALARY   |
+----+----------+-----+-----------+----------+
|  1 | Ramesh   |  32 | Ahmedabad |  2000.00 |
|  2 | Khilan   |  25 | Delhi     |  1500.00 |
|  3 | kaushik  |  23 | Kota      |  2000.00 |
|  4 | Chaitali |  25 | Mumbai    |  6500.00 |
|  5 | Hardik   |  27 | Bhopal    |  8500.00 |
|  6 | Komal    |  22 | MP        |  4500.00 |
|  7 | Muffy    |  24 | Indore    | 10000.00 |
+----+----------+-----+-----------+----------+

現在,下面的例子創建客戶表的視圖。這個視圖將用於從CUSTOMERS表讀取客戶姓名和年齡:

SQL > CREATE VIEW CUSTOMERS_VIEW AS
SELECT name, age
FROM  CUSTOMERS;

現在,你可以查詢CUSTOMERS_VIEW類似的方式來查詢實際的表。 下面是一個例子:

SQL > SELECT * FROM CUSTOMERS_VIEW;

這將產生以下結果:

+----------+-----+
| name     | age |
+----------+-----+
| Ramesh   |  32 |
| Khilan   |  25 |
| kaushik  |  23 |
| Chaitali |  25 |
| Hardik   |  27 |
| Komal    |  22 |
| Muffy    |  24 |
+----------+-----+

WITH CHECK OPTION:

WITH CHECK OPTION是CREATE VIEW語句選項。WITH CHECK OPTION的目的是爲了確保所有更新和插入滿足視圖定義的條件。

如果它沒有滿足條件,在UPDATE或INSERT返回一個錯誤。

以下是創建CUSTOMERS_VIEW 視圖例子使用WITH CHECK OPTION:

CREATE VIEW CUSTOMERS_VIEW AS
SELECT name, age
FROM  CUSTOMERS
WHERE age IS NOT NULL
WITH CHECK OPTION;

在這種情況下,WITH CHECK OPTION拒絕任何NULL值條目在視圖的AGE列,因爲該視圖由數據定義的不能在AGE欄中有NULL值。

更新視圖:

視圖在一定條件下可以更新:

  • SELECT子句不包含關鍵字DISTINCT。

  • SELECT子句不包含彙總函數。

  • SELECT子句不包含集合函數。

  • SELECT子句不能包含集合運算符。

  • SELECT子句不能包含一個ORDER BY子句。

  • FROM子句中不能包含多個表。

  • WHERE子句不能包含子查詢。

  • 查詢不包含GROUP BY或HAVING。

  • 計算列無法更新。

  • 從基表中的所有NOT NULL列必須包含在視圖是爲了使用INSERT查詢功能。

所以,如果一個視圖滿足所有上述規則,那麼就可以更新視圖。下面是一個例子,更新Ramesh的年齡:

SQL > UPDATE CUSTOMERS_VIEW
      SET AGE = 35
      WHERE name='Ramesh';

這最終將更新基礎表CUSTOMERS,並同樣在視圖中反映。現在,試着查詢基礎表,SELECT語句將產生如下結果:

+----+----------+-----+-----------+----------+
| ID | NAME     | AGE | ADDRESS   | SALARY   |
+----+----------+-----+-----------+----------+
|  1 | Ramesh   |  35 | Ahmedabad |  2000.00 |
|  2 | Khilan   |  25 | Delhi     |  1500.00 |
|  3 | kaushik  |  23 | Kota      |  2000.00 |
|  4 | Chaitali |  25 | Mumbai    |  6500.00 |
|  5 | Hardik   |  27 | Bhopal    |  8500.00 |
|  6 | Komal    |  22 | MP        |  4500.00 |
|  7 | Muffy    |  24 | Indore    | 10000.00 |
+----+----------+-----+-----------+----------+

將行插入視圖:

數據行可以插入的視圖。適用於UPDATE命令規則同樣也適用於INSERT命令。

在這裏,我們也不能插入行到CUSTOMERS_VIEW,因爲我們還沒有包括在該視圖中的所有NOT NULL列, 否則,你可以插入數據行到視圖,以其插入一個表中類似的方式。

在視圖中刪除行:

可以從視圖中刪除數據行。適用於UPDATE和INSERT命令的規則同樣也適用於DELETE命令。

下面是一個例子刪除其 AGE= 22 的記錄

SQL > DELETE FROM CUSTOMERS_VIEW
      WHERE age = 22;

這將最終從基表CUSTOMERS刪除一行,並同樣在視圖本身也會有反映。現在,試着查詢基礎表,SELECT語句將產生如下結果:

+----+----------+-----+-----------+----------+
| ID | NAME     | AGE | ADDRESS   | SALARY   |
+----+----------+-----+-----------+----------+
|  1 | Ramesh   |  35 | Ahmedabad |  2000.00 |
|  2 | Khilan   |  25 | Delhi     |  1500.00 |
|  3 | kaushik  |  23 | Kota      |  2000.00 |
|  4 | Chaitali |  25 | Mumbai    |  6500.00 |
|  5 | Hardik   |  27 | Bhopal    |  8500.00 |
|  7 | Muffy    |  24 | Indore    | 10000.00 |
+----+----------+-----+-----------+----------+

刪除視圖:

很顯然,在這裏有一個視圖,需要一種方法來刪除這個視圖如果它不再需要。語法很簡單,如下所示:

DROP VIEW view_name;

下面是一個例子是刪除CUSTOMERS客戶表的視圖:

DROP VIEW CUSTOMERS_VIEW;


索引


索引是數據庫的搜索引擎使用,以加快數據檢索特定的查找表。簡單地說,索引是一個指向表中的數據。數據庫中的索引非常類似於在一本書的索引。

例如,如果你想引用一本書的所有頁面以討論某個話題,首先參考索引,其中列出了所有的主題字母順序,然後被轉介到一個或多個特定的頁碼。

索引有助於加快SELECT和WHERE子句查詢,但它會減慢數據輸入,使用UPDATE和INSERT語句。索引可創建或刪除,但對數據不會有影響。

創建索引包括CREATE INDEX語句,它允許重命名索引,指定表和其中一個或多個列索引,並指示索引是否爲升序或降序排序。

索引是唯一的,類似於UNIQUE約束,索引防止在列的列或組合在其上有一個索引重複條目。

CREATE INDEX命令:

CREATE INDEX的基本語法如下:

CREATE INDEX index_name ON table_name;

單列索引:

單列索引是一個基於只有創建表列。 其基本語法如下:

CREATE INDEX index_name
ON table_name (column_name);

唯一索引:

唯一索引不僅用於性能,而且要求數據的完整性。唯一索引不允許有任何重複值插入到表中。 其基本語法如下:

CREATE UNIQUE INDEX index_name
on table_name (column_name);

組合索引:

組合索引在表上的兩個或多個列的索引。其基本語法如下:

CREATE INDEX index_name
on table_name (column1, column2);

是否要創建一個單列索引或複合索引,考慮到列,您可以使用非常頻繁的查詢的WHERE子句作爲過濾條件。

應該有隻有一個使用列,單列指數應的選擇。如果有頻繁使用WHERE子句作爲過濾器中的兩個或多個列,組合索引將是最好的選擇。

隱式索引:

隱式索引是自動由數據庫服務器創建對象時創建的索引。索引是主鍵約束和唯一性約束自動創建。

DROP INDEX命令:

索引可以使用SQL DROP命令刪除。 應當謹慎刪除索引時導致的性能可能會減慢或改善。

其基本語法如下:

DROP INDEX index_name;

您可以查看INDEX約束篇章查看索引的實際例子。

什麼時候避免使用索引?

儘管索引的目的在於提高數據庫的性能,以下幾種情況應該避免使用。以下準則顯示,當使用索引應該重新考慮:

  • 索引不應該用在小型表上。

  • 有頻繁的,大批量更新或插入操作的表。

  • 索引不應該用於對包含大量NULL值的列。

  • 列經常操縱不應該被索引。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章