IOS - 关于移动端SQLite,你想知道的都有

KirstenGumm 7年前
   <h2>一、SQLite简介</h2>    <p>SQLite,是一款轻型的数据库,是遵守 ACID 的关系型数据库管理系统,它包含在一个相对小的C库中。它是D.RichardHipp建立的公有领域项目。它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tcl、C#、PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL这两款开源的世界著名数据库管理系统来讲,它的处理速度比他们都快。</p>    <h2>二、SQLite优势</h2>    <ul>     <li>1、占用资源低</li>     <li>2、速度快</li>     <li>3、与其他数据库相比,更适配移动平台、嵌入式平台</li>    </ul>    <h2>三、SQLite支持的存储类型有:</h2>    <pre>  <code class="language-sql">1、INTEGER    - 整形   2、blob       - 二进制   3、real       - 浮点型   4、text       - 字符串   5、NULL       - 空</code></pre>    <h2>注意: 在SQLite中大小写不区分,也就是AA = aA = Aa = aa</h2>    <h2>四、SQLite学习之DDL</h2>    <p>DDL(Data Definition Language):数据定义语言,用来创建数据库中的各种对象-----表、视图、</p>    <p>索引、同义词、聚簇等</p>    <ul>     <li>创建表 <pre>  <code class="language-sql">CREATE TABLE 表名 (字段名 字段类型,字段名1 字段类型1,...);</code></pre> </li>     <li>删除表 <pre>  <code class="language-sql">DROP TABLE 表名;</code></pre> </li>    </ul>    <h2>DDL - 创建表:</h2>    <pre>  <code class="language-sql"><br />    CREATE TABLE T_Person(id INTEGER, name TEXT,age INTEGER);  在这里我们通常有两种书写格式,假设语句不是很长的情况下,  可以写成一行,但是如果语句过长就不利于阅读,所以有了下面的格式:  CREATE TABLE T_Person  (      id INTEGER,       name TEXT,      age INTEGER  );</code></pre>    <p>通过上述代码我们就可以创建一个表了,但是如果在执行一次上面的语句, 就会发现报错了,</p>    <p>错误:文件已存在 Error : table T_Person already exists</p>    <p>所以我们创建的时候需要判断表是不是存在</p>    <p>于是有了下面的创建语句:</p>    <pre>  <code class="language-sql">CREATE TABLE IF NOT EXISTS T_Person  (      id INTEGER,       name TEXT,      age INTEGER  );</code></pre>    <p>其中</p>    <pre>  <code class="language-sql">IF NOT EXISTS : 如果不存在  上面创建的语句翻译就是:  创建一个表,如果不存在的话就创建</code></pre>    <h2>DDL - 删除表:</h2>    <pre>  <code class="language-sql">DROP TABLE T_Person;</code></pre>    <h2>五、SQLite学习之DML</h2>    <p>DML(Data Manipulation Language)数据库操作语句:</p>    <p>关键字有insert,update,delete</p>    <p>分别对应:插入、更新、删除</p>    <ul>     <li>插入数据 <pre>  <code class="language-sql">INSERT INTO 表名(字段...) VALUES(值...);</code></pre> </li>     <li>更新数据 <pre>  <code class="language-sql">UPDATE 表名 SET 字段名=值,...;</code></pre> </li>     <li>删除数据 <pre>  <code class="language-sql">DELETE FROM 表名;</code></pre> </li>    </ul>    <h2>DML - 插入数据:</h2>    <pre>  <code class="language-sql">INSERT INTO T_Person1 (name,age) VALUES('zs',20);    在现实生活中我们可能会遇到这样一种情况:  在一个班里,有可能有两个人的姓名完全一致,这个时候我们  就需要进行区分,就像每个人都有一个身份证号,且唯一</code></pre>    <p style="text-align:center"><img src="https://simg.open-open.com/show/71b3f909fbfd884096a419630b8238b7.png"></p>    <p>这个时候如何区分?</p>    <p>如果想保证数据唯一:</p>    <p>这个时候就需要主键: PRIMARY KEY ,所以我们要修改我们的创建表的语句</p>    <p>修饰主键的方法有两种:</p>    <ul>     <li>方法一: <pre>  <code class="language-sql">CREATE TABLE T_Person  (    id INTEGER PRIMARY KEY,     name TEXT,    age INTEGER  );</code></pre> </li>     <li>方法二: <pre>  <code class="language-sql">CREATE TABLE IF NOT EXISTS T_Person1  (    id INTEGER,     name TEXT,    age INTEGER,    PRIMARY KEY (id)  );</code></pre> 这个时候我们再次执行插入语句 <pre>  <code class="language-sql">INSERT INTO   T_Person1 (id,name,age)   VALUES(1,'zs',20);  .  第一次:Affected rows : 1, Time: 0.00sec  第二次:Error : UNIQUE constraint failed: T_Person1.id</code></pre> 从上面的结果可以看出,id不能相同,那怎么样才能保证ID不相同,<br> 又不输入id这个属性呢?因为人输入,可能会存在差错,交给机器做最好。<br> 于是我们要用到个新的关键字: AUTOINCREMENT 自增<br> 所以我们还要在修改一次创建语句: <pre>  <code class="language-sql">CREATE TABLE IF NOT EXISTS T_Person1  (    id INTEGER PRIMARY KEY AUTOINCREMENT,     name TEXT,    age INTEGER  );</code></pre> 现在我们就可以肆无忌惮的执行下面这条插入语句了 <pre>  <code class="language-sql">INSERT INTO   T_Person1 (name,age)   VALUES('zs',20);</code></pre> 下面是执行了5次的之后的表:</li>    </ul>    <p style="text-align:center"><img src="https://simg.open-open.com/show/5ef02256807dca03e0b310494d9bf6a9.png"></p>    <p>执行了5次之后</p>    <p>现在我们完全可以不用管理ID这个字段,并且现在每一条数据都是唯一的。</p>    <p>但是在某些情况下还是会有不完善的地方,比如下面这条插入语句:</p>    <pre>  <code class="language-sql">INSERT INTO   T_Person1 (age)   VALUES(35);</code></pre>    <p>然后我们来查看一下表:</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/8472f9910fd95718654a7267a2b31d5b.png"></p>    <p>插入了一条姓名为空、年龄是35的数据</p>    <p>这样子看似乎没有问题,但是结合实际情况来看,假设这是一个班级的数据,我不希望我的学生连名字都没有,这个不像话。</p>    <p>然后没错,又要使用一个新的关键字: NOT NULL 不为空</p>    <p>然后再次更新表的创建语句:</p>    <pre>  <code class="language-sql">CREATE TABLE T_Person1 (       id INTEGER PRIMARY KEY AUTOINCREMENT,       name TEXT NOT NULL,       age INTEGER  );</code></pre>    <p>然后我们再次执行上面的语句</p>    <pre>  <code class="language-sql">INSERT INTO   T_Person1 (age)   VALUES(35);  错误提示:Error : NOT NULL constraint failed: T_Person1.name</code></pre>    <p>这个时候就会报错:提示我们名字不能为空</p>    <p>于是我们要写成:</p>    <pre>  <code class="language-sql">INSERT INTO   T_Person1 (name,age)   VALUES('xiaoming',35);  提示:Affected rows : 1, Time: 0.00sec</code></pre>    <p>再次查看表:</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/ceaa3b0bce9fa203f243fe9494639b5f.png"></p>    <p>插入数据</p>    <p>然后我们在介绍一个属性: DEFAULT 默认值</p>    <p>使用方法就是在字段名后面</p>    <pre>  <code class="language-sql">age INTEGER DEFAULT 15  表示定义了一个age 字段 默认是15</code></pre>    <p>这个时候我们的创建表语句如下:</p>    <pre>  <code class="language-sql">CREATE TABLE T_Person1 (      id INTEGER PRIMARY KEY AUTOINCREMENT,      name TEXT NOT NULL,      age INTEGER DEFAULT 15  );</code></pre>    <p>然后我们插入数据:</p>    <pre>  <code class="language-sql">INSERT INTO T_Person1 (name) VALUES('zs');  INSERT INTO T_Person1 (name,age) VALUES('ls',18);  INSERT INTO T_Person1 (name,age) VALUES('zs',25);  INSERT INTO T_Person1 (name) VALUES('zl');</code></pre>    <p>表如下:</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/d81af3dde5787edff4e5fe0ac725c8cc.png"></p>    <p>数据表图</p>    <p>通过上面的了解我们就知道如何插入数据,并且设置字段了。</p>    <h2>DML - 更新数据:</h2>    <pre>  <code class="language-sql">UPDATE T_Person1 SET name='qq';  执行这行语句后会发现所有的名字都变成了qq</code></pre>    <p>更新多个字段</p>    <pre>  <code class="language-sql">UPDATE T_Person1 set name='qq',age=20;</code></pre>    <p>如图:</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/79b7665c2bfda4afab2ea0bb6ff57a6b.png"></p>    <p>更新数据之后</p>    <p>在上面的代码中我们已经完成了对数据库的更新,但是却不是我们想要的结果,上面的是对整个数据库都进行了更新,如果我们只想对某个数据更新改如何解决呢?后面会讲到</p>    <h2>DML-删除:</h2>    <pre>  <code class="language-sql">DELETE FROM T_Person1;  执行完上面语句之后查看打印:  Affected rows : 4, Time: 0.00sec 影响了四行数据</code></pre>    <p>然后我们再来看表</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/1bfed2893ca10ef9023e6f9881b0bd4a.png"></p>    <p>空空如也</p>    <p>这个时候我们就已经完成了对DML的学习,但是这些还不够,比如我们更新数据的时候是对整个表进行更新,</p>    <p>删除也是把整个表进行删除,如果我们想对指定的数据进行操作,我们需要学习一个新的关键字:</p>    <p>WHERE 条件</p>    <h2>WHERE</h2>    <p>SQLite的 <strong>WHERE</strong> 子句用于指定从一个表或多个表中获取数据的条件。</p>    <p>如果满足给定的条件,即为真(true)时,则从表中返回特定的值。您可以使用 WHERE 子句来过滤记录,只获取需要的记录。</p>    <p>SQLite的运算符有四种:算数、比较、逻辑以及位运算符</p>    <p>算数运算符:</p>    <pre>  <code class="language-sql">+    加法 - 把运算符两边的值相加    a + b 将得到 30  -    减法 - 左操作数减去右操作数    a - b 将得到 -10  *    乘法 - 把运算符两边的值相乘    a * b 将得到 200  /    除法 - 左操作数除以右操作数    b / a 将得到 2  %    取模 - 左操作数除以右操作数后得到的余数    b % a will give 0</code></pre>    <p>比较运算符</p>    <pre>  <code class="language-sql">==    检查两个操作数的值是否相等,如果相等则条件为真。    (a == b) 不为真。  =    检查两个操作数的值是否相等,如果相等则条件为真。    (a = b) 不为真。  !=    检查两个操作数的值是否相等,如果不相等则条件为真。    (a != b) 为真。  <>    检查两个操作数的值是否相等,如果不相等则条件为真。    (a <> b) 为真。  >    检查左操作数的值是否大于右操作数的值,如果是则条件为真。    (a > b) 不为真。  <    检查左操作数的值是否小于右操作数的值,如果是则条件为真。    (a < b) 为真。  =    检查左操作数的值是否大于等于右操作数的值,如果是则条件为真。    (a >= b) 不为真。  <=    检查左操作数的值是否小于等于右操作数的值,如果是则条件为真。    (a <= b) 为真。  !<    检查左操作数的值是否不小于右操作数的值,如果是则条件为真。    (a !< b) 为假。  !>    检查左操作数的值是否不大于右操作数的值,如果是则条件为真。    (a !> b) 为真。</code></pre>    <p>逻辑运算符:</p>    <pre>  <code class="language-sql">AND        AND 运算符允许在一个 SQL 语句的 WHERE 子句中的多个条件的存在。   BETWEEN    BETWEEN 运算符用于在给定最小值和最大值范围内的一系列值中搜索值。   EXISTS     EXISTS 运算符用于在满足一定条件的指定表中搜索行的存在。   IN         IN 运算符用于把某个值与一系列指定列表的值进行比较。   NOT IN     IN 运算符的对立面,用于把某个值与不在一系列指定列表的值进行比较。   LIKE       LIKE 运算符用于把某个值与使用通配符运算符的相似值进行比较。   GLOB       GLOB 运算符用于把某个值与使用通配符运算符的相似值进行比较。GLOB 与 LIKE 不同之处在于,它是大小写敏感的。   NOT        NOT 运算符是所用的逻辑运算符的对立面。比如 NOT EXISTS、NOT BETWEEN、NOT IN,等等。**它是否定运算符。**   OR         OR 运算符用于结合一个 SQL 语句的 WHERE 子句中的多个条件。   IS NULL    NULL 运算符用于把某个值与 NULL 值进行比较。   IS         IS 运算符与 = 相似。   IS NOT     IS NOT 运算符与 != 相似。   ||         连接两个不同的字符串,得到一个新的字符串。   UNIQUE     UNIQUE 运算符搜索指定表中的每一行,确保唯一性(无重复)。</code></pre>    <p>位运算符:</p>    <pre>  <code class="language-sql">& 与  | 或  p    q    p & q    p | q  0    0    0        0  0    1    0        1  1    1    1        1  1    0    0        1</code></pre>    <p>在了解了WHERE之后呢我们就可以对数据库进行指定某条删除、更新等操作了</p>    <p>先向数据库中 插入一些数据</p>    <pre>  <code class="language-sql">INSERT INTO T_Person1 (name,age) VALUES('aa',20);  INSERT INTO T_Person1 (name,age) VALUES('bb',18);  INSERT INTO T_Person1 (name,age) VALUES('cc',24);  INSERT INTO T_Person1 (name,age) VALUES('dd',22);  INSERT INTO T_Person1 (name,age) VALUES('ee',19);  INSERT INTO T_Person1 (name,age) VALUES('ff',22);  INSERT INTO T_Person1 (name,age) VALUES('gg',19);  INSERT INTO T_Person1 (name,age) VALUES('hh',18);</code></pre>    <p>然后数据表中数据如下:</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/d3b25e1d1d38c8da4ca151bfcda43fbd.png"></p>    <p>数据图</p>    <h2>DML-更新/删除指定数据</h2>    <pre>  <code class="language-sql">UPDATE       T_Person1   set       name='ff',age=20   WHERE       name='bb';    表示我要更新一个姓名叫做bb的人数据,并且把他的名字设置为qq、年龄设置为20岁  Affected rows : 1, Time: 0.00sec 提示已经影响了一条数据</code></pre>    <p>此时查看表如下:</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/e7ffa593d5398c942e65e1e4e2baec7d.png"></p>    <p>更新了之后</p>    <p>如果你足够细心,你就发现了现在有两个人名字都叫ff了,如果我现在只想对第一个姓名叫ff的人更新数据</p>    <p>我们可以这样子写:</p>    <pre>  <code class="language-sql">UPDATE       T_Person1   set       name='ee',age=19   WHERE       name='ff' AND age=20;</code></pre>    <p>然后表现在的数据如下:</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/df805c452f277fb65676cce232a06432.png"></p>    <p>更新数据之后</p>    <p>OK,通过上面的语句我们完成了只对第一个名字叫ff的人更新数据,但是现在我想对</p>    <p>第二个姓名为ee进行更新,就很尴尬了,数据库中有两个姓名都叫ee的并且年龄都是19岁,</p>    <p>到了这里我们定义id为唯一的作用就发挥出来了,此时我们只需要更新</p>    <p>指定id即可</p>    <pre>  <code class="language-sql">UPDATE       T_Person1   set       name='bb',age=28   WHERE       id=9;</code></pre>    <p>更新之后如图:</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/248a58316378d61e780b0291a524cdd9.png"></p>    <p>更新之后</p>    <p>OK,通过上面的代码我们就可以知道如何对指定的数据进行更新了,下面我们简单的说下删除指定数据.</p>    <pre>  <code class="language-sql">DELETE FROM       T_Person1   WHERE       name='gg';</code></pre>    <p>如图:</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/edc910a5606e71405407c989f0a28b0f.png"></p>    <p>删除之后</p>    <p>如果我想删除多条数据呢?</p>    <p>比如删除20岁以上的</p>    <pre>  <code class="language-sql">DELETE FROM       T_Person1   WHERE       age>20;    Affected rows : 4, Time: 0.00sec 影响了四行,应该是删除了四行,  我们查看更新之后的表</code></pre>    <p>表:</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/b9d0b348db4a936f75668b5b2fc30e0e.png"></p>    <p>删除之后</p>    <h2>七、SQLite学习之DQL:</h2>    <p>DQL(Data Query Language)数据查询语言</p>    <p>关键字:Select,同时也是使用频率最高的</p>    <p>查询数据</p>    <p>SELECT 字段名,... FROM 表名;</p>    <p>先插入一下数据进去</p>    <pre>  <code class="language-sql">INSERT INTO T_Person1 (name,age) VALUES('ab',28);  INSERT INTO T_Person1 (name,age) VALUES('hg',25);  INSERT INTO T_Person1 (name,age) VALUES('ab',24);  INSERT INTO T_Person1 (name,age) VALUES('df',22);  INSERT INTO T_Person1 (name,age) VALUES('fd',23);  INSERT INTO T_Person1 (name,age) VALUES('yt',28);  INSERT INTO T_Person1 (name,age) VALUES('oi',21);  INSERT INTO T_Person1 (name,age) VALUES('qw',33);  INSERT INTO T_Person1 (name,age) VALUES('gf',19);  INSERT INTO T_Person1 (name,age) VALUES('kl',18);  INSERT INTO T_Person1 (name,age) VALUES('lj',23);  INSERT INTO T_Person1 (name,age) VALUES('rt',25);  INSERT INTO T_Person1 (name,age) VALUES('tr',28);  INSERT INTO T_Person1 (name,age) VALUES('qw',26);  INSERT INTO T_Person1 (name,age) VALUES('xx',24);  INSERT INTO T_Person1 (name,age) VALUES('zx',25);  INSERT INTO T_Person1 (name,age) VALUES('mn',24);  INSERT INTO T_Person1 (name,age) VALUES('vb',25);</code></pre>    <p>然后可以看到表数据如下:</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/2cacdad33d6b68594f508ceacae8c522.png"></p>    <p>数据表如图</p>    <p>OK,在填充了数据之后,我们开始查找</p>    <pre>  <code class="language-sql">SELECT * FROM T_Person1;  在这里*代表通配符,所有的字段</code></pre>    <p>如图:</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/badd5ee3bfa78209de19aa9822f9b49a.png"></p>    <p>查找之后</p>    <p>现在我们不想看到那么多数据,假设我们只显示age</p>    <pre>  <code class="language-sql">SELECT age FROM T_Person1;</code></pre>    <p>如图所示</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/7a127210e5ecb0b341822516d32abc19.png"></p>    <p>单个字段</p>    <p>查询多个字段: 这里字段的输入顺序就和显示的列名数据一致</p>    <pre>  <code class="language-sql">SELECT age,name FROM T_Person1;</code></pre>    <p>如图:</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/d5bd9fac9dbf00fa41389186713f04d4.png"></p>    <p>多个字段</p>    <p>OK,需求总是要变来变去的,这个时候我们想查询年龄大于22岁的数据,并且显示所有的信息</p>    <pre>  <code class="language-sql">SELECT * FROM T_Person1 WHERE age>22;</code></pre>    <p>如图:</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/5de830b38a63c1e6b7b4670fbd89f2f3.png"></p>    <p>条件查询</p>    <p>然后我们想找名字为ab的人,不要显示id</p>    <pre>  <code class="language-sql">SELECT name,age FROM T_Person1 WHERE name='ab';</code></pre>    <p>如图:</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/5de81aeeea1164bcc6abc3c938018a08.png"></p>    <p>条件查询二</p>    <p>如果你看到了这里,那么恭喜你,你已经知道了如何创建/删除表,以及对表的增删改查,同时还了解了WHERE条件语句,到这里基本上你已经可以自己管理数据库了。</p>    <h2>扩展知识 - 动态添加字段</h2>    <p>继续上面的表,这个时候老师分配任务啦,给每个人100块的启动资金,然后一个月后来查看他们是让100块变成了0块还是变成了更多,这个时候上面就来话了,你给我添加一个字段进去,保存他们的金钱额度。</p>    <p>但是这个需求在项目开始之初是没有考虑到的,这就比较坑爹了,原来的数据库文件的内容不能删除,又要新增一个字段……愁死我了。</p>    <p>方法有很多种,这里不作介绍了</p>    <p>只是来介绍一下动态添加字段这个方法</p>    <pre>  <code class="language-sql">ALTER TABLE 表名 ADD 字段名 字段类型;</code></pre>    <p>未插入字段之前的表:</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/798597ade0a9cb458cc1f4bc12bceedb.png"></p>    <p>未插入之前</p>    <p>插入一个字段:money</p>    <pre>  <code class="language-sql">ALTER TABLE     T_Person1   ADD     money real DEFAULT 100.0;</code></pre>    <p style="text-align:center"><img src="https://simg.open-open.com/show/1993504eaaa95c30f4b1b65a749994f7.png"></p>    <p>插入之后</p>    <p>OK,到这里完美解决了之前的问题</p>    <h2>注意:再插入一个字段之前,讲道理我们是要看下里面有没有这个字段的</h2>    <p>比如你正在上厕所,突然有个人就进来把你赶出去了,占了你的坑,此时的你肯定是在暴怒状态,正常的应该是:先看下里面有没有人,有人了就换一个,没人然后在进去占一个坑……</p>    <p>所以我们需要判断一下是不是可以插入这个字段</p>    <pre>  <code class="language-sql">SQLITE_API const unsigned char *SQLITE_STDCALL sqlite3_column_text(sqlite3_stmt*, int iCol);</code></pre>    <p>通过上面的方法会返回给我们一个C字符串数组判断这个数组是不是有值,如果有了就不能插入了</p>    <p>为此我特地的又运行了一次</p>    <pre>  <code class="language-sql">Error : duplicate column name: money  提示说有两个都叫money的列了</code></pre>    <h2>扩展知识 - AS(起别名)</h2>    <p>可以暂时把表或列重命名为另一个名字,这被称为 <strong>别名</strong> 。使用表别名是指在一个特定的 SQLite 语句中重命名表。重命名是临时的改变,在数据库中实际的表的名称不会改变。</p>    <p>列别名用来为某个特定的 SQLite 语句重命名表中的列。</p>    <p>比如:给字段起别名</p>    <pre>  <code class="language-sql">SELECT     name as xingming,    age as nianling   FROM     T_Person1   WHERE     age>25;</code></pre>    <p>如图:</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/76d6a50ca62d3879a2b069a364a025ae.png"></p>    <p>字段别名</p>    <p>给表起别名:</p>    <pre>  <code class="language-sql">SELECT   one.name as one_name,  one.age as one_age   FROM   T_Person1 as one   WHERE age>25;</code></pre>    <p>如图:</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/37cb920d5af07e0d9c6ee36864f77f0a.png"></p>    <p>表别名</p>    <p>多表查询:</p>    <p>先创建一个T_Person2表,然后插入一下数据</p>    <pre>  <code class="language-sql">CREATE TABLE IF NOT EXISTS       T_Person2(      id INTEGER PRIMARY KEY AUTOINCREMENT,      name TEXT NOT NULL,      age INTEGER DEFAULT 20,      money REAL DEFAULT 100.0  );    INSERT INTO T_Person2 (name,age) VALUES('asdf',28);  INSERT INTO T_Person2 (name,age) VALUES('hsdfg',25);  INSERT INTO T_Person2 (name,age) VALUES('afdfb',24);  INSERT INTO T_Person2 (name,age) VALUES('dfasdf',22);  INSERT INTO T_Person2 (name,age) VALUES('ffdfd',23);  INSERT INTO T_Person2 (name,age) VALUES('yfdft',28);  INSERT INTO T_Person2 (name,age) VALUES('ocvi',21);  INSERT INTO T_Person2 (name,age) VALUES('qwvc',33);  INSERT INTO T_Person2 (name,age) VALUES('gvcvf',19);  INSERT INTO T_Person2 (name,age) VALUES('kcvcl',18);  INSERT INTO T_Person2 (name,age) VALUES('lvj',23);  INSERT INTO T_Person2 (name,age) VALUES('rvcdst',25);  INSERT INTO T_Person2 (name,age) VALUES('tr43',28);  INSERT INTO T_Person2 (name,age) VALUES('qwgh',26);  INSERT INTO T_Person2 (name,age) VALUES('xgfdx',24);  INSERT INTO T_Person2 (name,age) VALUES('hfgzx',25);  INSERT INTO T_Person2 (name,age) VALUES('mgfhn',24);  INSERT INTO T_Person2 (name,age) VALUES('vhgb',25);</code></pre>    <p>这个时候,T_Person1里面有的字段T_Person2里面也有,就想两个班级里面的字段</p>    <p>都有姓名,年龄等数据。</p>    <p>别名这个时候就可以很方便的区分</p>    <pre>  <code class="language-sql">SELECT       one.name as one_name,      one.age as one_age,      two.name as two_name,      two.age as two_age   FROM       T_Person1 as one,      T_Person2 as two   WHERE       one.age>30 AND two.age>30;</code></pre>    <p>如图:</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/bf1337696aa2f4b7e784941724e04963.png"></p>    <p>如图</p>    <p>写别名的方式还有一种,但是不推荐,直接加个空格</p>    <pre>  <code class="language-sql">SELECT name xingming,age nianling   FROM T_Person2;</code></pre>    <p>如图:</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/448f523042088c790a4a011b185cfaf9.png"></p>    <p>别名</p>    <h2>扩展知识 - 排序</h2>    <p>ORDER BY ,用于对数据进行排序</p>    <p>考虑这么一种情况,当你把数据信息输入进去,而数据本身是杂乱无章的,这个时候你需要排序,比如:name、age字段来排序。</p>    <p>DESC : 降序</p>    <p>ASC:升序</p>    <p>单个字段排序</p>    <pre>  <code class="language-sql">SELECT       *   FROM       T_Person2   ORDER BY       age;</code></pre>    <p>如图:根据age升序</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/4d929ab6eab74131c6bb41b58d16a0c8.png"></p>    <p>单个字段排序</p>    <p>多个字段排序</p>    <pre>  <code class="language-sql">SELECT       *   FROM       T_Person2   ORDER BY       name,age;</code></pre>    <p>如图:根据name升序,在根据age升序</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/ad323d39dc0eda9d1763a7ff433b73d3.png"></p>    <p>多个字段排序</p>    <p>通过上面的语句我们发现在不写明是什么排序的情况下默认是升序,也就是 ASC</p>    <p>通过写上ASC来证明:</p>    <pre>  <code class="language-sql">SELECT       *   FROM       T_Person2   ORDER BY       name ASC,age ASC;</code></pre>    <p>如图:</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/c94a7c38323554938416012aa8b39800.png"></p>    <p>表</p>    <p>下面根据age字段进行降序</p>    <pre>  <code class="language-sql">SELECT       *  FROM      T_Person2  ORDER BY      age DESC;</code></pre>    <p>如图:</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/fb204887aac7f10b22f289de25a7fc01.png"></p>    <p>age降序</p>    <p>最后我们在实现一个根据name升序,age降序的</p>    <p>先别着急,因为我们数据库中没有相同姓名的,所以我们先插入两条数据</p>    <p>插入数据</p>    <pre>  <code class="language-sql">INSERT INTO T_Person1(name,age) VALUES('aa',18);  INSERT INTO T_Person1(name,age) VALUES('aa',19);</code></pre>    <p>检索</p>    <pre>  <code class="language-sql">SELECT       *  FROM      T_Person1  ORDER BY      name ASC,age DESC;</code></pre>    <p>如图:</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/b86513bcde9b930d01b2f6be2976a428.png"></p>    <p>检索如图</p>    <h2>扩展知识 - 数量</h2>    <p>快速查询有多少条数据或者查询某个字段有多少条数据</p>    <pre>  <code class="language-sql">SELECT COUNT(字段) FROM 表名;</code></pre>    <p>查询有多条数据:</p>    <pre>  <code class="language-sql">SELECT COUNT(*) FROM T_Person1;</code></pre>    <p>如图</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/ae1afb52b1435f210760f2e61b458eff.png"></p>    <p>检索</p>    <p>检索 age 字段条数:</p>    <pre>  <code class="language-sql">SELECT COUNT(age) FROM T_Person1;</code></pre>    <p style="text-align:center"><img src="https://simg.open-open.com/show/1f0119bd83e811d96e17ad540775add7.png"></p>    <p>age</p>    <h2>扩展知识 - 分页取数据</h2>    <p>Limit 常用来对数据进行分页,比如每页固定显示 n 条数据</p>    <pre>  <code class="language-sql">SELECT 字段... FORM 表名 LIMIT a,b;  a:表示跳过多少条数据  b:从a之后开始取多少条数据</code></pre>    <p>在网络请求的时候我们经常可以向服务器说明,从哪一页开始,取多少条,类似这样子的操作很频繁。</p>    <p>举例:每页取10条数据</p>    <ul>     <li>第1页:... LIMIT 0,10;</li>     <li>第2页:... LIMIT 10,10;</li>     <li>第3页:... LIMIT 20,10;</li>     <li>...</li>     <li>第n页:... LIMIT 10*(n-1),10; <p>于是我们可以得出一个公式:</p> <p>m:每次取多少</p> <p>n:页</p> <p>m*(n-1),m</p> </li>    </ul>    <p>注意:LIMIT 10 = LIMIT 0,10,两个语句相等</p>    <p>代码:取10条数据,从0开始</p>    <pre>  <code class="language-sql">SELECT * FROM T_Person1 LIMIT 10;</code></pre>    <p>如图:</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/0a32dc42442935f74af46429e57a4971.png"></p>    <p>limit</p>    <p>如果我们数据库中没有那么多的情况下,就会把剩下的全部都取出来</p>    <p>比如: T_Person1 中我们只有 23 条数据,在上面检索出来过</p>    <p>执行:</p>    <pre>  <code class="language-sql">SELECT * FROM T_Person1 LIMIT 20,10;</code></pre>    <p>如图:</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/45ed317535b9f083222f897418ae86f3.png"></p>    <p>limit 20,10</p>    <p>OK,进一步增加难度,我要取得age>20的前面10条数据</p>    <pre>  <code class="language-sql">SELECT *   FROM T_Person1   WHERE age>20   LIMIT 10;</code></pre>    <p style="text-align:center"><img src="https://simg.open-open.com/show/2219d57ca87e1806cf15701ecee39cf6.png"></p>    <p>检索age大于20的数据,取十条</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/2b5aa144d8a4e3377b9106bff1574ca4.png"></p>    <p>表</p>    <p>然后我们在联合排序提取数据:</p>    <pre>  <code class="language-sql">SELECT *  FROM T_Person1  ORDER BY age DESC  LIMIT 10;</code></pre>    <p>如图</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/e5167cfbc8fc1d7c9a04693f606c58fd.png"></p>    <p>根据age进行排序(降序),取前面十条</p>    <p>对比查看数据是不是正确</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/31b7297d2f141a7daf885e3e33006951.png"></p>    <p>对比</p>    <p>通过两个图比较,发现取出来的数据确实是正确的。</p>    <p>文中一些比较简短的语句其实没比较分行分的那么清楚,只是笔者为了能让人阅读起来更加方便,有写笔者也没有进行分行,不过阅读起来应该还是比较简单的。</p>    <p>OK,如果你坚持看完了,希望或多或少能给你带来一些小小的帮助。</p>    <p>笔者写这个也花了一点时间,如果能让您复习或者有幸让你更了解SQLite的话,就不枉费这些时间了。</p>    <p>最后厚着脸皮求个喜欢,那是我最大的动力。后面会更新如何在Swift3.0的中使用。</p>    <p> </p>    <p>来自:http://www.jianshu.com/p/4bc34f982fee</p>    <p> </p>