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值的列。
列經常操縱不應該被索引。