随笔 - 2649  文章 - 2452  评论 - 0  阅读 - 80424

SQLite 子查询

SQLite 子查询

  • 子查询或称为内部查询、嵌套查询,指的是在 SQLite 查询中的 WHERE 子句中嵌入查询语句。

  • 一个 SELECT 语句的查询结果能够作为另一个语句的输入值。

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

  • 以下是子查询必须遵循的几个规则:

    • 子查询必须用括号括起来。
    • 子查询在 SELECT 子句中只能有一个列,除非在主查询中有多列,与子查询的所选列进行比较。
    • ORDER BY 不能用在子查询中,虽然主查询可以使用 ORDER BY。可以在子查询中使用 GROUP BY,功能与 ORDER BY 相同。
    • 子查询返回多于一行,只能与多值运算符一起使用,如 IN 运算符。
    • 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])
    
  • 实例

  • 假设 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_BKP 的结构与 COMPANY 表相似,且可使用相同的 CREATE TABLE 进行创建,只是表名改为 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 表中所有 AGE 大于或等于 27 的客户的 SALARY 更新为原来的 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 表中所有 AGE 大于或等于 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
    
posted on   AtlasLapetos  阅读(12)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示