sqllite入门笔记
- 2020 年 3 月 11 日
- 筆記
sqlite下载
https://www.sqlite.org/download.html
sqlite install for Windows
C:UsersQFMX>E: E:>D: D:>cd DEVELOP # 切换到工作目录 D:DEVELOP>mkdir sqlite # 创建文件加 # 粘贴文件到此目录,并解压 sqlite-dll-win64-x64-3280000.zip sqlite-tools-win32-x86-3280000.zip # 解压后把这5个文件归到一个文件夹下 sqldiff.exe sqlite3.def sqlite3.dll sqlite3.exe sqlite3_analyzer.exe # 添加此路径到PATH D:DEVELOPsqlitesqllite-tools # 在dos窗口出入sqlite3 Microsoft Windows [版本 10.0.18362.145] (c) 2019 Microsoft Corporation。保留所有权利。 C:UsersQFMX>sqlite3 SQLite version 3.28.0 2019-04-16 19:49:53 Enter ".help" for usage hints. Connected to a transient in-memory database. Use ".open FILENAME" to reopen on a persistent database. sqlite>
在 Linux 上安装 SQLite
目前,几乎所有版本的 Linux 操作系统都附带 SQLite。所以,只要使用下面的命令来检查您的机器上是否已经安装了 SQLite。
$ sqlite3 SQLite version 3.7.15.2 2013-01-09 11:53:05 Enter ".help" for instructions Enter SQL statements terminated with a ";" sqlite>
如果没有看到sqlite3则自行安装
$ tar xvzf sqlite-autoconf-3071502.tar.gz $ cd sqlite-autoconf-3071502 $ ./configure --prefix=/usr/local $ make $ make install
sqlite3语法
.help
常用命令
| 命令 | 描述 | | :-------------------- | :----------------------------------------------------------- | | .backup ?DB? FILE | 备份 DB 数据库(默认是 "main")到 FILE 文件。 | | .bail ON|OFF | 发生错误后停止。默认为 OFF。 | | .databases | 列出数据库的名称及其所依附的文件。 | | .dump ?TABLE? | 以 SQL 文本格式转储数据库。如果指定了 TABLE 表,则只转储匹配 LIKE 模式的 TABLE 表。 | | .echo ON|OFF | 开启或关闭 echo 命令。 | | .exit | 退出 SQLite 提示符。 | | .explain ON|OFF | 开启或关闭适合于 EXPLAIN 的输出模式。如果没有带参数,则为 EXPLAIN on,及开启 EXPLAIN。 | | .header(s) ON|OFF | 开启或关闭头部显示。 | | .help | 显示消息。 | | .import FILE TABLE | 导入来自 FILE 文件的数据到 TABLE 表中。 | | .indices ?TABLE? | 显示所有索引的名称。如果指定了 TABLE 表,则只显示匹配 LIKE 模式的 TABLE 表的索引。 | | .load FILE ?ENTRY? | 加载一个扩展库。 | | .log FILE|off | 开启或关闭日志。FILE 文件可以是 stderr(标准错误)/stdout(标准输出)。 | | .mode MODE | 设置输出模式,MODE 可以是下列之一:**csv** 逗号分隔的值**column** 左对齐的列**html** HTML 的 <table> 代码**insert** TABLE 表的 SQL 插入(insert)语句**line** 每行一个值**list** 由 .separator 字符串分隔的值**tabs** 由 Tab 分隔的值**tcl** TCL 列表元素 | | .nullvalue STRING | 在 NULL 值的地方输出 STRING 字符串。 | | .output FILENAME | 发送输出到 FILENAME 文件。 | | .output stdout | 发送输出到屏幕。 | | .print STRING... | 逐字地输出 STRING 字符串。 | | .prompt MAIN CONTINUE | 替换标准提示符。 | | .quit | 退出 SQLite 提示符。 | | .read FILENAME | 执行 FILENAME 文件中的 SQL。 | | .schema ?TABLE? | 显示 CREATE 语句。如果指定了 TABLE 表,则只显示匹配 LIKE 模式的 TABLE 表。 | | .separator STRING | 改变输出模式和 .import 所使用的分隔符。 | | .show | 显示各种设置的当前值。 | | .stats ON|OFF | 开启或关闭统计。 | | .tables ?PATTERN? | 列出匹配 LIKE 模式的表的名称。 | | .timeout MS | 尝试打开锁定的表 MS 毫秒。 | | .width NUM NUM | 为 "column" 模式设置列宽度。 | | .timer ON|OFF | 开启或关闭 CPU 定时器。 |
.show # 查看 SQLite 命令提示符的默认设置
sqlite> .show echo: off eqp: off explain: auto headers: off mode: list nullvalue: "" output: stdout colseparator: "|" rowseparator: "n" stats: off width: filename: :memory:
SQLite 是不区分大小写的,但也有一些命令是大小写敏感的,比如 GLOB 和 glob 在 SQLite 的语句中有不同的含义 .help — 注释
SQLite 语句
SQLite ANALYZE 语句:
ANALYZE; or ANALYZE database_name; or ANALYZE database_name.table_name;
SQLite AND/OR 子句:
SELECT column1, column2....columnN FROM table_name WHERE CONDITION-1 {AND|OR} CONDITION-2;
SQLite ALTER TABLE 语句:
ALTER TABLE table_name ADD COLUMN column_def...;
SQLite ALTER TABLE 语句(Rename):
ALTER TABLE table_name RENAME TO new_table_name;
SQLite ATTACH DATABASE 语句:
ATTACH DATABASE 'DatabaseName' As 'Alias-Name';
SQLite BEGIN TRANSACTION 语句:
BEGIN; or BEGIN EXCLUSIVE TRANSACTION;
SQLite BETWEEN 子句:
SELECT column1, column2....columnN FROM table_name WHERE column_name BETWEEN val-1 AND val-2;
SQLite COMMIT 语句:
COMMIT;
SQLite CREATE INDEX 语句:
CREATE INDEX index_name ON table_name ( column_name COLLATE NOCASE );
SQLite CREATE UNIQUE INDEX 语句:
CREATE UNIQUE INDEX index_name ON table_name ( column1, column2,...columnN);
SQLite CREATE TABLE 语句:
CREATE TABLE table_name( column1 datatype, column2 datatype, column3 datatype, ..... columnN datatype, PRIMARY KEY( one or more columns ) );
SQLite CREATE TRIGGER 语句:
CREATE TRIGGER database_name.trigger_name BEFORE INSERT ON table_name FOR EACH ROW BEGIN stmt1; stmt2; .... END;
SQLite CREATE VIEW 语句:
CREATE VIEW database_name.view_name AS SELECT statement....;
SQLite CREATE VIRTUAL TABLE 语句:
CREATE VIRTUAL TABLE database_name.table_name USING weblog( access.log ); or CREATE VIRTUAL TABLE database_name.table_name USING fts3( );
SQLite COMMIT TRANSACTION 语句:
COMMIT;
SQLite COUNT 子句:
SELECT COUNT(column_name) FROM table_name WHERE CONDITION;
SQLite DELETE 语句:
DELETE FROM table_name WHERE {CONDITION};
SQLite DETACH DATABASE 语句:
DETACH DATABASE 'Alias-Name';
SQLite DISTINCT 子句:
SELECT DISTINCT column1, column2....columnN FROM table_name;
SQLite DROP INDEX 语句:
DROP INDEX database_name.index_name;
SQLite DROP TABLE 语句:
DROP TABLE database_name.table_name;
SQLite DROP VIEW 语句:
DROP VIEW view_name;
SQLite DROP TRIGGER 语句:
DROP TRIGGER trigger_name
SQLite EXISTS 子句:
SELECT column1, column2....columnN FROM table_name WHERE column_name EXISTS (SELECT * FROM table_name );
SQLite EXPLAIN 语句:
EXPLAIN INSERT statement...; or EXPLAIN QUERY PLAN SELECT statement...;
SQLite GLOB 子句:
SELECT column1, column2....columnN FROM table_name WHERE column_name GLOB { PATTERN };
SQLite GROUP BY 子句:
SELECT SUM(column_name) FROM table_name WHERE CONDITION GROUP BY column_name;
SQLite HAVING 子句:
SELECT SUM(column_name) FROM table_name WHERE CONDITION GROUP BY column_name HAVING (arithematic function condition);
SQLite INSERT INTO 语句:
INSERT INTO table_name( column1, column2....columnN) VALUES ( value1, value2....valueN);
SQLite IN 子句:
SELECT column1, column2....columnN FROM table_name WHERE column_name IN (val-1, val-2,...val-N);
SQLite Like 子句:
SELECT column1, column2....columnN FROM table_name WHERE column_name LIKE { PATTERN };
SQLite NOT IN 子句:
SELECT column1, column2....columnN FROM table_name WHERE column_name NOT IN (val-1, val-2,...val-N);
SQLite ORDER BY 子句:
SELECT column1, column2....columnN FROM table_name WHERE CONDITION ORDER BY column_name {ASC|DESC};
SQLite PRAGMA 语句:
PRAGMA pragma_name; For example: PRAGMA page_size; PRAGMA cache_size = 1024; PRAGMA table_info(table_name);
SQLite RELEASE SAVEPOINT 语句:
RELEASE savepoint_name;
SQLite REINDEX 语句:
REINDEX collation_name; REINDEX database_name.index_name; REINDEX database_name.table_name;
SQLite ROLLBACK 语句:
ROLLBACK; or ROLLBACK TO SAVEPOINT savepoint_name;
SQLite SAVEPOINT 语句:
SAVEPOINT savepoint_name;
SQLite SELECT 语句:
SELECT column1, column2....columnN FROM table_name;
SQLite UPDATE 语句:
UPDATE table_name SET column1 = value1, column2 = value2....columnN=valueN [ WHERE CONDITION ];
SQLite VACUUM 语句:
VACUUM;
SQLite WHERE 子句:
SELECT column1, column2....columnN FROM table_name WHERE CONDITION;
SQLite 数据类型
SQLite 存储类
每个存储在 SQLite 数据库中的值都具有以下存储类之一:
| 存储类 | 描述 | | :------ | :----------------------------------------------------------- | | NULL | 值是一个 NULL 值。 | | INTEGER | 值是一个带符号的整数,根据值的大小存储在 1、2、3、4、6 或 8 字节中。 | | REAL | 值是一个浮点值,存储为 8 字节的 IEEE 浮点数字。 | | TEXT | 值是一个文本字符串,使用数据库编码(UTF-8、UTF-16BE 或 UTF-16LE)存储。 | | BLOB | 值是一个 blob 数据,完全根据它的输入存储。 |
SQLite 亲和(Affinity)类型
SQLite支持列的亲和类型概念。任何列仍然可以存储任何类型的数据,当数据插入时,该字段的数据将会优先采用亲缘类型作为该值的存储方式。SQLite目前的版本支持以下五种亲缘类型:
| 亲和类型 | 描述 | | :------- | :----------------------------------------------------------- | | TEXT | 数值型数据在被插入之前,需要先被转换为文本格式,之后再插入到目标字段中。 | | INTEGER | 对于亲缘类型为INTEGER的字段,其规则等同于NUMERIC,唯一差别是在执行CAST表达式时。 | | REAL | 其规则基本等同于NUMERIC,唯一的差别是不会将"30000.0"这样的文本数据转换为INTEGER存储方式。 | | NONE | 不做任何的转换,直接以该数据所属的数据类型进行存储。 | | NUMERIC | 当文本数据被插入到亲缘性为NUMERIC的字段中时,如果转换操作不会导致数据信息丢失以及完全可逆,那么SQLite就会将该文本数据转换为INTEGER或REAL类型的数据,如果转换失败,SQLite仍会以TEXT方式存储该数据。对于NULL或BLOB类型的新数据,SQLite将不做任何转换,直接以NULL或BLOB的方式存储该数据。需要额外说明的是,对于浮点格式的常量文本,如"30000.0",如果该值可以转换为INTEGER同时又不会丢失数值信息,那么SQLite就会将其转换为INTEGER的存储方式。 |
SQLite 亲和类型(Affinity)及类型名称
下表列出了当创建 SQLite3 表时可使用的各种数据类型名称,同时也显示了相应的亲和类型:
| 数据类型 | 亲和类型 | | :----------------------------------------------------------- | :------- | | INTINTEGERTINYINTSMALLINTMEDIUMINTBIGINTUNSIGNED BIG INTINT2INT8 | INTEGER | | CHARACTER(20)VARCHAR(255)VARYING CHARACTER(255)NCHAR(55)NATIVE CHARACTER(70)NVARCHAR(100)TEXTCLOB | TEXT | | BLOBno datatype specified | NONE | | REALDOUBLEDOUBLE PRECISIONFLOAT | REAL | | NUMERICDECIMAL(10,5)BOOLEANDATEDATETIME | NUMERIC |
Boolean 数据类型
SQLite 没有单独的 Boolean 存储类。相反,布尔值被存储为整数 0(false)和 1(true)。
Date 与 Time 数据类型
SQLite 没有一个单独的用于存储日期和/或时间的存储类,但 SQLite 能够把日期和时间存储为 TEXT、REAL 或 INTEGER 值。
| 存储类 | 日期格式 | | :------ | :----------------------------------------------------------- | | TEXT | 格式为 "YYYY-MM-DD HH:MM:SS.SSS" 的日期。 | | REAL | 从公元前 4714 年 11 月 24 日格林尼治时间的正午开始算起的天数。 | | INTEGER | 从 1970-01-01 00:00:00 UTC 算起的秒数。 |
您可以以任何上述格式来存储日期和时间,并且可以使用内置的日期和时间函数来自由转换不同格式。
创建数据库
# 在dos命令行输入 C:UsersQFMX>sqlite3.exe qfmx.db SQLite version 3.28.0 2019-04-16 19:49:53 Enter ".help" for usage hints. sqlite> # 查看创建好的数据库 sqlite> .databases main: C:UsersQFMXqfmx.db
导出sqlite文件到文本文件
# 到处qfmx数据库的数据到E盘 C:UsersQFMX>sqlite3 qfmx.db .dump > E:/qfmx.sql C:UsersQFMX> # 进入E盘可查看文件qfmx.sql # 由于我没有数据看到的内容为 PRAGMA foreign_keys=OFF; BEGIN TRANSACTION; COMMIT;
导入sql文件到sqlite数据库
E:>sqlite3 qfmx1.db SQLite version 3.28.0 2019-04-16 19:49:53 Enter ".help" for usage hints. sqlite> .quit E:>sqlite3 qfmx1.db < qfmx.sql E:>
附加数据库
SQLite 的 ATTACH DATABASE 语句是用来选择一个特定的数据库,使用该命令后,所有的 SQLite 语句将在附加的数据库下执行
# 附加qfmx.db到TEST数据库 sqlite> ATTACH DATABASE 'qfmx.db' as 'TEST'; sqlite> sqlite> .database main: TEST: E:qfmx.db # 已经附加成功 sqlite> # 已经附加数据库的不能再次附加 sqlite> ATTACH DATABASE 'qfmx.db' as 'TEMP'; Error: database TEMP is already in use # 已被TEST使用 sqlite>
分离数据库
DETACH DATABASE 'TEST'
SQLite 创建表
SQLite 的 CREATE TABLE 语句用于在任何给定的数据库创建一个新表。创建基本表,涉及到命名表、定义列及每一列的数据类型。
语法
CREATE TABLE 语句的基本语法如下:
CREATE TABLE database_name.table_name( column1 datatype PRIMARY KEY(one or more columns), column2 datatype, column3 datatype, ..... columnN datatype, );
# 删除表DEPARTMENT和COMPANY sqlite> DROP TABLE IF EXISTS "DEPARTMENT"; sqlite> DROP TABLE IF EXISTS "COMPANY"; sqlite> .tables sqlite> CREATE TABLE "COMPANY" ( ...> "ID" INTEGER NOT NULL, ...> "NAME" TEXT NOT NULL, ...> "AGE" INTEGER NOT NULL, ...> "ADDRESS" TEXT NOT NULL, ...> "SALARY" REAL, ...> PRIMARY KEY ("ID") ...> ); sqlite> CREATE TABLE "DEPARTMENT" ( ...> "ID" INTEGER NOT NULL, ...> "DEPT" text NOT NULL, ...> "EMP_ID" INTEGER NOT NULL, ...> PRIMARY KEY ("ID") ...> ); sqlite> .tables COMPANY DEPARTMENT sqlite>
SQLite 删除表
SQLite 的 DROP TABLE 语句用来删除表定义及其所有相关数据、索引、触发器、约束和该表的权限规范。
使用此命令时要特别注意,因为一旦一个表被删除,表中所有信息也将永远丢失。
语法
DROP TABLE 语句的基本语法如下。您可以选择指定带有表名的数据库名称,如下所示:
DROP TABLE database_name.table_name;
sqlite> .tables # 展示所有表 COMPANY COMPANY_copy1 COMPANY_copy2 DEPARTMENT sqlite> drop table COMPANY_copy1; # 删除表COMPANY_copy1 sqlite> .tables # 再次展示所有表,表COMPANY_copy1已被删除 COMPANY COMPANY_copy2 DEPARTMENT sqlite>
SQLite Insert 语句
SQLite 的 INSERT INTO 语句用于向数据库的某个表中添加新的数据行。
语法
INSERT INTO 语句有两种基本语法,如下所示:
INSERT INTO TABLE_NAME [(column1, column2, column3,...columnN)] VALUES (value1, value2, value3,...valueN);
在这里,column1, column2,…columnN 是要插入数据的表中的列的名称。
如果要为表中的所有列添加值,您也可以不需要在 SQLite 查询中指定列名称。但要确保值的顺序与列在表中的顺序一致。SQLite 的 INSERT INTO 语法如下:
INSERT INTO TABLE_NAME VALUES (value1,value2,value3,...valueN);
-- 插入实例写法一 sqlite> insert into COMPANY ('ID','NAME','AGE','ADDRESS','SALARY') values (2,'BOb',20,'贵州b农业大学',6000.00); sqlite> insert into COMPANY ('ID','NAME','AGE','ADDRESS','SALARY') values (3,'Lily',30,'贵州b农业大学',2000.00); sqlite> INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) ...> VALUES (4, 'Mark', 25, 'Rich-Mond ', 65000.00 ); sqlite> INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) ...> VALUES (5, 'David', 27, 'Texas', 85000.00 ); sqlite> INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) ...> VALUES (6, 'Kim', 22, 'South-Hall', 45000.00 ); sqlite>
-- 简洁写法 sqlite> INSERT INTO COMPANY VALUES (7, 'James', 24, 'Houston', 10000.00 ); sqlite> INSERT INTO "COMPANY" VALUES (8, '老二', 50, '北京哈哈大学', 15000.0); sqlite>
使用select填充表
# 将COMPANY表的查询结果填充到COMPANY_copy2表 sqlite> insert into COMPANY_copy2 (ID,NAME,AGE,ADDRESS,SALARY) select ID,NAME,AGE,ADDRESS,SALARY from COMPANY; sqlite> sqlite> select * from COMPANY_copy2; 1|老大|50|北京农业大学|5000.0 2|BOb|20|贵州b农业大学|6000.0 3|Lily|30|贵州b农业大学|2000.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 8|老二|50|北京哈哈大学|15000.0
根据条件填充表
sqlite> CREATE TABLE "COMPANY_temp" ( ...> "ID" INTEGER NOT NULL, ...> "NAME" TEXT NOT NULL, ...> "AGE" INTEGER NOT NULL, ...> "ADDRESS" TEXT NOT NULL, ...> "SALARY" REAL, ...> PRIMARY KEY ("ID") ...> ); -- 不按照顺序来也可以 sqlite> insert into COMPANY_temp (ID,NAME,AGE,ADDRESS,SALARY) select ID,NAME,AGE,ADDRESS,SALARY from COMPANY where ID=5; sqlite> insert into COMPANY_temp (ID,NAME,AGE,ADDRESS,SALARY) select ID,NAME,AGE,ADDRESS,SALARY from COMPANY where ID=4; sqlite> insert into COMPANY_temp (ID,NAME,AGE,ADDRESS,SALARY) select ID,NAME,AGE,ADDRESS,SALARY from COMPANY where ID=1; sqlite> insert into COMPANY_temp (ID,NAME,AGE,ADDRESS,SALARY) select ID,NAME,AGE,ADDRESS,SALARY from COMPANY where ID=8; sqlite> select * from COMPANY_temp; 1|老大|50|北京农业大学|5000.0 4|Mark|25|Rich-Mond |65000.0 5|David|27|Texas|85000.0 8|老二|50|北京哈哈大学|15000.0 sqlite>
SQLite Select 语句
SQLite 的 SELECT 语句用于从 SQLite 数据库表中获取数据,以结果表的形式返回数据。这些结果表也被称为结果集。
语法
SQLite 的 SELECT 语句的基本语法如下:
SELECT column1, column2, columnN FROM table_name;
在这里,column1, column2…是表的字段,他们的值即是您要获取的。如果您想获取所有可用的字段,那么可以使用下面的语法:
SELECT * FROM table_name;
通过附加数据库的方法实现多表操作
-- 现在我们有3个数据库 -- css.db -- qfmx.db -- qfmx1.db -- 我们任意使用一个进入 E:>sqlite3 qfmx1.db SQLite version 3.28.0 2019-04-16 19:49:53 Enter ".help" for usage hints. sqlite> .databases main: E:qfmx1.db -- 现在我们qfmx1.db数据库的别名为main sqlite> sqlite> create table main.q1(ID int(11),NAME varchar(50)); sqlite> insert table main.q1(1,'qfmx520'); sqlite> select * from q1; 1|qfmx520 # 开始附加数据库 sqlite> attach database 'css.db' as 'DB1'; -- css.db附加数据库为DB1 sqlite> attach database 'qfmx.db' as 'DB2'; -- qfmx.db附加数据库为DB1 sqlite> attach database 'qfmx1.db' as 'DB3'; -- qfmx1.db附加数据库为DB1 sqlite> .databases -- 查看所有数据库 main: E:qfmx1.db DB1: E:css.db DB2: E:qfmx.db DB3: E:qfmx1.db sqlite> sqlite> select * from DB3.q1; -- 通过别名DB3查询q1表 1|qfmx520 sqlite> .tables -- 此时列出了可执行的表 DB1.COMPANY DB1.COMPANY_temp DB2.allms q1 DB1.COMPANY_copy2 DB1.DEPARTMENT DB3.q1 sqlite> select * from DB1.COMPANY; -- 通过附加数据库DB1查询css.db里面的表 1|老大|50|北京农业大学|5000.0 2|BOb|20|贵州b农业大学|6000.0 3|Lily|30|贵州b农业大学|2000.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 8|老二|50|北京哈哈大学|15000.0 sqlite> select * from DB1.COMPANY_temp; -- 通过附加数据库DB1查询css.db里面的表 1|老大|50|北京农业大学|5000.0 4|Mark|25|Rich-Mond |65000.0 5|David|27|Texas|85000.0 8|老二|50|北京哈哈大学|15000.0 sqlite> select * from DB2.allms; -- 通过附加数据库DB2查询qfmx.db里面的表 1|xyj sqlite> select * from DB1.COMPANY_copy2; -- 通过附加数据库DB1查询css.db里面的表 1|老大|50|北京农业大学|5000.0 2|BOb|20|贵州b农业大学|6000.0 3|Lily|30|贵州b农业大学|2000.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 8|老二|50|北京哈哈大学|15000.0 sqlite> select * from DB1.DEPARTMENT; -- 通过附加数据库DB2查询qfmx.db里面的表,but里面没数据 sqlite> -- 下面通过附加数据可别名就可以对qfmx.db里面的表进行一波插入数据 sqlite> select * from DB1.DEPARTMENT; sqlite> insert into DB2.allms values (2,'db2'); sqlite> insert into DB2.allms values (3,'test'); sqlite> insert into DB2.allms values (4,'liil'); sqlite> select * from DB2.allms; 1|xyj 2|db2 3|test 4|liil sqlite> -- 下面删除其他通过附加数据库别名删除其他数据库的表 sqlite> .tables DB1.COMPANY DB1.COMPANY_temp DB2.allms q1 DB1.COMPANY_copy2 DB1.DEPARTMENT DB3.q1 sqlite> drop table DB1.COMPANY_copy2; sqlite> .tables DB1.COMPANY DB1.DEPARTMENT DB3.q1 DB1.COMPANY_temp DB2.allms q1 sqlite> -- 有了附加数据库别名就可以对其他数据库的数据表进行CRUD了 -- 删库呢?试一试吧,好像不行,万一成功了,准备跑路吧!!
SQLite 运算符
SQLite 运算符是什么?
运算符是一个保留字或字符,主要用于 SQLite 语句的 WHERE 子句中执行操作,如比较和算术运算。
运算符用于指定 SQLite 语句中的条件,并在语句中连接多个条件。
- 算术运算符
- 比较运算符
- 逻辑运算符
- 位运算符
SQLite 算术运算符
假设变量 a=10,变量 b=20,则:
运算符 |
描述 |
实例 |
---|---|---|
+ |
加法 – 把运算符两边的值相加 |
a + b 将得到 30 |
– |
减法 – 左操作数减去右操作数 |
a – b 将得到 -10 |
* |
乘法 – 把运算符两边的值相乘 |
a * b 将得到 200 |
/ |
除法 – 左操作数除以右操作数 |
b / a 将得到 2 |
% |
取模 – 左操作数除以右操作数后得到的余数 |
b % a will give 0 |
SQLite 比较运算符
假设变量 a=10,变量 b=20,则:
运算符 |
描述 |
实例 |
---|---|---|
== |
检查两个操作数的值是否相等,如果相等则条件为真。 |
(a == b) 不为真。 |
= |
检查两个操作数的值是否相等,如果相等则条件为真。 |
(a = b) 不为真。 |
!= |
检查两个操作数的值是否相等,如果不相等则条件为真。 |
(a != b) 为真。 |
<> |
检查两个操作数的值是否相等,如果不相等则条件为真。 |
(a <> b) 为真。 |
> |
检查左操作数的值是否大于右操作数的值,如果是则条件为真。 |
(a > b) 不为真。 |
< |
检查左操作数的值是否小于右操作数的值,如果是则条件为真。 |
(a < b) 为真。 |
>= |
检查左操作数的值是否大于等于右操作数的值,如果是则条件为真。 |
(a >= b) 不为真。 |
<= |
检查左操作数的值是否小于等于右操作数的值,如果是则条件为真。 |
(a <= b) 为真。 |
!< |
检查左操作数的值是否不小于右操作数的值,如果是则条件为真。 |
(a !< b) 为假。 |
!> |
检查左操作数的值是否不大于右操作数的值,如果是则条件为真。 |
(a !> b) 为真。 |
-- 算术运算符 sqlite> select 10 + 20; 10 + 20 = 30 sqlite> select 10 - 20; 10 - 20 = -10 sqlite> select 10 * 20; 10 * 20 = 200 sqlite> select 10 / 5; 10 / 5 = 2 sqlite> select 12 % 5; 12 % 5 = 2 -- 比较运算符 sqlite> .mode tabs -- 由 Tab 分隔的值 sqlite> select * from DB1.COMPANY; 1 老大 50 北京农业大学 5000.0 2 BOb 20 贵州b农业大学 6000.0 3 Lily 30 贵州b农业大学 2000.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 8 老二 50 北京哈哈大学 15000.0 sqlite> SELECT * FROM COMPANY WHERE SALARY > 50000; 4 Mark 25 Rich-Mond 65000.0 5 David 27 Texas 85000.0 sqlite> SELECT * FROM COMPANY WHERE SALARY = 20000; sqlite> SELECT * FROM COMPANY WHERE SALARY = 15000.0; 8 老二 50 北京哈哈大学 15000.0 sqlite> SELECT * FROM COMPANY WHERE SALARY != 20000; 1 老大 50 北京农业大学 5000.0 2 BOb 20 贵州b农业大学 6000.0 3 Lily 30 贵州b农业大学 2000.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 8 老二 50 北京哈哈大学 15000.0 sqlite> SELECT * FROM COMPANY WHERE SALARY <> 20000; -- <>表示不等于 1 老大 50 北京农业大学 5000.0 2 BOb 20 贵州b农业大学 6000.0 3 Lily 30 贵州b农业大学 2000.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 8 老二 50 北京哈哈大学 15000.0 sqlite> SELECT * FROM COMPANY WHERE SALARY >= 65000; 4 Mark 25 Rich-Mond 65000.0 5 David 27 Texas 85000.0 -- 逻辑运算符 sqlite> sqlite> SELECT * FROM COMPANY WHERE AGE >= 25 AND SALARY >= 65000; 4 Mark 25 Rich-Mond 65000.0 5 David 27 Texas 85000.0 sqlite> SELECT * FROM COMPANY WHERE AGE >= 25 OR SALARY >= 65000; 1 老大 50 北京农业大学 5000.0 3 Lily 30 贵州b农业大学 2000.0 4 Mark 25 Rich-Mond 65000.0 5 David 27 Texas 85000.0 8 老二 50 北京哈哈大学 15000.0 sqlite> SELECT * FROM COMPANY WHERE AGE IS NOT NULL; 1 老大 50 北京农业大学 5000.0 2 BOb 20 贵州b农业大学 6000.0 3 Lily 30 贵州b农业大学 2000.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 8 老二 50 北京哈哈大学 15000.0 sqlite> SELECT * FROM COMPANY WHERE NAME LIKE 'Ki%'; 6 Kim 22 South-Hall 45000.0 sqlite> SELECT * FROM COMPANY WHERE AGE IN ( 25, 27 ); 4 Mark 25 Rich-Mond 65000.0 5 David 27 Texas 85000.0 sqlite> SELECT * FROM COMPANY WHERE AGE NOT IN ( 25, 27 ); 1 老大 50 北京农业大学 5000.0 2 BOb 20 贵州b农业大学 6000.0 3 Lily 30 贵州b农业大学 2000.0 6 Kim 22 South-Hall 45000.0 7 James 24 Houston 10000.0 8 老二 50 北京哈哈大学 15000.0 sqlite> SELECT * FROM COMPANY WHERE AGE BETWEEN 25 AND 27; 4 Mark 25 Rich-Mond 65000.0 5 David 27 Texas 85000.0 sqlite> SELECT AGE FROM COMPANY ...> WHERE EXISTS (SELECT AGE FROM COMPANY WHERE SALARY > 65000); 50 20 30 25 27 22 24 50 sqlite> SELECT * FROM COMPANY ...> WHERE AGE > (SELECT AGE FROM COMPANY WHERE SALARY > 65000); 1 老大 50 北京农业大学 5000.0 3 Lily 30 贵州b农业大学 2000.0 8 老二 50 北京哈哈大学 15000.0 -- 位运算符 sqlite> .mode line sqlite> select 60 | 13; 60 | 13 = 61 sqlite> select 60 & 13; 60 & 13 = 12 sqlite> select (~60); (~60) = -61 sqlite> select (60 << 2); (60 << 2) = 240 sqlite> select (60 >> 2); (60 >> 2) = 15