其他文章

Excel数据按sheet导入SQLite

SQL, sqlite, excel, sheet, pandas

Excel数据按sheet导入SQLite # 以下为python实例脚本,将名为test.xlsx的表格,按每个sheet名新建table,导入SQlite3数据库中。 ## 导入库 import pandas as pd import sqlite3 ##建立数据库文件 con=sqlite3.connect('test.db') ##读取excel xlsx=pd.read_excel('test.xlsx', sheet_name=None) ##遍历每个sheet for sheet in xlsx.keys(): ## 按sheet读取excel内容 df=pd.read_excel('test.xlsx',sheet_name=sheet) ##按sheet名命名table,写入数据库 df.to_sql(sheet,con, index=False,if_exists="replace") con.commit() con.close()

innodb 是如何存数据的?

innodb 是如何存数据的? # 如果你使用过mysql数据库,对它的存储引擎:innodb,一定不会感到陌生。 众所周知,在mysql5以前,默认的存储引擎是:myslam。但mysql5之后,默认的存储引擎已经变成了:innodb,它是我们建表的首选存储引擎。 那么,问题来了: innodb底层是如何存储数据的? 表中有哪些隐藏列? 用户记录之间是如何关联起来的? 如果你想知道上面三个问题的答案,那么,请继续往下面看。 1.磁盘or内存? # 1.1 磁盘 # 数据对系统来说是非常重要的东西,比如:用户的身份证、手机号、银行号、会员过期时间、积分等等。一旦丢失,会对用户造成很大的影响。 那么问题来了,如何才能保证这些重要的数据不丢呢? 答案:把数据存在磁盘上。 当然有人会说,如果磁盘坏了怎么办? 那就需要备份,或者做主从了。。。 好了,打住,这不是今天的重点。 言归正传。 大家都知道,从磁盘上读写数据,至少需要两次IO请求才能完成。一次是读IO,另一次是写IO。 而IO请求是比较耗时的操作,如果频繁的进行IO请求势必会影响数据库的性能。 那么,如何才能解决数据库的性能问题呢? 1.2 内存 # 把数据存在寄存器? 没错,操作系统从寄存器中读取数据是最快的,因为它离CPU最近。 但是寄存器有个非常致命的问题是:它只能存储非常少量的数据,设计它的目的主要是用来暂存指令和地址,并非存储大量用户数据的。 这样看来,只能把数据存在内存中了。 因为内存同样能满足我们,快速读取和写入数据的需求,而且性能是非常可观的,只是比较寄存器稍稍慢了一丢丢而已。 不过有个让人讨厌的地方是,内存相对于磁盘来说,是更加昂贵的资源。通常情况下,500G或者1T的磁盘,是很常见的。但你有听说过有500G的内存吗?别人会以为你疯了。内存大小讨论的数量级一般是16G或32G。 内存可以存储一些用户数据,但无法存储所有的用户数据,因为如果数据量太大了,它可能还是存不下。 此外,即使用户数据能刚好存在内存,以后万一有一天,数据库服务器或者部署节点挂了,或者重启了,数据不就丢了? 怎么做,才能不会因为异常情况,而丢数据。同时,又能保证数据的读写速度呢? 2.数据页 # 我们可以把一批数据放在一起。 写操作时,先将数据写到内存的某个批次中,然后再将该批次的数据一次性刷到磁盘上。如下图所示: 读操作时,从磁盘上一次读一批数据,然后加载到内存当中,以后就在内存中操作。如下图所示: 将内存中的数据刷到磁盘,或者将磁盘中的数据加载到内存,都是以批次为单位,这个批次就是我们常说的:数据页。 当然innodb中存在多种不同类型的页,数据页只是其中一种,我们在这里重点介绍一下数据页。 那么问题来了,什么是数据页? 数据页主要是用来存储表中记录的,它在磁盘中是用双向链表相连的,方便查找,能够非常快速得从一个数据页,定位到另一个数据页。 很多时候,由于我们表中的数据比较多,在磁盘中可能存放在多个数据页当中。 有一天,我们要根据某个条件查询数据时,需要从一个数据页找到另一个数据页,这时候的双向链表就派上大用场了。磁盘中各数据页的整体结构如下图所示: 通常情况下,单个数据页默认的大小是16kb。当然,我们也可以通过参数:innodb_page_size,来重新设置大小。不过,一般情况下,用它的默认值就够了。 好吧,数据页的整体结构已经搞明白了。 那么,单个数据页包含哪些内容呢? 从上图中可以看出,数据页主要包含如下几个部分: 文件头部 页头部 最大和最小记录 用户记录 空闲空间 页目录 文件尾部 3.用户记录 # 对于新申请的数据页,用户记录是空的。当插入数据时,innodb会将一部分空闲空间分配给用户记录。 用户记录是innodb的重中之重,我们平时保存到数据库中的数据,就存储在它里面。那么,它里面又包含哪些内容呢?你不好奇吗? 其实在innodb支持的数据行格式有四种: compact行格式 redundant行格式 dynamic行格式 compressed行格式 我们以compact行格式为例: 一条用户记录主要包含三部分内容: ...

MyBatis 动态 SQL 教程

MyBatis 动态 SQL 教程 # MyBatis动态sql是什么 # 动态 SQL 是 MyBatis 的强大特性之一。在 JDBC 或其它类似的框架中,开发人员通常需要手动拼接 SQL 语句。根据不同的条件拼接 SQL 语句是一件极其痛苦的工作。例如,拼接时要确保添加了必要的空格,还要注意去掉列表最后一个列名的逗号。而动态 SQL 恰好解决了这一问题,可以根据场景动态的构建查询。 动态SQL(code that is executed dynamically),它一般是根据用户输入或外部条件动态组合的SQL语句块。动态SQL能灵活的发挥SQL强大的功能、方便的解决一些其它方法难以解决的问题。相信使用过动态SQL的人都能体会到它带来的便利,然而动态SQL有时候在执行性能 (效率)上面不如静态SQL,而且使用不恰当,往往会在安全方面存在隐患 (SQL 注入式攻击)。 Mybatis 动态sql是做什么的? # Mybatis 动态 sql 可以让我们在 Xml 映射文件内,以标签的形式编写动态 sql,完成逻辑判断和动态拼接 sql 的功能。 Mybatis 的9种动态sql标签有哪些? # 动态sql的执行原理? # 原理为:使用 OGNL 从 sql 参数对象中计算表达式的值,根据表达式的值动态拼接 sql,以此来完成动态 sql 的功能。 MyBatis标签 # if标签:条件判断 # MyBatis if 类似于 Java 中的 if 语句,是 MyBatis 中最常用的判断语句。使用 if 标签可以节省许多拼接 SQL 的工作,把精力集中在 XML 的维护上。 ...

SQL多表查询inner join用法

SQL多表查询inner join用法 # inner join(等值连接):只返回两个表中联结字段相等的行。 left join(左联接):返回包括左表中的所有记录和右表中联结字段相等的记录。 right join(右联接):返回包括右表中的所有记录和左表中联结字段相等的记录。 INNER JOIN 语法: # INNER JOIN 连接两个数据表的用法: # SELECT * FROM 表1 INNER JOIN 表2 ON 表1.字段号=表2.字段号 INNER JOIN 连接三个数据表的用法: # SELECT * FROM (表1 INNER JOIN 表2 ON 表1.字段号=表2.字段号) INNER JOIN 表3 ON 表1.字段号=表3.字段号 INNER JOIN 连接四个数据表的用法: # SELECT * FROM ((表1 INNER JOIN 表2 ON 表1.字段号=表2.字段号) INNER JOIN 表3 ON 表1.字段号=表3.字段号) INNER JOIN 表4 ON Member.字段号=表4.字段号 INNER JOIN 连接五个数据表的用法: # SELECT * FROM (((表1 INNER JOIN 表2 ON 表1. ...