该汇总来自于[日]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’
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表达式
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
仅Oracle、SQL Server、DB2支持grouping运算符中的rollup
select … from … group by rollup(列名1, 列名2…)
MySQL支持 group by … with rollup(功能一致,但是不符合标准SQL规则)