sqlite3_and_sql

Posted guomc

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sqlite3_and_sql相关的知识,希望对你有一定的参考价值。

目录

一、安装sqlite3. 1

二、定义数据... 1

1.进入和定义数据库... 1

2.基本表的定义、删除、修改... 1

(1)数据类型... 1

(2)完整性约束条件... 1

(3)定义基本表... 1

(4)删除基本表... 2

(5)修改基本表... 2

3.索引的建立和删除... 2

(1)建立索引... 2

(2)修改索引... 2

(3)删除索引... 3

4.触发器的定义和删除... 3

二、查询数据... 3

1.单表查询... 4

2.连接查询,查询将涉及多张表... 5

3.嵌套查询,在上一级查询的结果上进行查询,也是类似于编程语言中的多层循环... 6

4.集合查询,参加操作的行的列数、数据类型都必须相同... 6

5.基于派生表的查询,子查询的结果可以出现在FROM子句中作为临时的派生表,sqlite3不支持... 6

三、更新数据... 6

1.添加数据... 6

2.修改数据... 6

3.删除数据... 7

四、特殊处理... 7

1.空值... 7

2.视图... 7

五、附录... 7

1.参考网址... 7

 

2.sqlite3的常用命令... 7

 

 

正文

一、安装sqlite3

进入https://www.sqlite.org/,下载for widows和sqlite-amalgamation-….zip的全部文件;

创建文件夹sqlite3_32(bin,include,lib)或sqlite3_64(bin,include,lib);

创建环境路径E:\CodeBlocks\MinGW\bin; E:\sqlite3_32\bin,这一步不是必须的,但如果经常用命令行的话会方便很多;

sqlite3_32/lib路径下命令行执行dlltool -D sqlite3.dll -d sqlite3.def -l libsqlite3dll.a;

Build options->Search directories->Compiler选入E:\sqlite3_32\include、Build options->Search directories->Linker选入E:\sqlite3_32\lib、Build options->Linker settings加入E:\sqlite3_32\lib\libsqlite3dll.a;

如果出现0xc000007b的错误提示,表示使用的32或64位版本和机器不兼容(比如32位的电脑上用了64位的dll)。

 

二、定义数据

1.进入和定义数据库

sqlite3的shell命令

sqlite3 <[路径]数据库的名称>

2.基本表的定义、删除、修改

sql语句中的单引号和双引号没有必然区别,有时候能够起到互为转义的作用

(1)数据类型

NULL

空值

INT

整形

NUMBERIC

精确数值

VARCHAR

可变长的文本

FLOAT

浮点数

DOUBLE

双精度浮点数

DECIMAL(10,5)

精确小数

BOOLEAN

布尔值

DATE

日期

(2)完整性约束条件

比如PRIMARY KEY、FOREIGN KEY(Cpno) REFERENCES Course(Cno)、NOT NULL

(3)定义基本表

sql标准语句

CREATE TABLE <表名>(<列名>< 数据类型>[ 列级完整性约束条件]

                                    [,<列名>< 数据类型>[ 列级完整性约束条件]]

                                    …

                                    [,<标记完整性约束条件>]);

(4)删除基本表

sql标准语句

CASCADE级联、与该表相关的对象全部删除,RESTRICT限制、如果该表没有相关的对象就可以执行这些语句

DROP TABLE <表名称> [RESTRICT|CASCADE];

(5)修改基本表

sql标准语句

ALTER TABLE <表名>

[ADD [COLUMN] <新列名>< 数据类型>[ 完整性约束]]

[ADD <表级完整性约束>]

[DROP [COLUMN] <列名> [CASECADE|RESTRICT]]

[DROP CONSTRANT <完整性约束> [CASECADE|RESTRICT]]

[ALTER COLUMN <列名>< 数据类型>];

sqlite3的shell命令

ALTER TABLE 数据库名称.表名称ADD [COLUMN] <新列名>< 数据类型>[ 完整性约束];

ALTER TABLE数据库名称. 表名称 RENAME TO 新名称;

3.索引的建立和删除

当表的数据相当庞大而且需要查询时,使用索引是很有必要的

标准sql语句

(1)建立索引

UNIQUE表示索引中的每个索引值值对应一个数据记录,CLUSTER表示聚簇索引;索引可以建在一列或多列上,次序默认是ASC升序、次序DESC是降序

CREATE [UNIQUE][CLUSTER] INDEX <索引的名称>

ON <表的名称>(<列名> [次序] [,<列名>[次序]]…);

(2)修改索引

sqlite3不支持修改索引

ALTER INDEX <旧索引名> RENAME TO <新索引名>;

(3)删除索引

DROP INDEX <索引名>;

4.触发器的定义和删除

标准sql语句

定义触发器

CREATE TRIGGER <触发器名称>

{BEFORE|AFTER} <触发事件> ON <表的名称>

REFERENCING NEW|OLD ROW AS <变量>

FOR EACH {ROW|STATEMENT}

[WHEN <触发条件>] <触发动作体>

删除触发器

DROP TRIGGER <触发器名称> ON <表的名称>;

sqlite3的shell命令

定义触发器

事件名称可以是INSERT、UPDATE、DELETE;在sqlite_master这张表中可以找到触发器的信息,最前面是type类型

CREATE TRIGGER 触发器名称 [BEFORE|AFTER] 事件名称

ON 表的名称

BEGIN

       类似于sql的逻辑语句

END;

删除触发器

DROP TRIGGER 触发器名称;

 

二、查询数据

标准sql语句

SELECT [ALL|DISTINCT] <目标列表达式> [,<目标列表达式>,…]

FROM <表或视图的名称> [,<表或视图的名称>,…] | (<SELECT 语句>) [AS] <别名>

[WHERE <条件表达式>]

[GROUP BY <列的名称1> [HAVING <条件表达式>]]

[ORDER BY <列的名称2> [ASC|DESC]];

1.单表查询

查询指定列

//Sno、Sname是Student表中的列,但是列举出来的列的顺序可以是任意的

SELECT Sno,Sname FROM Student;

查询全部列

SELECT * FROM Student;

查询经过计算的值

SELECT Sname,2014-Sage FROM Student;

//加入字符串常量、函数

SELECT Sname NAME,‘Year of birth:‘ BIRTH,2014-Sage BIRTHDAY,LOWER(Sdept) DEPARTMENT FROM Student;

消除完全重复的行

//默认是全部ALL

SELECT DISTINCT Sno FROM SC;

查询满足条件的行

//比较大小:会用到WHERE子句和运算符(!=或<>,!>,!<等)

SELECT Sname,Sage FROM Student WHERE Sage<20;

//在某个范围内、不在某个范围内

SELECT Sname,Sdept,Sage FROM Student WHERE Sage BETWEEN 20 AND 23;

SELECT Sname,Sdept,Sage FROM Student WHERE Sage NOT BETWEEN 20 AND 23;

//在某个集合内、不在某个集合内

SELECT Sname,Ssex FROM Student WHERE Sdept IN(‘CS‘,‘MA‘,‘IS‘);

SELECT Sname,Ssex FROM Student WHERE Sdept NOT IN(‘CS‘,‘MA‘,‘IS‘);

//字符串匹配,[NOT] LIKE ‘用于匹配的字符串’ [ESCAPE ‘转义字符’],%表示匹配任意长度的字符串、_匹配一个字符

SELECT Sname,Sno,Ssex FROM Student WHERE Sname LIKE ‘刘%‘;

SELECT Cno,Ccredit FROM Course WHERE Cname LIKE ‘DB\_Design‘ ESCAPE ‘\‘;

//涉及空值的查询,实际过程中有些数据可能为空

SELECT Sno,Cno FROM SC WHERE Grade IS NULL;

SELECT Sno,Cno FROM SC WHERE Grade IS NOT NULL;

//多种条件的查询,用AND、OR来连接各个查询条件,AND的优先级高于OR但是可以用括号来改变

SELECT Sname FROM Student WHERE Sdept=‘CS‘ AND Sage<20;

ORDER BY子句,对上一级结果按照一列或多列进行升序ASC(默认值)、降序DESC输出

SELECT * FROM Student ORDER BY Sdept,Sage DESC;

聚集函数,只能用于SELECT子句和GROUP BY中的HAVING子句

COUNT([DISTINCT|ALL] <列的名称>)

统计满足条件的列的数目

SUM([DISTINCT|ALL] <列的名称>)

列值的总和

AVG([DISTINCT|ALL] <列的名称>)

列值的平均值

MAX([DISTINCT|ALL] <列的名称>)

列中的最大值

MIN([DISTINCT|ALL] <列的名称>)

列中的最小值

LOWER()

将字符串转换为小写

UPPER()

将字符串转换为大写

RANDOM()

获取一个随机数

ABS()

求绝对值

LENGTH()

求字符串的长度

//获取学生的总数目

SELECT COUNT(*) FROM Student;

//计算3号课程的平均成绩

SELECT AVG(Grade) FROM SC WHERE Cno=‘3‘;

GROUP BY子句,对一列或多列进行分组、之后对每一组使用聚集函数后输出,如果最终选出的组还需要满足一定的条件,那就使用HAVING条件子句

SELECT Cno,COUNT(Sno) FROM SC GROUP BY Cno;

SELECT Sno FROM SC GROUP BY Sno HAVING COUNT(*)>2;

2.连接查询,查询将涉及多张表

等值与非等值的连接查询,类似编程中的双层循环,之前建立的索引在这里会加快查询的过程

//WHERE子句有一定的格式,“表1.列的名称 比较运算符 表2.列的名称”或者“表1.列的名称 BETWEEN 表2.列的名称 AND 表2.列的名称”

SELECT Student.Sno,SC.Cno,Sage FROM Student,SC WHERE Student.Sno=SC.Sno;

自身连接

//先修课的先修课

SELECT FIRST.Cno,SECOND.Cpno FROM Course FIRST,Course SECOND WHERE FIRST.Cpno=SECOND.Cno;

外连接也是一种连接查询,无损一个表然后尽可能的填充输出

//这个一个左外连接,类似的有右外连接

SELECT Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade FROM Student LEFT OUTER JOIN SC ON (Student.Sno=SC.Sno);

多表连接,按先后顺序先进行两个表的连接,得到的结果继续和下一个表进行连接

//跨表查询每个学生的学号、姓名、选修的课程名和对应的成绩

SELECT Student.Sno,Sname,Cname,Grade FROM Student,SC,Course WHERE Student.Sno=SC.Sno AND SC.Cno=Course.Cno;

3.嵌套查询,在上一级查询的结果上进行查询,也是类似于编程语言中的多层循环

带有IN的子查询

//不相关子查询,查找和“刘晨”在同一个系的学生

SELECT * FROM Student WHERE Sdept IN(SELECT Sdept FROM Student WHERE Sname=‘刘晨‘);

带有比较运算符的子查询

//相关子查询,找出每个学生超过他自身选修课程平均成绩的课程号

SELECT Sno,Cno FROM SC x WHERE Grade>=(SELECT AVG(Grade) FROM SC y WHERE y.Sno=x.Sno);

带有ANY(SOME)或ALL的子查询,sqlite3不支持应该用后一种办法来代替

SELECT Sname,Sage FROM Student WHERE Sage<ANY(SELECT Sage FROM Student WHERE Sdept=‘CS‘) AND Sdept<>‘CS‘;

SELECT Sname,Sage FROM Student WHERE Sage<(SELECT MAX(Sage) FROM Student WHERE Sdept=‘CS‘) AND Sdept<>‘CS‘;

带有量词EXISTS或NOT EXISTS的子查询,子查询的结果返回true或false

//查询所有选修了课程1的学生姓名

SELECT Sname FROM Student WHERE EXISTS(SELECT * FROM SC WHERE Sno=Student.Sno AND Cno=‘1‘);

//查询选修了全部课程的学生姓名,可能要用到量词转换规律解决类似的至多至少问题

SELECT Sname FROM Student WHERE NOT EXISTS(SELECT * FROM Course WHERE NOT EXISTS(SELECT * FROM SC WHERE Sno=Student.Sno AND Cno=Course.Cno));

4.集合查询,参加操作的行的列数、数据类型都必须相同

//可能会用到并操作UNION、交操作INTERSECT、差操作EXCEPT

SELECT * FROM Student WHERE Sdept=‘CS‘ UNION SELECT * FROM Student WHERE Sage<=19;

5.基于派生表的查询,子查询的结果可以出现在FROM子句中作为临时的派生表,sqlite3不支持

//找出每个学生超过他选修课程平均成绩的课程号

SELECT Sno,Cno FROM SC,(SELECT Sno,AVG(Grade) FROM SC GROUP BY Sno) AS Avg_sc(avg_sno,avg_grade) WHERE SC.Sno=Avg_sc.avg_sno AND SC.Grade>=Avg_sc.avg_grade;

 

三、更新数据

标准sql语句

1.添加数据

INSERT INTO <表名>[属性列1,…,属性列n]

VALUES(数据1,…,数据n);

2.修改数据

sql标准语句

UPDATE <表名>

SET <列名>=<表达式> [,<列名>=<表达式>,…]

[WHERE <条件>];

3.删除数据

DELETE FROM <表名称> [WHERE <条件>];

 

四、特殊处理

1.空值

插入空值

INSERT INTO SC VALUES(‘201215126‘,‘1‘,NULL);

空值的判断,使用IS NULL或IS NOT NULL

2.视图

在表的基础上抽象出自己感兴趣的部分得到视图,视图有着和表类似的操作;数据库不会存放视图的数据,只是存放它的定义;WITH CHECK OPTION表示更新视图时要时刻加上子查询中的条件;sqlite3不支持WITCH CHECK OPTION、不支持CASCADE、不支持更新视图

建立视图

CREATE VIEW <视图的名称> [(<列的名称>[,<列的名称>…])]

AS <子查询>

[WITH CHECK OPTION]

删除视图

//CASCADE表示与之相关的都一并删除

DROP VIEW <视图的名称> [CASCADE];

 

五、附录

1.参考网址

www.sqlite.org

下载sqlite3

www.runoob.com

中文教程

 

 

2.sqlite3的常用命令

命令区分大小写

.databases

查阅当前数据库

.mode <选项>

输出模式,选项可以是:逗号分隔csv、左对齐的列column、<table> 代码html、insert语句insert、每行一个值line、separator 字符串分隔list、Tab 分隔tabs、TCL 列表tcl

.tables

查阅当前数据库中的表

ctrl+c

退出

.schema <表名称>

查询表的结构

sqlite3 <[路径]数据库名称> .dump > <[路径]名称.sql>

将数据库导出到文件

sqlite3 <[路径]名称.db> < <[路径]文件名称.sql>

用sql文件恢复数据库

.open [路径]名称.db

进入sqlite3后打开某个数据库

.excel

可以将查询到的结果导出到excel文件

.indices <表名称>

列出表的索引

.output <文件名>

将输出结果保存到文件,也可以是stdout

.read <文件名>

执行文件中的sql语句

.show

显示数据库中的系统设置

.timer <ON|OFF>

计时器

select 表达式;

对表达式进行运算

sqlite_version()

获取sqlite的版本号

以上是关于sqlite3_and_sql的主要内容,如果未能解决你的问题,请参考以下文章

openjudge1.3

数据通信技术

数据库三级

计算(1/2+1/3+...+1/20)+(2/3+2/4+...+2/20)+(3/4+3/5+...+3/20)+...+(18/19+18/20)+19/20等于多少

js如何将数组按照每行切割分组?

多线程