美文网首页
SQLite语法汇总

SQLite语法汇总

作者: 狂奔的胖蜗牛 | 来源:发表于2017-09-06 13:49 被阅读554次

1.创建数据库

//存在会打开,不存在,会创建
sqlite3 TEST.sqlite

//查看数据库表概要 sqlite_master 一个特殊的表,储存了数据的相关信息
.schema sqlite_master

//注释
.help -- 这是帮助信息
.help /*这是帮助信息*/

//检查sqlite数据库列表
.databases

//查看数据库中的表
.tables

//查看建表信息
.schema
.schema Person

//退出sqlite
.quit

//导出完整数据库到文本文件中
sqlite3 TEST.sqlite .dump > TEST.sql

//导入文本文件中数据到数据库
sqlite3 TEST.sqlite < TEST.sql

//附加数据库,如果存在SQLite.sqlite数据库,则把SQLite.sqlite和new绑定。不存在,则会创建,然后绑定。temp和main不能被附加。
ATTACH DATABASE 'SQLite.sqlite' As 'new';

//分离数据库
DETACH DATABASE 'new';

//终端设置
.header on
.mode column
.timer on
.width 10,20,30 //设置输出宽度

默认不区分大小写,但是有部分特殊的是大小写敏感的。比如GLOB和glob。

2.创建表

//语法
CREATE TABLE database_name.table_name(
   column1 datatype  PRIMARY KEY(one or more columns),
   column2 datatype,
   column3 datatype,
   .....
   columnN datatype,
);

//使用
CREATE TABLE Person (
id INT PRIMARK KEY NOT NULL, 
name TEXT NOT NULL, 
age INT NOT NULL, 
score INT);

3.删除表

//语法
DROP TABLE database_name.table_name;

//使用
DROP TABLE Student;

4.插入

//语法1
INSERT INTO TABLE_NAME [(column1, column2, column3,...columnN)]  
VALUES (value1, value2, value3,...valueN);
//语法3
INSERT INTO TABLE_NAME VALUES (value1,value2,value3,...valueN);

//使用
INSERT INTO Person (id, name, age, score) VALUES (0,"zs",10,99);

INSERT INTO Person VALUES (1,"ls",11,98);

INSERT INTO Person (id, name, age) VALUES (2,"ww",11);

//通过拷贝,将一个表拷入另外一个表中
INSERT INTO first_table_name [(column1, column2, ... columnN)] 
   SELECT column1, column2, ...columnN 
   FROM second_table_name
   [WHERE condition];

//使用
INSERT INTO Student (id, name, age, score) SELECT id, name, age, score FROM Person;

5.查询

//基本语法,查询具体字段
SELECT column1, column2, columnN FROM table_name;
//简化,查询所有
SELECT * FROM table_name;

//使用
SELECT id,name,age,score FROM Student;
SELECT * FROM Student;

//查询数据库中的表
SELECT tbl_name FROM sqlite_master WHERE type = 'table';

//列出表的完整信息
SELECT sql FROM sqlite_master WHERE type = 'table' AND tbl_name = 'Student';

6.运算符

//=
SELECT * FROM Student WHERE age = 10;

//>
SELECT * FROM Student WHERE age > 10;

//!=
SELECT * FROM Student WHERE age != 10;

//<>
SELECT * FROM Student WHERE age <> 10;

//>=
SELECT * FROM Student WHERE age >= 10;

//AND
SELECT * FROM Student WHERE age < 12 AND id < 2;

//OR
SELECT * FROM Student WHERE age = 11 OR id = 0;

//IS NOT NULL
SELECT * FROM Student WHERE score IS NOT NULL;

//LIKE
SELECT * FROM Student WHERE name LIKE "Z%";

//GLOB
SELECT * FROM Student WHERE name GLOB "z*";

//IN
SELECT * FROM Student WHERE age IN (10,11);

//NOT IN
SELECT * FROM Student WHERE age NOT IN (10,13);

//BETWEEN AND
SELECT * FROM Student WHERE age BETWEEN 9 AND 12;

//EXISTS
SELECT * FROM Student WHERE EXISTS (SELECT AGE FROM Student WHERE age > 10);

//子查询
SELECT * FROM Student WHERE age > (SELECT age FROM Student WHERE id >= 0);

//AVG()
SELECT AVG(age) FROM Student;

//SUM()
SELECT SUM(age) FROM Student;

//COUNT()
SELECT COUNT(age) FROM Student;

//CURRENT_TIMESTAMP
SELECT CURRENT_TIMESTAMP;

7.更新

//语法
UPDATE table_name
SET column1 = value1, column2 = value2...., columnN = valueN
WHERE [condition];

//使用
UPDATE Student SET score = 88 WHERE id = 2;

//更新全部
UPDATE Student SET color = "red", score = 90;

8.删除

//语法
DELETE FROM table_name
WHERE [condition];

//使用
DELETE FROM Student WHERE id = 2;

//删除全部
ELETE FROM Student;

//清除未使用的空间,建议使用删除全部后,都清除一次
VACUUM;

9.LIKE

//匹配上了,返回1
//%表示0个或者多个
//_一个
SELECT * FROM Person WHERE name LIKE "z%";
SELECT * FROM Person WHERE name LIKE "z_";

10.GLOB

//同LIKE
//*表示0个或者多个
//?一个
SELECT * FROM Person WHERE name GLOB "l*";
SELECT * FROM Person WHERE name GLOB "l?";

11.LIMIT

//限制返回数量
//语法
SELECT column1, column2, columnN 
FROM table_name
LIMIT [no of rows]

SELECT column1, column2, columnN 
FROM table_name
LIMIT [no of rows] OFFSET [row num]

//使用
SELECT * FROM Person LIMIT 1;
SELECT * FROM Person LIMIT 1 OFFSET 1;

12.ORDER BY

排序

//语法
SELECT column-list 
FROM table_name 
[WHERE condition] 
[ORDER BY column1, column2, .. columnN] [ASC | DESC];

//使用
SELECT * FROM Person ORDER BY score;//默认ASC升序
SELECT * FROM Person ORDER BY score DESC;//降序
SELECT * FROM Person ORDER BY score, name ASC;//按照score,name排序

13.GROUP BY

分组

//语法
SELECT column-list
FROM table_name
WHERE [ conditions ]
GROUP BY column1, column2....columnN
ORDER BY column1, column2....columnN

//使用
SELECT * FROM Person GROUP BY name;
SELECT name,score FROM Person GROUP BY name ORDER BY name DESC;

14.HAVING

过滤

//语法
SELECT column1, column2
FROM table1, table2
WHERE [ conditions ]
GROUP BY column1, column2
HAVING [ conditions ]
ORDER BY column1, column2

//使用
SELECT * FROM Person GROUP BY name HAVING count(name) > 1;

15.DISTINCT

清除重复

//语法
SELECT DISTINCT column1, column2,.....columnN 
FROM table_name
WHERE [condition]

//使用
SELECT DISTINCT name FROM Person;

16.各种语句在SELECT中的位置

SELECT
FROM
WHERE
GROUP BY
HAVING
ORDER BY

17.约束

//NOT NULL,不能为空
CREATE TABLE Person (id INT PRIMARK KEY NOT NULL, name TEXT NOT NULL, age INT NOT NULL, score INT);

//DEFAULT,提供一个默认值
CREATE TABLE Student (id INT PRIMARK KEY NOT NULL, name TEXT DEFAULT "_");

//PRIMARY KEY,主键,不能重复
CREATE TABLE Student (id INT PRIMARK KEY NOT NULL, name TEXT DEFAULT "_");

//CHECK,约束,检查输入值,不满足不能输入到表
CREATE TABLE Teacher (id INT PRIMARK KEY NOT NULL, age INT CHECK(age>10));

18.结合

//交叉连接,两者相互叠加
SELECT ... FROM table1 CROSS JOIN table2 ...

//使用
SELECT name,height,age FROM Person CROSS JOIN TEACHER;


//内连接,按照条件合并
SELECT ... FROM table1 [INNER] JOIN table2 ON conditional_expression ...
SELECT ... FROM table1 JOIN table2 USING ( column1 ,... ) ...
SELECT ... FROM table1 NATURAL JOIN table2...

//使用
SELECT name,height FROM Person INNER JOIN TEACHER ON Person.id = TEACHER.id;

//外连接
SELECT ... FROM table1 LEFT OUTER JOIN table2 ON conditional_expression ...
SELECT ... FROM table1 LEFT OUTER JOIN table2 USING ( column1 ,... ) ...

//使用
SELECT name,height FROM Person LEFT OUTER JOIN TEACHER ON Person.id = TEACHER.id;

19.NULL

表示一个值的缺失,在字段中显示为一个空白的值。

//语法
CREATE TABLE COMPANY(
   ID INT PRIMARY KEY     NOT NULL,
   NAME           TEXT    NOT NULL,
   AGE            INT     NOT NULL,
   ADDRESS        CHAR(50),
   SALARY         REAL
);

20.别名

可以暂时把表或者列重命名,不会改变数据库表名。

//语法-表
SELECT column1, column2....
FROM table_name AS alias_name
WHERE [condition];
//列
SELECT column_name AS alias_name
FROM table_name
WHERE [condition];


SELECT C.id,C.name,C.age,D.height
FROM Person as C, TEACHER as D
 WHERE C.id = D.id;

SELECT C.id AS ID,C.name AS NAME,D.height AS HEIGHT
FROM Person AS C, TEACHER AS D
WHERE C.id = D.id;

21.触发器

当数据库发生指定事件时,触发器会被调用。

  • 发生DELETE/INSERT/UPDATE时触发,或者一个、多个指定表的列发生更新时触发
  • 只支持FOR EACH ROW触发
  • 没提供WHEN子句,会对所有执行SQL语句触发
  • BEFORE或AFTER关键字决定何时执行触发器
  • 当触发器关联的表删除时,自动删除触发器
  • 要修改的表必须存在同一数据库
  • 一个特殊的SQL函数RAISE可以用于触发器程序抛出异常
//语法
CREATE  TRIGGER trigger_name [BEFORE|AFTER] event_name 
ON table_name
BEGIN
 -- Trigger logic goes here....
END;

//使用 a触发器的标示符
CREATE TRIGGER a AFTER INSERT ON Person
BEGIN
INSERT INTO AUDIT(id,date) VALUES(new.id,datetime("now"));
END;


//列出触发器
SELECT name FROM sqlite_master WHERE type = "trigger";

//特定表的触发器
SELECT name FROM sqlite_master WHERE type = "trigger" AND tbl_name = "Person";

//删除触发器 audit_log是触发器标示符
DROP TRIGGER audit_log;

22.索引

一种特殊的查找表,用于加快数据的检索。
能够加快SELECT和WHERE子句的速度,但是会减慢UPDATE和INSERT的输入。

//基本语法
CREATE INDEX index_name ON table_name;

//单列索引
CREATE INDEX index_name
ON table_name (column_name);

//唯一索引
CREATE UNIQUE INDEX index_name
on table_name (column_name);

//组合索引
CREATE INDEX index_name
on table_name (column1, column2);

//使用
CREATE INDEX id_id ON Person(id);

//查看表的索引
.indices Person

//查看数据库所有索引
SELECT * FROM sqlite_master WHERE type = "index";

//删除索引
DROP INDEX index_name;

不应该使用索引的情况:

  • 表内容较小
  • 大批量插入和更新
  • 含有大量NULL值的列上
  • 频繁操作的列上

23.ALERT

可以重命名表和增加新的列。

//语法-重命名
ALTER TABLE database_name.table_name RENAME TO new_table_name;
//语法-添加新的列
ALTER TABLE database_name.table_name ADD COLUMN column_def...;

//使用-重命名
ALTER TABLE TEACHER RENAME TO Teachers;
//使用-添加新的列
ALTER TABLE Teachers ADD COLUMN sex char(1);

24.视图

可以创建出一个视图,该视图和表一样,但是不能够执行DELETE/INSERT/UPDATE语句,但是可以添加触发器。

//语法
CREATE [TEMP | TEMPORARY] VIEW view_name AS
SELECT column1, column2.....
FROM table_name
WHERE [condition];

//使用-创建
CREATE VIEW PERSONVIEW AS SELECT * FROM Person;

//查询
 select * FROM PERSONVIEW;

//删除
drop view PERSONVIEW;

25.子查询

可以与SELECT/INSERT/UPDATE/DELETE一起使用,进一步限制要检索的数据。

  • 子查询必须用括号括起来
  • 子查询在SELECT中只能有一个列
  • ORDER BY 不能用在子查询中
  • 子查询返回多余一行,智能与多值运算符一起使用,如IN
  • BETWEEN不能与子查询一起使用,但可以在子查询内使用
//语法-SELECT
SELECT column_name [, column_name ]
FROM   table1 [, table2 ]
WHERE  column_name OPERATOR
      (SELECT column_name [, column_name ]
      FROM table1 [, table2 ]
      [WHERE])


//使用
SELECT * FROM Person WHERE id IN (SELECT id FROM Person WHERE id > 1);

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

//使用
INSERT INTO PersonT SELECT * FROM Person WHERE id IN (SELECT id FROM Person);

//语法-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) ]

26.自动递增

用于表中的字段自动的递增

//语法
CREATE TABLE table_name(
   column1 INTEGER AUTOINCREMENT,
   column2 datatype,
   column3 datatype,
   .....
   columnN datatype,
);

//使用
CREATE TABLE C (ID INTEGER PRIMARY KEY AUTOINCREMENT, NAME TEXT NOT NULL);

27.SQLite注入

用户通过输入,并将输入内容插入到 SQLite 数据库中,这个时候您就面临着一个被称为 SQL 注入的安全问题。注入通常在请求用户输入时发生,比如需要用户输入姓名,但用户却输入了一个 SQLite 语句,而这语句就会在不知不觉中在数据库上运行。

防治办法就是,插入前进行判断。

28.EXPLAIN

可用EXPLAIN来描述表的细节。

//语法
EXPLAIN [SQLite Query]
EXPLAIN  QUERY PLAN [SQLite Query]

29.日期和时间

函数 作用
date(timestring, modifier, modifier, ...) 以 YYYY-MM-DD 格式返回日期。
time(timestring, modifier, modifier, ...) 以 HH:MM:SS 格式返回时间。
datetime(timestring, modifier, modifier, ...) 以 YYYY-MM-DD HH:MM:SS 格式返回。
julianday(timestring, modifier, modifier, ...) 这将返回从格林尼治时间的公元前 4714 年 11 月 24 日正午算起的天数
strftime(format, timestring, modifier, modifier, ...) 这将根据第一个参数指定的格式字符串返回格式化的日期。具体格式见下边讲解。

YYYY年
MM月
DD日
HH时
MM分
SS秒
SSS毫秒
now当前

30.常用函数

函数 作用
COUNT 计算数据库表中的行数
MAX 最大值
MIN 最小值
AVG 平均值
SUM 总和
RANDOM 随机数
ABS 绝对值
UPPER 大写
LOWER 小写
LENGTH 字符串长度
sqlite_version 返回SQLite版本

相关文章

  • SQLite语法汇总

    1.创建数据库 默认不区分大小写,但是有部分特殊的是大小写敏感的。比如GLOB和glob。 2.创建表 3.删除表...

  • SQLite 语法

    SQLite 语法 SQLite 是遵循一套独特的称为语法的规则和准则。本教程列出了所有基本的 SQLite 语法...

  • iOS - FMDB使用

    SQLite语法可参考SQLite 教程[https://www.runoob.com/sqlite/sqlite...

  • SQLite

    参考 sqlite3 语句总结 SQLite可视化管理工具汇总 SQLite教程 sqlitestudio(可视化...

  • SQLite的基础知识

    数据库SQLite的基础语法 SQLite 1. 什么是SQLite: (1) SQLite是一款轻型的嵌入式数据...

  • SQLite(语法)

    参考:http://www.runoob.com/sql/sql-syntax.html 1.大小写敏感 SQL...

  • Jetpack 详解之 Room 三 SQLite常用查询语法

    SQLite Select 语句 SQLite 的 SELECT 语句的基本语法如下 ,column1, colu...

  • Android之SQLite的Sql语言介绍

    .. SQLite SQLite 是遵循一套独特的称为语法的规则和准则。 所有的 SQLite 语句可以以任何关键...

  • sqlite学习3

    SQL for SQLite 语法 verb + subject + predicate commannds(命令...

  • 告别sqlite的复杂语法

    使用方便,不必再去写繁琐的sqlite语法. 使用 引入sqlite3 API. pod 'SLCSqlite' ...

网友评论

      本文标题:SQLite语法汇总

      本文链接:https://www.haomeiwen.com/subject/arvujxtx.html