子查询或内部查询或嵌套查询是在另一个SQLite查询内嵌入在WHERE子句中的查询。

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

子查询可以与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 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 FROM TABLE_NAME
[ WHERE OPERATOR [ VALUE ]
   (SELECT COLUMN_NAME
   FROM TABLE_NAME)
   [ WHERE) ]
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

https://www.yuque.com/docs/share/eec5adea-b0eb-4872-a561-d727fb4620b2

SQLite 的 PRAGMA 命令是一个特殊的命令,可以用在 SQLite 环境内控制各种环境变量和状态标志。一个 PRAGMA 值可以被读取,也可以根据需求进行设置。 2、 常用配置 2.1 auto_vacuum 2.1.1 VACUUM 命令通过复制主数据库中的内容到一个临时数据库文件,然后清空主数据库,并从副本中重新载入原始的数据库文件。这消除了空闲页,把表中的数据排列为连续的,另外会清理数据库文件结构。如果表中没有明确的整型主键(), 命令可能会改变表中条目的行 ID()。命令只适用于主数据库 select 表1.*,表2.字段名 where 表1.字段名=表2.字段名;重命名为: select * A.字段名,B.字段名 from 表1 A inner 表2 B on A.字段名=B.字段名; select * 表1.字段名,表2.字段名 from 表1 inner 表2 on 表1.字段名=表2.字段名; select * from 表1 inner join 表2 on 表1.字段名=表2.字段名; select * from 表1,表2 where 表1.字段名=表2.字段名; sql语句: 1. select count(*) FROM student//查询表中数据行数 2. SELECT sex,student_number FROM student where name=?//查询名字为《要查的名字》的性别,学号 查询demon //查找表中所有学生人数 #define SELECT _STUDENT_MSG " select count(*) FROM student" //查找某个学生的信息 #define SELECT _STUDENT_NAME " SELECT sex,st 每个数据库通常都包含多个表,而每个表又包含多条数据。要获取数据库中的数据,就需要SQL语言提供的查询语句 SELECT 。本章将讲解和 SELECT 语句相关的内容,其中包括 SELECT 基本形式、表达式、连接、分组、排序和去重、获取子集、 子查询 以及联合查询等。 3.1 SELECT 基本形式 本节将讲解 SELECT 语句的基本形式,其中包括基本完整形式、 SELECT 子句、FROM子句以及WHERE子句等 3.1.1 基本形式 以下是 SELECT 语法的基本完整形式: SELECT [DISTINCT] se.. SQLite 中的 SELECT 子句使用表达式在 SELECT 语句中可以只有 SELECT 子句不写FROM子句。这些表达式列表将被单次计算,生成一行,然后组成工作表。这对于测试和判断独立表达式很有用。例如,下面的SQL语句在 SELECT 语句中只使用到了 SELECT 子句: SELECT 1+1,6.68,'Hello'运行程序,执行效果如图3.7所示。图3.7  运行效果... if not exists( select * from ErrorConfig where Type='TryWaitSeconds') begin insert into ErrorConfig(Type,Value1) values('TryWaitSeconds','3') insert into ErrorConfig(Type,Va sqlite 会自动维护一个系统表 sqlite _master,该表存储了我们所创建的各个table, view, trigger等等信息。 sqlite _master表数据字段: type:  类型,取值一般为table, view name:     tbl_name:   表名 rootpage: sql:创建表或者视图的sql语句,可以从该sql语句中判