SQL学习笔记——各种关系型数据库SQL语言的差异

该汇总来自于[日]MICK的《SQL基础教程》,该教材内容深入浅出,非常值得学习。

涉及的数据库有:SQL Server、Oracle、DB2、MySQL、PostgreSQL

 

数据类型

Oracle中不推荐使用varchar,使用varchar2

Oracle中date包括年月日、时分秒

 

更新表定义

alter table 表名 add/drop column 列定义

Oracle与SQL Server中不用写column

Oracle中可以添加/删除多列

 

更改表名

Oracle、postpreSQL使用alter table 表名 rename to 表名2

DB2、MySQL使用rename table 表名 to 表名2

SQL Server使用sp_rename ‘表名’ to ‘表名2’

 

select子句不跟from子句

Oracle不行,必须加from子句,可以使用DUAL临时表

 

插入多行数据

Oracle

insert all into 表名 values(列值1,列值2……)

into 表名 values(列值1,列值2……)

into 表名 values(列值1,列值2……)

into 表名 values(列值1,列值2……)

into 表名 values(列值1,列值2……)

select * from DAUL

 

删除所有数据

Oracle、SQL Server、MySQL、PostgreSQL中可以使用 truncate 表名

处理速度比delete快很多

【注意】Oracle中truncate为DDL,而不是DML,执行时默认执行commit,不能rollback

 

提交任务

SQL Server、PostgreSQL使用begin transaction

MySQL使用start transaction

Oracle、DB2使用不需要

 

默认自动提交任务

SQL Server、PostgreSQL、MySQL默认自动提交任务

Oracle指导用户执行commit或rollback为止算一个事务

 

更新视图

PostgreSQL的视图初始设定是只读,

create or replace rule insert_rule

as on insert

to 视图名 do instead

insert into 视图名values(列1,列2,列3…)

 

删除关联视图

PostgreSQL

drop view 视图名 cascade

 

子查询

as 子查询名称,as有时候可以省略

Oracle中不能使用as,否则会报错

 

取余数

SQL Server使用%计算余数

其他数据库都是使用mod()

 

拼接字符串

Oracle、DB2、PostgreSQL使用||

SQL Server使用+

MySQL使用concat()

 

字符串长度

Oracle、DB2、PostgreSQL、MySQL使用length()

SQL Server使用len()

MySQL还有一个char_length()

 

截取字符串

PostgreSQL、MySQL使用substring(对象from截取的起始位置for截取的字符数)

SQL Server使用substring(对象, 截取的起始位置, 截取的字符数)

Oracle、DB2使用substr (对象, 截取的起始位置, 截取的字符数)

 

当前日期

PostgreSQL、MySQL使用current_date

SQL Server没有相关用法,只有current_timestamp返回年月日时分秒,想要返回当前日期,使用cast(current_timestamp as date)

Oracle 需要在from 中指定临时表DAUL

DB2使用current date(之间添加半角空格,还要指定临时表sysibm.sysdummy1)

 

当前时间

参考上文

 

当前日期时间

参考上文

 

截取日期元素

PostgreSQL、MySQL使用extract(日期元素 from 日期),返回值是数值类型

SQL Server使用datepart(日期元素, 日期)

Oracle指定临时表DAUL

DB2添加半角空格

 

将字符串转为数据类型

SQL Server、PostgreSQL、Oracle、DB2使用cast(字符串 as interger)

【注意】Oracle要增加from DAUL,DB2要增加 from sysibm.sysdummy1

MySQL使用cast(字符串 as signed interger)

 

case表达式

除了case之外,一些数据库还有特定的case表达式

Oracle还可以使用decode代替case

decode(列名, 值1, 返回结果1, 值2, 返回结果2……null)

MySQL可以使用if嵌套结构代替case

 

交集

Oracle、SQL Server、DB2、postpreSQL可以使用intersect

MySQL暂时不支持intersect,可以替换为如下语句

select * from a

where exists (select * from b where a.f1=b.f1 and a.f2=b.f2 …….)

 

差集

SQL Server、DB2、postpreSQL可以使用except

Oracle可以使用minus

MySQL暂时不支持except,可以替换为如下语句

select * from a

where not exists (select * from b where a.f1=b.f1 and a.f2=b.f2 …….)

 

在窗口函数中使用聚合函数

SQL Server中,聚合函数与over子句组合使用时,无法使用order by子句

Oracle、DB2、PostgreSQL中可以使用如下sql语句

select id, name, price, sum(price) over (order by id) as current_sum from shop(求累计价格)

 

窗口函数中计算移动平均

仅Oracle与DB2支持该功能

select id, name, price, avg(price) over (order by id rows 2 preceding) as moving_avg from shop

(1)rows 2 preceding 截止到前2行(当前记录,之前1行的记录,之前2行的记录)

(2)following,意思与preceding相反,为截止到之后n行

(3)可以同时使用preceding与following,如下所示:

select id, name, price,

avg(price) over (order by id rows between 1 preceding and 1 following) as moving_avg

from shop

 

分组功能之rollup

仅Oracle、SQL Server、DB2支持grouping运算符中的rollup

select … from … group by rollup(列名1, 列名2…)

MySQL支持 group by … with rollup(功能一致,但是不符合标准SQL规则)

 

 

你可能感兴趣的:(SQL)