Sqlite全面学习(三),京东面试题2024

创建触发器(Trigger)语法:

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操作上在表的一个或多个指定列上创建触发器(Trigger)的语法:

CREATE TRIGGER trigger_name [BEFORE|AFTER]

UPDATE OF column_name

ON table_name

BEGIN

– Trigger logic goes here…

END;

如下实例语句:

这里写图片描述

列出触发器(TRIGGERS)

您可以从sqlite_master表中列出所有触发器,如下所示:

SELECT name FROM sqlite_master WHERE type = ‘trigger’;

上面的 SQLite 语句只会列出一个条目,如下:

name


audit_log

如果您想要列出特定表上的触发器,则使用AND子句连接表名,如下所示:

SELECT name FROM sqlite_master WHERE type = ‘trigger’ AND tbl_name = ‘teamTable’;

上面的 SQLite 语句只会列出一个条目,如下:

name


audit_log

删除触发器(TRIGGERS)

下面是DROP命令,可用于删除已有的触发器:

DROP TRIGGER trigger_name;

SQLite索引(Index)

索引(Index)是一种特殊的查找表,数据库搜索引擎用来加快数据检索。简单地说,索引是一个指向表中数据的指针。一个数据库中的索引与一本书后边的索引是非常相似的。例如,如果您想在一本讨论某个话题的书中引用所有页面,您首先需要指向索引,索引按字母顺序列出了所有主题,然后指向一个或多个特定的页码。

索引有助于加快SELECT查询和WHERE子句,但它会减慢使用UPDATE和INSERT语句时的数据输入。索引可以创建或删除,但不会影响数据。使用CREATE INDEX语句创建索引,它允许命名索引,指定表及要索引的一列或多列,并指示索引是升序排列还是降序排列。索引也可以是唯一的,与UNIQUE约束类似,在列上或列组合上防止重复条目。

CREATE INDEX命令:

CREATE INDEX基本语法:

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);

是否要创建一个单列索引还是组合索引,要考虑到您在作为查询过滤条件的WHERE子句中使用频繁的列。如果值使用到一个列,则选择使用单列索引。如果在作为过滤的WHERE子句中有两个或多个列经常使用,则选择使用组合索引。

隐式索引

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

如下实例演示:

CREATE INDEX money_index ON teamTable (money);

查看索引:

.indices teamTable

结果:

salary_index

sqlite_autoindex_COMPANY_1 //创建表时创建的隐式索引

列出数据库范围的所有索引:

SELECT * FROM sqlite_master WHERE type = ‘index’;

DROP INDEX命令:

一个索引可以使用SQLite的DROP命令删除。当删除索引时应特别注意,因为性能可能会下降或提高。

基本语法:

DROP INDEX index_name;

什么情况下避免使用索引

索引的目的在于提高数据库的性能,但这里有几个情况需要避免使用索引。使用索引时,应重新考虑下列准则:

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

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

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

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

SQLite Indexed By关键字

“INDEXED BY index-name”子句规定必须需要命名的索引来查找前面表中值。如果索引名index-name不存在或不能用于查询,然后SQLite语句的准备失败。”NOT INDEXED” 子句规定当访问前面的表(包括由UNIQUE和PRIMARY KEY约束创建的隐式索引)时,没有使用索引。然而,即使指定了 “NOT INDEXED”,INTEGER PRIMARY KEY 仍然可以被用于查找条目。

下面是INDEXED BY子句的语法,它可以与DELETE、UPDATE 或 SELECT 语句一起使用:

SELECT|DELETE|UPDATE column1, column2…

INDEXED BY (index_name)

table_name

WHERE (CONDITION);

如下实例:

假设有表teamTable表,我们将创建一个索引,并用它进行INDEXED BY操作:

CREATE INDEX money_index ON teamTable(money);

现在使用INDEXED BY子句从表teamTable中选择数据:

SELECT * FROM teamTable INDEXED BY money_index WHERE money > 5000;

SQLite Alter命令

SQLite的ALTER TABLE命令不通过执行一个完整的转储和数据的重载来修改已有的表。您可以使用ALTER TABLE语句重命名表,使用ALTER TABLE语句还可以在已有的表中添加额外的列。在SQLite中,除了重命名表和在已有的表中添加列,ALTER TABLE命令不支持其他操作。

用来重命名已有的表的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…;

如下展示示例:

ALTER TABLE teamTable RENAME TO androidTeamTable;

ALTER TABLE androidTeamTable ADD COLUMN sex char(1);

新添加的列是以NULL值来填充的

SQLite Truncate Table关键字

在SQLite中,并没有TRUNCATE TABLE命令,但可以使用SQLite的DELETE命令从已有的表中删除全部的数据,但建议使用DROP TABLE命令删除整个表,然后再重新创建一遍。

DELETE命令的基本语法:

DELETE FROM table_name;

DROP TABLE的基本语法:

DROP TABLE table_name;

如果您使用DELETE TABLE命令删除所有记录,建议使用VACUUM命令清除未使用的空间。

如下实例:

DELETE FROM androidTeamTable;

VACUUM;

SQLite视图(View)

视图(View)只不过是通过相关的名称存储在数据库中的一个SQLite语句。视图(View)实际上是一个以预定义的SQLite查询形式存在的表的组合。视图(View)可以包含一个表的所有行或从一个或多个表选定行。视图(View)可以从一个或多个表创建,这取决于要创建视图的SQLite查询。视图(View)是一种虚表,允许用户实现以下几点:

  • 用户或用户组查找结构数据的方式更自然或直观。

  • 限制数据访问,用户只能看到有限的数据,而不是完整的表。

  • 汇总各种表中的数据,用于生成报告。

SQLite视图是只读的,因此可能无法在视图上执行DELETE、INSERT或UPDATE语句。但是可以在视图上创建一个触发器,当尝试DELETE、INSERT或UPDATE视图时触发,需要做的动作在触发器内容中定义。

创建视图

SQLite的视图是使用CREATE VIEW语句创建的。SQLite视图可以从一个单一的表、多个表或其他视图创建。

CREATE VIEW基本语法:

CREATE [TEMP | TEMPORARY] VIEW view_name AS

SELECT column1, column2…

FROM table_name

WHERE [condition];

您可以在SELECT语句中包含多个表,这与在正常的SQL SELECT查询中的方式非常相似。如果使用了可选的TEMP或TEMPORARY关键字,则将在临时数据库中创建视图。

如下实例展示:

CREATE VIEW test_view AS SELECT id, name, age FROM androidTeamTable;

SELECT * FROM test_view;

删除视图

要删除视图,只需使用带有view_name的DROP VIEW语句。DROP VIEW的基本语法如下:

DROP VIEW view_name;

SQLite事务(Transaction)

事务(Transaction)是一个对数据库执行工作单元。事务(Transaction)是以逻辑顺序完成的工作单位或序列,可以是由用户手动操作完成,也可以是由某种数据库程序自动完成。事务(Transaction)是指一个或多个更改数据库的扩展。例如,如果您正在创建一个记录或者更新一个记录或者从表中删除一个记录,那么您正在该表上执行事务。重要的是要控制事务以确保数据的完整性和处理数据库错误。实际上,您可以把许多的SQLite查询联合成一组,把所有这些放在一起作为事务的一部分进行执行。

事务的属性

事务(Transaction)具有以下四个标准属性,通常根据首字母缩写为ACID:

  • 原子性(Atomicity):确保工作单位内的所有操作都成功完成,否则,事务会在出现故障时终止,之前的操作也会回滚到以前的状态。

  • 一致性(Consistency):确保数据库在成功提交的事务上正确地改变状态。

  • 隔离性(Isolation):使事务操作相互独立和透明。

  • 持久性(Durability):确保已提交事务的结果或效果在系统发生故障的情况下仍然存在。

事务控制

使用下面的命令来控制事务:

BEGIN TRANSACTION;

开始事务处理。

COMMIT:保存更改,或者可以使用END TRANSACTION命令。

ROLLBACK:回滚所做的更改。

事务控制命令只与DML命令 INSERT、UPDATE和DELETE一起使用。他们不能在创建表或删除表时使用,因为这些操作在数据库中是自动提交的。

BEGIN TRANSACTION命令

事务(Transaction)可以使用BEGIN TRANSACTION命令或简单的BEGIN命令来启动。此类事务通常会持续执行下去,直到遇到下一个COMMIT或ROLLBACK命令。不过在数据库关闭或发生错误时,事务处理也会回滚。以下是启动一个事务的简单语法:

BEGIN; 或者 BEGIN TRANSACTION;

COMMIT命令

COMMIT命令是用于把事务调用的更改保存到数据库中的事务命令。COMMIT命令把自上次COMMIT或ROLLBACK命令以来的所有事务保存到数据库。

语法:

COMMIT; 或者 END TRANSACTION;

ROLLBACK命令

ROLLBACK命令是用于撤消尚未保存到数据库的事务的事务命令。ROLLBACK命令只能用于撤销自上次发出COMMIT或ROLLBACK命令以来的事务。

语法:

ROLLBACK;

示例就不演示了,比较easy!!

SQLite子查询

子查询或内部查询或嵌套查询是在另一个SQLite查询内嵌入在WHERE子句中的查询。使用子查询返回的数据将被用在主查询中作为条件,以进一步限制要检索的数据。子查询可以与SELECT、INSERT、UPDATE和DELETE语句一起使用,可伴随着使用运算符如 =、<、>、>=、<=、IN、BETWEEN等。

以下是子查询必须遵循的几个规则:

  • 子查询必须用括号括起来。

  • 子查询在SELECT子句中只能有一个列,除非在主查询中有多列与子查询的所选列进行比较。

  • ORDER BY不能用在子查询中,虽然主查询可以使用ORDER BY。

  • 子查询返回多于一行,只能与多值运算符一起使用,如IN运算符。

  • BETWEEN运算符不能与子查询一起使用,但是BETWEEN可在子查询内使用。

* SELECT语句中的子查询使用*

子查询通常与SELECT语句一起使用。基本语法如下:

SELECT column_name [, column_name ]

FROM table1 [, table2 ]

WHERE column_name OPERATOR

(SELECT column_name [, column_name ]

FROM table1 [, table2 ]

[WHERE]);

如下示例:

SELECT * FROM teamTable WHERE id IN (SELECT id FROM teamTable WHERE money > 45000);

INSERT语句中的子查询使用

子查询也可以与INSERT语句一起使用。INSERT语句使用子查询返回的数据插入到另一个表中。在子查询中所选择的数据可以用任何字符、日期或数字函数修改。

基本语法如下:

INSERT INTO table_name [ (column1 [, column2 ]) ]

SELECT [ *|column1 [, column2 ]

FROM table1 [, table2 ]

[ WHERE VALUE OPERATOR ];

如下示例:

把一个表的数据全部插入到另一个bck表中

INSERT INTO teamTable_bak SELECT * FROM teamTable WHERE id IN (SELECT id FROM teamTable);

UPDATE语句中的子查询使用

子查询可以与UPDATE语句结合使用。当通过UPDATE语句使用子查询时,表中单个或多个列被更新。

基本语法如下:

UPDATE table

SET column_name = new_value

[ WHERE OPERATOR [ VALUE ]

(SELECT COLUMN_NAME

FROM TABLE_NAME)

[ WHERE) ];

如下示例:

UPDATE teamTable SET money = money * 0.50 WHERE age IN (SELECT age FROM teamTable_bck WHERE age >= 24);

DELETE语句中的子查询使用

子查询可以与DELETE语句结合使用,就像上面提到的其他语句一样。

基本语法如下:

DELETE FROM TABLE_NAME

[ WHERE OPERATOR [ VALUE ]

(SELECT COLUMN_NAME

FROM TABLE_NAME)

[ WHERE) ];

如下示例:

DELETE FROM teamTable WHERE age IN (SELECT age FROM teamTable_bck WHERE age > 24);

SQLite Autoincrement(自动递增)

SQLite的AUTOINCREMENT是一个关键字,用于表中的字段值自动递增。我们可以在创建表时在特定的列名称上使用AUTOINCREMENT关键字实现该字段值的自动增加。关键字AUTOINCREMENT只能用于整型(INTEGER)字段。

设置了AUTOINCREMENT后insert或者update时不需要指定值,自动的,而且是从1开始的。

语法:

CREATE TABLE table_name(

column1 INTEGER AUTOINCREMENT,

column2 datatype,

column3 datatype,

columnN datatype,

);

示例就算了,太easy!!

SQLite注入

如果您的站点允许用户通过网页输入,并将输入内容插入到SQLite数据库中,这个时候您就面临着一个被称为SQL注入的安全问题。

注入通常在请求用户输入时发生,比如需要用户输入姓名,但用户却输入了一个SQLite语句,而这语句就会在不知不觉中在数据库上运行。

永远不要相信用户提供的数据,所以只处理通过验证的数据,这项规则是通过模式匹配来完成的。

SQLite日期 & 时间

SQLite支持以下五个日期和时间函数:

| 函数 | 实例 |

| :-- | :-- |

| date(timestring, modifiers…) | 以YYYY-MM-DD格式返回日期。 |

| time(timestring, modifiers…) | 以 HH:MM:SS 格式返回时间。 |

| datetime(timestring, modifiers…) | 以 YYYY-MM-DD HH:MM:SS 格式返回。 |

| julianday(timestring, modifiers…) | 这将返回从格林尼治时间的公元前4714年11月24日正午算起的天数。 |

| strftime(timestring, modifiers…) | 这将根据第一个参数指定的格式字符串返回格式化的日期。具体格式见下边讲解。 |

上述五个日期和时间函数把时间字符串作为参数。时间字符串后跟零个或多个modifiers修饰符。strftime() 函数也可以把格式字符串作为其第一个参数。下面将为您详细讲解不同类型的时间字符串和修饰符。

时间字符串

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
img

总结

其实要轻松掌握很简单,要点就两个:

  1. 找到一套好的视频资料,紧跟大牛梳理好的知识框架进行学习。
  2. 多练。 (视频优势是互动感强,容易集中注意力)

你不需要是天才,也不需要具备强悍的天赋,只要做到这两点,短期内成功的概率是非常高的。

对于很多初中级Android工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。

以上就是总结的关于在面试的一些总结,希望对大家能有些帮助,除了这些面试中需要注意的问题,当然最重要的就是刷题了,这里放上我之前整理的一份超全的面试专题PDF

还有 高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料 帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。

【Android核心高级技术PDF文档,BAT大厂面试真题解析】

这里只是整理出来的部分面试题,后续会持续更新,希望通过这些高级面试题能够降低面试Android岗位的门槛,让更多的Android工程师理解Android系统,掌握Android系统。喜欢的话麻烦点击一个喜欢在关注一下~

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
img
习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!**

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
[外链图片转存中…(img-JzEgwGCc-1712675974083)]

总结

其实要轻松掌握很简单,要点就两个:

  1. 找到一套好的视频资料,紧跟大牛梳理好的知识框架进行学习。
  2. 多练。 (视频优势是互动感强,容易集中注意力)

你不需要是天才,也不需要具备强悍的天赋,只要做到这两点,短期内成功的概率是非常高的。

对于很多初中级Android工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。

以上就是总结的关于在面试的一些总结,希望对大家能有些帮助,除了这些面试中需要注意的问题,当然最重要的就是刷题了,这里放上我之前整理的一份超全的面试专题PDF

还有 高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料 帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。

【Android核心高级技术PDF文档,BAT大厂面试真题解析】

[外链图片转存中…(img-EfweNhHw-1712675974083)]

这里只是整理出来的部分面试题,后续会持续更新,希望通过这些高级面试题能够降低面试Android岗位的门槛,让更多的Android工程师理解Android系统,掌握Android系统。喜欢的话麻烦点击一个喜欢在关注一下~

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-F4WsVqCK-1712675974084)]

  • 14
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值