开发学院

您的位置:首页>教程>正文

教程正文

SQLite 子查询

SQLite 子查询

  子查询是嵌套在另一个SQL查询中的查询,一般嵌入在WHERE子句中。

  子查询用于返回将在主查询中使用的数据,作为进一步限制要检索数据的条件。

  子查询可以与SELECT、INSERT、UPDATE和DELETE语句以及运算符一起使用,例如 =, <, >, >=, <=, IN, BETWEEN等。

  子查询必须遵循以下几条规则:

  •   子查询必须括在括号内。

  •   一个子查询在SELECT子句中只能有一列,除非该子查询的主查询中有多个列来比较它所选的列。

  •   排序依据不能用于子查询,尽管主查询可以使用排序依据。GROUP BY可用于执行与子查询中的ORDER BY相同的功能。

  •   返回多个行的子查询只能与多个值运算符一起使用,例如IN运算符。

  •   BETWEEN运算符不能用于子查询;但是,可以在子查询中使用介于之间的。

带有SELECT语句的子查询

  子查询最常用于SELECT语句。基本语法如下

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

例子

  假设COMPANY表有如下数据:

ID          NAME        AGE         ADDRESS     SALARY
----------  ----------  ----------  ----------  ----------
1           Paul        32          California  20000.0
2           Allen       25          Texas       15000.0
3           Teddy       23          Norway      20000.0
4           Mark        25          Rich-Mond   65000.0
5           David       27          Texas       85000.0
6           Kim         22          South-Hall  45000.0
7           James       24          Houston     10000.0

  现在,让我们用SELECT语句检查下面的子查询。

sqlite> SELECT * 
   FROM COMPANY 
   WHERE ID IN (SELECT ID 
      FROM COMPANY 
      WHERE SALARY > 45000) ;

  上述操作产生如下结果:

ID          NAME        AGE         ADDRESS     SALARY
----------  ----------  ----------  ----------  ----------
4           Mark        25          Rich-Mond   65000.0
5           David       27          Texas       85000.0

带有INSERT语句的子查询

  子查询也可以与INSERT语句一起使用。INSERT语句使用子查询返回的数据插入到另一个表中。子查询中选定的数据可以使用任何字符、日期或数字函数进行修改。

  以下是基本语法,如下所示:

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

例子

  假设想创建一个与COMPANY表结构相似的表COMPANY_BKP,可以使用 CREATE TABL创建,使用COMPANY_BKP作为表名。将完整的COMPANY表复制到COMPANY_BKP中,以下是语法:

sqlite> INSERT INTO COMPANY_BKP
   SELECT * FROM COMPANY 
   WHERE ID IN (SELECT ID 
      FROM COMPANY) ;

带有UPDATE语句的子查询

  子查询可以与UPDATE语句一起使用。将子查询与UPDATE语句一起使用时,可以更新表中的单列或多列。

  以下是基本语法,如下所示:

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

例子

  假设有COMPANY_BKP表可用,这是COMPANY表的备份。

  以下示例将COMPANY表中所有年龄大于或等于27岁的人工资更新0.50倍。

sqlite> UPDATE COMPANY
   SET SALARY = SALARY * 0.50
   WHERE AGE IN (SELECT AGE FROM COMPANY_BKP
      WHERE AGE >= 27 );

  这将影响两行,最终COMPANY表的记录如下

ID          NAME        AGE         ADDRESS     SALARY
----------  ----------  ----------  ----------  ----------
1           Paul        32          California  10000.0
2           Allen       25          Texas       15000.0
3           Teddy       23          Norway      20000.0
4           Mark        25          Rich-Mond   65000.0
5           David       27          Texas       42500.0
6           Kim         22          South-Hall  45000.0
7           James       24          Houston     10000.0

带有DELETE语句的子查询

  子查询可以与DELETE语句一起使用,就像上面提到的任何其他语句一样。

  以下是基本语法,如下所示:

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

例子

  假设有COMPANY_BKP表可用,这是COMPANY表的备份。

  以下示例从COMPANY表中删除年龄大于或等于27岁的所有记录。

sqlite> DELETE FROM COMPANY
   WHERE AGE IN (SELECT AGE FROM COMPANY_BKP
   WHERE AGE > 27 );

  这将影响两行,最终COMPANY表的记录如下

ID          NAME        AGE         ADDRESS     SALARY
----------  ----------  ----------  ----------  ----------
2           Allen       25          Texas       15000.0
3           Teddy       23          Norway      20000.0
4           Mark        25          Rich-Mond   65000.0
5           David       27          Texas       42500.0
6           Kim         22          South-Hall  45000.0
7           James       24          Houston     10000.0