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

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