您的位置:首页 > 数据库

总结SQLite不支持的SQL语法有哪些

2014-10-24 11:29 357 查看
<p
class="p3"><span
class="s3">目前</span><span
class="s4"><b>SQLITE</b></span><span
class="s3">版本中</span><span
class="s4"><b>ALTER TABLE</b></span><span
class="s3">不支持</span><span
class="s4"><b>DROP COLUMN</b></span><span
class="s3">,只有</span><span
class="s4"><b>RENAME
</b></span><span
class="s3">和</span><span
class="s4"><b>ADD</b></span></p>
 <p
class="p3"><span
class="s4"><b>alter table drop column </b></span></p>
 <p
class="p3"><span
class="s4"><b>rename add</b></span></p>
 <p
class="p4"><span
class="s4">不能支持完整的触发器,支持一部分</span></p>
 <p
class="p5"><span
class="s5"><b>1 TOP</b></span><span
class="s6"><br>
 </span><span
class="s4">这是一个大家经常问到的问题,例如在</span><span
class="s7">SQLSERVER</span><span
class="s4">中可以使用如下语句来取得记录集中的前十条记录:</span></p>
 <p
class="p6"><span
class="s4">SELECT</span><span
class="s8">
</span><span
class="s4">TOP</span><span
class="s8">
</span><span
class="s9"><b>10</b></span><span
class="s8">
</span><span
class="s10">*</span><span
class="s8">
</span><span
class="s4">FROM</span><span
class="s8">
</span><span
class="s11">[index]</span><span
class="s8">
</span><span
class="s4">ORDER</span><span
class="s8">
</span><span
class="s4">BY</span><span
class="s8"> indexid
</span><span
class="s4">DESC</span><span
class="s8">;</span></p>
 <p
class="p7"><br></p>
 <p
class="p8"><span
class="s4">但是这条</span><span
class="s7">SQL</span><span
class="s4">语句在</span><span
class="s7">SQLite</span><span
class="s4">中是无法执行的,应该改为:</span></p>
 <p
class="p9"><span
class="s12">SELECT</span><span
class="s4">
</span><span
class="s10">*</span><span
class="s4">
</span><span
class="s12">FROM</span><span
class="s4">
</span><span
class="s11">[index]</span><span
class="s4">
</span><span
class="s12">ORDER</span><span
class="s4">
</span><span
class="s12">BY</span><span
class="s4"> indexid
</span><span
class="s12">DESC</span><span
class="s4"> limit
</span><span
class="s9"><b>0</b></span><span
class="s4">,</span><span
class="s9"><b>10</b></span><span
class="s4">;</span></p>
 <p
class="p7"><br></p>
 <p
class="p8"><span
class="s4">其中</span><span
class="s5"><b>limit
</b></span><span
class="s7">0,10</span><span
class="s4">表示从第</span><span
class="s7">0</span><span
class="s4">条记录开始,往后一共读取</span><span
class="s7">10</span><span
class="s4">条</span></p>
 <p
class="p10"><span
class="s4"><b> TOP</b></span></p>
 <p
class="p5"><span
class="s5"><b>2
</b></span><span
class="s11">创建视图(</span><span
class="s5"><b>Create View</b></span><span
class="s11">)</span><span
class="s6"><br>
 </span><span
class="s7">SQLite</span><span
class="s4">在创建多表视图的时候有一个</span><span
class="s7">bug</span><span
class="s4">,问题如下:</span></p>
 <p
class="p9"><span
class="s12">CREATE</span><span
class="s4">
</span><span
class="s12">VIEW</span><span
class="s4"> watch_single
</span><span
class="s12">AS</span><span
class="s4">
</span><span
class="s12">SELECT</span><span
class="s4"> DISTINCT watch_item.</span><span
class="s11">[watchid]</span><span
class="s4">,watch_item.
</span><span
class="s11">[itemid]</span><span
class="s4"> 
</span><span
class="s12">FROM</span><span
class="s4"> watch_item;</span></p>
 <p
class="p11"><i>create view /// as select distinct</i><span
class="s13">(不同的,分别的)</span></p>
 <p
class="p8"><span
class="s4">上面这条</span><span
class="s7">SQL</span><span
class="s4">语句执行后会显示成功,但是实际上除了</span></p>
 <p
class="p9"><span
class="s12">SELECT</span><span
class="s4">
</span><span
class="s14">COUNT</span><span
class="s4">(</span><span
class="s10">*</span><span
class="s4">)
</span><span
class="s12">FROM</span><span
class="s4">
</span><span
class="s11">[watch_single ]</span><span
class="s4">
</span><span
class="s12">WHERE</span><span
class="s4"> watch_
</span><span
class="s12">single</span><span
class="s4">.watchid
</span><span
class="s10">=</span><span
class="s4">
</span><span
class="s9"><b>1</b></span><span
class="s4">;</span></p>
 <p
class="p7"><br></p>
 <p
class="p8"><span
class="s4">能执行之外是无法执行其他任何语句的。其原因在于建立视图的时候指定了字段所在的表名,而</span><span
class="s7">SQLite</span><span
class="s4">并不能正确地识别它。所以上面的创建语句要改为:</span></p>
 <p
class="p9"><span
class="s12">CREATE</span><span
class="s4">
</span><span
class="s12">VIEW</span><span
class="s4"> watch_single
</span><span
class="s12">AS</span><span
class="s4">
</span><span
class="s12">SELECT</span><span
class="s4">
</span><span
class="s12">DISTINCT</span><span
class="s4">
</span><span
class="s11">[watchid]</span><span
class="s4">,</span><span
class="s11">[itemid]</span><span
class="s4">
</span><span
class="s12">FROM</span><span
class="s4"> watch_item;</span></p>
 <p
class="p7"><br></p>
 <p
class="p8"><span
class="s4">但是随之而来的问题是如果是多表的视图,且表间有重名字段的时候该怎么办?</span></p>
 <p
class="p7"><br></p>
 <p
class="p10"><span
class="s4"><b>3 COUNT</b></span><span
class="s3">(</span><span
class="s4"><b>DISTINCT column</b></span><span
class="s3">)</span><span
class="s15"><br>
 </span><span
class="s16">SQLite</span><span
class="s17">在执行如下语句的时候会报错:</span></p>
 <p
class="p9"><span
class="s12">SELECT</span><span
class="s4">
</span><span
class="s14">COUNT</span><span
class="s4">(</span><span
class="s12">DISTINCT</span><span
class="s4"> watchid)
</span><span
class="s12">FROM</span><span
class="s4">
</span><span
class="s11">[watch_item]</span><span
class="s4">
</span><span
class="s12">WHERE</span><span
class="s4"> watch_item.watchid
</span><span
class="s10">=</span><span
class="s4">
</span><span
class="s9"><b>1</b></span><span
class="s4">;</span></p>
 <p
class="p7"><br></p>
 <p
class="p8"><span
class="s4">其原因是</span><span
class="s7">SQLite</span><span
class="s4">的所有内置函数都不支持</span><span
class="s7">DISTINCT</span><span
class="s4">限定,所以如果要统计不重复的记录数的时候会出现一些麻烦。比较可行的做法是先建立一个不重复的记录表的视图,然后再对该视图进行计数。</span></p>
 <p
class="p7"><br></p>
 <p
class="p5"><span
class="s5"><b>4
</b></span><span
class="s11">外连接outer join</span><span
class="s6"><br>
 </span><span
class="s4">虽然</span><span
class="s7">SQLite</span><span
class="s4">官方已经声称</span><span
class="s7">LEFT OUTER JOIN
</span><span
class="s4">已经实现,但还没有</span><span
class="s7"> RIGHT OUTER JOIN
</span><span
class="s4">和</span><span
class="s7"> FULL OUTER JOIN</span><span
class="s4">。但是实际测试表明似乎并不能够正常的工作。以下三条语句在执行的时候均会报错:</span></p>
 <p
class="p12"><span
class="s12">SELECT</span><span
class="s8"> tags.</span><span
class="s4">[tagid]</span><span
class="s8">
</span><span
class="s12">FROM</span><span
class="s8">
</span><span
class="s4">[tags]</span><span
class="s8">,</span><span
class="s4">[tag_rss]</span><span
class="s8">
</span><span
class="s12">WHERE</span><span
class="s8"> tags.</span><span
class="s4">[tagid]</span><span
class="s8">
</span><span
class="s10">=</span><span
class="s8"> tag_rss.</span><span
class="s4">[tagid]</span><span
class="s8">(</span><span
class="s10">*</span><span
class="s8">);</span></p>
 <p
class="p12"><span
class="s12">SELECT</span><span
class="s8"> tags.</span><span
class="s4">[tagid]</span><span
class="s8">
</span><span
class="s12">FROM</span><span
class="s8">
</span><span
class="s4">[tags]</span><span
class="s8">,</span><span
class="s4">[tag_rss]</span><span
class="s8">
</span><span
class="s12">WHERE</span><span
class="s8">
</span><span
class="s10">LEFT</span><span
class="s8">
</span><span
class="s10">OUTER</span><span
class="s8">
</span><span
class="s10">JOIN</span><span
class="s8"> tag_rss.</span><span
class="s4">[tagid]</span><span
class="s8">
</span><span
class="s10">=</span><span
class="s8"> tags.</span><span
class="s4">[tagid]</span><span
class="s8">;</span></p>
 <p
class="p12"><span
class="s12">SELECT</span><span
class="s8"> tags.</span><span
class="s4">[tagid]</span><span
class="s8">
</span><span
class="s12">FROM</span><span
class="s8">
</span><span
class="s4">[tags]</span><span
class="s8">,</span><span
class="s4">[tag_rss]</span><span
class="s8">
</span><span
class="s12">WHERE</span><span
class="s8">
</span><span
class="s10">LEFT</span><span
class="s8">
</span><span
class="s10">JOIN</span><span
class="s8"> tag_rss.</span><span
class="s4">[tagid]</span><span
class="s8">
</span><span
class="s10">=</span><span
class="s8"> tags.</span><span
class="s4">[tagid]</span><span
class="s8">;</span></p>
 <p
class="p7"><br></p>
 <p
class="p8"><span
class="s4">此外经过测试用</span><span
class="s7">+</span><span
class="s4">号代替</span><span
class="s7">*</span><span
class="s4">号也是不可行的。</span></p>
 <p
class="p7"><br></p>
 <p
class="p10"><span
class="s3">收集</span><span
class="s4"><b>SQLite</b></span><span
class="s3">与</span><span
class="s4"><b>Sql Server</b></span><span
class="s3">的语法差异</span></p>
 <p
class="p13"><span
class="s11"><b>1.</b></span><span
class="s18">返回最后插入的标识值</span><span
class="s11"><b> </b></span><span
class="s6"><br>
 </span><span
class="s3">返回最后插入的标识值</span><span
class="s4">sql server</span><span
class="s3">用</span><span
class="s11"><b>@@IDENTITY</b></span><span
class="s4"> identity</span><span
class="s6"><br>
 </span><span
class="s4">sqlite</span><span
class="s3">用标量函数</span><span
class="s11"><b>LAST_INSERT_ROWID() last inserid</b></span><span
class="s6"><br>
 </span><span
class="s3">返回通过当前的</span><span
class="s4"> SQLConnection
</span><span
class="s3">插入到数据库的最后一行的行标识符(生成的主键)。此值与</span><span
class="s4">
</span><span
class="s11"><b>SQLConnection.lastInsertRowID
</b></span><span
class="s3">属性返回的值相同。</span></p>
 <p
class="p13"><span
class="s11"><b>2.top n</b></span><span
class="s6"><br>
 </span><span
class="s3">在</span><span
class="s4">sql server</span><span
class="s3">中返回前</span><span
class="s4">2</span><span
class="s3">行可以这样:</span><span
class="s4"> </span></p>
 <p
class="p6"><span
class="s4">select</span><span
class="s8">
</span><span
class="s4">top</span><span
class="s8">
</span><span
class="s9"><b>2</b></span><span
class="s8">
</span><span
class="s10">*</span><span
class="s8">
</span><span
class="s4">from</span><span
class="s8"> aa
</span><span
class="s4">order</span><span
class="s8">
</span><span
class="s4">by</span><span
class="s8"> ids
</span><span
class="s4">desc</span></p>
 <p
class="p14"><br></p>
 <p
class="p13"><span
class="s4">sqlite</span><span
class="s3">中用</span><span
class="s4">LIMIT</span><span
class="s3">,语句如下:</span><span
class="s4"> </span></p>
 <p
class="p6"><span
class="s4">select</span><span
class="s8">
</span><span
class="s10">*</span><span
class="s8">
</span><span
class="s4">from</span><span
class="s8"> aa
</span><span
class="s4">order</span><span
class="s8">
</span><span
class="s4">by</span><span
class="s8"> ids
</span><span
class="s4">desc</span><span
class="s8"> LIMIT
</span><span
class="s9"><b>2</b></span></p>
 <p
class="p14"><br></p>
 <p
class="p13"><span
class="s11"><b>3.GETDATE ( ) getDate</b></span><span
class="s6"><br>
 </span><span
class="s3">在</span><span
class="s4">sql server</span><span
class="s3">中</span><span
class="s11"><b>GETDATE ( )</b></span><span
class="s3">返回当前系统日期和时间</span><span
class="s4"> </span><span
class="s6"><br>
 </span><span
class="s4">sqlite</span><span
class="s3">中没有</span></p>
 <p
class="p13"><span
class="s11"><b>4.EXISTS</b></span><span
class="s18">语句</span><span
class="s11"><b> </b></span><span
class="s6"><br>
 </span><span
class="s4">sql server</span><span
class="s3">中判断插入(不存在</span><span
class="s4">ids=5</span><span
class="s3">的就插入)</span><span
class="s4"> </span></p>
 <p
class="p6"><span
class="s4">IF</span><span
class="s8">
</span><span
class="s10">NOT</span><span
class="s8">
</span><span
class="s10">EXISTS</span><span
class="s8"> (</span><span
class="s4">select</span><span
class="s8">
</span><span
class="s10">*</span><span
class="s8">
</span><span
class="s4">from</span><span
class="s8"> aa
</span><span
class="s4">where</span><span
class="s8"> ids</span><span
class="s10">=</span><span
class="s9"><b>5</b></span><span
class="s8">) </span></p>
 <p
class="p6"><span
class="s4">BEGIN</span><span
class="s8"> </span></p>
 <p
class="p9"><span
class="s12">insert</span><span
class="s4">
</span><span
class="s12">into</span><span
class="s4"> aa(nickname) </span></p>
 <p
class="p6"><span
class="s4">select</span><span
class="s8">
</span><span
class="s11">'t'</span><span
class="s8"> </span></p>
 <p
class="p6"><span
class="s4">END</span><span
class="s8"> </span></p>
 <p
class="p7"><br></p>
 <p
class="p11"><span
class="s3">在</span><span
class="s4">sqlite</span><span
class="s3">中可以这样</span><span
class="s4"> </span></p>
 <p
class="p9"><span
class="s12">insert</span><span
class="s4">
</span><span
class="s12">into</span><span
class="s4"> aa(nickname) </span></p>
 <p
class="p6"><span
class="s4">select</span><span
class="s8">
</span><span
class="s11">'t'</span><span
class="s8"> </span></p>
 <p
class="p6"><span
class="s4">where</span><span
class="s8">
</span><span
class="s10">not</span><span
class="s8">
</span><span
class="s10">exists</span><span
class="s8">(</span><span
class="s4">select</span><span
class="s8">
</span><span
class="s10">*</span><span
class="s8">
</span><span
class="s4">from</span><span
class="s8"> aa
</span><span
class="s4">where</span><span
class="s8"> ids</span><span
class="s10">=</span><span
class="s9"><b>5</b></span><span
class="s8">)</span></p>
 <p
class="p14"><br></p>
 <p
class="p5"><span
class="s5"><b>5.</b></span><span
class="s11">嵌套事务</span><span
class="s5"><b> </b></span><span
class="s6"><br>
 </span><span
class="s7">sqlite</span><span
class="s4">仅允许单个活动的事务</span></p>
 <p
class="p10"><span
class="s4"><b>6.RIGHT
</b></span><span
class="s3">和</span><span
class="s4"><b> FULL OUTER JOIN </b></span><span
class="s15"><br>
 </span><span
class="s16">sqlite</span><span
class="s17">不支持</span><span
class="s16">
</span><span
class="s4"><b>RIGHT OUTER JOIN</b></span><span
class="s16">
</span><span
class="s17">或</span><span
class="s16">
</span><span
class="s4"><b>FULL OUTER JOIN</b></span></p>
 <p
class="p13"><span
class="s11"><b>7.</b></span><span
class="s18">可更新的视图</span><span
class="s11"><b> </b></span><span
class="s6"><br>
 </span><span
class="s4">sqlite</span><span
class="s3">视图是只读的。不能对视图执行</span><span
class="s4"> DELETE</span><span
class="s3">、</span><span
class="s4">INSERT
</span><span
class="s3">或</span><span
class="s4"> UPDATE
</span><span
class="s3">语句,</span><span
class="s4">sql server</span><span
class="s3">是可以对视图</span><span
class="s4"> DELETE</span><span
class="s3">、</span><span
class="s4">INSERT
</span><span
class="s3">或</span><span
class="s4"> UPDATE</span></p>
 <p
class="p14"><br></p>
 <p
class="p15"><span
class="s4"><i>sqlite -- limit</i></span><span
class="s3">,没有,</span><span
class="s4"><i>exists where not,</i></span><span
class="s3">仅允许单个活动的事务,不能对视图执行</span><span
class="s4"><i>delete</i></span><span
class="s3">,</span><span
class="s4"><i>insert</i></span><span
class="s3">,</span><span
class="s4"><i>update</i></span><span
class="s3">操作,不支持</span><span
class="s4"><i>right
</i></span><span
class="s3">、</span><span
class="s4"><i>full outer join
</i></span><span
class="s3">,</span><span
class="s4"><i>SQLConnection.LastInsertRowID</i></span></p>
 <p
class="p15"><span
class="s4"><i>sql sever --  top</i></span><span
class="s3">,</span><span
class="s4"><i>getdate,if not exists,</i></span><span
class="s3">可多个活动事务,可以对视图进行</span><span
class="s4"><i>delete</i></span><span
class="s3">,</span><span
class="s4"><i>insert</i></span><span
class="s3">,</span><span
class="s4"><i>update</i></span><span
class="s3">操作,返回最后插入的标识符用</span><span
class="s4"><i> @identity</i></span></p>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: