sqlite不是玩具数据库

2021-03-26 20:07:10

无论您是开发人员,数据分析师,QA工程师,Devops人还是产品经理 - SQLite都是一个完美的工具。这就是为什么。

SQLite是世界上最常见的DBMS,附带所有流行的操作系统。

对于其他人来说,有一个方便的数据库控制台(REPT),作为单个文件(Windows上的SQLite3.exe,Linux / MacOS上的SQLite3)提供。

控制台是数据分析的杀手SQLite功能:比Excel更强大,比Pandas更简单。一个可以使用单个命令导入CSV数据,表将自动创建:

控制台支持基本的SQL功能,并显示良好的ASCII绘制的表中的查询结果。还支持高级SQL功能,但稍后还有更多。

选择世纪|| '世纪'截至世纪DESC世纪秩序,历史集团的历史集团(*)计算(*)。

┌───────────────────────── ─────────21世纪│1││20世纪│263││19世纪│189││18世纪│191││17世纪│137││...│ ──────────────────────

数据可以作为SQL,CSV,JSON,甚至是Markdown和HTML导出。只需要几个命令:

[{"城市" :"阿姆斯特丹" ,"基金会" :1300," TimeZone" :" UTC + 1" },{"城市" :"柏林" ,"基金会" :1237," TimeZone" :" UTC + 1" },{"城市" :"赫尔辛基" ,"基金会" :1548," TimeZone" :" UTC + 2" },{"城市" :"摩纳哥" ,"基金会" :1215," TimeZone" :" UTC + 1" },{"城市" :"莫斯科" ,"基金会" :1147," TimeZone" :" UTC + 3" },{"城市" :" reykjavik" ,"基金会" :874," TimeZone" :" UTC" },{"城市" :" Sarajevo" ,"基金会" :1461," TimeZone" :" UTC + 1" },{"城市" :"斯德哥尔摩" ,"基金会" :1252," TimeZone" :" UTC + 1" },{"城市" :"塔林" ,"基金会" :1219," TimeZone" :" UTC + 2" },{"城市" :"萨格勒布" ,"基金会" :1094," TimeZone" :" UTC + 1" }]

如果您是比控制台人员的更多,如果您的流行数据探索工具,如元数据库,Redash和Superset都支持SQLite。

没有什么比SQLite用于分析和转换JSON更方便。您可以直接从文件中选择数据,就像它是常规表一样。或将数据导入表中并从那里选择。

选择JSON_EXTRACT(值,' $。ISO.CODE')作为代码,json_extract(值,' $。iso.number')作为num,json_extract(值,' $ .name')作为名称,json_extract(值,' $。单位.major.name')作为json_each的单位(readfile(' currency.sample.json' sample.json'));

┌─────────────────────────────────码号单位│├─────────────────────────────────────阿根廷比索| PESO││CHF│756│瑞士法郎│法郎││欧元978│欧元欧元││英镑│826│英镑││in in│356│印度卢比│卢比││jpy│392│日元│日元││疯狂│504│摩洛哥迪拉姆│dirham││rur│643│俄罗斯卢布│卢布││sos│706│索马里先令│shilling││usd│840│美元美元│美元│└─────── ────────────────────────────

无论JSON如何深度 - 您可以提取任何嵌套对象:

┌────────┬──────────────────────┐│ID│名│├────────┼── ───────────────────────── │││9.401光纤光学│││43.641审计│││43.646保险│││43.647银行│└────────┴───────────────── ─────

当然,SQLite支持常见的表格表达式(带有条款)和连接,我甚至不会在此举例说明。如果数据是分层(表格通过像parent_id这样的列) - 递归将派上友好。任何层次结构,无论多么深,都可以使用单一查询“展开”。

与递归TMP(ID,姓名,电平)如(选择ID,名称,1从区域级别,其中PARENT_ID为空UNION ALL选择区域编号,TMP名称||&#39 ;,' ||区域。名称为名称,TMP。级别+ 1为来自区域的级别加入TMP区域。parent_id = tmp。ID)选择*来自TMP;

┌──────┬──────────────────────────┬───────┐│ID││名│水平├──────┼──────────────────────────┼───────┤│93││美国│1 │768│美国,华盛顿特区│2││1833│美国,华盛顿│2││2987│美国,华盛顿,贝尔维尤│3││3021│美国,华盛顿,埃弗里特│3││3039│美国,华盛顿,肯特│ 3││......│...│...│└───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── ───────

alter表空缺添加列Salary_Net整数(Salary_Gross = True的情况)换档(Salary_from / 1。04)否则Salary_from End);

选择substr(名称,1,40)作为名称,从空缺的Salary_Net,其中Salary_currency =' JPY'和Salary_Net不是空限制10;

描述性统计?简单:平均值,中位数,百分位数,标准偏差,您将其命名为。您必须加载扩展,但它也是一个命令(和一个文件)。

。加载sqlite3 - stats选择count(*)作为book_count,转换(avg(num_pages)为整数),如同中位数,模式(num_pages)为mode,percient_90(num_pages)作为p90,百分位员_95(num_pages)为p95,百分位数_99(num_pages)从书籍中的p99;

┌────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── ───────│││平均值│中位数│模式│p90│p95│p99│├──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── ┼────────────────────1483│349│295│256│640│817│1199─────────────────────────────────────────────────────────────────────────────────────────────────────────── ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────

关于扩展的注意事项。与PostgreSQL等其他DBMS相比,SQLite缺少大量功能。但它们很容易添加,这就是人们所做的 - 所以它结果很乱。

因此,我决定制作一组一致的扩展,除以域区域并为主要操作系统编译。他们中有很少有,但更多是在他们的路上:

与统计数据更有趣。您可以在控制台中绘制数据分发。看起来有多可爱:

使用插槽(选择num_pages / 100作为插槽,计数(*)作为bable_count by slot),最大值(选择max(book_count)为从插槽的值)选择插槽,book_count,printf('%。 ' ||(book_count * 30 / max。值)||' c',' *')作为从插槽的酒吧,通过插槽的最大订单。

┌──────┬────────────┬───────────────────────────── ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── ─────────────116│*********││1│254 *************** *****││2│376│******************************││3│285│*** *******************││4│184│************** 5│90│***** **││6│54│****││7│41│***││8│31│**││9│15│*││10│11│*││11│12│* ││12│2│*│└──────┴────────────┴───────────────────── ───────────

SQLite合作搭配数亿件纪录。常规插入显示在我的笔记本电脑上每秒约240k记录。如果将CSV文件连接为虚拟表(则该分机) - 插入将更快地变为2倍。

。加载SQLite3 - VSV创建虚拟表TEMP。 blocks_csv使用vsv(filename =",schema =" create表x(网络文本,geoname_id整数,geach_country_geoname_id整数,表示_country_geoname_id整数,is_aNonmous_proxy Integer,IS_Satellite_Provider Integer,Postal_code文本,Latitude Real ,经度真实,准确性_radius整数)",列= 10,标题= ON,NULLS = ON);

SQLite不适合Web的开发人员之间存在一个受欢迎的观点,因为它不支持并发访问。这是一个神话。在注册日志模式(简称以来可用),可以根据需要存在许多并发读卡器。只有一个并发作家,但通常是足够的。

SQLite是一个完美的小型网站和应用程序。 sqlite.org使用SQLite作为数据库,而不是在优化(每页的≈200请求)上打扰。它处理每月700K访问,并在我见过的95%的网站上提供页面。

SQLite支持表达式的部分索引和索引,正如“大”DBMSS所做的。您可以在生成的列上构建索引,甚至将SQLite转换为文档数据库。只需存储原始JSON并在JSON_TACT() - ED列上构建索引:

创建表货币(正文文本,代码文本为(json_extract(body,' $ code')),名称文本为(json_extract(body,' $。名称'));在货币(代码)上创建索引currency_code_idx;从json_each插入货币选择值(Readfile(' currency.sample.json'));

解释查询计划从货币中选择名称,其中code =' eur' ;查询计划` - 使用索引currency_code_idx的研究表货币(代码=?)

您还可以使用SQLite作为图形数据库。一堆与递归的复杂会做诀窍,或者也许你愿意添加一些python:

使用FTS5(标题,作者,发布者)创建虚拟表图书_FTS;插入Books_fts选择标题,作者,来自书籍的发布者;选择作者,substr(title,1,30)作为标题,子杆(发布者,1,10)作为来自books_fts的发布者,其中books_fts匹配' Ann'限制5;

┌─────────────────────┬─────────────────────────── ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── - ────── ─────────────────────────────────────────红宝石安桥│ Ruby Ann' S下载首页拖车P│Citadel││ruby Ann Boxcar♥Ruby Ann' S下载首页拖车P♪Citadel││林恩恩守护者最后舞蹈:遇到D│麦格劳 - HIL││丹尼尔德│鲁滨逊漂流记│安阿伯││安·斯韦特│等待甲方:本LIF│大卫R.摹│└─────────────────────┴─── ───────────────────────────────────

有花哨的窗口功能(就像在PostgreSQL中一样)。 UPSERT,更新和生成_SERIES()。 R树索引。正则表达式,模糊搜索和Geo。在功能方面,SQLite可以与任何“大”DBMS竞争。

Sqlite还有很好的工具。我特别喜欢Databette - 一个开源工具,用于探索和发布SQLite数据集。 DBeaver是一个具有最新的SQLite版本支持的优秀开源数据库IDE。