多年实战总结Access、SQLServer以及SQLite数据库常见差异

日期:2021年01月09日
作者:Commas
注释:很久很久没有更新文章了,2020年虐我千百遍,2021年可以待我如初恋。今年第一更,记录自己知识积累的同时,也希望可以帮助到大家。接触了好几种关系型数据库,总结一下它们之间的差异吧……


目录

文章目录

  • 一、常见数据库类型定义比较
  • 二、常见数据库语法差异比较
    • (1)SQL通配符*和%比较
    • (2)JOIN比较
    • (3)查询中的+和&的比较
    • (4)排序查询的比较
    • (5)复制表及其数据的比较


一、常见数据库类型定义比较

序号 类型 Access SQLServer SQLite
1 文本(以10个字符为例) TEXT(10) NVARCHAR(10) TEXT(10)
2 长文本 MEMO NVARCHAR(MAX) TEXT
3 日期 DATETIME DATETIME DATETIME
4 浮点数 DOUBLE FLOAT DOUBLE
5 整数 INTEGER INTEGER INTEGER

【Access】数据库类型定义示例如下:

CREATE TABLE [book] (
 [id] COUNTER NOT NULL CONSTRAINT [PK_book] PRIMARY KEY,
 [book_name] TEXT(24) NOT NULL,
 [book_comment] TEXT NULL,
 [publish_date] DATETIME NOT NULL,
 [price] DATETIME NOT NULL,
 [num] INTEGER NOT NULL DEFAULT 0
);

【SQLServer】数据库类型定义示例如下:

CREATE TABLE [book] (
 [id] INTEGER IDENTITY(1,1) NOT NULL CONSTRAINT [PK_book] PRIMARY KEY,
 [book_name] NVARCHAR(24) NULL,
 [book_comment] NVARCHAR(MAX) NOT NULL,
 [publish_date] DATETIME NOT NULL,
 [price] FLOAT NULL,
 [num] INTEGER NULL DEFAULT 0,
);

【SQLite】 数据库类型定义示例如下:

CREATE TABLE [book](
 [id] INTEGER NOT NULL CONSTRAINT [PK_book] PRIMARY KEY AUTOINCREMENT,
 [book_name] TEXT(24) NULL COLLATE NOCASE,
 [book_comment] TEXT NOT NULL COLLATE NOCASE
 [publish_date] DATETIME NOT NULL,
 [price] DOUBLE NULL,
 [num] INTEGER NULL DEFAULT 0
);

二、常见数据库语法差异比较

(1)SQL通配符*和%比较

在数据库搜索数据时,SQL通配符可以替代一个或多个字符;
注释:序号为1、2比较常用,且SQL通配符必须与 LIKE 运算符一起使用。

序号 通配符 含义 Access SQLServer SQLite
1 * 替代一个或多个字符 × ×
2 % 替代一个或多个字符 ×
3 _ 仅替代一个字符 ×
4 [X] 字符列中的任何单一字符,其中为任意字符 × ×
5 [^X] 不在字符列中的任何单一字符,其中为任意字符 × ×

匹配开头是"替代"的数据,示例如下:

SELECT * FROM A WHERE A.Comment LIKE '替代*';
SELECT * FROM A WHERE A.Comment LIKE '替代%';

匹配开头是"替代",结尾为任意字符的三个字符的数据,示例如下:
如“替代品”,而“替代商品”不匹配;

SELECT * FROM A WHERE A.Comment LIKE '替代_';

匹配开头是"替"或者“代”的数据,示例如下:
如“替换身份”、“代劳吃饭”等等


SELECT * FROM A WHERE A.Comment LIKE '[替代]%';

匹配开头不是"替"或者“代”的数据,示例如下:
如“我替换你”、“你代劳我”等等

SELECT * FROM A WHERE A.Comment LIKE '[^替代]%';

匹配结尾是"a"或者“b”的数据,示例如下:
如“qqa”、“qqb”等等

SELECT * FROM A WHERE A.Comment LIKE '%[ab]';

匹配结尾不是"a"或者“b”的数据,示例如下:
如“qqac”、“qqbc”等等

SELECT * FROM A WHERE A.Comment LIKE '%[^ab]';

(2)JOIN比较

JOIN 用于根据两个或多个表中的列之间的关系,从这些表中查询数据。

序号 类型 Access SQLServer SQLite
1 LEFT JOIN
2 RIGHT JOIN ×
3 INNER JOIN

(2-1)【Access/SQLServer/SQLite】之LEFT JOIN示例:

LEFT JOIN 关键字会从左表 (A) 那里返回所有的行,即使在右表 (B) 中没有匹配的行。多年实战总结Access、SQLServer以及SQLite数据库常见差异_第1张图片

SELECT * FROM A LEFT JOIN comment ON A.id = B.iid;

(2-2)【Access/SQLServer】之RIGHT JOIN示例:

RIGHT JOIN关键字会从表 (B) 那里返回所有的行,即使在左表 (A) 中没有匹配的行。多年实战总结Access、SQLServer以及SQLite数据库常见差异_第2张图片

SELECT * FROM A RIGHT JOIN B ON A.id = B.iid;

--SQLite没有RIGHT JOIN,需要转换成LEFT JOIN。
SELECT * FROM B LEFT JOIN A ON B.Iid = A.id;

(2-3)【Access/SQLServer/SQLite】之 INNER JOIN示例:

INNER JOIN 关键字会返回AB两个表交集数据行。
多年实战总结Access、SQLServer以及SQLite数据库常见差异_第3张图片

SELECT * FROM A INNER JOIN B ON A.id = B.iid;

(3)查询中的+和&的比较

序号 操作符 Access SQLServer SQLite
1 + 数值类型相加,字符类型拼接 数值类型相加,字符类型拼接 数值相加(字符类型强转为数值,不成功则为0)
2 || 不支持 不支持 字符拼接

【Access/SQLServer】示例如下:

select 1+1;       --结果为:2
select 'a'+1;     --结果为:在将 varchar 值 'a' 转换成数据类型 int 时失败。
select '1'+1      --结果为:2
select 'a'+'b';   --结果为:ab
select 'a'||'b';  --结果为:“|”附近有语法错误。

【SQLite】示例如下:

select 1+1;       --结果为:2
select 'a'+1;     --结果为:1(分析,‘a’强制转为0,0+1=1)
select '1'+1      --结果为:2
select 'a'+'b';   --结果为:0(分析,‘a’、‘b’强制转为0,0+0=0)
select 'a'||'b';  --结果为:“|”附近有语法错误。

(4)排序查询的比较

序号 类型 Access SQLServer SQLite
1 TOP ×
2 LIMIT × ×

【Access/SQLServer】示例如下:

--(1)从班级表class中,找出第1条数据
SELECT TOP 1 * FROM class;

--(2)从班级表class中,找出前3条数据
SELECT TOP 3 * FROM class;

--(3)从班级表class中,找出前50%的数据
SELECT TOP 50 PERCENT * FROM  ac

【SQLite】语法:
LIMIT [offset_index=0,],numLIMIT num OFFSET offset_index
其中,num为多少行,offset_index为偏移位数(从0开始计数),示例如下:

--(1)从班级表class中,找出第1条数据
SELECT * FROM class LIMIT 1;

--(2)从班级表class中,找到偏移量为5(即4+1)后面的3条数据;
-- 或者说,从第5条(即4+1)数据开始,向后取3条数据
SELECT * FROM class LIMIT 4,3;

--(3)从班级表class中,找到偏移量为5(即4+1)后面的3条数据;
-- 或者说,从第5条(即4+1)数据开始,向后取3条数据
SELECT * FROM class LIMIT 3 OFFSET 4;

(5)复制表及其数据的比较

【Access、SQLServer】示例:

-- (1)复制表结构+数据
SELECT * INTO newTable FROM oldTable;
-- (2)仅仅复制表结构
SELECT * INTO newTable FROM oldTable WHERE 1=0;

【SQLite】示例:

-- (1)复制表结构+数据
CREATE TABLE newTable AS SELECT * FROM oldTable;
-- (2)仅仅复制表结构
SELECT * INTO newTable FROM oldTable WHERE 1=0;


版权声明:本文为博主原创文章,如需转载,请给出:
原文链接:https://blog.csdn.net/qq_35844043/article/details/112262317

你可能感兴趣的:(sqlite,数据库专栏,sqlserver,sqlite,access,数据库,sql)