赞
踩
日期:2021年01月09日
作者:Commas
注释:很久很久没有更新文章了,2020年虐我千百遍,2021年可以待我如初恋。今年第一更,记录自己知识积累的同时,也希望可以帮助到大家。接触了好几种关系型数据库,总结一下它们之间的差异吧……
目录
序号 | 类型 | 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
);
在数据库搜索数据时,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]';
JOIN
用于根据两个或多个表中的列之间的关系,从这些表中查询数据。
序号 | 类型 | Access | SQLServer | SQLite |
---|---|---|---|---|
1 | LEFT JOIN | √ | √ | √ |
2 | RIGHT JOIN | √ | √ | × |
3 | INNER JOIN | √ | √ | √ |
(2-1)【Access/SQLServer/SQLite】之LEFT JOIN示例:
LEFT JOIN
关键字会从左表 (A) 那里返回所有的行,即使在右表 (B) 中没有匹配的行。
SELECT * FROM A LEFT JOIN comment ON A.id = B.iid;
(2-2)【Access/SQLServer】之RIGHT JOIN示例:
RIGHT JOIN
关键字会从表 (B) 那里返回所有的行,即使在左表 (A) 中没有匹配的行。
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两个表交集数据行。
SELECT * FROM A INNER JOIN B ON A.id = B.iid;
序号 | 操作符 | 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'; --结果为:“|”附近有语法错误。
序号 | 类型 | 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,],num
或LIMIT 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;
【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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。