现有两张表用于下面的演示:company、department.
SQLite 的 Join 子句用于结合两个或多个数据库中表的记录。JOIN 是一种通过共同值来结合两个表中字段的手段。
SQL 定义了三种主要类型的连接:交叉连接 - CROSS JOIN、内连接 - INNER JOIN、外连接 - OUTER JOIN。
1、交叉连接(CROSS JOIN)把第一个表的每一行与第二个表的每一行进行匹配。如果两个输入表分别有 x 和 y 行,则结果表有 x*y 行。
select emp_id,dept,name from company cross join department;
2、内连接(INNER JOIN)根据连接谓词结合两个表(table1 和 table2)的列值来创建一个新的结果表。是最常见的连接类型,是默认的连接类型。INNER 关键字是可选的。
基本用法:
SELECT ... FROM table1 [INNER] JOIN table2 ON conditional_expression ...
如果匹配条件有多个列,也可以使用using
表达式
SELECT ... FROM table1 JOIN table2 USING ( column1 ,... ) ...
如查询company.id和department.emp_id相等的记录:
select emp_id,dept,name from company inner join department on company.id = department.emp_id;
3、 外连接(OUTER JOIN)是内连接(INNER JOIN)的扩展。虽然 SQL 标准定义了三种类型的外连接:LEFT、RIGHT、FULL,但 SQLite 只支持 左外连接(LEFT OUTER JOIN)。外连接(OUTER JOIN)声明条件的方法与内连接(INNER JOIN)是相同的,一旦主连接计算完成,外连接(OUTER JOIN)将从一个或两个表中任何未连接的行合并进来,外连接的列使用 NULL 值,将它们附加到结果表中。
您可以暂时把表或列重命名为另一个名字,这被称为别名。
表别名用法:
SELECT column1, column2....
FROM table_name AS alias_name
WHERE [condition];
列别名用法:
SELECT column_name AS alias_name
FROM table_name
WHERE [condition];
SQLite 触发器(Trigger)是数据库的回调函数,它会在指定的数据库事件发生时自动执行/调用。
以下是关于 SQLite 的触发器(Trigger)的要点:
1、SQLite 的触发器(Trigger)可以指定在特定的数据库表发生 DELETE、INSERT 或 UPDATE 时触发,或在一个或多个指定表的列发生更新时触发。
2、SQLite 只支持 FOR EACH ROW 触发器(Trigger),没有 FOR EACH STATEMENT触发器(Trigger)。因此,明确指定 FOR EACH ROW 是可选的。
3、WHEN 子句和触发器(Trigger)动作可能访问使用表单 NEW.column-name 和 OLD.column-name的引用插入、删除或更新的行元素,其中 column-name 是从与触发器关联的表的列的名称。
4、 如果提供 WHEN 子句,则只针对 WHEN 子句为真的指定行执行 SQL 语句。如果没有提供 WHEN 子句,则针对所有行执行 SQL语句。
5、BEFORE 或 AFTER 关键字决定何时执行触发器动作,决定是在关联行的插入、修改或删除之前或者之后执行触发器动作。
6、当触发器相关联的表删除时,自动删除触发器(Trigger)。
7、要修改的表必须存在于同一数据库中,作为触发器被附加的表或视图,且必须只使用 tablename,而不是database.tablename。
8、一个特殊的 SQL 函数 RAISE() 可用于触发器程序内抛出异常。
基本语法:
CREATE TRIGGER trigger_name [BEFORE|AFTER] event_name
ON table_name
BEGIN
-- 触发器逻辑....
END;
event_name 可以是在所提到的表 table_name 上的 INSERT、DELETE 和 UPDATE 数据库操作
如我们要记录修改薪资的日志,首先创建一个日志表:
create table log (emp_id int not null, date text not null);
然后创建触发器:
create trigger update_log after update of salary on company
begin
insert into log values(new.id,datetime('now'));
end;
最后修改company的某个薪资,查询结果:
如果要查询某张表上有什么触发器,如下查询company表上的触发器,如果不加company条件,则查询数据库所有的触发器:
select name from sqlite_master where type='trigger' and tbl_name = 'company';
drop trigger update_log;
索引(Index)是一种特殊的查找表,数据库搜索引擎用来加快数据检索。简单地说,索引是一个指向表中数据的指针。一个数据库中的索引与一本书的索引目录是非常相似的。索引有助于加快 SELECT 查询和 WHERE 子句,但它会减慢使用 UPDATE 和 INSERT 语句时的数据输入。索引可以创建或删除,但不会影响数据。
使用索引的原则:
索引不应该使用在较小的表上。
索引不应该使用在有频繁的大批量的更新或插入操作的表上。
索引不应该使用在含有大量的 NULL 值的列上。
索引不应该使用在频繁操作的列上
基本语法:
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);
隐式索引是在创建对象时,由数据库服务器自动创建的索引。索引自动创建为主键约束和唯一约束。
在 COMPANY 表的 salary 列上创建一个索引:
create index salary_index on company (salary);
通过.indices company
可以查看索引
删除索引drop index salary_index
Indexed By语句
“INDEXED BY index-name” 子句规定必须需要命名的索引来查找前面表中值。
现在使用 INDEXED BY 子句从表 COMPANY 中选择数据:
SELECT * FROM COMPANY INDEXED BY salary_index WHERE salary > 5000;
在SQLite中使用索引优化查询速度
SQLite 索引(Index)
未完待续~~