欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

关系数据库Oracle、MySQL、PostgreSQL的SQL语法的差异(整理中)

程序员文章站 2022-03-15 19:36:20
...

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)PostgreSQL数据库的一张表中支持存在多个自增字段,在使用last_insert_id()时需要制定序列名;

(3)可以单纯创建序列,在建表语句中自增的字段指定使用的序列名称。示例如下:

CREATE SEQUENCE gys.mytable_myid_seq
    INCREMENT 1
    START 1
    MINVALUE 1
    MAXVALUE 99999999
    CACHE 1;
相关标签: ETL database