以下以单表查询为例分析下www.9159.com,并在Powe

作者: www.9159.com  发布:2019-11-09

有一张报表,是基于sql脚本查询出的数据,一直是手动修改日期等关键字来每个月进行查询,目前的需求是把它做成自动化,并在PowerBi上实时查询。

SQLite数据库

前言

我把其中的日期做了一些自动化获取的处理,例如月初的获取,例如工作日的获取(上篇)等,在整个工作完成后,直接执行就能实时查询出最新的数据,效果很好,准备放在PowerBi上使用Sql语句来DirectQuery,结果报了错误信息,如下:

1.数据库简介

其实自己之前没遇到过这种在查询时给结果编号的情况,是同事打算跳槽,面试回来问到这种情况才想到去研究,以下以单表查询为例分析下:

www.9159.com 1

1.1数据库的作用:"离线缓存数据"

SQL:

在网上查找了下,有人这样解释

1.2数据缓存策略

SELECT (@i:=@i+1) i,user_id,user_name FROM `dt_user_all_orders`, (SELECT @i:=0) as i WHERE user_name='qqqqqqqqqq' LIMIT 0,10;

www.9159.com 2

plist

结果:

 

归档

www.9159.com 3

简单来说,就是DirectQuery的查询,是通过子查询来实现的。

偏好设置

如果需要分组后再进行序号显示:

select * from ([你想执行的语句])

沙盒文件

SELECT drug_productor,@y:=@y+1 as num FROM( SELECT drug_productor FROM ts_drug a GROUP BY drug_productor) c,(SELECT @y:=0) d 

这样的话,Declare肯定是会报错的。

"SQLite数据库"

结果:

我做了同样的实验,在Excel中建立一个这样的查询,是完全没有问题的,我注意到在Excel中,并没有Import和DirectQuery的选项,我想了下,可能是在Excel中是通过手动点击刷新,做了一遍重新导入的动作,这方面没有深究,所以我打算通过Excel来获得数据,然后在把它放在Onedrive上,接着再用PowerBi来获取Onedrive上的Excel文件,PowerBi上支持把Excel解析成一个工作簿,也可以实现点击实时刷新的效果,这是我昨天做的实验,我甚至都要妥协,打算使用这种看起来只需要点击的"简单方式"来实现。

1.3系统提供的数据存储方式的弊端:

www.9159.com 4

但是我仍然不甘心,在今天查询到原因后,我打算麻烦一点,把所有定义的@关键字,全部替换成赋值的Sql脚本,因为基本上这样的查询,都是在脚本里定义一个字段,去动态赋值而已,不像存储过程,值需要手动输入,所以这并不是什么难事。

不方便操作大量的数据

分析:

如果你定义的字段不是通过系统函数,而是通过某张表来获取某个字段(例如上篇的工作日),其实也只是把 www.9159.com,@字段 替换成 (select 字段 from xxx ...)  括号带上,这样放在外部的

-系统提供的数据存储方式都是覆盖存储的,新的数据会覆盖旧的数据.而且当数据量非常大时,如果要添加新的数据,必须先把旧数据全部加载到内存中

在开始是定义一个变量i,让它每增一条结果是➕1, @i:=1;

select a,b,(select 字段 from xxx),c from xxxxx... 也是完全没有任何问题的。

不方便查找大量的数据

这里顺带复习下mysql定义用户变量的方式:select @变量名

 

-当数据量非常庞大时,要查询其中某些数据,就非常困难

对用户变量赋值有两种方式,一种是直接用"="号,另一种是用":="号。其区别在于使用set命令对用户变量进行赋值时,两种方式都可以使用;当使用select语句对用户变量进行赋值时,只能使用":="方式,因为在select语句中,"="号被看作是比较操作符

这只是我个人的一点小经验而已,看起来很简单,但是确是在不甘心妥协后找到的另外一种解决方式,这是很有意义的事情。想想看,通过Onedrive来做中转和最初的只想实时查询,做到了初心,这是让人很有成就感的事情。

代码演示plist文件保存数据

(@i:=@i+1)  也可以写成 @i:=@i+1,加括号是为了视觉上看这结构更清楚些。在定义好一个变量后每次查询都会给这个变量自增,而我们每次执行查询语句获取结果后就不需要这个变量自增了,所以要把它重置为0,在表名后用逗号分格下使用 (SELECT @i:=0) as i就可以了,说下这个as i为什么要这样用,是因为派生表必须需要一个别名,这个就是做它的别名,可以任意字符。

对于程序员来说,成就感很重要,不是吗?:)

1.4SQLite简介

总结

 

SQLite是一个轻量级,体积小,嵌入式,功能强大,跨平台的数据存储方式

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

客户端的数据库: SQLite

您可能感兴趣的文章:

  • MySQL rownumber SQL生成自增长序号使用介绍

服务器端的数据库: MySQL --> SQLServer --> Oracle

1.5学习方式

先用Navicat客户端演示SQLite的使用(仅仅是上课演示而已,不需要掌握)

再用代码演示SQLite的使用(需要熟练使用)

2.Excel存储数据

2.1提示: SQLite数据库存储数据的结构和Excel很像

"Excel""SQLite"

-创建Excel文件-创建一个数据库文件

-创建表-创建表

-确定表头-创建数据库的字段名(Excel表头),并指定数据类型

-对Excel表进行数据操作-对数据库进行增删改查

2.2一个数据库中,可以有多张表,每个表中可以存储不同的数据

3.Navicat存储数据-创建数据库和表

3.1提示:数据库本身就是一个文件,可以用终端和客户端来创建和操作

3.2Navicat创建数据库和表的步骤:

1.创建一个数据库文件,以".sqlite"结尾

2.建立Navicat和数据库文件的连接,只有建立好连接才能操作数据库文件

3.创建数据库表,创建表头并指定数据类型

4.保存数据库文件,以"t_xxx"命名

4.Navicat操作数据-增删改查

4.1在数据库中

行:记录/数据(一条记录/一条数据)

列:字段名/列名

4.2增删改查操作

新增:'+'

删除:'-'

修改:双击字段直接修改

查询:'filter'(过滤)

4.3以上操作都是在Navicat客户端操作的,实际开发中是在Xcode中写代码.

5.SQL语句之数据定义语句-创建和删除表

iOS             OC

Android         JAVA

SQLite数据库"SQL语句"

5.1SQL语句:一个通用的数据库语言,适用于客户端数据库(SQLite)和服务器端数据库(MySQL,SQLServer,Oracle)

5.2客户端的SQL语句需要掌握:"数据定义语句","数据操作语句","条件语句","数据查询语句"

5.3数据定义语句:创建(create)和删除(drop)数据库表

-创建数据库表:

create tableifnot exists表名(字段名1类型,字段名2类型,...);

"create table if not exists t_product(productID integer,productName text,productPrice integer);"

-删除数据库表

drop tableifexists表名;

"drop table if exists t_product;"

6.SQL语句之数据操作语句-增删改

-提示:到目前为止数据库和数据库表都已经创建好了,现在开始就是操作数据库

6.1新增语句

insert into表名(字段名1,字段名2,...) values(字段1值,字段2值,...);

"insert into t_product(productID,productName,productPrice) values(1005,'iPhone103',2000);"

注意:字符串用'单引号'引起来

6.2删除语句

delete from表名where条件语句;

"delete from t_product where productPrice = 1000;"

注意:如果执行删除语句时不加条件语句,就会删除表中所有的记录

6.3修改语句

不加条件时,所有的productPrice字段的值都会修改成103

"update t_product set productPrice = 103;"

按照条件修改一个字段的值

"update t_product set productPrice = 333 where productID = 1005;"

按照条件,修改一条记录的多个字段

"update t_product set productName = 'iPHone1000',productPrice = 1000 where productID = 1002;"

7.SQL语句之查询语句(相当重要)

7.1准备工作:执行提前准备好的新增语句,准备要查询的数据

7.2查询语句体验

查询价格大于5500的商品信息

"select * from t_product where productPrice > 5500;"

查询价格小于4000或者价格大于5500的商品信息

"select * from t_product where productPrice < 4000 or productPrice > 5500;"

查询商品编号小于100并且价格小于4000的商品信息

"select * from t_product where productID < 100 and productPrice < 4000;"

注意:"select *"是查找表中的所有字段

8.排序和分页查找

8.1排序

提示:分页和排序都是在某个查询结果后面执行进行的

使用场景:电商类APP中的商品按照价格的从高到低筛选展示

查询出来的数据,按照价格从低到高排序

"select * from t_product where productID < 100 and productPrice < 4000 order by productPrice;"

查询出来的数据,按照价格从高到低排序

"select * from t_product where productID < 100 and productPrice < 4000 order by productPrice desc;"

注意:"order by"是默认从低到高;"desc"是从高到低

8.2分页查询

从第0条开始查询,查询五条记录

"select * from t_product where productID < 100 and productPrice < 4000 order by productPrice desc limit 0,5;"

"limit 0,5":分页语句;索引,每页条数.从第0条开始查询,每页查询五条记录

规律:

第1页: limit0,5

第2页: limit5,5

第3页: limit10,5

...

第n页: limit (n-1)*每页条数,每页条数

注意:

当取到最后,记录不足每页条数时,就取实际剩下的记录

分页语句放在查询语句的后面

9.模糊查询

9.1使用场景:关键字搜索

查找商品价格中带99的商品

"select * from t_product where productPrice like '%99%';"

查找商品价格中带99的商品,按照价格从高到低排序

"select * from t_product where productPrice like '%99%' order by productPrice desc;"

查找商品价格中带99的商品,按照价格从高到低排序,取前面五条

"select * from t_product where productPrice like '%99%' order by productPrice desc limit 0,5;"

10.主键字段

10.1提示:

当有两条记录是一样的时候,可以使用主键字段来区别

主键可以自增长,数据库建议我们每个表中都要有主键字段

10.2主键字段演练

增加字段(了解)

"alter table t_studentInfo add id_replace integer;"

新建表,并设置主键字段

"create table if not exists t_class(id integer primary key,className text not null,classNO integer);"

10.3注意:

"primary key":某某字段为主键

"not null":某某字段不能为空

11.Xcode之原生SQLite -创建数据库和表

11.1提示:导入头文件"#import ";新增类库"libsqlite3.0.tbd"

11.2使用步骤

1.创建数据库

2.打开数据库

3.建表(t_person)

4.操作表

11.3注意:

- sqlite3中的函数都是以sqlite3开头的

-创建并打开数据库函数: sqlite3_open

-建表和数据操作函数(查询函数除外) : sqlite3_exec

12.Xcode之原生SQLite -数据增删改查

-建表和数据操作函数(查询函数除外) : sqlite3_exec

-查询函数: sqlite3_prepare_v2

-查询数据时会得到结果集,要查询的数据都在结果集中,while循环遍历结果集一条一条记录取出来

13.FMDB -创建数据库和表

13.1FMDB简介

- FMDB是一个操作数据库的第三方框架,并且支持多线程环境下的操作

-也是需要手动导入'libsqlite3.0.tbd'库

-"FMDatabase":单线程;"FMDatabaseQueue":多线程;"FMResultSet":查询的结果集

13.2演练保存Heros模型数据

准备模型类和保存模型数据的工具类

13.3FMDB使用步骤:

1.创建数据库

2.打开数据库

3.创建表

4.增删改查

13.4注意:

-创建数据库和建表只需要执行一次,可以在"+ (void)initialize"方法中实现

-建表,增删改操作都是同一个方法"[_db executeUpdate]"

-查询是另外的方法"[_db executeQuery]"

15.FMDB增删改查

15.1新增操作

[_db executeUpdateWithFormat:@"insert into t_heros(name,age) values(%@,%@)",hero.name,hero.age];

15.2删除操作

[_db executeUpdateWithFormat:@"delete from t_heros where name = %@",hero.name];

15.3修改操作

[_db executeUpdateWithFormat:@"update t_heros set name = %@ where id = 3",hero.name];

15.4查询操作

-需求:把查询出来的数据展示在列表上

- UI准备:准备好列表

-数据准别

获取结果集: FMResultSet *resultSet = [_db executeQuery:@"select * from t_heros"];

while循环遍历结果集,把遍历出来的数据转成模型数据,并添加到模型数组

取结果集中的数据: NSString *name = [resultSet stringForColumn:@"name"];

16.FMDB模糊查找-关键字搜索

16.1注意:

1.大坑提示:模糊查询时,需要自己拼接查询语句,不要使用框架提供的

2.'%'是特殊字符,此时需要使用%转义.即'%%'

3.自己拼接查询语句时,就需要自己添加单引号把字符串引起来

16.2自己拼接模糊查询语句

-错误的拼接和执行模糊查询的方式

FMResultSet *resultSet = [_db executeQueryWithFormat:@"select * from t_heros where name like '%%%@%%'",keyWord];

-正确的拼接和执行模糊查询的方式

NSString *selectSQL = [NSString stringWithFormat:@"select * from t_heros where name like '%%%@%%'",keyWord];

FMResultSet *resultSet = [_db executeQuery:selectSQL];

17.多线程操作数据库的问题及解决办法

-问题:当有多个线程同时操作一个数据库时,只有一个数据会写入.

-解决办法:让FMDatabaseQueue(串行队列)来管理数据库对象.多个操作按顺序来进行

18.封装FMDataBaseQueue单例

新建单例类,继承自FMDataBaseQueue,保证只创建一次

把FMDatabaseQueue定义成单例的目的是为了保证队列在内存中是唯一的一个,当有多个数据库操作任务时,都可以放在同一个队列中

本文由9159.com发布于www.9159.com,转载请注明出处:以下以单表查询为例分析下www.9159.com,并在Powe

关键词: