oracle与mysql语法不同之处
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle与mysql语法不同之处相关的知识,希望对你有一定的参考价值。
参考技术A insert allinto 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
insert into dept(deptno,dname) values(70,'测试一部');
insert into dept(deptno,dname) values(71,'测试二部');
end;
oracle的序列 sequences(mysql自增长)
sequences的使用分两步
1、新建一个序列(工具建)
2、如何使用
3、函数对比
https://blog.csdn.net/qq_39137554/article/details/76034335
3.1)数学函数
oracle: ceil(-1.001) mysql: ceiling(-1.001)
3.2)字符串函数
1)ascii(str)一样:返回一个字符对应的ascii码值
2)chr||char (不同)
ORACLE:chr(97) MYSQL:char(97) 返回这个整数所代表的 ASCII 码值
oracle示例:
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;
CONCAT:连接
LPAD:在左边加点内容(左追加)
RPAD:在右边加点内容(右追加)
把sal变成10位,不足10位的,右侧 补*
select RPAD(sal,10,'*') as v from emp;
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.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)
练习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;
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;
select cast(11 as unsigned int) / 整型 /
select cast(11 as decimal(10,2)) / 浮点型 /
3.5.1 nvl/COALESCE vs ifnull
**NVL函数等价于mysql的ifnull
– 语法:NVL (expr1,expr2)
– 如果expr1不是null,返回expr1,否则返回expr2
select comm,nvl(comm,0) from emp;
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;
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
sql server,mysql,oracle有啥相通点和语法区别?
SQL语法都是一样的,区别只有少许的不同,如sqlserver中的top关键字,在oracle中就是没有的。而sql
server中也没有oracle中的伪列等,像sql
server和oracle数据库应用的一般都是大型的项目,而mysql则是一些小项目或是个人使用的。 参考技术A SQL语法都是一样的,区别只有少许的不同,如sql
server中的top关键字,在oracle中就是没有的。而sql
server中也没有oracle中的伪列等,像sql
server和oracle数据库应用的一般都是大型的项目,而mysql则是一些小项目或是个人使用的。 参考技术B 太多了,像rowid这类字段都是oracle特有的,
mysql接近于sql,比较简单,倒是oracle有许多特有的函数,需要查询手册 参考技术C 太多了,像rowid这类字段都是oracle特有的,
mysql接近于sql,比较简单,倒是oracle有许多特有的函数,需要查询手册 参考技术D 都用的sql语言,这些是相同的,管理的思路也是相同的。
区别就多了,自己baidu去本回答被提问者采纳
以上是关于oracle与mysql语法不同之处的主要内容,如果未能解决你的问题,请参考以下文章