|
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语句 =, , >=, 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值的列。
- 列经常操纵不应该被索引。
|
|