Heim  >  Artikel  >  Datenbank  >  Was ist der Syntaxunterschied zwischen Datenbank Oracle und MySQL?

Was ist der Syntaxunterschied zwischen Datenbank Oracle und MySQL?

青灯夜游
青灯夜游Original
2021-12-21 12:42:4425826Durchsuche

Unterschiede: 1. MySQL hat keinen Zahlentyp, Oracle jedoch schon. 2. Der Datumstyp in MySQL stellt nur das Datum dar, und der Datumstyp in Oracle stellt Datum und Uhrzeit dar. 3. Um die Länge einer Zeichenfolge zu ermitteln: Oracle verwendet length() und MySQL verwendet char_length() usw.

Was ist der Syntaxunterschied zwischen Datenbank Oracle und MySQL?

Die Betriebsumgebung dieses Tutorials: Windows7-System, MySQL8-Version, Dell G3-Computer.

Kürzlich muss ich das Projekt migrieren und die Datenbank von Oracle auf MySQL ändern. Da die Syntax zwischen den beiden teilweise unterschiedlich ist, ist es notwendig, die Funktionen/Typen, die in Oracle, aber nicht in MySQL verwendet werden können, in diejenigen zu ändern, die in MySQL verwendet werden können. Im Folgenden finden Sie eine Zusammenfassung einiger Syntaxunterschiede:

1. Datentyp

1. Zahlentyp

Es gibt keinen Zahlentyp in MySQL, aber in Oracle gibt es einen int/dezimalen Typ, der dezimal(5, 1) In MySQL entspricht Nummer (5) int(5).

Es gibt viele numerische Typen in MySQL, die in detailliertere Kategorien unterteilt sind, darunter Tinyint, Smallint, Mediumint, Bigint und andere Typen

2 Varchar2(n)-Typ

Der entsprechende Oracle Varchar2(n) Typ in MySQL Der alternative Typ ist der Typ varchar(n).

3. Datumstyp

Zu den Datums- und Zeittypen in MySQL gehören Datum, Uhrzeit, Datumszeit und andere Typen. Der Datumstyp in MySQL repräsentiert nur das Datum (Jahr-Monat-Tag) und der Zeittyp repräsentiert nur die Uhrzeit (Stunde: Minute: Sekunden), und der Datetime-Typ stellt Datum und Uhrzeit dar (Jahr-Monat-Tag Stunde:Minute:Sekunde). Der Date-Typ in Oracle stimmt mit dem Datetime-Typ in MySQL überein.

2. Funktion

1. Längenfunktion (str)

                                                     Verwendung mit char_length(str) in MySQL.

2. sys_guid()-Funktion

Oracle kann die sys_guid()-Funktion verwenden, um eine Zufallssequenz zu generieren, und MySQL kann eine Zufallssequenz über UUID() generieren.

3. Zeitformatierungsfunktion

Zeit in String-Zeit konvertieren MySQL date_format(NOW(),'%Y-%m-%d') entspricht to_char(sysdate, 'YYYY' in Oracle's Oracle) -MM- DD');

String-Zeit in Zeittyp MySQL konvertieren str_to_date('2019-01-01','%Y-%m-%d') entspricht to_date('2019-01) in Oracle -01', ' JJJJ-MM-TT');

                                                                                                                                                             Einschließlich Funktion zur Umrechnung von Stunden, Minuten und Sekunden: DATE_FORMAT(NOW(),'%Y-%m-%d %H:%i:%s'), str_to_date( '2019 -01-01','%Y-%m-%d %H:%i:%s').

4. Bedingte Funktionen (nvl(), nvl2(), decode())

nvl(tab.columnName, 0): Wenn der tab.columnName-Wert leer ist, ist der Rückgabewert 0, andernfalls ist er leer tab. ColumnName; die entsprechende MySQL-Funktion ist: ifnull(tab.columnName, 0).

     nvl2(expr1,expr2,expr3): Wenn expr1 nicht null ist, geben Sie expr2 zurück, andernfalls lautet die entsprechende MySQL-Funktion: if(expr1,expr2,expr3). (Dekodieren (Wert, Wert, Wert, Wert): Wenn Wert gleich Wert1 ist, wird Wert2 zurückgegeben, andernfalls wird Wert3 zurückgegeben; MySQL kann durch die if-Funktion dargestellt werden: if (Wert = Wert, Wert, Wert); , val1, if2 ,val2,...,ifn, valn, val): Wenn der Wert gleich if1 ist, gib val1 zurück, wenn der Wert gleich if2 ist, gib Wert2 zurück...Wenn der Wert gleich ifn ist, gib valn zurück, andernfalls gib val zurück; MySQL kann diese Art der Beurteilung anhand von case when then else end;l beurteilen, das heißt: case when value=if1 then val1 when value=if2 then val2,,,when value=ifn then valn else val end;

5 . trunc()-Funktion

                  TRUNC (12.123): Gibt eine Ganzzahl (12) zurück; entsprechende MySQL-Funktion: truncate(12.123, 2);  TRUNC (SYSDATE): der Rückgabewert ist (2019-07-26 00:00:00); die entsprechende Funktion für MySQL ist cast(now() as datetime): der Rückgabewert ist (2019-07-26 14:11:38); Die Syntax der Umwandlungsfunktion von MySQL lautet: CAST(xxx AS-Typ) (Die verfügbaren Typen sind: binär, mit der Wirkung des binären Präfixes: BINARY; Zeichentyp, kann sein. Parameter: CHAR(); Datum: DATE; Zeit: TIME; Datum und Zeittyp: DATETIME; Ganzzahl: SIGNED; vorzeichenlose Ganzzahl:

6 entsprechende Funktion in MySQL ist CAST(123 AS CHAR(3));

to_number('123'): Konvertieren Sie die Zeichenfolgennummer 123 in einen numerischen Typ in MySQL. ;

7. Systemdatum aktuelle Uhrzeit

                                                                                                                                                                                         Systemdatum:    Anführungszeichen.

2. String-Verkettung ||   Oracles a.studentname||'['||a.studentno||']' entspricht MySQLs concat(a.studentname, '[', a.studentno, ']')

3                                                                                                                                                 –   Oracle kann die ersten n Datensätze über Rownum abrufen, und MySQL verwendet Limit, um die ersten n Datensätze abzurufen, aber in Oracle wird Rownum als Teil der Where-Bedingung verwendet, während in MySQL, limit ist kein Where-Teil.

-- 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. Nulldatensortierung (Nullen zuerst und Nullen zuletzt)

-- 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. Tabellenassoziation (links/rechts)

Oracle Left Join und Right Join können mit (+) implementiert werden. . MySQL kann nur Left-Join, Right-Join und andere Schlüsselwörter verwenden.

-- 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. Die Löschsyntax von MySQL ist nicht so willkürlich wie die von Oracle. Beispielsweise kann die folgende SQL in Oracle ausgeführt werden, aber nicht in 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. Rekursive Abfrage (beginnen mit connect by prior)

MySQL unterstützt diese Art der rekursiven Abfrage (beginnen mit connect by prior), sie kann jedoch über eine benutzerdefinierte Funktion implementiert werden.

-- 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. Zusammenführen in

MySQL unterstützt nicht (Zusammenführen in), aber das bereitgestellte Ersetzen in und bei der Aktualisierung eines doppelten Schlüssels kann ähnliche Funktionen erreichen.

-- 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 kann with zum Erstellen einer temporären Tabelle verwenden, MySQL unterstützt jedoch nicht with. Für die entsprechende temporäre Tabelle kann MySQL dies über Klammern verarbeiten, die erstellte temporäre Tabelle muss jedoch eingerichtet werden mit einem temporären Namen.

-- 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

【Verwandte Empfehlung: MySQL-Video-Tutorial

Das obige ist der detaillierte Inhalt vonWas ist der Syntaxunterschied zwischen Datenbank Oracle und MySQL?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn