SQLite基础学习 互动版

说明:

  SQLite 的子查询是在另一个 SQLite 查询内嵌入在 WHERE 子句中的查询。
  子查询可以与 SELECT、INSERT、UPDATE 和 DELETE 语句一起使用,可伴随着使用运算符如 =、<、>、>=、<=、IN、BETWEEN 等。
  使用子查询返回的数据将被用在主查询中作为条件,以进一步限制要检索的数据。

必须遵循的几个规则:

(1)子查询必须用括号括起来。
(2)子查询在 SELECT 子句中只能有一个列,除非在主查询中有多列,与子查询的所选列进行比较。
(3)ORDER BY 不能用在子查询中,虽然主查询可以使用 ORDER BY。可以在子查询中使用 GROUP BY,功能与 ORDER BY 相同。
(4)子查询返回多于一行,只能与多值运算符一起使用,如 IN 运算符。
(5)BETWEEN 运算符不能与子查询一起使用,但是,BETWEEN 可在子查询内使用。

语法:

  SELECT 语句中的子查询使用:

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

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

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

  UPDATE中子查询的用法,当通过 UPDATE 语句使用子查询时,表中单个或多个列被更新:

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

  DELETE中子查询的用法,

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

实例:

  假设有如下表student:

sqlite> select * from student;
ID          NAME        AGE         ADDRESS
----------  ----------  ----------  ----------
1           xiaoming    18          shenzhen
2           xiaohua     18          beijing
3           mingming    19          shanghai
4           xiaogang    20          hangzhou
5           honghong    17          shenzhen
6           liangliang  21          wuhan
7           tingting    23          shenzhen
sqlite>

  select语句中的用法:

sqlite> select * from student where AGE in (select AGE from student where ID > 4);
ID          NAME        AGE         ADDRESS
----------  ----------  ----------  ----------
5           honghong    17          shenzhen
6           liangliang  21          wuhan
7           tingting    23          shenzhen
sqlite>

  insert语句中的用法,利用查询出来的数据新建一张表:
  我们写一个文件,里面的内容是下面这样:

create table student_bak ( 
ID int primary key not NULL,
NAME TEXT NOT NULL,
AGE INT NOT NULL,
ADDRESS CAHR(50)
);
insert into student_bak select * from student where ID in(select ID from student);
select * from student_bak;

  运行结果:

sqlite> .read where.txt
ID          NAME        AGE         ADDRESS
----------  ----------  ----------  ----------
1           xiaoming    18          shenzhen
2           xiaohua     18          beijing
3           mingming    19          shanghai
4           xiaogang    20          hangzhou
5           honghong    17          shenzhen
6           liangliang  21          wuhan
7           tingting    23          shenzhen

sqlite> .table
company_bak  student      student_bak
sqlite>
  1. 请实现delete子句和update子句中子查询的例子。