SQL语言的分类
SQL语言共分为四大类:数据查询语言DQL,数据操纵语言DML,
数据定义语言DDL,数据控制语言DCL。
1. 数据查询语言DQL
数据查询语言DQL基本结构是由SELECT子句,FROM子句,WHERE
子句组成的查询块:
SELECT <字段名表>
FROM <表或视图名>
WHERE <查询条件>
2 .数据操纵语言DML
数据操纵语言DML主要有三种形式:
1) 插入:INSERT
2) 更新:UPDATE
3) 删除:DELETE
3. 数据定义语言DDL
数据定义语言DDL用来创建数据库中的各种对象—–表、视图、
索引、同义词、聚簇等如:
1 2 3
| CREATE TABLE/VIEW/INDEX/SYN/CLUSTER | | | | | 表 视图 索引 同义词 簇
|
4. 数据控制语言DCL
数据控制语言DCL用来授予或回收访问数据库的某种特权,并控制
数据库操纵事务发生的时间及效果,对数据库实行监视等。如:
1) GRANT:授权。
2) ROLLBACK [WORK] TO [SAVEPOINT]:回退到某一点。
回滚—ROLLBACK
回滚命令使数据库状态回到上次最后提交的状态。其格式为:
SQL>ROLLBACK;
3) COMMIT [WORK]:提交。
在数据库的插入、删除和修改操作时,只有当事务在提交到数据
库时才算完成。在事务提交前,只有操作数据库的这个人才能有权看
到所做的事情,别人只有在最后提交完成后才可以看到。
提交数据有三种类型:显式提交、隐式提交及自动提交。下面分
别说明这三种类型。
(1) 显式提交
用COMMIT命令直接完成的提交为显式提交。其格式为:
SQL>COMMIT;
(2) 隐式提交
用SQL命令间接完成的提交为隐式提交。这些命令是:
ALTER,AUDIT,COMMENT,CONNECT,CREATE,DISCONNECT,DROP,
EXIT,GRANT,NOAUDIT,QUIT,REVOKE,RENAME。
(3) 自动提交
若把AUTOCOMMIT设置为ON,则在插入、修改、删除语句执行后,
系统将自动进行提交,这就是自动提交。其格式为:
SQL>SET AUTOCOMMIT ON;
Sqlite4Unity
地址
建立连接
1 2
| var dbPath = string.Format(@"Assets/StreamingAssets/tempDB.sqlite3"); _connection = new SQLiteConnection(dbPath, SQLiteOpenFlags.ReadWrite | SQLiteOpenFlags.Create);
|
删除table
1
| _connection.DropTable<Person>();
|
创建table
1
| _connection.CreateTable<Person>();
|
插入数据
1 2 3 4
| _connection.Insert(new Person {typeId = 1, Name = "Tom"}); _connection.Insert(new Person {typeId = 2, Name = "Dom"}); _connection.Insert(new Person {typeId = 1, Name = "Jake"}); _connection.Insert(new Person {typeId = 2, Name = "Rose"});
|
整体插入数据
1 2 3 4 5 6
| _connection.InsertAll( new[] { new Person {typeId = 1, Name = "Ben"}, new Person {typeId = 2, Name = "Lily"}, });
|
修改数据
1 2 3 4 5 6
| _connection.Table<Person>() .Where(p => p.typeId == 1) .ToObservable() .Do(p=>p.Name="Jim") .Do(p => _connection.Update(p)) .Subscribe();
|
删除数据
1 2 3 4 5
| _connection.Table<Person>() .Where(p => p.typeId == 1) .ToObservable() .Do(p => _connection.Delete(p)) .Subscribe();
|
查找
1
| _connection.Find<Person>(x => x.Id == 4).Name.print();
|
1 2 3 4 5 6
| foreach (var map in _connection.TableMappings) { var item = _connection.Find(1, map); if (item != null) item.ToString().print(); }
|
查询
1 2 3 4
| _connection.Query<Person>("select * from Person") .ToObservable() .Do(t => t.Name.print()) .Subscribe();
|
相当于
1 2 3 4 5 6
| SQLiteCommand cmd = new SQLiteCommand(_connection); cmd.CommandText = "select * from Person"; cmd.ExecuteQuery<Person>() .ToObservable() .Do(t => t.Name.print()) .Subscribe();
|
查询多张表
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| _connection.Query<val>("select typeId as id,TypeName as N from Person,PersonType") .ToObservable() .Do(t => { t.id.print(); t.N.print(); }) .Subscribe(); public class val { public int id { get; set; } public string N { get; set; } }
|
获取
1 2
| var item=_connection.Get<Person>(2); item.Name.print();
|
GetMapping
1 2
| var item = _connection.GetMapping<Person>(); item.GetByPrimaryKeySql.print();
|
执行sql语句删除
1 2
| int id = 5; _connection.Execute("delete from Person where id=?", id);
|
执行sql语句创建
1 2 3 4 5 6
| string sql = "create table contacts ( id integer primary key," + "name text not null collate nocase," + "phone text not null default 'unknown'," + "email text not null default '' collate nocase," + "unique (name,phone));"; _connection.Execute(sql);
|
事务–快速插入
1 2 3 4 5 6 7 8 9 10
| SQLiteCommand cmd = new SQLiteCommand(_connection); _connection.BeginTransaction(); Observable.Range(0, 20) .Do(t => { cmd.CommandText = string.Format("insert into Person values(null,2,'{0}')",t); cmd.ExecuteNonQuery(); }) .Subscribe(); _connection.Commit();
|
添加字段
1 2 3 4
| _connection.Table<Person>(); SQLiteCommand cmd = new SQLiteCommand(_connection); cmd.CommandText = "alter table Person add name2 text not null default noknow;"; cmd.ExecuteNonQuery();
|
重命名字段
删除字段
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| SQLiteCommand cmd = new SQLiteCommand(_connection); string[] sql = { "drop table if exists PersonOld;", "alter table Person rename to PersonOld;", "create table Person(Id,Name);", "insert into Person select Id,Name from PersonOld;", "drop table PersonOld", }; _connection.BeginTransaction(); sql.ToObservable() .Do(t => { cmd.CommandText = t; cmd.ExecuteNonQuery(); }) .Subscribe(); _connection.Commit();
|
ExecuteScalar
返回结果第一行的第一列,如果结果集为空,则为空引用。
最多返回2033个字符。
1 2
| cmd.CommandText = "select count(*) from Person"; cmd.ExecuteScalar<int>().print();
|
架构
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| Exception + ++SQLiteException + ++Not Null Constration Violation Exception Attribute + ++Table Attribute | ++ColumnAttribute | ++PrimaryKeyAttribute | ++AutoIncrementAttribute | ++IndexedAttribute+-------+UniqueAttribute | ++IgnoreAttribute | ++MaxLengthAttribute | ++CollationAttribute | ++NotNullAttribute
|
TableMapping
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| TableMapping + | +-----------------------------+ | |SetAutoIncPK | | |FindColumnWithPropertyName | +--->+FindColumn | | |GetInsertCommand | | |CreateInsertCommand | | |Dispose | | | | | +-----------------------------+ | +---> Column + | +-----------+ +--> |SetValue | |getValue | +-----------+
|
orm
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101
| Orm + | +----------+ | | SqlDecl | +-> | SqlType | | | IsPK | | +----------+ | +----> Collation | + +----------------+ | | |IsAutoInc | | | |GetIndices | | +--> |MaxStringLength | | |isMarkedNotNull | | +----------------+ +--->SQLiteCommand | + | | +---------------------------+ | | | ExecuteNonQuery | | | | ExecuteDeferredQuery | | | | ExecuteQuery | | | | OnInstanceCreated | | | | ExecuteScalar | | | | Bind | | | | Prepare | | +---> | Finalize | | | BindAll | | | BindParameter | | | ReadCol | | | Binding(Name,Value,Index) | | +---------------------------+ | | +---> Prepare Sqlite Insert Command: IDisposable | + | | +----------------+ | | |ExecuteNonQuery | | +----> |Prepare | | |Dispose | | |~ | | +----------------+ | +-------> TableQuery : BaseTableQuery + | +------------------+ | |Clone | | |Where | | |Take | | |Skip | | |ElementAt | | |Deferred | | |OrderBy | | |OrderByDescending | | |ThenBy | +--> |ThenByDescending | | |AddOrderBy | | |AddWhere | | |Join | | |Select | | |GenerateCommand | | |CompileResult | | |CompileExpr | | +------------------+ | +---> SQLite3 + +-----------------------+ | | Open | | | EnableLoadExtension | | | Close | | | Initialize | | | Shutdown | +------> | Config | | SetDirectory | | BusyTimeout | | Changes | | Prepare2 | | Step | | Reset | | Finalize | | LastInsertRowid | | Errmsg | | GetErrmsg | | BindParameterIndex | | BindNull | | BindInt | | BindDouble | | BindText | | BindBlob | | ColumnCount | | ColumName | | ColumnType | | ColumnInt | | ColumnDouble | | ColumnText | | ColumnBlob | | ColumnBytes | | ColumnString | | ColumnByteArray | | ExtendedErrCode | | LibVersionNumber | +-----------------------+
|
SQLiteConnection
SQLiteConnection
构建了一种新的sqliteconnection并打开一个指定databasepath SQLite数据库。
1 2
| var dbPath = string.Format(@"Assets/StreamingAssets/tempDB.sqlite3"); _connection = new SQLiteConnection(dbPath, SQLiteOpenFlags.ReadWrite | SQLiteOpenFlags.Create);
|
EnableLoadExtension
GetNullTerminatedUtf8
GetMapping
检索给定类型的自动生成的映射。
该映射表示数据库的列的架构,并包含设置和获取对象的属性的方法。
DropTable
在数据库上执行“drop table”。这是不可恢复的。
CreateTable
在数据库上执行“create table if not
exists”它也在表的列上创建任何指定的索引。它使用一个自动生成的模式从指定的类型。以后您可以通过调用getmapping访问模式。返回添加到数据库模式的条目的数目。
CreateIndex
为指定的表和列创建索引。
GetTableInfo
MigrateTable
NewCommand
创建一个新的sqlitecommand。可以重写为一个子类。
CreateCommand
创建一个新的sqlitecommand给定的命令文本的理由。放置一个“?”在每个参数的命令文本中。
Execute
创建一个sqlitecommand给定的命令文本(SQL)的参数。放置一个“?”在每个参数的命令文本中,然后执行该命令。使用此方法,而不是查询时,您不期望行返回。这种情况包括插入、更新和删除。你可以设置连接的痕迹或timeexecution属性来执行配置文件。返回由于此执行,在数据库中修改的行数。
其实就是执行的cmd.ExecuteNonQuery ();
ExecuteScalar
返回结果第一行的第一列,如果结果集为空,则为空引用。
最多返回2033个字符。
Query
创建一个sqlitecommand给定的命令文本(SQL)的参数。放置一个“?”在每个参数的命令文本中,然后执行该命令。它使用给定类型的自动生成的映射返回结果的每一行。
返回 List
DeferredQuery
返回 IEnumerable
Table
返回一个queryable界面,通过给定的类型表。
Get
试图从与指定类型关联的表中检索给定主键的对象。使用这种方法需要特定类型指定一个主键(使用primarykeyattribute)。返回给定主键的对象。如果找不到对象,抛出一个未找到的异常。
Find
试图从与指定类型关联的表中检索给定主键的对象。使用这种方法需要特定类型指定一个主键(使用primarykeyattribute)。
返回主键或空的对象。
BeginTransaction
开始一个新的事务
IsInTransaction
是否在事务中
SaveTransactionPoint
创建在事务当前时间点在数据库中保存。如果一个不在进行中,就开始一个新的事务。
返回保存点的字符串名称
Rollback
回滚事务的开始点或者保存点
Release
释放一个保存点
DoSavePointExecute
Commit
提交已开始的事务
RunInTransaction
在执行动作(可能是嵌套的)被包装在一个事务保存点。如果异常发生时整个事务回滚,不只是现在的保存点。唯一的例外是重抛出。
InsertAll
插入所有指定的对象。
Insert
插入指定的对象和检索其自增主键如果有。
InsertOrReplace
插入指定的对象和检索其自增主键如果有。如果一个唯一的约束冲突发生在一些预先存在的对象上,这个函数将删除旧的对象。
Update
更新使用指定的对象的表的所有列,除了它的主键以外。
UpdateAll
更新所有指定的对象。
Delete
使用它的主键从数据库中删除给定的对象。
DeleteAll
从指定的表中删除所有对象。
Dispose
Close
多表连接
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
| using SQLite4Unity3d; using UnityEngine; using UniRx; public class test : MonoBehaviour { SQLiteConnection _connection; void Start() { var dbPath = string.Format(@"Assets/StreamingAssets/tempDB.sqlite3"); _connection = new SQLiteConnection(dbPath, SQLiteOpenFlags.ReadWrite | SQLiteOpenFlags.Create); createPerson(); createPersonType(); var cmd = new SQLiteCommand(_connection); cmd.CommandText = //"select Person.Name as name,PersonType.TypeName as type from Person,PersonType where Person.typeId = PersonType.id limit 10;"; //左外连接 //"select Person.Name as name,PersonType.TypeName as type from Person left outer join PersonType on Person.typeId = PersonType.id limit 10;"; //内连接 "select Person.Name as name,PersonType.TypeName as type from Person join PersonType on Person.typeId = PersonType.id limit 10;"; //自然连接 //"select Person.Name as name,PersonType.TypeName as type from Person natural join PersonType limit 10;"; var result = cmd.ExecuteQuery<val>(); result.ToObservable() .Do(t => { var s = string.Format("name:{0},type:{1}", t.name, t.type); s.print(); }) .Subscribe(); } public class val { public string name { get; set; } public string type { get; set; } } void createPerson() { //删除table _connection.DropTable<Person>(); //创建table _connection.CreateTable<Person>(); //插入数据 _connection.Insert(new Person {typeId = 1, Name = "Tom"}); _connection.Insert(new Person {typeId = 2, Name = "Dom"}); _connection.Insert(new Person {typeId = 1, Name = "Jake"}); _connection.Insert(new Person {typeId = 2, Name = "Rose"}); //整体插入 _connection.InsertAll( new[] { new Person {typeId = 3, Name = "Ben"}, new Person {typeId = 3, Name = "Lily"}, }); } void createPersonType() { _connection.DropTable<PersonType>(); _connection.CreateTable<PersonType>(); _connection.Insert(new PersonType {TypeName = "hehe"}); _connection.Insert(new PersonType {TypeName = "lala"}); } } public static class StringExtension { public static void print(this string ss) { Debug.Log(ss); } public static void print(this int ii) { print(ii.ToString()); } } public class Person { [PrimaryKey,AutoIncrement] public int Id { get; set; } public int typeId { get; set; } public string Name { get; set; } } public class PersonType { [PrimaryKey,AutoIncrement] public int Id { get; set; } public string TypeName { get; set; } }
|