首页 > 数据库技术 > 详细

学习SQLite之路(四)

时间:2016-06-22 23:40:12      阅读:720      评论:0      收藏:0      [点我收藏+]

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用的不是很熟,能看到的话给个回复吧,好人一生平安

 

学习SQLite之路(四)

原文:http://www.cnblogs.com/xcywt/p/5604965.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!