20160616更新

参考: http://www.runoob.com/sqlite/sqlite-tutorial.html

1. SQLite  PRAGMA:可以用在 SQLite 环境内控制各种环境变量和状态标志。

一个 PRAGMA 值可以被读取,也可以根据需求进行设置。

(1)读取语法:只需要提供该 pragma 的名字

PRAGMA pragma_name;

(2)设置语法:

PRAGMA pragma_name = value;

(3)举几个例子:pragma.txt

详情请参考:http://www.runoob.com/sqlite/sqlite-pragma.html

pragma auto_vacuum; -- 这里是查看

pragma cache_size;

pragma case_sensitive_like;

pragma count_changes;

pragma database_list;

pragma encoding;

pragma freelist_count;

pragma auto_vacuum = FULL;  -- 这里是设置

pragma cache_size = 10;

pragma case_sensitive_like = true;

pragma count_changes = true;

2. SQLite 约束:约束是在表的数据列上强制执行的规则

约束可以是列级或表级。列级约束仅适用于列,表级约束被应用到整个表

(1)以下是在 SQLite 中常用的约束

  • NOT NULL 约束:确保某列不能有 NULL 值。

  • DEFAULT 约束:当某列没有指定值时,为该列提供默认值。

  • UNIQUE 约束:确保某列中的所有值是不同的。

  • PRIMARY Key 约束:唯一标识数据库表中的各行/记录。

  • CHECK 约束:CHECK 约束确保某列中的所有值满足一定条件

(2)primary key约束:

  PRIMARY KEY 约束唯一标识数据库表中的每个记录。

  在一个表中可以有多个 UNIQUE 列,但只能有一个主键。

  在设计数据库表时,主键是很重要的。主键是唯一的 ID。

  在 SQLite 中,主键可以是 NULL,这是与其他数据库不同的地方。

  主键是表中的一个字段,唯一标识数据库表中的各行/记录。主键必须包含唯一值。主键列不能有 NULL 值。

  一个表只能有一个主键,它可以由一个或多个字段组成。当多个字段作为主键,它们被称为复合键。

  如果一个表在任何字段上定义了一个主键,那么在这些字段上不能有两个记录具有相同的值。

(3)实例: constraint.txt

create table tab_test
(
ID INT PRIMARY KEY NOT NULL,  -- 主键 非空
NAME TEXT NOT NULL UNIQUE, -- 非空, 不相等
AGE INT CHECK(AGE > 0), -- check约束,AGE必须大于0
ADDRESS CHAR(50),
SALARY REAL DEFAULT 5000.00 -- 默认约束
);

(4)删除约束:在 SQLite 中,ALTER TABLE 命令允许用户重命名表,或向现有表添加一个新的列。重命名列,删除一列,或从一个表中添加或删除约束都是不可能的。

 3. SQLite  joins:用于结合两个或多个数据库中表的记录。JOIN 是一种通过共同值来结合两个表中字段的手段

(1)主要有三种连接方式:

  • 交叉连接 - CROSS JOIN

  • 内连接 - INNER JOIN

  • 外连接 - OUTER JOIN

(2)为了练习需要新建一个表:  create_department.txt

create table department(

ID INT PRIMARY KEY NOT NULL,

DEPT CHAR(50) NOT NULL,

EMP_ID INT NOT NULL );

-- 插入一些数据

insert into department values(1, 'IT Billing', 1);

insert into department values(2, 'Engineering', 2);

insert into department values(3, 'Finance', 7);

select * from department;

(3)交叉连接:把第一个表的每一行与第二个表的每一行进行匹配。如果两个输入表分别有 x 和 y 列,则结果表有 x*y 列。有时会特别庞大

语法:

SELECT ... FROM table1 CROSS JOIN table2 ...

(4)内连接 inner join:根据连接谓词结合两个表(table1 和 table2)的列值来创建一个新的结果表。

查询会把 table1 中的每一行与 table2 中的每一行进行比较,找到所有满足连接谓词的行的匹配对。

为了避免冗余,并保持较短的措辞,可以使用 USING 表达式声明内连接(INNER JOIN)条件。这个表达式指定一个或多个列的列表:

SELECT ... FROM table1 JOIN table2 USING ( column1 ,... ) ...

自然连接(NATURAL JOIN)类似于 JOIN...USING,只是它会自动测试存在两个表中的每一列的值之间相等值:

SELECT ... FROM table1 NATURAL JOIN table2...

语法:

SELECT ... FROM table1 [INNER] JOIN table2 ON conditional_expression ...

(5)外连接 outer join:虽然 SQL 标准定义了三种类型的外连接:LEFT、RIGHT、FULL,但 SQLite 只支持 左外连接(LEFT OUTER JOIN)

外连接(OUTER JOIN)声明条件的方法与内连接(INNER JOIN)是相同的,使用 ON、USING 或 NATURAL 关键字来表达。

最初的结果表以相同的方式进行计算。一旦主连接计算完成,外连接(OUTER JOIN)将从一个或两个表中任何未连接的行合并进来,外连接的列使用 NULL 值,将它们附加到结果表中。

为了避免冗余,并保持较短的措辞,可以使用 USING 表达式声明外连接(OUTER JOIN)条件。这个表达式指定一个或多个列的列表:

SELECT ... FROM table1 LEFT OUTER JOIN table2 USING ( column1 ,... ) ...

语法:

SELECT ... FROM table1 LEFT OUTER JOIN table2 ON conditional_expression ...

(6)实例: join.txt

-- 交叉连接,表1与表2的所有列进行一一匹配

select EMP_ID, NAME, DEPT from company cross join department;

-- 内连接,满足连接谓词时就生成一个新的结果

select EMP_ID, NAME, DEPT from company inner join department on company.ID = department.EMP_ID;

-- 左外连接,从一个或两个表中任何未连接的行合并进来,外连接的列使用 NULL 值,将它们附加到结果表中。

select EMP_ID, NAME, DEPT from company left outer join department on company.ID = department.EMP_ID;

结果:

(7)比较:(不知道这样算不算正确,我也不是理解的太深刻)

交叉连接后结果非常多,慎用

左外连接会填充NULL,内连接不会

4, SQLite Unions子句:用于合并两个或多个 SELECT 语句的结果,不返回任何重复的行。

为了使用 UNION,每个 SELECT 被选择的列数必须是相同的,相同数目的列表达式,相同的数据类型,并确保它们有相同的顺序,但它们不必具有相同的长度

(1)UNION基本语法:

SELECT column1 [, column2 ]
FROM table1 [, table2 ]
[WHERE condition] UNION SELECT column1 [, column2 ]
FROM table1 [, table2 ]
[WHERE condition]

(2)union all基本语法:用于结合两个 SELECT 语句的结果,包括重复行。适用于 UNION 的规则同样适用于 UNION ALL 运算符。

SELECT column1 [, column2 ]
FROM table1 [, table2 ]
[WHERE condition] UNION ALL SELECT column1 [, column2 ]
FROM table1 [, table2 ]
[WHERE condition]

(3)实例:unions.txt

select EMP_ID,NAME,DEPT from company inner join department -- 内连接

on company.ID = department.EMP_ID

UNION

select EMP_ID,NAME,DEPT from company left outer join department  -- 左外连接

on company.ID = department.EMP_ID;

select EMP_ID,NAME,DEPT from company inner join department -- 内连接

on company.ID = department.EMP_ID

UNION  ALL

select EMP_ID,NAME,DEPT from company left outer join department  -- 左外连接

on company.ID = department.EMP_ID;

5. SQLite NULL值:

SQLite 的 NULL 是用来表示一个缺失值的项。表中的一个 NULL 值是在字段中显示为空白的一个值。

带有 NULL 值的字段是一个不带有值的字段。NULL 值与零值或包含空格的字段是不同的,理解这点是非常重要的。

(1)带有 NULL 值的字段在记录创建的时候可以保留为空。

(2)NULL 值在选择数据时会引起问题,因为当把一个未知的值与另一个值进行比较时,结果总是未知的,且不会包含在最后的结果中。

6. SQLite 别名:暂时把表或列重命名为另一个名字,这被称为别名

重命名是临时的改变,在数据库中实际的表的名称不会改变。

列别名用来为某个特定的 SQLite 语句重命名表中的列。

(1)语法:

 别名的基本语法如下:

SELECT column1, column2....
FROM table_name AS alias_name
WHERE [condition];

 别名的基本语法如下:

SELECT column_name AS alias_name
FROM table_name
WHERE [condition];

(2)实例:

select C.ID as company_ID, C.NAME as company_NAME, D.DEPT as department_DEPT  -- 这里是给列取别名
from company as C , department as D  -- 这里是给表取别名
where C.ID = D.EMP_ID; - 并且使用

(3)效果:

7. SQLite触发器: Trigger SQLite 的触发器是数据库的回调函数,它会自动执行/指定的数据库事件发生时调用。

(1)要点:

  • SQLite 的触发器(Trigger)可以指定在特定的数据库表发生 DELETE、INSERT 或 UPDATE 时触发,或在一个或多个指定表的列发生更新时触发。

  • SQLite 只支持 FOR EACH ROW 触发器(Trigger),没有 FOR EACH STATEMENT 触发器(Trigger)。因此,明确指定 FOR EACH ROW 是可选的。

  • WHEN 子句和触发器(Trigger)动作可能访问使用表单 NEW.column-name 和 OLD.column-name 的引用插入、删除或更新的行元素,其中 column-name 是从与触发器关联的表的列的名称。

  • 如果提供 WHEN 子句,则只针对 WHEN 子句为真的指定行执行 SQL 语句。如果没有提供 WHEN 子句,则针对所有行执行 SQL 语句。

  • BEFORE 或 AFTER 关键字决定何时执行触发器动作,决定是在关联行的插入、修改或删除之前或者之后执行触发器动作。

  • 当触发器相关联的表删除时,自动删除触发器(Trigger)。

  • 要修改的表必须存在于同一数据库中,作为触发器被附加的表或视图,且必须只使用 tablename,而不是database.tablename

  • 一个特殊的 SQL 函数 RAISE() 可用于触发器程序内抛出异常。

(2)语法:

CREATE  TRIGGER trigger_name [BEFORE|AFTER] event_name
ON table_name
BEGIN
-- Trigger logic goes here....
END;

event_name 可以是在所提到的表 table_name 上的 INSERT、DELETE 和 UPDATE 数据库操作。您可以在表名后选择指定 FOR EACH ROW。

以update为例:

CREATE  TRIGGER trigger_name [BEFORE|AFTER] UPDATE OF column_name
ON table_name
BEGIN
-- Trigger logic goes here.... -- 这里是执行update时的操作,可以写进一张表里
END;

(3)实例:以插入数据为例:

先创建一张表,存储插入信息: create_audit.txt

CREATE TABLE AUDIT(
EMP_ID INT NOT NULL,
ENTRY_DATE TEXT NOT NULL
);

再创建触发器:  trigger.txt

create trigger audit_log after insert
on company
begin
 insert into audit (EMP_ID, ENIRY_DATA) values(new.ID, datetime('now'));  -- 每次插入数据,就往audit中插入一条数据
end;

 注意: new代表新的, 还可以用old,表示操作之前的信息。

这个例子中,如果insert换成delete,插入时就必须用 old.ID了,因为记录已经被删除了,new已经没有意义了。

再把company表中的数据清空:

delete from company;

最后运行插入数据: insert_company.txt

可以看到audit中的数据:

(4)列出 触发器:列出所有的触发器

select name from sqlite_master where type = 'trigger';  --  列出所有的触发器

select name from sqlite_master where type = 'trigger' AND tbl_name='company'; -- 找出特定表中的触发器

(5)删除触发器:drop命令

如: drop trigger trigger_name;

8.SQLite 索引:是一种特殊的查找表,数据库搜索引擎用来加快数据检索

索引是一个指向表中数据的指针。一个数据库中的索引与一本书后边的索引是非常相似的。

索引有助于加快 SELECT 查询和 WHERE 子句,但它会减慢使用 UPDATE 和 INSERT 语句时的数据输入。

索引可以创建或删除,但不会影响数据。

(1)基本语法

CREATE INDEX index_name ON table_name;

(2)

单列索引:单列索引是一个只基于表的一个列上创建的索引。基本语法如下:

CREATE INDEX index_name
ON table_name (column_name);

唯一索引:使用唯一索引不仅是为了性能,同时也为了数据的完整性。唯一索引不允许任何重复的值插入到表中。基本语法如下

CREATE INDEX index_name
on table_name (column_name);

组合索引:组合索引是基于一个表的两个或多个列上创建的索引

CREATE INDEX index_name
on table_name (column1, column2);

隐式索引:隐式索引是在创建对象时,由数据库服务器自动创建的索引。索引自动创建为主键约束和唯一约束。

(3)实例: index.txt

在company的SALARY上建立索引:

CREATE INDEX salary_index ON COMPANY (SALARY);

(4)实例: find_index.txt

.indices company -- .indices命令  列出company表上可用的所有的索引

select * from sqlite_master where type='index'; -- 列出数据库范围内的所有索引

(5)删除索引: drop  index index_name;

(6)什么情况下要避免使用索引:

  • 索引不应该使用在较小的表上。

  • 索引不应该使用在有频繁的大批量的更新或插入操作的表上。

  • 索引不应该使用在含有大量的 NULL 值的列上。

  • 索引不应该使用在频繁操作的列上。

9、SQLite  index by:"INDEXED BY index-name" 子句规定必须需要命名的索引来查找前面表中值

如果索引名 index-name 不存在或不能用于查询,然后 SQLite 语句的准备失败。

(1)语法:

SELECT|DELETE|UPDATE column1, column2...
from table_name
INDEXED BY (index_name)
WHERE (CONDITION);

(2)、实例:indexby.txt

create index salary_index on company(SALARY);  -- 创建索引
select * from company INDEXED BY salary_index where SALARY > 4000; -- 利用索引进行查询

 

学习SQLite之路(三)的更多相关文章

  1. 学习SQLite之路(五) C/C++ SQLite开发实例

    介绍一种乌班图中使用sqlite的用法,非常简单,下面的例子是在乌班图12.04中实现的: 1,先安装两个东西: sudo apt-get install sqlite sqlite3 sudo ap ...

  2. 学习SQLite之路(二)

    下面就是真正关于数据库的一些知识了: 20160614更新 参考: http://www.runoob.com/sqlite/sqlite-tutorial.html 1. SQLite创建表: 基本 ...

  3. 学习SQLite之路(一)

    工作快一年了,接触的东西不是很多,学到的东西也不多.无意中看到公司的代码有一点关于sqlite3的(不是我这一层负责的代码),于是乎就学学试试. 参考: http://www.runoob.com/s ...

  4. 学习SQLite之路(四)

    20160621 更新 参考: http://www.runoob.com/sqlite/sqlite-tutorial.html 1. SQLite   alter命令:不通过执行一个完整的转储和数 ...

  5. SpringCloud学习成长之路三 服务消费者(Feign)

    一.Feign简介 Feign是一个声明式的伪Http客户端,它使得写Http客户端变得更简单.使用Feign,只需要创建一个接口并注解. 它具有可插拔的注解特性,可使用Feign 注解和JAX-RS ...

  6. 学习之路三十九:新手学习 - Windows API

    来到了新公司,一开始就要做个程序去获取另外一个程序里的数据,哇,挑战性很大. 经过两周的学习,终于搞定,主要还是对Windows API有了更多的了解. 文中所有的消息常量,API,结构体都整理出来了 ...

  7. Python学习之旅(三十八)

    Python基础知识(37):访问数据库(Ⅱ) 二.MySQL MySQL是Web世界中使用最广泛的数据库服务器.SQLite的特点是轻量级.可嵌入,但不能承受高并发访问,适合桌面和移动应用.而MyS ...

  8. 学习WCF之路,长期更新

    我学习WCF之路:创建一个简单的WCF程序   为了使读者对基于WCF的编程模型有一个直观的映像,我将带领读者一步一步地创建一个完整的WCF应用.本应用功能虽然简单,但它涵盖了一个完整WCF应用的基本 ...

  9. 学习 Webpack5 之路(优化篇)

    一.前言 从 0 到 1 学习的朋友可参考前置学习文章: 学习 Webpack5 之路(基础篇) 学习 Webpack5 之路(实践篇) 前置文章 学习 Webpack5 之路(基础篇) 对 webp ...

随机推荐

  1. sed实例精解--例说sed完整版

    原文地址:sed实例精解--例说sed完整版 作者:xiaozhenggang 最近在学习shell,怕学了后面忘了前面的就把学习和实验的过程记录下来了.这里是关于sed的,前面有三四篇分开的,现在都 ...

  2. InnoDB源码分析--缓冲池(三)

    转载请附原文链接:http://www.cnblogs.com/wingsless/p/5582063.html 昨天写到了InnoDB缓冲池的预读:<InnoDB源码分析--缓冲池(二)> ...

  3. Java api 入门教程 之 JAVA的文件操作

    I/O类使用 由于在IO操作中,需要使用的数据源有很多,作为一个IO技术的初学者,从读写文件开始学习IO技术是一个比较好的选择.因为文件是一种常见的数据源,而且读写文件也是程序员进行IO编程的一个基本 ...

  4. 【转】input输入框中光标高度的变化问题

    原文地址:http://blog.csdn.net/luochao_tj/article/details/17755457 input[type='text']文本框光标高度在有输入内容和为空时发生很 ...

  5. eclipse常用配置

    一. 手动方式安装svn插件 1. 根据本地的svn客户端的版本,到http://subclipse.tigris.org/ 下载eclipse对应版本的svn插件包 注:装eclipse里面的svn ...

  6. springmvc+log4j操作日志记录,详细配置

    没有接触过的,先了解一下:log4j教程 部分内容来:log4j教程 感谢! 需要导入包: log包:log4j-12.17.jar 第一步:web.xml配置 <!-- log4j配置,文件路 ...

  7. WIN32 API编程之 透明static

    createwindow可以直接创建一个staitc,但这个static是不透明的,如果我们把窗口背景设置为GRAY_BRUSH,则static会很明显的有一个白色背景,一般来说这样肯定很难看. 可以 ...

  8. 命令行向php传入参数的两种方法

    ##$argv or $argc  $argv 包含当运行于命令行下时传递给当前脚本的参数的数组.  $argv[0]  就是脚本文件名. $argc 包含当运行于命令行下时传递给当前脚本的参数的数目 ...

  9. Linux nm命令

    一.简介 显示关于对象文件.可执行文件以及对象文件库里的符号信息. 二.选项 http://www.cnblogs.com/wangkangluo1/archive/2012/07/02/257243 ...

  10. [转]backbone.js 示例 todos

    本文转自:http://www.css88.com/doc/backbone/examples/todos/index.html <!DOCTYPE html> <html lang ...