SQLite和SQL的⼏个区别
总结SQLite不⽀持的SQL语法有哪些
1 TOP
这是⼀个⼤家经常问到的问题,例如在SQLSERVER中可以使⽤如下语句来取得记录集中的前⼗条记录:
SELECT TOP 10 * FROM [index] ORDER BY indexid DESC;
但是这条SQL语句在SQLite中是⽆法执⾏的,应该改为:
SELECT * FROM [index] ORDER BY indexid DESC limit 0,10;
其中limit 0,10表⽰从第0条记录开始,往后⼀共读取10条
LIMIT 所要取的记录数⽬(以基准点为参考点) OFFSET 基准点
SELECT * FROM trom_data LIMIT nNumRecord OFFSET nBaseRow
表⽰从第nBaseRow⾏(基于0的索引)(包括该⾏)开始,取其后的nNumRecord 条记录
2 创建视图(Create View)
SQLite在创建多表视图的时候有⼀个BUG,问题如下:
CREATE VIEW watch_single AS SELECT DISTINCTwatch_item.[watchid],watch_item.[itemid] FROM watch_item;
上⾯这条SQL语句执⾏后会显⽰成功,但是实际上除了
SELECT COUNT(*) FROM [watch_single ] WHERE watch_ single.watchid = 1;
能执⾏之外是⽆法执⾏其他任何语句的。其原因在于建⽴视图的时候指定了字段所在的表名,⽽SQLite并不能正确地识别它。所以上⾯的创建语句要改为:
CREATE VIEW watch_single AS SELECT DISTINCT [watchid],[itemid] FROM watch_item;
但是随之⽽来的问题是如果是多表的视图,且表间有重名字段的时候该怎么办?
3 COUNT(DISTINCT column)
SQLite在执⾏如下语句的时候会报错:
SELECT COUNT(DISTINCT watchid) FROM [watch_item] WHERE watch_item.watchid = 1;
其原因是SQLite的所有内置函数都不⽀持DISTINCT限定,所以如果要统计不重复的记录数的时候会出现⼀些⿇烦。⽐较可⾏的做法是先建⽴⼀个不重复的记录表的视图,然后再对该视图进⾏计数。
4 外连接
虽然SQLite官⽅已经声称LEFT OUTER JOIN 已经实现,但还没有 RIGHT OUTER JOIN 和 FULL OUTER JOIN。但是实际测试表明似乎并不能够正常的⼯作。以下三条语句在执⾏的时候均会报错:
SELECT tags.[tagid] FROM [tags],[tag_rss] WHERE tags.[tagid] = tag_rss.[tagid](*);
SELECT tags.[tagid] FROM [tags],[tag_rss] WHERE LEFT OUTER JOIN tag_rss.[tagid] = tags.[tagid];
SELECT tags.[tagid] FROM [tags],[tag_rss] WHERE LEFT JOIN tag_rss.[tagid] = tags.[tagid];
此外经过测试⽤+号代替*号也是不可⾏的。
收集SQLite与Sql Server的语法差异
1.返回最后插⼊的标识值
返回最后插⼊的标识值sql server⽤@@IDENTITY
sqlite⽤标量函数LAST_INSERT_ROWID()
返回通过当前的 SQLConnection 插⼊到数据库的最后⼀⾏的⾏标识符(⽣成的主键)。此值与 SQLConnection.lastInsertRowID 属性返回的值相同。
在sql server中返回前2⾏可以这样:
select top 2 * from aa
order by ids desc
sqlite中⽤LIMIT,语句如下:
select * from aa
order by ids desc
LIMIT 2
3.GETDATE ( )
在sql server中GETDATE ( )返回当前系统⽇期和时间
sqlite中没有可以⽤这个代替select date('now')
4.EXISTS语句
sql server中判断插⼊(不存在ids=5的就插⼊)
IF NOT EXISTS (select * from aa where ids=5)
BEGIN
insert into aa(nickname)
select 't'
END
在sqlite中可以这样
insert into aa(nickname)
select 't'
where not exists(select * from aa where ids=5)
5.嵌套事务
sqlite仅允许单个活动的事务
6.RIGHT 和 FULL OUTER JOIN
sqlite不⽀持 RIGHT OUTER JOIN 或 FULL OUTER JOIN
sql包含哪几个部分7.可更新的视图
sqlite视图是只读的。不能对视图执⾏ DELETE、INSERT 或 UPDATE 语句,sql server是可以对视图 DELETE、INSERT 或 UPDATE 8.外键约束(FOREIGN KEY constraints)
外键约束会被解析但不会被执⾏。
9.完整的触发器⽀持(Complete trigger support)
现在有⼀些触发器的⽀持,但是还不完整。缺少的特性包括 FOR EACH STATEMENT 触发器(现在所有的触发器都必须是 FOR EACH ROW ),在表上的 INSTEAD OF 触发器(现在 INSTEAD OF 触发器只允许在视图上),以及递归触发器——触发⾃⾝的触发器。10。完整的 ALTER TABLE ⽀持(Complete ALTER TABLE support)
只⽀持 ALTER TABLE 命令的 RENAME TABLE 和 ADD COLUMN。其他类型的 ALTER TABLE 操作如 DROP COLUMN,ALTER COLUMN,ADD CONSTRAINT 等等均被忽略。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论