|
算术函数 |
|
abs(X) |
返回给定数字表达式的绝对值。 |
|
max(X,Y[,...]) |
返回表达式的最大值。 |
|
min(X,Y[,...]) |
返回表达式的最小值。 |
|
random(*) |
返回随机数。 |
|
round(X[,Y]) |
返回数字表达式并四舍五入为指定的长度或精度。 |
|
字符处理函数 |
|
length(X) |
返回给定字符串表达式的字符个数。 |
|
lower(X) |
将大写字符数据转换为小写字符数据后返回字符表达式。 |
|
upper(X) |
返回将小写字符数据转换为大写的字符表达式。 |
|
substr(X,Y,Z) |
返回表达式的一部分。 |
|
randstr() |
|
|
quote(A) |
|
|
like(A,B) |
确定给定的字符串是否与指定的模式匹配。 |
|
glob(A,B) |
|
|
条件判断函数 |
|
coalesce(X,Y[,...]) |
|
|
ifnull(X,Y) |
|
|
nullif(X,Y) |
|
|
集合函数 |
|
avg(X) |
返回组中值的平均值。 |
|
count(X) |
返回组中项目的数量。 |
|
max(X) |
返回组中值的最大值。 |
|
min(X) |
返回组中值的最小值。 |
|
sum(X) |
返回表达式中所有值的和。 |
|
其他函数 |
|
typeof(X) |
返回数据的类型。 |
|
last_insert_rowid() |
返回最后插入的数据的 ID 。 |
|
sqlite_version(*) |
返回 SQLite 的版本。 |
|
change_count() |
返回受上一语句影响的行数。 |
|
last_statement_change_count() |
|
oh,还有就是看到有人说,好像成批插入的时候,启动事务,比不启动事务快n倍
还有就是尽量使用参数化的SQL,估计和商用DB一样能够自动Prepare.
===========
sqlite可以在shell/dos command底下直接执行命令:
sqlite3 film.db "select * from film;"
输出 HTML 表格:
sqlite3 -html film.db "select * from film;"
将数据库「倒出来」:
sqlite3 film.db ".dump" > output.sql
利用输出的资料,建立一个一模一样的数据库(加上以上指令,就是标准的SQL数据库备份了):
sqlite3 film.db < output.sql
在大量插入资料时,你可能会需要先打这个指令:
begin;
插入完资料后要记得打这个指令,资料才会写进数据库中:
commit;
SQLITE分页
刚开始的时候没注意语法
后来才发现,原来用SQLite分页是世界上最简单的。
如果我要去11-20的Account表的数据
Select * From Account Limit 9 Offset 10;
以上语句表示从Account表获取数据,跳过10行,取9行
嗯,我觉得这个特性足够让很多的web中型网站使用这个了。
也可以这样写 select * from account limit10,9和上面的的效果一样。
这种写法MySQL也支持。
SQLite不同于其他大部分的SQL数据库引擎,因为它的首要设计目标就是简单化:
易于管理
易于使用
易于嵌入其他大型程序
易于维护和配置
许多人喜欢SQLite因为它的小巧和快速. 但是这些特性只是它的部分优点, 使用者还会发现SQLite是非常稳定的. 出色的稳定性源于它的简单, 越简单就越不容易出错. 除了上述的简单、小巧和稳定性外, 最重要的在于SQLite力争做到简单化.
简单化在一个数据库引擎中可以说是一个优点, 但也可能是个缺点, 主要决定于你想要做什么. 为了达到简单化, SQLite省略了一些人们认为比较有用的特性, 例如高并发性、严格的存取控制、 丰富的内置功能、 存储过程、复杂的SQL语言特性、 XML以及Java的扩展, 超大的万亿级别的数据测量等等. 如果你需要使用上述的这些特性并且不介意它们的复杂性, 那么SQLite也许就不适合你了. SQLite没有打算作为一个企业级的数据库引擎, 也并不打算和Oracle或者PostgreSQL竞争.
仅凭经验来说SQLite适用于以下场合: 当你更看中简单的管理、使用和维护数据库, 而不是那些企业级数据库提供的不计其数的复杂功能的时候,使用SQLite是一个比较明智的选择. 事实也证明, 人们在许多情况下已经清楚的认识到简单就是最好的选择.
SQLite最佳试用场合
网站
作为数据库引擎SQLite适用于中小规模流量的网站(也就是说, 99.9%的网站). SQLite可以处理多少网站流量在于网站的数据库有多大的压力. 通常来说, 如果一个网站的点击率少于100000次/天的话, SQLite是可以正常运行的. 100000次/天是一个保守的估计, 不是一个准确的上限. 事实证明, 即使是10倍的上述流量的情况下SQLite依然可以正常运行.
嵌入式设备和应用软件
因为SQLite数据库几乎不需要管理, 因此对于那些无人值守运行或无人工技术支持的设备或服务, SQLite是一个很好的选择. SQLite能很好的适用于手机, PDA, 机顶盒, 以及其他仪器. 作为一个嵌入式数据库它也能够很好的应用于客户端程序.
应用程序文件格式
SQLite作为桌面应用程序的本地磁盘文件格式取得了巨大成功.例如金融分析工具、CAD 包、档案管理程序等等. 一般的数据库打开操作需要调用sqlite3_open()函数,并且标记一个显式本地事务的起始点(BEGIN TRANSACTION)来保证以独占的方式得到文件的内容. 文件保存将执行一个提交(COMMIT)同时标记另一个显式本地事务起始点. 这种事务处理的作用就是保证对于应用程序数据文件的更新是原子的、持久的、独立的和一致的.
数据库里可以加入一些临时的触发器,用来把所有的改变记录在一张临时的取消/重做日志表中. 当用户按下取消/重做按钮的时候这些改变将可以被回滚. 应用这项技术实现一个无限级的取消/重做功能只需要编写很少的代码.
替代某些特别的文件格式
许多程序使用fopen(), fread(), 或 fwrite()函数创建和管理一些自定义的文件用来保存数据. 使用SQLite替代这些自定义的文件格式将是一种很好的选择.
内部的或临时的数据库
对于那些有大量的数据需要用不同的方式筛选分类的程序, 相对于编写同样功能的代码, 如果你把数据读入一个内存中的SQLite数据库, 然后使用连接查询和ORDER BY子句按一定的顺序和排列提取需要的数据, 通常会更简单和快速. 按照上述的方法使用内嵌的SQLite数据库将会使程序更富有灵活性, 因为添加新的列或索引不用重写任何查询语句.
命令行数据集分析工具
有经验的SQL用户可以使用SQLite命令行程序去分析各种混杂的数据集. 原是数据可以从CSV(逗号分隔值文件)文件中导入, 然后被切分产生无数的综合数据报告. 可能得用法包括网站日志分析, 运动统计分析, 编辑规划标准, 分析试验结果.
当然你也可以用企业级的客户端/服务器数据库来做同样的事情. 在这种情况下使用SQLite的好处是: SQLite的部署更为简单并且结果数据库是一个单独的文件, 你可以把它存储在软盘或者优盘或者直接通过email发给同事.
在Demo或测试版的时候作为企业级数据库的替代品
如果你正在编写一个使用企业级数据库引擎的客户端程序, 使用一个允许你连接不同SQL数据库引擎的通用型数据库后台将是很有意义的. 其更大的意义在于将SQLite数据库引擎静态的连接到客户端程序当中,从而内嵌SQLite作为混合的数据库支持. 这样客户端程序就可以使用SQLite数据库文件做独立的测试或者验证.
本文来自: (www.91linux.com) 详细出处参考:http://www.91linux.com/html/article/database/sqlite/200812/12-14611.html
数据库教学
因为SQLite的安装和使用非常的简单(安装过程几乎忽略不计, 只需要拷贝SQLite源代码或sqlite.exe可执行文件到目标主机, 然后直接运行就可以) 所以它非常适合用来讲解SQL语句. 同学们可以非常简单的创建他们喜欢的数据库, 然后通过电子邮件发给老师批注或打分. 对于那些感兴趣怎样实现一个关系型数据库管理系统(RDBMS)的高层次的学生, 按照模块化设计且拥有很好的注释和文档的SQLite源代码, 将为他们打下良好的基础. 这并不是说SQLite就是如何实现其他数据库引擎的精确模型, 但是很适合学生们了解SQLite是如何快速工作的, 从而掌握其他数据库系统的设计实现原则.
试验SQL语言的扩展
SQLite简单且模块化的设计使得它可以成为一个用来测试数据库语言特性或新想法的优秀的原型平台.
哪些场合适合使用其他的关系型数据库管理系统(RDBMS)
客户端/服务器程序
如果你有许多的客户端程序要通过网络访问一个共享的数据库, 你应当考虑用一个客户端/服务器数据库来替代SQLite. SQLite可以通过网络文件系统工作, 但是因为和大多数网络文件系统都存在延时, 因此执行效率不会很高. 此外大多数网络文件系统在实现文件逻辑锁的方面都存在着bug(包括Unix 和windows). 如果文件锁没有正常的工作, 就可能出现在同一时间两个或更多的客户端程序更改同一个数据库的同一部分, 从而导致数据库出错. 因为这些问题是文件系统执行的时候本质上存在的bug, 因此SQLite没有办法避免它们.
好的经验告诉我们, 应该避免在许多计算机需要通过一个网络文件系统同时访问同一个数据库的情况下使用SQLite.
高流量网站
SQLite通常情况下用作一个网站的后台数据库可以很好的工作. 但是如果你的网站的访问量大到你开始考虑采取分布式的数据库部署, 那么你应当毫不犹豫的考虑用一个企业级的客户端/服务器数据库来替代SQLite.
超大的数据集
当你在SQLite中开始一个事务处理的时候(事务处理会在任何写操作发生之前产生, 而不是必须要显示的调用BEGIN...COMMIT), 数据库引擎将不得不分配一小块脏页(文件缓冲页面)来帮助它自己管理回滚操作. 每1MB的数据库文件SQLite需要256字节. 对于小型的数据库这些空间不算什么, 但是当数据库增长到数十亿字节的时候, 缓冲页面的尺寸就会相当的大了. 如果你需要存储或修改几十GB的数据, 你应该考虑用其他的数据库引擎.
高并发访问
SQLite对于整个数据库文件进行读取/写入锁定. 这意味着如果任何进程读取了数据库中的某一部分, 其他所有进程都不能再对该数据库的任何部分进行写入操作. 同样的, 如果任何一个进程在对数据库进行写入操作, 其他所有进程都不能再读取该数据库的任何部分. 对于大多数情况这不算是什么问题. 在这些情况下每个程序使用数据库的时间都很短暂, 并且不会独占, 这样锁定至多会存在十几毫秒. 但是如果有些程序需要高并发, 那么这些程序就需要寻找其他的解决方案了
[]
特征:针对特定类型、固定长度的
Array
特征:针对任意类型、固定长度的
List
特征:针对特定类型、任意长度的
ArrryList
特征:针对任意类型、任意长度的
C# 数组中每个元素的类型必须相同
C# 数组的下标是从 0 开始
一维数组
int[] arr = {1, 2, 3};
多维数组
int[,] arr = { {1, 11}, {2, 12}, {3, 13} };
交错数组
int[][][] arr = new int[1][][];
GridView
特征:一行一条记录,就像新闻列表一样;带分页功能
DataList
特征:一行可以有多条记录,就像图片列表一样;分页功能需要手写
Repeater
特征:自由定制;分页功能需要手写
ListView
特征:自由定制,功能强大;应用复杂;分页功能需要手写
DetailsView 控件
特征:一条记录,一行一个字段;带分页功能
FormView
特征:一条记录,自由定制;带分页功能
C# 3.0 - var 隐式类型声明
C# 3.0 -自动属性实现
C# 3.0 -对象初始化设置
C# 3.0 -集合初始化设置
C# 3.0 -匿名类型
C# 3.0 -扩展方法
C# 3.0 - partial 分部(类型)
C# 3.0 - Lambda
重载
必须位于同一个类中;
方法名称必须相同;
方法的参数要么类型不同,要么个数不同,要么类型个数均不同;
返回值类型可以不同;
隐藏
必须位于基类和派生类中;
方法名称必须相同;
参数类型、参数个数必须相同;
返回值类型可以不同;
应该使用 new,虽然不使用 new 也会运行,但在编译时会被警告;
调用派生类方法还是基类方法,取决于被什么类型的实例调用。
覆盖
必须位于基类和派生类中;
方法名称必须相同;
参数类型、参数个数必须相同;
返回值类型必须相同(与隐藏不同);
必须使用关键字 virtual 和 override;
即使把派生类的实例转换成基类类型,也无法调用基类中被覆盖的方法,因为它已经被覆盖了嘛,不像隐藏还有被“发掘”的机会。
抽象
可对类用 abstract,不对其方法用 abstract;
但若对方法用 abstract,其类必须用 abstract;
若类用了 abstract,方法没用 abstract,不表示方法也是 abstract;
不能使用 new 来实例化抽象类;
抽象方法不能有主体,只需要在参数写完后,直接收括号,引号结束;
抽象的方法是隐式的 virtual 方法,所以它还有覆盖(改写、重写)的特点。
接口
一个接口定义了一个契约。
接口可以包容方法、C# 属性、事件、以及索引器。
在一个接口声明中,我们可以声明零个或者多个成员。
所有接口成员的默认访问类型都是 public。
如果在接口成员声明中包括了任何修饰符,那么会产生一个编译器错误。
与一个非抽象类类似,一个抽象类必须提供接口中所有成员的实现,只要这些成员在这个类的基类中出现过。
partial
分部(类型) 可以在任意一个类中声明 partial类型的方法 编译之后这些方法将合并
char
char 关键字用于声明 U+0000 到 U+ffff 的 16 位 Unicode 字符。Unicode 字符是 16 位字符,用于表示世界上多数已知的书面语言,char 可以隐式转换为 ushort、int、uint、long、ulong、float、double 或 decimal。但是,不存在从其他类型到 char 类型的隐式转换。注意是隐式转换。
为 char 类型变量赋值有四种方法:
char c1 = 'X'; //注意是单引号
char c2 = '\x0058'; //用十六进制表示
char c3 = (char)88; //用数字转换
char c4 = '\u0058'; //用 Unicode 表示
float
float 是 4 个字节数,表示浮点数,它的表示方法,需要在数字后加“f”,大小写不敏感
如:float f = 3.2f/float f = 3.2F;
decimal
小数型)是一种高精度的 128 位数据类型,它所表示的范围从 1.0*10-28 到大约 7.9*1028。它的表示方法,需要在数字后加“m”,大小写不敏感
如decimal m = 1.0m/decimal m = 1.0M;
值类型
值类型有:byte(1)、sbyte(1)、short(2)、ushort(2)、int(4)、uint(4)、long(8)、ulong(8)、float(4)、double(8)、decimal(8)、char、bool、枚举、结构。
上述中括号中的数字表示字节数,byte、ushort、uint、ulong 为无符号类型(没有负数),顺便说一下 sbyte 是有符号的字节。
这些类型是.NET Framework 类型的别名的别名,具体对应关系,请参见由 String 与 string 引出的。
引用类型
引用类型有:对象类型、类类型、接口、代表元、字符串类型、数组。
虽然字符串类型(string)是引用类型,但微软为了我们设计方便,重载了其中的一些操作符,使得它应用起来就像是值类型一样。
yield
yield 关键字会告诉编译器当前的函数是在一个循环内部,编译器会相应生成一个执行它在循环体内部所表示行为的类,yield 和 return 关键字一起用于为枚举器对象提供返回值,比如说:在 foreach 内部的每一次循环内,yield 关键字用于终止当前循环
var
自从 C# 3.0 开始,在函数作用局范围内声明的变量可以通过 var 关键字声明成隐含类型 , 隐含类型是强类型,你需要自己声明隐含类型本地变量,然后编译器会帮你决定为某种强类型。在 2.0 版本上跑的程序也可以使用 var 关键字,但是需要你的编译器是 3.0 以上版本并且设置代码输出版本为 2.0
using()
定义一个范围,在范围外的对象将会被回收
readonly
readonly 关键字是一个可作用在变量域上的修饰符,当一个变量域被 readonly 修饰后,这个变量只可在声明或者当前变量所属类的构造器内赋值
as
as 操作符很像一个类型转换器,然和,当转换无法发生时,as 会返回 null 而不是抛出一个异常
default
在泛型类和泛型方法中产生的一个问题是,在预先未知以下情况时,如何将默认值分配给参数化类型 T:T 是引用类型还是值类型。如果 T 为值类型,则它是数值还是结构。给定参数化类型 T 的一个变量 t,只有当 T 为引用类型时,语句 t = null 才有效;只有当 T 为数值类型而不是结构时,语句 t = 0 才能正常使用。解决方案是使用 default 关键字,此关键字对于引用类型会返回 null,对于数值类型会返回零。对于结构,此关键字将返回初始化为零或 null 的每个结构成员,具体取决于这些结构是值类型还是引用类型 :
T temp = default(T);
global
在 :: 运算符前面使用的 global 上下文关键字引用全局命名空间,该命名空间是任何 C# 程序的默认命名空间,未以其他方式命名。
class TestClass : global::TestApp { }
volatile
表示字段可能被多个并发执行线程修改。声明为 volatile 的字段不受编译器优化(假定由单个线程访问)的限制。这样可以确保该字段在任何时间呈现的都是最新的值
extern alias
有时可能有必要引用具有相同完全限定类型名的程序集的两个版本,例如当需要在同一应用程序中使用程序集的两个或更多的版本时。通过使用外部程序集别名,来自每个程序集的命名空间可以在由别名命名的根级别命名空间内包装,从而可在同一文件中使用
http://msdn.microsoft.com/en-us/library/ms173212%28VS.80%29.aspx