目录
- SQLite 创建数据库
- SQLite Like 子句
- SQLite Glob 子句
- SQLite Limit 子句
- SQLite Distinct 关键字
- SQLite JOIN 子句
- 交叉连接 - CROSS JOIN
- 内连接 - INNER JOIN
- 外连接 - OUTER JOIN
- SQLite Having 子句
- SQLite Delete 语句
一、SQLite 创建数据库
SQLite 的 sqlite3 命令被用来创建新的 SQLite 数据库。您不需要任何特殊的权限即可创建一个数据。打开cmd,输入
1 | sqlite3 student.db |
SQLite 创建表的语法为
1 | CREATE TABLE table_name ( |
这时数据库student.db
还是空的,我们在数据库中新建三个表:course
、sc
和student
,在当前目录下新建sql_scripts.txt
文本文档,并将下列代码写入文本文档,然后在sqlite>
的提示符后输入.read data.txt
加载,则三个表在student.db
中新建完毕。
1 | PRAGMA foreign_keys=OFF; |
然后,使用SELECT
查询语句可以查看各个表中的内容
1 | sqlite> select * |
二、QLite Like 子句
SQLite 的 LIKE 运算符是用来匹配通配符指定模式的文本值。如果搜索表达式与模式表达式匹配,LIKE 运算符将返回真(true),也就是 1。这里有两个通配符与 LIKE 运算符一起使用:
-百分号 (%)代表零个、一个或多个数字或字符
-下划线 (_)代表一个单一的数字或字符,这些符号可以被组合使用
比如,查找student表中,所有姓李的学生
1 | sqlite> SELECT sname |
语句 | 描述 |
---|---|
WHERE SALARY LIKE ‘200%’ | 查找以 200 开头的任意值 |
WHERE SALARY LIKE ‘%200%’ | 查找任意位置包含 200 的任意值 |
WHERE SALARY LIKE ‘_00%’ | 查找第二位和第三位为 00 的任意值 |
WHERE SALARY LIKE ‘2%%’ | 查找以 2 开头,且长度至少为 3 个字符的任意值 |
WHERE SALARY LIKE ‘%2’ | 查找以 2 结尾的任意值 |
WHERE SALARY LIKE ‘_2%3’ | 查找第二位为 2,且以 3 结尾的任意值 |
WHERE SALARY LIKE ‘2___3’ | 查找长度为 5 位数,且以 2 开头以 3 结尾的任意值 |
三、SQLite Glob 子句
SQLite 的 GLOB 运算符是用来匹配通配符指定模式的文本值。如果搜索表达式与模式表达式匹配,GLOB 运算符将返回真(true),也就是 1。与 LIKE 运算符不同的是,GLOB 是大小写敏感的,对于下面的通配符,它遵循 UNIX 的语法。
-星号 (*)代表零个、一个或多个数字或字符
-问号 (?)代表一个单一的数字或字符
语句 | 描述 |
---|---|
WHERE SALARY GLOB ‘200*’ | 查找以 200 开头的任意值 |
WHERE SALARY GLOB ‘200‘ | 查找任意位置包含 200 的任意值 |
WHERE SALARY GLOB ‘?00*’ | 查找第二位和第三位为 00 的任意值 |
WHERE SALARY GLOB ‘2??’ | 查找以 2 开头,且长度至少为 3 个字符的任意值 |
WHERE SALARY GLOB ‘*2’ | 查找以 2 结尾的任意值 |
WHERE SALARY GLOB ‘?2*3’ | 查找第二位为 2,且以 3 结尾的任意值 |
WHERE SALARY GLOB ‘2???3’ | 查找长度为 5 位数,且以 2 开头以 3 结尾的任意值 |
四、SQLite Limit 子句
SQLite 的 LIMIT 子句用于限制由 SELECT 语句返回的数据数量。带有 LIMIT 子句的 SELECT 语句的基本语法如下:
1 | SELECT column1, column2, columnN |
下面是 LIMIT 子句与 OFFSET 子句一起使用时的语法:
1 | SELECT column1, column2, columnN |
SQLite 引擎将返回从下一行开始直到给定的 OFFSET 为止的所有行,如下一个实例所示
1 | sqlite> SELECT * |
五、SQLite Distinct 关键字
SQLite 的 DISTINCT 关键字与 SELECT 语句一起使用,来消除所有重复的记录,并只获取唯一一次记录。
有可能出现一种情况,在一个表中有多个重复的记录。当提取这样的记录时,DISTINCT 关键字就显得特别有意义,它只获取唯一一次记录,而不是获取重复记录。
1 | sqlite> SELECT ssex |
用于消除重复记录的 DISTINCT 关键字的基本语法如下:
1 | SELECT DISTINCT column1, column2,.....columnN |
1 | sqlite> SELECT DISTINCT ssex |
六、SQLite JOIN 子句
SQLite 的 Joins 子句用于结合两个或多个数据库中表的记录。JOIN 是一种通过共同值来结合两个表中字段的手段。
SQL 定义了三种主要类型的连接:
- 交叉连接 CROSS JOIN
- 内连接 INNER JOIN
- 外连接 OUTER JOIN
交叉连接 - CROSS JOIN
交叉连接(CROSS JOIN)把第一个表的每一行与第二个表的每一行进行匹配。如果两个输入表分别有 x 和 y 列,则结果表有 x+y 列。由于交叉连接(CROSS JOIN)有可能产生非常大的表,使用时必须谨慎,只在适当的时候使用它们。
下面是交叉连接(CROSS JOIN)的语法:
1 | SELECT ... FROM table1 CROSS JOIN table2 ... |
1 | /*student表中的sname和course表中的cname cross join*/ |
内连接 - INNER JOIN
内连接(INNER JOIN)根据连接条件结合两个表(table1 和 table2)的列值来创建一个新的结果表。查询会把 table1 中的每一行与 table2 中的每一行进行比较,找到所有满足连接条件的行的匹配对。当满足连接谓词时,A 和 B 行的每个匹配对的列值会合并成一个结果行。
内连接(INNER JOIN)是最常见的连接类型,是默认的连接类型。INNER 关键字是可选的。
下面是内连接(INNER JOIN)的语法:1
SELECT ... FROM table1 [INNER] JOIN table2 ON conditional_expression ...
比如要查询有选修课学生的考试成绩(有的有选修课,有的没有)
1 | sqlite> SELECT student.sno,sname,grade |
如果还需要查找得到该学生的选修课程名,那么就需要连接多个表,还用到了AND运算符
1 | sqlite> SELECT sname,student.sno,cname,grade |
外连接 - OUTER JOIN
外连接(OUTER JOIN)是内连接(INNER JOIN)的扩展。虽然 SQL 标准定义了三种类型的外连接:LEFT、RIGHT、FULL,但 SQLite 只支持 左外连接(LEFT OUTER JOIN)。
外连接(OUTER JOIN)声明条件的方法与内连接(INNER JOIN)是相同的,使用 ON、USING 或 NATURAL 关键字来表达。最初的结果表以相同的方式进行计算。一旦主连接计算完成,外连接(OUTER JOIN)将从一个或两个表中任何未连接的行合并进来(有的时候需要包含没有关联行的那些行),外连接的列使用 NULL 值,将它们附加到结果表中。
下面是左外连接(LEFT OUTER JOIN)的语法:
1 | SELECT ... FROM table1 LEFT OUTER JOIN table2 ON conditional_expression ... |
左外连接(LEFT OUTER JOIN)的左边的表是参照的主体,即根据连接条件,除了返回主体表与非主体中连接成功的行外,还返回主体表与非主体表连接不成功的记录。所以,左外连接中表的连接先后会导致不同的结果。
1 | sqlite> SELECT student.sno,sname,grade |
1 | sqlite> SELECT student.sno,sname,grade |
七、SQLite Having 子句
HAVING 子句允许指定条件来过滤将出现在最终结果中的分组结果。
WHERE 子句在所选列上设置条件,而 HAVING 子句则在由 GROUP BY 子句创建的分组上设置条件。
有必要说清楚分组GROUP BY与排序ORDER BY的区别,分组是将输出的结果以分组的形式呈现,而排序则是让输出结果按照顺序进行排列,换言之,分组的结果不一定是按照顺序排列的。where和having的功能也差不多,区别在于where是在数据分组前进行过滤,而having是在数据分组后进行过滤的。
下面是 HAVING 子句在 SELECT 查询中的位置:
1 | SELECT |
1 | sqlite> SELECT * |
八、SQLite Delete 语句
SQLite 的 DELETE 查询用于删除表中已有的记录。可以使用带有 WHERE 子句的 DELETE 查询来删除选定行,否则所有的记录都会被删除。
带有 WHERE 子句的 DELETE 查询的基本语法如下:
1 | DELETE FROM table_name |