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_nameWHERE 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子句在查询中的位置:
SELECTFROMWHEREGROUP BYHAVINGORDER BY
HAVING子句必须遵循GROUP BY子句中的查询,如果使用也必须先于ORDER BY子句。 下面是SELECT语句,包括HAVING子句的语法:
SELECT column1, column2FROM table1, table2WHERE [ conditions ]GROUP BY column1, column2HAVING [ 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, SALARYFROM CUSTOMERSGROUP BY ageHAVING 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 tableSET 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连接有不同类型可用:
返回记录当两个表有匹配。
返回左表中所有的行,即使右表中没有匹配。
返回右表中所有的行,即使有在左表中没有匹配。
返回表中匹配的所有行。
是用来连接表本身,如果表有两张表,暂时改名至少在一个表中的SQL语句。
返回来自两个或更多个联接的表的记录的集合的笛卡尔乘积。
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, column2FROM table_nameWHERE [ conditions ]GROUP BY column1, column2ORDER 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 ASSELECT column1, column2.....FROM table_nameWHERE [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 ASSELECT name, ageFROM 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 ASSELECT name, ageFROM CUSTOMERSWHERE age IS NOT NULLWITH 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_nameON table_name (column_name);
唯一索引:
唯一索引不仅用于性能,而且要求数据的完整性。唯一索引不允许有任何重复值插入到表中。 其基本语法如下:
CREATE UNIQUE INDEX index_nameon table_name (column_name);
组合索引:
组合索引在表上的两个或多个列的索引。其基本语法如下:
CREATE INDEX index_nameon table_name (column1, column2);
是否要创建一个单列索引或复合索引,考虑到列,您可以使用非常频繁的查询的WHERE子句作为过滤条件。
应该有只有一个使用列,单列指数应的选择。如果有频繁使用WHERE子句作为过滤器中的两个或多个列,组合索引将是最好的选择。
隐式索引:
隐式索引是自动由数据库服务器创建对象时创建的索引。索引是主键约束和唯一性约束自动创建。
DROP INDEX命令:
索引可以使用SQL DROP命令删除。 应当谨慎删除索引时导致的性能可能会减慢或改善。
其基本语法如下:
DROP INDEX index_name;
您可以查看篇章查看索引的实际例子。
什么时候避免使用索引?
尽管索引的目的在于提高数据库的性能,以下几种情况应该避免使用。以下准则显示,当使用索引应该重新考虑:
索引不应该用在小型表上。
有频繁的,大批量更新或插入操作的表。
索引不应该用于对包含大量NULL值的列。
列经常操纵不应该被索引。