设为首页 收藏本站
查看: 652|回复: 0

[经验分享] SQL语法2

[复制链接]

尚未签到

发表于 2018-10-22 11:43:14 | 显示全部楼层 |阅读模式
  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值的列。
  •   列经常操纵不应该被索引。



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-624939-1-1.html 上篇帖子: SQL大量数据查询的优化 下篇帖子: sql语句查询执行过程
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表