1、分页
LIMIT 0,1
ROWNUM <= 1
情景①:mysql中不含ORDER BY
-- mysql
SELECT * FROM 表名 LIMIT 1
-- oracle
SELECT * FROM 表名 WHERE ROWNUM <= 1
情景②:mysql中含ORDER BY
-- mysql
SELECT * FROM 表名 ORDER BY 字段名 DESC LIMIT 1
-- oracle
SELECT * FROM (
SELECT TMP.*, ROWNUM ROW_ID FROM (
SELECT * FROM 表名 ORDER BY 字段名 DESC
) TMP WHERE ROWNUM <= 1 )
WHERE ROW_ID > 0;
温馨小知识:SQL
SELECT语句执行顺序
FROM
子句组装来自不同数据源的数据WHERE
子句基于指定的条件对记录进行筛选GROUP BY
子句将数据划分为多个分组聚集函数
进行计算HAVING
子句筛选分组计算
所有表达式
ORDER BY
对结果进行排序2、oracle中字段名不能使用符号 " ` " 包括
-- mysql
SELECT `字段名` FROM 表名
-- oracle
SELECT 字段名 FROM 表名
3、字符串拼接
注: Oracle中
CONCAT
函数只能放两个参数,因此改为||
拼接
CONCAT('%', 'xxx' , '%')
'%' || 'xxx' || '%'
-- mysql
SELECT 字段名 FROM 表名 WHERE 字段名 LIKE CONCAT('%','helloworld','%')
-- oracle
SELECT 字段名 FROM 表名 WHERE 字段名 LIKE ('%' || 'helloworld' || '%')
4、date类型时间转10位时间戳
UNIX_TIMESTAMP
ORACLE_TO_UNIX
(注:此函数为步骤三中手动创建的,并非oracle自带哦!)5、字段名
为Oracle关键字
需加上双引号
温馨小提示: 字段名需大写,如果Java实体类对应字段为小写,映射的别名注意需保持原本小写与之对应 ~
例如:
level -> "LEVEL"
user -> "USER"
number -> "NUMBER"
desc -> "DESC"
date
-> DATE
6、判断是否为 NULL: 如果x为NULL,则返回value,否则返回x值本身
IFNULL(x, value)
NVL(x, value)
7、日期时间互换
前mysql,后oracle
STR_TO_DATE
-> TO_DATE
DATE_FORMAT
-> TO_CHAR
NOW()
-> SELECT SYSDATE FROM DUAL
-- 时间类型转指定字符串类型
SELECT DATE_FORMAT( NOW(),'%Y-%m-%d %H:%i:%s'); -- mysql
SELECT TO_CHAR( SYSDATE,'yyyy-MM-dd HH24:mi:ss') FROM DUAL; -- oracle
-- 字符串类型转时间类型
SELECT STR_TO_DATE( NOW(), '%Y-%m-%d %H'); -- mysql
SELECT TO_DATE( '2020-01-09', 'yyyy-MM-dd') FROM DUAL; -- oracle 【 注:oracle中前者字符串时间的格式需与后者转换格式相同哦~ 】
-- 获取系统当前时间
SELECT NOW(); -- mysql
SELECT SYSDATE + 8/24 FROM DUAL; -- oralce 【注:如果服务器时间没有相差8小时则无需加上`8/24`】
-- mysql
SELECT YEAR( NOW() ); -- 求年份
SELECT QUARTER( NOW() ); -- 求季度
SELECT MONTH( NOW() ); -- 求月份
-- oracle
SELECT TO_CHAR(SYSDATE, 'Q') FROM DUAL; -- 求季度
另外这里给出小编所用到的时间标识符格式
-- 前:mysql 后:oracle
"%Y-%m-%d %H:%i:%S" "yyyy-MM-dd HH24:mi:ss"
"%Y-%m-%d %H:%i:%s" "yyyy-MM-dd HH24:mi:ss"
"%Y-%m-%d %H:%i" "yyyy-MM-dd HH24:mi"
"%Y-%m-%d %H" "yyyy-MM-dd HH24"
"%Y-%m-%d %h" "yyyy-MM-dd HH"
"%Y-%m-%d" "yyyy-MM-dd"
"%Y-%m" "yyyy-MM"
"%Y" "yyyy"
"%H" "HH24"
"%k" "HH24"
8、判断时 左
右
字段类型
必须相同
这里注意是必须,可能在oracle版本不同的情况下,老版本不同类型也会查询出来,但建议还是改为相同类型关联,避免以后数据库版本升级出现问题!!!
建议小转大,比如:数字转字符串;并使用CONCAT
去修改类型,因为mysql和oracle都支持此函数,并且不会在特殊类型上出现问题 ~
-- ex: `JOIN` 关联表时 两张表的关联`字段类型`必须`相同`
SELECT a.*,b.*
FROM 表1 a
LEFT JOIN 表2 b on a.字符串类型字段 = CONCAT(b.数字类型字段, '')
9、批量插入
-- mysql
INSERT INTO 表名( `字段名1`, `字段名2`, `字段...`) VALUES
#{item.字段1},#{item.字段2},#{item中的每一个字段名...}
-- oracle
INSERT INTO 表名(字段名1,字段名2,xxx...)
SELECT A.*
FROM(
SELECT
#{item.字段1},#{item.字段2},#{item中的每一个字段名...}
FROM DUAL
) A
10、分组 GROUP BY
oracle中GROUP BY
分组后,查询出来的所有字段(除分组字段)必须为聚合函数的字段,否则会报错!
解决:
分析函数 OVER (Partition BY ...) 及开窗函数
-- mysql
SELECT 字段名,xxx... FROM 表名 GROUP BY 分组字段
-- oracle
SELECT
*
FROM (
SELECT tb.*, ROW_NUMBER ( ) OVER ( PARTITION BY tb.分组字段 ORDER BY tb.排序字段 DESC ) AS result
FROM (
SELECT 字段名,xxx... FROM 表名 -- 此处为查询sql,去掉`GROUP BY`分组条件,将分组字段加到上面 【 注:此sql的查询字段中要么全是聚合函数字段,要么都不是! 】
) tb
) WHERE result = 1
11、Oracle中表的别名不能用AS
, 列的别名可以用AS
why ?:为了防止和Oracle存储过程中的关键字AS冲突的问题