>  기사  >  데이터 베이스  >  데이터베이스 oracle과 mysql의 구문 차이점은 무엇입니까

데이터베이스 oracle과 mysql의 구문 차이점은 무엇입니까

青灯夜游
青灯夜游원래의
2021-12-21 12:42:4425826검색

차이점: 1. MySQL에는 숫자 유형이 없지만 Oracle에는 있습니다. 2. MySQL의 Date 유형은 날짜만 나타내고 Oracle의 Date 유형은 날짜와 시간을 나타냅니다. Oracle은 length()를 사용하고 MySQL은 char_length() 등을 사용합니다.

데이터베이스 oracle과 mysql의 구문 차이점은 무엇입니까

이 튜토리얼의 운영 환경: windows7 시스템, mysql8 버전, Dell G3 컴퓨터.

최근에 프로젝트를 마이그레이션하고 데이터베이스를 Oracle에서 MySQL로 변경해야 합니다. 둘 사이의 구문이 부분적으로 다르기 때문에 Oracle에서는 사용할 수 있지만 MySQL에서는 사용할 수 없는 함수/유형을 MySQL에서 사용할 수 있는 함수/유형으로 변경해야 합니다. 다음은 몇 가지 구문 차이점을 요약한 것입니다.

1. 데이터 유형

1. 숫자 유형

MySQL에는 숫자 유형이 없지만 Oracle에는 숫자(5,1)가 10진수(5, 1) MySQL에서는 숫자 (5)가 int(5)에 해당합니다.

MySQL에는 많은 숫자 유형이 있으며, Tinyint, Smallint, Mediumint, Bigint 및 기타 유형을 포함하여 보다 세부적인 범주로 나뉩니다.

2 Varchar2(n) 유형

해당 Oracle Varchar2(n) MySQL의 유형 대체 유형은 varchar(n) 유형입니다.

3. 날짜 유형

MySQL의 날짜 및 시간 유형에는 날짜(Date), 시간(Time), 날짜/시간(Datetime) 및 기타 유형이 포함됩니다. MySQL의 날짜 유형은 날짜(년-월-일)만 나타내고 시간 유형은 날짜(연월일)만 나타냅니다. 시간(시:분:초)이고 Datetime 유형은 날짜 및 시간(년-월-일 시:분:초)을 나타냅니다. Oracle의 Date 유형은 MySQL의 Datetime 유형과 일치합니다.

2. 함수

1. 길이(str) 함수

                                                                   MySQL에서는 char_length(str)와 함께 사용합니다.

2.sys_guid() 함수

Oracle은 sys_guid() 함수를 사용하여 임의의 시퀀스를 생성할 수 있고, MySQL은 UUID()를 통해 임의의 시퀀스를 생성할 수 있습니다.

3. 시간 형식 지정 기능

시간을 문자열 시간으로 변환 MySQL date_format(NOW(),'%Y-%m-%d')는 Oracle의 Oracle에서 to_char(sysdate, 'YYYY') -MM-에 해당합니다. DD');

문자열 시간을 시간 유형으로 변환 MySQL str_to_date('2019-01-01','%Y-%m-%d')는 Oracle -01', '의 to_date('2019-01)에 해당합니다. YYYY-MM-DD');

                                                                                                                                              시, 분, 초 기능 변환 포함: DATE_FORMAT(NOW(),'%Y-%m-%d %H:%i:%s'), str_to_date( '2019 -01-01','%Y-%m-%d %H:%i:%s').

4. 조건부 함수(nvl(), nvl2(), decode())

nvl(tab.columnName, 0): tab.columnName 값이 비어 있으면 반환 값은 0이고, 그렇지 않으면 반환 값입니다. tab.columnName; 해당 MySQL 함수는 ifnull(tab.columnName, 0)입니다.

        nvl2(expr1,expr2,expr3): expr1이 null이 아니면 expr2를 반환하고, 그렇지 않으면 expr3을 반환합니다. 해당 MySQL 함수는 if(expr1,expr2,expr3)입니다. (디코드(값, 값, 값, 값): 값이 Val1과 같으면 Val2를 반환하고, 그렇지 않으면 Val3을 반환합니다. mysql은 if 함수로 표현할 수 있습니다: if (value = value, value, value); , val1, if2 ,val2,...,ifn, valn, val): 값이 if1과 같으면 val1을 반환하고, 값이 if2와 같으면 값2를 반환합니다...값이 ifn과 같으면 valn을 반환하고, 그렇지 않으면 val을 반환합니다. MySQL은 Case when else end;l, 즉 case when value=if1 then val1 when value=if2 then val2,,,when value=ifn then valn else val end;

5 를 통해 이러한 종류의 판단을 판단할 수 있습니다. trunc() 함수

                    TRUNC(12.123): 정수(12)를 반환합니다. MySQL 해당 함수: truncate(12.123, 0); MySQL에 해당 함수: truncate(12.123, 2);      TRUNC(시스템 날짜): 반환 값은 (2019-07-26 00:00:00)입니다. MySQL에 해당하는 함수는 Cast(now() as datetime)입니다. 반환 값은 (2019-07-26 14:11:38)입니다. MySQL의 캐스트 함수 구문은 다음과 같습니다: CAST(xxx AS 유형)(사용 가능한 유형은 바이너리, 바이너리 접두사의 효과: BINARY; 문자 유형일 수 있음 매개변수: CHAR(); 날짜: DATE; 시간: TIME; 날짜 시간 유형: DATETIME; 정수: SIGNED; 부호 없는 정수: UNSIGNED)

6. to_char() to_number()

to_char (123): 숫자 123을 문자열로 변환합니다. MySQL의 해당 함수는 CAST(123 AS CHAR(3))입니다.

to_number('123'): 문자열 번호 123을 숫자 유형으로 변환합니다. MySQL의 해당 함수는 캐스트('123' as SIGNED)입니다. ;

7.sysdate 현재 시간ㅋㅋㅋ                                                                                                                    sysdate:    따옴표.

2. 문자열 연결 || Oracle은 '||'을 사용하여 문자열을 연결할 수 있지만 MySQL은 concat() 함수를 통해 문자열을 연결할 수 있습니다.

  Oracle의 a.studentname||'['||a.studentno||']'는 MySQL의 concat(a.studentname, '[', a.studentno, ']')

3과 동일합니다. +                                –   Oracle은 rownum을 통해 처음 n개의 레코드를 얻을 수 있고 MySQL은 처음 n개의 레코드를 얻기 위해 제한을 사용하지만 두 가지의 쓰기 방법은 Oracle에서 where 조건의 일부로 약간 다릅니다. MySQL, 제한은 where 조건이 아닙니다.

-- rownum语法如下:
SELECT * FROM XJ_STUDENT WHERE ROWNUM = 1; -- 查询第一条数据
SELECT * FROM XJ_STUDENT WHERE ROWNUM <= 10; -- 获取前10条数据
-- 但rownum不支持查询后几条或第n(n>1)条数据,例如以下sql是不支持的
SELECT * FROM XJ_STUDENT WHERE ROWNUM > 2;
SELECT * FROM XJ_STUDENT WHERE ROWNUM = 3;

-- limit 语法如下:
SELECT * from fw_department limit 3; -- 查询前3条数据
SELECT * from fw_department limit 2, 4; -- 从第2(序号从0开始)条开始,查4条记录

4. Null 데이터 정렬(null이 먼저, null이 마지막)

-- null值排在最前
SELECT * FROM FW_DEPARTMENT A ORDER BY A.REMARK DESC NULLS FIRST
-- null值排在最后
SELECT * FROM FW_DEPARTMENT A ORDER BY A.REMARK DESC NULLS LAST
 
-- MySQL 可通过IF和ISNULL函数达到相同的效果
-- null值排在最后
select * from FW_DEPARTMENT A order by IF(ISNULL(A.REMARK),1,0),A.REMARK desc
-- null值排在最前
select * from FW_DEPARTMENT A order by IF(ISNULL(A.REMARK),0,1),A.REMARK desc

5. 테이블(왼쪽/오른쪽) 연결(+)

Oracle 왼쪽 조인 및 오른쪽 조인은 (+)를 사용하여 구현할 수 있습니다. . MySQL은 왼쪽 조인, 오른쪽 조인 및 기타 키워드만 사용할 수 있습니다.

-- Oracle 左关联
select * from taba, tabb where taba.id = tabb.id(+);
-- Oracle 右关联
select * from taba, tabb where taba.id(+) = tabb.id;
-- MySQL 左关联
select * from taba left join tabb on taba.id=tabb.id;
-- MySQL 右关联
select * from taba right join tabb on taba.id=tabb.id;
6. 삭제 구문

MySQL의 삭제 구문은 Oracle만큼 임의적이지 않습니다. 예를 들어 다음 SQL은 Oracle에서는 실행될 수 있지만 MySQL에서는 실행될 수 없습니다.

-- Oracle 可执行,但MySQL中不能执行
DELETE FROM FW_DEPARTMENT A WHERE A.DEPID = '111';
DELETE FW_DEPARTMENT WHERE DEPID = '111';
-- MySQL中删除语句格式如下:
DELETE FROM FW_DEPARTMENT WHERE DEPID = '111';
7. 재귀 쿼리(사전 연결로 시작)

MySQL은 이러한 종류의 재귀 쿼리(사전 연결로 시작)를 지원하지 않지만 사용자 정의 함수를 통해 구현할 수 있습니다.

-- Oracle 递归查询 查询部门ID为‘1111’的所有子部门(包含自身)
SELECT *
FROM FW_DEPARTMENT
START WITH DEPID=&#39;1111&#39;
CONNECT BY PRIOR DEPID = PARENTDEPID;
-- Oracle 递归查询 查询部门ID为‘1111’的所有父部门(包含自身)
SELECT *
FROM FW_DEPARTMENT
START WITH DEPID=&#39;1111&#39;
CONNECT BY PRIOR PARENTDEPID = DEPID;

-- MySQL 先创建fun_getDepIDList函数,用于查询部门ID字符串
CREATE FUNCTION fun_getDepIDList(rootId VARCHAR(32))
RETURNS VARCHAR(6000)
BEGIN 
	DECLARE pTemp VARCHAR(6000);
	DECLARE cTemp VARCHAR(6000);
	SET pTemp=&#39;$&#39;;
	SET cTemp=rootId;
	WHILE cTemp is not null DO
		set pTemp=CONCAT(pTemp,&#39;,&#39;,cTemp);
		SELECT GROUP_CONCAT(depid) INTO cTemp from fw_department
		WHERE FIND_IN_SET(PARENTDEPID,cTemp)>0;
	END WHILE;
	RETURN pTemp;
END;

-- 查询部门ID为‘1111’的所有子部门(包含自己)
select * from fw_department
where FIND_IN_SET(DEPID, fun_getDepIDList(&#39;1111&#39;));

-- 查询部门ID为‘1111’的所有父部门(包含自己)
select * from fw_department
where FIND_IN_SET(&#39;1111&#39;, fun_getDepIDList(DEPID));

8. merge into

MySQL은 병합을 지원하지 않지만 제공된 대체 키 업데이트와 중복 키 업데이트를 통해 비슷한 기능을 수행할 수 있습니다.

-- Oracle merge into (有则修改,无则新增)
MERGE INTO TMPDEPTAB A
USING (SELECT &#39;1111&#39; DEPID, &#39;哈哈&#39; DEPNAME FROM DUAL) B
ON (A.DEPID = B.DEPID)
WHEN MATCHED THEN 
	UPDATE SET A.DEPNAME = B.DEPNAME
WHEN NOT MATCHED THEN 
	INSERT(DEPID, DEPNAME) VALUES(B.DEPID, B.DEPNAME);

-- MySQL replace into (特点:1、先删后增; 2、插入/更新的表必须有主键或唯一索引;
-- 3、未修改/新增的数据项,如果必填,则必须有默认值)
-- 1、由于是先删后增,所以需要满足以下2个条件之一:
--      1.要么必填项有默认值; 
--      2.要么插入/更新时为没有默认值的必填项赋值, 否则新增时会报错。
-- 2、表中需要有主键或唯一索引,否则下面语句如果执行多次,表中会出现重复数据。
replace into fw_department(DEPID,PARENTDEPID,DEPNO,DEPNAME) 
values(&#39;1111111&#39;, &#39;1234&#39;,&#39;123&#39;, &#39;哈哈&#39;);

-- MySQL on duplicate key update (特点:1、插入/更新的表必须有主键或唯一索引;
-- 2、未修改/新增的数据项,如果必填,则必须有默认值)
insert into fw_department(depid,parentdepid,depno,depname)
select &#39;1111111&#39; depid, &#39;123&#39; parentdepid, &#39;e12&#39; depno, &#39;哈哈哈哈&#39; depname
from fw_department
on duplicate key 
update parentdepid = values(parentdepid),
	depno=values(depno),
	depname=values(depname);

9. with

Oracle은 with를 사용하여 임시 테이블을 구축할 수 있지만 MySQL은 with를 지원하지 않습니다. 해당 임시 테이블에 대해 MySQL은 괄호를 통해 처리할 수 있지만 구축된 임시 테이블을 설정해야 합니다. 임시 테이블 이름으로.

-- Oracle with使用
WITH TMPTAB AS (
	SELECT A.DEPID FROM FW_DEPARTMENT A
)
SELECT DEPID
FROM TMPTAB

-- MySQL 构建临时表使用(此处必须给括号中的临时表设置表名)
select b.depid
from (
	select depid
	from fw_department
) b
【관련 추천:

mysql 비디오 튜토리얼

위 내용은 데이터베이스 oracle과 mysql의 구문 차이점은 무엇입니까의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.