标签:
20160621 更新
1. SQLite alter命令:不通过执行一个完整的转储和数据的重载来修改已有的表。
可以使用 ALTER TABLE 语句重命名表,使用 ALTER TABLE 语句还可以在已有的表中添加额外的列。
在 SQLite 中,除了重命名表和在已有的表中添加列,ALTER TABLE 命令不支持其他操作(在其他数据库中可以改变表中列的数据类型,删除表中的列)
(1)基本语法:
用来重命名已有的表的 ALTER TABLE 的基本语法如下:
ALTER TABLE database_name.table_name RENAME TO new_table_name;
用来在已有的表中添加一个新的列的 ALTER TABLE 的基本语法如下:
ALTER TABLE database_name.table_name ADD COLUMN column_def...;
(2)实例: alter_company.txt
alter table company rename to old_company; -- 重命名表
alter table old_company add column sex char(1);-- 增加新列,新添加的列是以 NULL 值来填充的
2、SQLite Truncate Table:在 SQLite 中,并没有 TRUNCATE TABLE 命令。
但可以使用 SQLite 的 DELETE 命令从已有的表中删除全部的数据,但建议使用 DROP TABLE 命令删除整个表,然后再重新创建一遍。
(1):基本语法:
DELETE 命令的基本语法如下:
sqlite> DELETE FROM table_name;
DROP TABLE 的基本语法如下:
sqlite> DROP TABLE table_name;
如果您使用 DELETE TABLE 命令删除所有记录,建议使用 vacuum 命令清除未使用的空间。
(2)实例:
SQLite> DELETE FROM COMPANY;
SQLite> VACUUM;
现在,COMPANY 表中的记录完全被删除,使用 SELECT 语句将没有任何输出。
3. SQLite 视图(view):是通过相关的名称存储在数据库中的一个 SQLite 语句。
视图(View)实际上是一个以预定义的 SQLite 查询形式存在的表的组合。
视图(View)可以包含一个表的所有行或从一个或多个表选定行。视图(View)可以从一个或多个表创建,这取决于要创建视图的 SQLite 查询。
(1)视图(View)是一种虚表,允许用户实现以下几点:
用户或用户组查找结构数据的方式更自然或直观。
限制数据访问,用户只能看到有限的数据,而不是完整的表。
汇总各种表中的数据,用于生成报告。
SQLite 视图是只读的,因此可能无法在视图上执行 DELETE、INSERT 或 UPDATE 语句。但是可以在视图上创建一个触发器,当尝试 DELETE、INSERT 或 UPDATE 视图时触发,需要做的动作在触发器内容中定义。
(2)创建视图:
CREATE [TEMP | TEMPORARY] VIEW view_name AS
SELECT column1, column2.....
FROM table_name
WHERE [condition];
(3)删除视图:
DROP VIEW view_name;
(4)实例: view.txt
create view company_view as select NAME, ID, SALARY from company where SALARY>2000;
删除: drop view company_view;
4、SQLite 事务(Transaction):一个对数据库执行工作单元。(就是一堆操作的集合)
是以逻辑顺序完成的工作单位或序列,可以是由用户手动操作完成,也可以是由某种数据库程序自动完成。
您可以把许多的 SQLite 查询联合成一组,把所有这些放在一起作为事务的一部分进行执行。
(1)事务的属性:(ACID)
原子性(Atomicity):确保工作单位内的所有操作都成功完成,否则,事务会在出现故障时终止,之前的操作也会回滚到以前的状态。
一致性(Consistency):确保数据库在成功提交的事务上正确地改变状态。
隔离性(Isolation):使事务操作相互独立和透明。
持久性(Durability):确保已提交事务的结果或效果在系统发生故障的情况下仍然存在。
(2)事务控制(语法):
BEGIN TRANSACTION:开始事务处理。
COMMIT:保存更改,或者可以使用 END TRANSACTION 命令。
ROLLBACK:回滚所做的更改。
(3)begin命令: BEGIN TRANSACTION 命令或简单的 BEGIN 命令来启动。此类事务通常会持续执行下去,直到遇到下一个 COMMIT 或 ROLLBACK 命令。不过在数据库关闭或发生错误时,事务处理也会回滚。
以下是启动一个事务的简单语法:
BEGIN;
or
BEGIN TRANSACTION;
commit命令:COMMIT 命令是用于把事务调用的更改保存到数据库中的事务命令。
COMMIT 命令把自上次 COMMIT 或 ROLLBACK 命令以来的所有事务保存到数据库。
基本语法:
COMMIT;
or
END TRANSACTION;
rollback命令:ROLLBACK 命令是用于撤消尚未保存到数据库的事务的事务命令。
ROLLBACK 命令只能用于撤销自上次发出 COMMIT 或 ROLLBACK 命令以来的事务
语法: rollback;
(4)实例:commit.txt 这里提交了,已经做了修改
select * from company;
begin;
update company set SALARY = SALARY + 999; -- 所有人工资加999
commit;
select * from company;
(5)实例2: rollback.txt
select * from company;
begin;
update company set SALARY = SALARY + 999;
rollback; -- 这里进行回滚,相当于没操作
select * from company;
5、SQLite 子查询:在另一个 SQLite 查询内嵌入在 WHERE 子句中的查询。
使用子查询返回的数据将被用在主查询中作为条件,以进一步限制要检索的数据。
子查询可以与 SELECT、INSERT、UPDATE 和 DELETE 语句一起使用,可伴随着使用运算符如 =、<、>、>=、<=、IN、BETWEEN 等。
(1)几个原则:
子查询必须用括号括起来。
子查询在 SELECT 子句中只能有一个列,除非在主查询中有多列,与子查询的所选列进行比较。
ORDER BY 不能用在子查询中,虽然主查询可以使用 ORDER BY。可以在子查询中使用 GROUP BY,功能与 ORDER BY 相同。
子查询返回多于一行,只能与多值运算符一起使用,如 IN 运算符。
BETWEEN 运算符不能与子查询一起使用,但是,BETWEEN 可在子查询内使用。
(2)子查询中的select子句: subquery_select.txt
SELECT column_name [, column_name ]
FROM table1 [, table2 ]
WHERE column_name OPERATOR
(SELECT column_name [, column_name ]
FROM table1 [, table2 ]
[WHERE]);
-- ID 大于4的人中找工资大于4000的
select * from (select * from company where ID > 4) where SALARY > 4000;
-- ID 在 工资大于4000的范围内
select * from company where ID IN (select ID from company where SALARY > 4000);
(3)子查询中的insert子句:subquery_insert.txt
INSERT INTO table_name [ (column1 [, column2 ]) ]
SELECT [ *|column1 [, column2 ]
FROM table1 [, table2 ]
[ WHERE VALUE OPERATOR ]
create table company_bak( -- 建一个和company一样的表
ID INT PRIMARY KEY NOT NULL,
NAME TEXT NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR(50),
SALARY REAL );
-- 利用查询查来的ID,再往一张一样的表中插入数据
insert into company_bak select * from company where ID in(select ID from company);
select * from company_bak;
(4)子查询中的update子句:subquery_update.txt
UPDATE table
SET column_name = new_value
[ WHERE OPERATOR [ VALUE ]
(SELECT COLUMN_NAME
FROM TABLE_NAME)
[ WHERE) ]
-- 大于30岁的人涨1.5倍工资,
update company set SALARY = 1.5*SALARY where AGE IN
(select AGE from company where AGE > 30);
(5)子查询中的delete子句:subquery_delete.txt
DELETE FROM TABLE_NAME
[ WHERE OPERATOR [ VALUE ]
(SELECT COLUMN_NAME
FROM TABLE_NAME)
[ WHERE) ]
-- 删除年龄大于30的客户记录
delete from company where ID IN
(select ID from company where AGE > 30);
(6)运行效果图: 省略
6、SQLite Autoincrement(自动递增): AUTOINCREMENT 是一个关键字,用于表中的字段值自动递增。
在创建表时在特定的列名称上使用 AUTOINCREMENT 关键字实现该字段值的自动增加。
关键字 AUTOINCREMENT 只能用于整型(INTEGER)字段。
(1)语法:
CREATE TABLE table_name(
column1 INTEGER AUTOINCREMENT,
column2 datatype,
column3 datatype,
.....
columnN datatype,
);
(2)实例: autoincrement.txt
create table autoincrement_test (
ID INTEGER PRIMARY KEY AUTOINCREMENT, -ID 是自动递增的
NAME TEXT NOT NULL,
AGE INT NOT NULL );
insert into autoincrement_test(NAME, AGE) values(‘Paul‘, 3); -- 插入几条数据
insert into autoincrement_test(NAME, AGE) values(‘Kobe‘, 24);
insert into autoincrement_test(NAME, AGE) values(‘KD‘, 35);
insert into autoincrement_test(NAME, AGE) values(‘MJ‘, 23);
select * from autoincrement_test;
7、SQLite Explain(解释):在 SQLite 语句之前,可以使用 "EXPLAIN" 关键字或 "EXPLAIN QUERY PLAN" 短语,用于描述表的细节。
如果省略了 EXPLAIN 关键字或短语,任何的修改都会引起 SQLite 语句的查询行为,并返回有关 SQLite 语句如何操作的信息。
来自 EXPLAIN 和 EXPLAIN QUERY PLAN 的输出只用于交互式分析和排除故障。
输出格式的细节可能会随着 SQLite 版本的不同而有所变化。
应用程序不应该使用 EXPLAIN 或 EXPLAIN QUERY PLAN,因为其确切的行为是可变的且只有部分会被记录。
(1)语法:
EXPLAIN语法:
EXPLAIN [SQLite Query]
EXPLAIN QUERY PLAN语法:
EXPLAIN QUERY PLAN [SQLite Query]
(2)实例:explain.txt
explain select * from company where SALARY > 2000;
结果是一大堆什么鬼东西,我看不懂,有兴趣可以试试。
(3)说明:这个东西不太理解,先放一下,写完这些再说。
8、SQLite 时间日期:
(1)支持下面5个时间和日期函数:
函数 说明
1 | date(timestring, modifier, modifier, ...) | 以 YYYY-MM-DD 格式返回日期。 |
2 | time(timestring, modifier, modifier, ...) | 以 HH:MM:SS 格式返回时间。 |
3 | datetime(timestring, modifier, modifier, ...) | 以 YYYY-MM-DD HH:MM:SS 格式返回。 |
4 | julianday(timestring, modifier, modifier, ...) | 这将返回从格林尼治时间的公元前 4714 年 11 月 24 日正午算起的天数。 |
5 | strftime(format, timestring, modifier, modifier, ...) | 这将根据第一个参数指定的格式字符串返回格式化的日期。具体格式见下边讲解。 |
上述五个日期和时间函数把时间字符串作为参数。时间字符串后跟零个或多个 modifier 修饰符。
strftime() 函数也可以把格式字符串 format 作为其第一个参数。
(2)时间字符串:可以用下面任何一种形式
可以使用 "T" 作为分隔日期和时间的文字字符。
时间字符串 实例
1 | YYYY-MM-DD | 2010-12-30 |
2 | YYYY-MM-DD HH:MM | 2010-12-30 12:10 |
3 | YYYY-MM-DD HH:MM:SS.SSS | 2010-12-30 12:10:04.100 |
4 | MM-DD-YYYY HH:MM | 30-12-2010 12:10 |
5 | HH:MM | 12:10 |
6 | YYYY-MM-DDTHH:MM | 2010-12-30 12:10 |
7 | HH:MM:SS | 12:10:01 |
8 | YYYYMMDD HHMMSS | 20101230 121001 |
9 | now | 2013-05-07 |
(3)修饰符(Modifier):时间字符串后边可跟着零个或多个的修饰符,这将改变有上述五个函数返回的日期和/或时间。
任何上述五大功能返回时间。修饰符应从左到右使用。
下面是可以在SQLite中使用的修饰符:
NNN days
NNN hours
NNN minutes
NNN.NNNN seconds
NNN months
NNN years
start of month
start of year
start of day
weekday N
unixepoch
localtime
utc
(4)格式化:SQLite 提供了非常方便的函数 strftime() 来格式化任何日期和时间。
可以使用以下的替换来格式化日期和时间:
替换 描述
%d | 一月中的第几天,01-31 |
%f | 带小数部分的秒,SS.SSS |
%H | 小时,00-23 |
%j | 一年中的第几天,001-366 |
%J | 儒略日数,DDDD.DDDD |
%m | 月,00-12 |
%M | 分,00-59 |
%s | 从 1970-01-01 算起的秒数 |
%S | 秒,00-59 |
%w | 一周中的第几天,0-6 (0 is Sunday) |
%W | 一年中的第几周,01-53 |
%Y | 年,YYYY |
%% | % symbol |
(5)实例:date.txt
-- 计算当前日期
select date(‘now‘);
-- 计算当前月份的最后一天 -- now 后面接的是几个修饰符,
-- ‘start of month‘ 当前月份开始
-- ‘+1 month‘, 当前月份加一个月
-- ‘-1 day‘ 减一天
select date(‘now‘,‘start of month‘,‘+1 month‘,‘-1 day‘);
-- 所以这个是上个月的第2天
select date(‘now‘,‘start of month‘,‘-1 month‘,‘+1 day‘);
-- 所以这个是今年的最后一天, 当前年加一年再减一天,就是今年的最后一天
select date(‘now‘,‘start of year‘,‘+1 year‘,‘-1 day‘);
-- 计算给定时间戳1992241466的日期和时间
select datetime(‘1992241466‘, ‘unixepoch‘);
-- 计算新中国成立到现再的天数
select julianday(‘now‘) - julianday(‘1949-10-01‘);
-- 计算当年9月的第一个星期2的日期
select date(‘now‘, ‘start of year‘,‘+8 months‘,‘weekday 2‘);
-- 在UTC与本地时间之间进行转化,当格式化日期时,用utc修饰符或localtime修饰符
select time(‘12:00‘, ‘localtime‘);
select time(‘12:00‘, ‘utc‘);
-- 计算当前时间
select datetime(‘now‘);
select datetime(‘now‘, ‘+8 hour‘); -- 北京在东八区 这个才是北京时间
-- 当天的最后一秒
select datetime(‘now‘, ‘start of day‘, ‘+1 day‘, ‘-1 seconds‘);
9、常用函数:
下面列出了一些有用的 SQLite 内置函数,且所有函数都是大小写不敏感,这意味着您可以使用这些函数的小写形式或大写形式或混合形式。
(1)count() : 计算表中的行数
(2)MAX() : 求某列的最大值
(3)MIN():求某列的最小值
(4)sqlite_version():返回SQLite的版本
(5)AVG():求某列的平均值
(6)SUM():求某列的和
(7)RNDOM():产生随机数
(8)ABS():求绝对值
(9)upper():字符串转成大写
(10)lower():字符串转成小写
(11)length():求字符串的长度
(12)实例:fun.txt 结果不显示了
select count(*) from company;
select MAX(SALARY), NAME from company;
select MIN(SALARY), NAME from company;
select MIN(SALARY), NAME from company;
select SUM(SALARY) from company;
select random() as Random;
select ABS(5), ABS(-5), ABS(NULL), ABS(‘aa‘);
select upper(NAME) as Big_Name from company;
select lower(NAME) as Small_Name from company;
select length(NAME) as Name_len , name from company;
select sqlite_version() as SQL_VER;
10、之前所有的例子 全部放在这里:
https://github.com/xcywt/MySQLite
这样大家可以看到吗,Github用的不是很熟,能看到的话给个回复吧,好人一生平安
标签:
原文地址:http://www.cnblogs.com/xcywt/p/5604965.html