这篇文章主要总结了常用关系数据库Oracle、MySQL、PostgreSQL的SQL语法的差异。 本文分为以下几个部分:
- SQL结尾的分号问题
- SQL中的引号问题
- 批量插入insert问题
- 分页查询问题
1、SQL结尾的分号问题
-
MySQL数据库的SQL允许使用英文分号结尾
-
Oracle数据库的SQL不允许使用英文分号结尾
-
PostgreSQL数据库的SQL不允许使用英文分号结尾
2、SQL中的引号问题
-
MySQL数据库的SQL中使用单撇号`
-
Oracle数据库的SQL中使用双引号”
-
PostgreSQL数据库的SQL中使用双引号”
3、批量插入insert问题
- MySQL数据库的SQL中insert 支持多个values批量插入数据
-- ----------------------------
-- Table structure for stu
-- ----------------------------
DROP TABLE IF EXISTS `stu`;
CREATE TABLE `stu` (
`id` varchar(128) NOT NULL,
`name` varchar(255) NOT NULL,
`sex` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- ----------------------------
-- Records of stu
-- ----------------------------
INSERT INTO `stu`(`id`,`name`,`sex`) VALUES
('tangqi', '唐七', 'girl'),
('wangwu', '王五', 'boy'),
('zhangsan', '张三', 'boy');
- Oracle数据库的SQL中insert 支持多个values批量插入数据
-- ----------------------------
-- Table structure for stu
-- ----------------------------
DROP TABLE "stu";
CREATE TABLE "stu" (
"id" varchar2(128) NOT NULL,
"name" varchar2(255) NOT NULL,
"sex" varchar2(255) DEFAULT NULL,
PRIMARY KEY ("id")
)
-- ----------------------------
-- Records of stu
-- ----------------------------
INSERT ALL
INTO "stu"("id","name","sex") VALUES ('tangqi', '唐七', 'girl')
INTO "stu"("id","name","sex") VALUES ('wangwu', '王五', 'boy')
INTO "stu"("id","name","sex") VALUES ('zhangsan', '张三', 'boy')
SELECT * FROM dual
注意:oracle中drop表时不支持IF EXISTS关键词
- PostgreSQL数据库的SQL中insert 支持多个values批量插入数据
-- ----------------------------
-- Table structure for stu
-- ----------------------------
DROP TABLE "stu";
CREATE TABLE "stu" (
"id" varchar(128) NOT NULL,
"name" varchar(255) NOT NULL,
"sex" varchar(255) DEFAULT NULL,
PRIMARY KEY ("id")
)
-- ----------------------------
-- Records of stu
-- ----------------------------
INSERT INTO "stu"("id","name","sex") VALUES
('tangqi', '唐七', 'girl'),
('wangwu', '王五', 'boy'),
('zhangsan', '张三', 'boy')
总结:PostgreSQL与MySQL的批量insert语句很相似
4、分页查询问题
- MySQL数据库的分页查询SQL
使用LIMIT 关键词分页:
SELECT * from `stu` LIMIT 0,1;
SELECT * from `stu` LIMIT 1;
- Oracle数据库的分页查询SQL
(1) 在Oracle11g及其一下版本使用子查询的方式分页:
SELECT
*
FROM
(
SELECT
ROWNUM AS rowno,
T.*
FROM
"stu" T
where ROWNUM <2
) table_alias
WHERE
table_alias.rowno >= 1
(2) 在Oracle12c及其以上版本支持使用FETCH NEXT / ROWS ONLY 关键词方式来分页。
- PostgreSQL数据库的分页查询SQL
使用标准的LIMIT OFFSET关键词分页:
SELECT * from "stu" LIMIT 1 OFFSET 0
5、自增字段问题
- MySQL数据库的自增字段
(1)在建表时,对于整型字段,可以使用AUTO_INCREMENT关键词配置为自增字段;
(2)MySQL数据库中的一个表最多有一个自增的字段
- Oracle数据库的自增字段
与PostgreSQL类似.
- PostgreSQL数据库的自增字段
(1)创建表时,如果使用serial类型,默认生成的自增序列名为:’表名’ + ’‘ + ’字段名’ + ’‘ + ’seq’;
(2)可以单纯创建序列,在建表语句中自增的字段指定使用的序列名称。示例如下:
CREATE SEQUENCE gys.mytable_myid_seq
INCREMENT 1
START 1
MINVALUE 1
MAXVALUE 99999999
CACHE 1;