search
HomeDatabaseMysql Tutorial【数据库】SQLite与SQL差异问题汇总
【数据库】SQLite与SQL差异问题汇总Jun 07, 2016 pm 03:10 PM
sqlsqlitedifferencedatabaseSummaryquestion

编者注:这些关于SQLite与SQL差异的问题,你是否遇到过呢?笔者在这里为大家总结出了使用SQLite时,与SQL之间经常会出现的一些差异性问题,希望对大家的使用有所帮助。 一、常见问题汇总 1 TOP 这是一个大家经常问到的问题,例如在SQLSERVER中可以使用如下语

编者注:这些关于SQLite与SQL差异的问题,你是否遇到过呢?笔者在这里为大家总结出了使用SQLite时,与SQL之间经常会出现的一些差异性问题,希望对大家的使用有所帮助。

一、常见问题汇总

1 TOP

这是一个大家经常问到的问题,例如在SQLSERVER中可以使用如下语句来取得记录集中的前十条记录:

<ol><li><span><span>SELECT</span><span> </span><span>TOP</span><span> 10 * </span><span>FROM</span><span> [</span><span>index</span><span>] </span><span>ORDER</span><span> </span><span>BY</span><span> indexid </span><span>DESC</span><span>; </span></span></li></ol>

但是这条SQL语句在SQLite中是无法执行的,应该改为:

<ol><li><span><span>SELECT</span><span> * </span><span>FROM</span><span> [</span><span>index</span><span>] </span><span>ORDER</span><span> </span><span>BY</span><span> indexid </span><span>DESC</span><span> limit 0,10; </span></span></li></ol>

其中limit 0,10表示从第0条记录开始,往后一共读取10条

2 创建视图(Create View)

SQLite在创建多表视图的时候有一个BUG,问题如下:

<ol><li><span><span>CREATE</span><span> </span><span>VIEW</span><span> watch_single </span><span>AS</span><span> </span><span>SELECT</span><span> DISTINCTwatch_item.[watchid],watch_item.[itemid] </span><span>FROM</span><span> watch_item; </span></span></li></ol>

上面这条SQL语句执行后会显示成功,但是实际上除了

<ol><li><span><span>SELECT</span><span> </span><span>COUNT</span><span>(*) </span><span>FROM</span><span> [watch_single ] </span><span>WHERE</span><span> watch_ single.watchid = 1; </span></span></li></ol>

能执行之外是无法执行其他任何语句的。其原因在于建立视图的时候指定了字段所在的表名,而SQLite并不能正确地识别它。所以上面的创建语句要改为:

<ol><li><span><span>CREATE</span><span> </span><span>VIEW</span><span> watch_single </span><span>AS</span><span> </span><span>SELECT</span><span> </span><span>DISTINCT</span><span> [watchid],[itemid] </span><span>FROM</span><span> watch_item; </span></span></li></ol>

但是随之而来的问题是如果是多表的视图,且表间有重名字段的时候该怎么办?

3 COUNT(DISTINCT column)

SQLite在执行如下语句的时候会报错:

<ol><li><span><span>SELECT</span><span> </span><span>COUNT</span><span>(</span><span>DISTINCT</span><span> watchid) </span><span>FROM</span><span> [watch_item] </span><span>WHERE</span><span> watch_item.watchid = 1; </span></span></li></ol>

其原因是SQLite的所有内置函数都不支持DISTINCT限定,所以如果要统计不重复的记录数的时候会出现一些麻烦。比较可行的做法是先建立一个不重复的记录表的视图,然后再对该视图进行计数。

4 外连接

虽然SQLite官方已经声称LEFT OUTER JOIN 已经实现,但还没有 RIGHT OUTER JOIN 和 FULL OUTER JOIN。但是实际测试表明似乎并不能够正常的工作。以下三条语句在执行的时候均会报错:

<ol>
<li><span><span>SELECT</span><span> tags.[tagid] </span><span>FROM</span><span> [tags],[tag_rss] </span><span>WHERE</span><span> tags.[tagid] = tag_rss.[tagid](*);  </span></span></li>
<li>
<span>SELECT</span><span> tags.[tagid] </span><span>FROM</span><span> [tags],[tag_rss] </span><span>WHERE</span><span> </span><span>LEFT</span><span> </span><span>OUTER</span><span> </span><span>JOIN</span><span> tag_rss.[tagid] = tags.[tagid];  </span>
</li>
<li>
<span>SELECT</span><span> tags.[tagid] </span><span>FROM</span><span> [tags],[tag_rss] </span><span>WHERE</span><span> </span><span>LEFT</span><span> </span><span>JOIN</span><span> tag_rss.[tagid] = tags.[tagid]; </span>
</li>
</ol>

此外经过测试用+号代替*号也是不可行的。

二、收集SQLite与Sql Server的语法差异

1.返回最后插入的标识值

返回最后插入的标识值sql server用@@IDENTITY

sqlite用标量函数LAST_INSERT_ROWID()

返回通过当前的 SQLConnection 插入到数据库的最后一行的行标识符(生成的主键)。此值与 SQLConnection.lastInsertRowID 属性返回的值相同。

2.top n

在sql server中返回前2行可以这样:

<ol>
<li><span><span>select</span><span> </span><span>top</span><span> 2 * </span><span>from</span><span> aa   </span></span></li>
<li>
<span>order</span><span> </span><span>by</span><span> ids </span><span>desc</span><span> </span>
</li>
</ol>

sqlite中用LIMIT,语句如下:

<ol>
<li><span><span>select</span><span> * </span><span>from</span><span> aa   </span></span></li>
<li>
<span>order</span><span> </span><span>by</span><span> ids </span><span>desc</span><span>   </span>
</li>
<li><span>LIMIT 2 </span></li>
</ol>

3.GETDATE ( )

在sql server中GETDATE ( )返回当前系统日期和时间

sqlite中没有

4.EXISTS语句

sql server中判断插入(不存在ids=5的就插入)

<ol>
<li><span><span>IF </span><span>NOT</span><span> EXISTS (</span><span>select</span><span> * </span><span>from</span><span> aa </span><span>where</span><span> ids=5)   </span></span></li>
<li>
<span>BEGIN</span><span>   </span>
</li>
<li>
<span>insert</span><span> </span><span>into</span><span> aa(nickname)   </span>
</li>
<li>
<span>select</span><span> </span><span>'t'</span><span>   </span>
</li>
<li>
<span>END</span><span>   </span>
</li>
</ol>

在sqlite中可以这样

<ol>
<li><span><span>insert</span><span> </span><span>into</span><span> aa(nickname)   </span></span></li>
<li>
<span>select</span><span> </span><span>'t'</span><span>   </span>
</li>
<li>
<span>where</span><span> </span><span>not</span><span> exists(</span><span>select</span><span> * </span><span>from</span><span> aa </span><span>where</span><span> ids=5) </span>
</li>
</ol>

5.嵌套事务

sqlite仅允许单个活动的事务

6.RIGHT 和 FULL OUTER JOIN

sqlite不支持 RIGHT OUTER JOIN 或 FULL OUTER JOIN

7.可更新的视图

sqlite视图是只读的。不能对视图执行 DELETE、INSERT 或 UPDATE 语句,sql server是可以对视图 DELETE、INSERT 或 UPDATE

三、新增内容

1.关于日期时间类型列的默认设置:

对"列"的设置包括三个字段:Name、Type、Default

Name:logTime(随意命名);

Type:

Date类型,得到的值形如"2011-04-23",

DATETIME类型,得到的值形如"2011-04-23 11:49:04.000";

Default:datetime('now','localtime')  我采用的是两个参数,后面的localtime不要丢弃,不然时间不准确。

Statement
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
深入理解MySQL索引优化器工作原理深入理解MySQL索引优化器工作原理Nov 09, 2022 pm 02:05 PM

本篇文章给大家带来了关于mysql的相关知识,其中主要介绍了关于索引优化器工作原理的相关内容,其中包括了MySQL Server的组成,MySQL优化器选择索引额原理以及SQL成本分析,最后通过 select 查询总结整个查询过程,下面一起来看一下,希望对大家有帮助。

sybase是什么数据库sybase是什么数据库Sep 22, 2021 am 11:39 AM

sybase是基于客户/服务器体系结构的数据库,是一个开放的、高性能的、可编程的数据库,可使用事件驱动的触发器、多线索化等来提高性能。

visual foxpro数据库文件是什么visual foxpro数据库文件是什么Jul 23, 2021 pm 04:53 PM

visual foxpro数据库文件是管理数据库对象的系统文件。在VFP中,用户数据是存放在“.DBF”表文件中;VFP的数据库文件(“.DBC”)中不存放用户数据,它只起将属于某一数据库的 数据库表与视图、连接、存储过程等关联起来的作用。

数据库系统的构成包括哪些数据库系统的构成包括哪些Jul 15, 2022 am 11:58 AM

数据库系统由4个部分构成:1、数据库,是指长期存储在计算机内的,有组织,可共享的数据的集合;2、硬件,是指构成计算机系统的各种物理设备,包括存储所需的外部设备;3、软件,包括操作系统、数据库管理系统及应用程序;4、人员,包括系统分析员和数据库设计人员、应用程序员(负责编写使用数据库的应用程序)、最终用户(利用接口或查询语言访问数据库)、数据库管理员(负责数据库的总体信息控制)。

microsoft sql server是什么软件microsoft sql server是什么软件Feb 28, 2023 pm 03:00 PM

microsoft sql server是Microsoft公司推出的关系型数据库管理系统,是一个全面的数据库平台,使用集成的商业智能(BI)工具提供了企业级的数据管理,具有使用方便可伸缩性好与相关软件集成程度高等优点。SQL Server数据库引擎为关系型数据和结构化数据提供了更安全可靠的存储功能,使用户可以构建和管理用于业务的高可用和高性能的数据应用程序。

数据库的什么是指数据的正确性和相容性数据库的什么是指数据的正确性和相容性Jul 04, 2022 pm 04:59 PM

数据库的“完整性”是指数据的正确性和相容性。完整性是指数据库中数据在逻辑上的一致性、正确性、有效性和相容性。完整性对于数据库系统的重要性:1、数据库完整性约束能够防止合法用户使用数据库时向数据库中添加不合语义的数据;2、合理的数据库完整性设计,能够同时兼顾数据库的完整性和系统的效能;3、完善的数据库完整性有助于尽早发现应用软件的错误。

go语言可以写数据库么go语言可以写数据库么Jan 06, 2023 am 10:35 AM

go语言可以写数据库。Go语言和其他语言不同的地方是,Go官方没有提供数据库驱动,而是编写了开发数据库驱动的标准接口,开发者可以根据定义的接口来开发相应的数据库驱动;这样做的好处在于,只要是按照标准接口开发的代码,以后迁移数据库时,不需要做任何修改,极大方便了后期的架构调整。

mysql查询慢的因素除了索引,还有什么?mysql查询慢的因素除了索引,还有什么?Jul 19, 2022 pm 08:22 PM

mysql查询为什么会慢,关于这个问题,在实际开发经常会遇到,而面试中,也是个高频题。遇到这种问题,我们一般也会想到是因为索引。那除开索引之外,还有哪些因素会导致数据库查询变慢呢?

See all articles

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

AI Hentai Generator

AI Hentai Generator

Generate AI Hentai for free.

Hot Article

Hot Tools

PhpStorm Mac version

PhpStorm Mac version

The latest (2018.2.1) professional PHP integrated development tool

MantisBT

MantisBT

Mantis is an easy-to-deploy web-based defect tracking tool designed to aid in product defect tracking. It requires PHP, MySQL and a web server. Check out our demo and hosting services.

SublimeText3 Linux new version

SublimeText3 Linux new version

SublimeText3 Linux latest version

SecLists

SecLists

SecLists is the ultimate security tester's companion. It is a collection of various types of lists that are frequently used during security assessments, all in one place. SecLists helps make security testing more efficient and productive by conveniently providing all the lists a security tester might need. List types include usernames, passwords, URLs, fuzzing payloads, sensitive data patterns, web shells, and more. The tester can simply pull this repository onto a new test machine and he will have access to every type of list he needs.

EditPlus Chinese cracked version

EditPlus Chinese cracked version

Small size, syntax highlighting, does not support code prompt function