oracle与mysql语法不同之处

1、批量添加

mysql语法

insert into dept
     values(50,'测试一部',null),
           (51,'测试二部',null),
           (52,'测试三部',null);

oracle批量添加

第一种

insert all
into dept(deptno,dname) values(50,'测试一部')
into dept(deptno,dname) values(51,'测试二部')
SELECT 1 FROM DUAL;

第二种

insert all into dept(deptno,dname)
into dept(deptno,dname) values(60,'测试一部')
into dept(deptno,dname) values(61,'测试二部')
SELECT 62,'测试三' FROM DUAL;

第三种 begin...and 语句块

begin
insert into dept(deptno,dname) values(70,'测试一部');
insert into dept(deptno,dname) values(71,'测试二部');
end;

2、oracle序列和mysql自增长

oracle的序列 sequences(mysql自增长)
sequences的使用分两步
1、新建一个序列(工具建)
2、如何使用

select deptseq.nextval from dual;
select deptseq.currval from dual;
insert into dept(deptno,dname) values(deptseq.nextval,'开发一部');

3、函数对比

https://blog.csdn.net/qq_39137554/article/details/76034335
3.1)数学函数
oracle: ceil(-1.001) mysql: ceiling(-1.001)
3.2)字符串函数

3.2.1查找类的(有不一样)

1)ascii(str)一样:返回一个字符对应的ascii码值
2)chr||char (不同)
ORACLE:chr(97) MYSQL:char(97) 返回这个整数所代表的 ASCII 码值
oracle示例:

select ascii('A')+32 value from dual
select chr(ascii('A')+32) value from dual;

3)INSTR||locate(mysql新增 mysql可以用instr locate)
INSTR(s1,s2,[,n1],[n2]) 返回s1中,子串s2从n1开始,第n2次出现的位置。n1,n2默认值为1
oracle例子:

-- 查询s字符串在sdsq中第一次出现的位置,从头开始查找,索引从1开始计算 返回1
select INSTR('sdsq','s') value from dual;
-- 查询s字符串在sdsq中第一次出现的位置,从索引从2开始查找 返回3
select INSTR('sdsq','s',2) value from dual;
-- 查询s字符串在sdsq中第一次出现的位置,从索引从2开始查找,如果没有查找到,返回0
select INSTR('sdsq','s',2,2) value from dual;

mysql:
instr||locate

4)length||char_length(不同)
SELECT length('AAAASDF') VALUE FROM DUAL;

3.2.2添加类的一样

CONCAT:连接

 select concat(empno,ename) as 编号和姓名 from emp;

LPAD:在左边加点内容(左追加)

  把sal变成10位,不足10位的,左侧 补*
   select LPAD(sal,10,'*') as v from emp;

RPAD:在右边加点内容(右追加)
把sal变成10位,不足10位的,右侧 补*
select RPAD(sal,10,'*') as v from emp;

3.2.3修改类的

REPLACE 替换 一样
LOWER 转小写 一样
UPPER 转大写 一样
initcap首字母大写

SELECT REPLACE('18604001139', '0400', '****') value from dual;
select LOWER(ename) username from emp; 转小写
select UPPER(ename) username from emp;
select initcap(ename) username from emp;

3.2.4删除类的

3.2.4.1TRIM:去掉首尾的指定字符,不能去除中间的
oracle:trim(子串 from 父串)

select TRIM('S' FROM 'SSMISSTH') value from dual; //MISSTH
select TRIM(' ' FROM ' a b c ') value from dual; //a b c

3.2.4.2SUBSTR(oracle)||substring(mysql)

SUBSTR(原字符串,开始处位置,截取长度)
select SUBSTR('String',2,5) value from dual; //tring

ORACLE:
练习1:
1.写一个查询,用首字母大写,其它字母小写显示雇员的 ename,显
示名字的长度,并给每列一个适当的标签,条件是满足所有雇员名字
的开始字母是J、A 或 M 的雇员,并对查询结果按雇员的ename升序
排序。(提示:使用initcap、length、substr)

select initcap(ename) 员工姓名,length(ename) 名字长度
  from emp
  where SUBSTR(ENAME,1,1) IN('J','A','M')
  order by ENAME ASC;

练习2 都用函数解决
• 1.查询员工姓名中中包含大写或小写字母A的员工姓名。
select ename
from emp
where instr(ename,'A')>0 OR instr(ename,'a')>0

• 2.查询部门编号为10或20,入职日期在81年5月1日之后,并且姓名中
包含大写字母A的员工姓名,员工姓名长度(提示,要求使用INSTR函
数,不能使用like进行判断)

select ename,length(ename) len
from emp
where deptno in(10,20)
and hiredate>'1-5月-1981'
and instr(ename,'A')>0;

• 3.查询每个职工的编号,姓名,工资
– 要求将查询到的数据按照一定的格式合并成一个字符串.
– 前10位:编号,不足部分用填充,左对齐(右填充)
– 中间10位:姓名,不足部分用
填充,左对齐
– 后10位:工资,不足部分用*填充,右对齐

select rpad(empno,10,'')||rpad(ename,10,'')||lpad(sal,10,'*') as value
from emp;

select concat(concat(rpad(empno,10,'') , rpad(ename,10,'')),lpad(sal,10,'*')) as value
from emp;

3.4 转换函数重点掌握(不一样)

https://www.cnblogs.com/aipan/p/7941917.html
3.4.1 to_char vs date_format/ time_format

select to_char(hiredate,'YYYY-MM-DD HH24:MI:SS') VALUE FROM emp;
select to_char(-125.8, '999D99S') from dual;

3.4.2 to_date vs STR_TO_DATE(str,format)

select to_date('2021-04-23 15:12:20','YYYY-MM-DD HH24:MI:SS') VALUE FROM DUAL;

3.4.3 to_number vs CAST("123" AS SIGNED INTEGER)
select to_number('12,454.8-', '99G999D9S') value from dual;
select to_number('-12,454.8', 'S99G999D9') value from dual;

练习:

1.显示服务器系统当前时间,格式为2007-10-1217:11:11(提示:使用to_char函数)
select to_char(sysdate,'YYYY-MM-DD HH24:MI:SS')
from dual;

3.查询员工姓名,工资,格式化的工资(¥999,999.99)(提示:使用to_char函数)

select to_char(sal,'L999G999D99')
from emp;

4.把字符串2015-3月-18 13:13:13 转换成日期格式
select to_date('2015-3月-18 13:13:13','YYYY-MON-DD HH24:MI:SS')
from dual;

mysql:

select cast(11 as unsigned int) /整型/
select cast(11 as decimal(10,2)) /浮点型/

3.5 通用函数(控制流函数 不一样)

3.5.1 nvl/COALESCE vs ifnull
**NVL函数等价于mysql的ifnull
– 语法:NVL (expr1,expr2)
– 如果expr1不是null,返回expr1,否则返回expr2

select comm,nvl(comm,0) from emp;

**COALESCE oracle独有的 ( 表达式1, 表达式2, ... 表达式n )函数是对NVL函数的扩展。 COALESCE 函数的功能是返回第一个不为空的参数,参数个数不受限制。

select comm,coalesce(comm,sal,0) from emp;

3.5.2 nvl2 vs if
NVL2函数
– 语法:NVL2(expr1,expr2,expr3)
– 如果expr1不是null,返回expr2,否则返回expr3

select nvl2(comm,'无奖金','有奖金') from emp;

3.5.3 NULLIF vs 无(可以考虑用if 建议了解,不用掌握)
NULLIF函数
– 语法: NULLIF(expr1,expr2)
– 比较两个表达式,如果相等,返回null,否则,返回第一个表达式

3.5.4 DECODE(解密的意思)/case vs if/case 多分支情况
DECODE(字段| 表达式, 条件1,结果1[,条件2,结果2…,][,缺省值] )

SELECT ename, deptno,
decode(deptno,
10,' 销售部',
20,' 技术部',
30 , ' 管理部',
' 无') deptname
FROM emp;

CASE expr
WHEN comparison_expr1 THEN return_expr1
[WHEN comparison_expr2 THEN return_expr2
WHEN comparison_exprn THEN return_exprn
ELSE else_expr]
END

SELECT ename, deptno,
(CASE deptno
WHEN 10 THEN ' 销售部'
WHEN 20 THEN ' 技术部'
WHEN 30 THEN ' 管理部'
ELSE ' 无' END) deptname FROM emp;

3.3日期函数

  • SYSDATE vs now()||sysdate()
  • MONTHS_BETWEEN:两个日期相差的月数
  • ADD_MONTHS:返回指定日期加上相应的月数后的日期
    – NEXT_DAY:返回某一日期的下一个星期几的日期
    – LAST_DAY:返回指定日期当月最后一天的日期
    – ROUND(date[,‘fmt’])将date按照fmt指定的格式
  • EXTRACT 提取日期的某部分内容(年月日)

EXTRACT ([YEAR] [MONTH][DAY] FROM [日期表达式])

SELECT ename, sal, MONTHS_BETWEEN(SYSDATE,hiredate) months
FROM emp
ORDER BY months;

SELECT ename, sal, hiredate, ADD_MONTHS(hiredate,3) new_date
FROM emp
WHERE hiredate>'01-1月-82';

SELECT NEXT_DAY(sysdate,'星期二') NEXT_DAY
FROM DUAL;

SELECT Last_DAY('1-2月-2019') last_DAY
FROM DUAL;
select EXTRACT (YEAR FROM HIREDATE) AS 年 from emp;

select EXTRACT (YEAR FROM HIREDATE) AS 年 from emp;
select EXTRACT (MONTH FROM HIREDATE) AS 年 from emp;
select EXTRACT (DAY FROM HIREDATE) AS 年 from emp;

4、外连接的加号定法。oralce支持,mysql不支持

查询所有雇员姓名,部门编号,部门名称, 包括没有员工
的部门也要显示出来
select e.ename,d.deptno,d.dname
from emp e,dept d
where e.deptno(+)=d.deptno;

4、分页的处理

比较日期相等
https://www.cnblogs.com/bailing80/p/11440927.html

你可能感兴趣的:(oracle与mysql语法不同之处)