Maison  >  Article  >  base de données  >  Quelle est la différence de syntaxe entre Oracle de base de données et MySQL

Quelle est la différence de syntaxe entre Oracle de base de données et MySQL

青灯夜游
青灯夜游original
2021-12-21 12:42:4425963parcourir

Différences : 1. MySQL n'a pas de type Number, mais Oracle en a ; 2. Le type Date dans MySQL représente uniquement la date, et le type Date dans Oracle représente la date et l'heure ; Oracle utilise length() et MySQL utilise char_length()etc.

Quelle est la différence de syntaxe entre Oracle de base de données et MySQL

L'environnement d'exploitation de ce tutoriel : système windows7, version mysql8, ordinateur Dell G3.

Récemment, j'ai besoin de migrer le projet et de changer la base de données d'Oracle vers MySQL. Étant donné que la syntaxe entre les deux est partiellement différente, il est nécessaire de remplacer les fonctions/types qui peuvent être utilisés dans Oracle mais pas dans MySQL par ceux qui peuvent être utilisés dans MySQL. Voici un résumé de certaines des différences de syntaxe :

1. Type de données

1. Type de nombre

Il n'y a pas de type Nombre dans MySQL, mais il y a un type int/décimal dans Oracle correspond à décimal(5, 1) dans MySQL, le numéro (5) correspond à int(5).

Il existe de nombreux types numériques dans MySQL, et ils sont divisés en catégories plus détaillées, notamment tinyint, smallint, mediumint, bigint et d'autres types

2 Type Varchar2(n)

L'Oracle Varchar2(n) correspondant. tapez dans MySQL Le type alternatif est le type varchar(n).

3. Type de date

Les types de date et d'heure dans MySQL incluent Date, Time, Datetime et d'autres types. Le type Date dans MySQL représente uniquement la date (année-mois-jour), et le type Time représente uniquement. l'heure (heure : minute : secondes) et le type Datetime représente la date et l'heure (année-mois-jour heure : minute : seconde). Le type Date dans Oracle est cohérent avec le type Datetime dans MySQL.

2. Fonction

1. fonction longueur (str)

                                                                    using using char_length (str).

2. Fonction sys_guid()

Oracle peut utiliser la fonction sys_guid() pour générer une séquence aléatoire, et MySQL peut générer une séquence aléatoire via UUID().

3. Fonction de formatage de l'heure

Convertir l'heure en chaîne d'heure MySQL date_format(NOW(),'%Y-%m-%d') correspond à to_char(sysdate, 'YYYY' dans Oracle d'Oracle) -MM- DD');

Convertir l'heure de la chaîne en type d'heure MySQL str_to_date('2019-01-01','%Y-%m-%d') correspond à to_date('2019-01) dans Oracle -01', ' AAAA-MM-JJ');

                                                                                                                                                               Y compris la fonction de conversion des heures, des minutes et des secondes : DATE_FORMAT(NOW(),'%Y-%m-%d %H:%i:%s'), str_to_date( '2019 -01-01','%Y-%m-%d %H:%i:%s').

4. Fonctions conditionnelles (nvl(), nvl2(), decode())

nvl(tab.columnName, 0) : Si la valeur tab.columnName est vide, la valeur de retour est 0, sinon elle est tab.colonneName ; la fonction MySQL correspondante est : ifnull(tab.columnName, 0).

     nvl2(expr1,expr2,expr3) : Si expr1 n'est pas nul, renvoie expr2, sinon renvoie expr3 la fonction MySQL correspondante est : if(expr1,expr2,expr3). (Décoder (valeur, valeur, valeur, valeur) : Si la valeur est égale à Val1, renvoie Val2, sinon Val3 est renvoyé ; mysql peut être représenté par la fonction if : if (valeur = valeur, valeur, valeur); , val1, if2 ,val2,...,ifn, valn, val) : Si la valeur est égale à if1, renvoie val1, si la valeur est égale à if2, renvoie valeur2...Si la valeur est égale à ifn, renvoie valn, sinon renvoie val ; MySQL peut juger ce type de jugement à travers case when then else end;l, c'est-à-dire : case when value=if1 then val1 when value=if2 then val2,,,when value=ifn then valn else val end;

5 . Fonction trunc()

                    TRUNC (12.123) : renvoie un entier (12) ; fonction MySQL correspondante : truncate (12.123, 0);   TRUNC (SYSDATE) : la valeur de retour est (2019-07-26 00:00:00) ; la fonction correspondante pour MySQL est cast(now() as datetime) : la valeur de retour est (2019-07-26 14:11:38) ; La syntaxe de la fonction cast de MySQL est : CAST(xxx AS type) (Les types disponibles sont : binaire, avec l'effet du préfixe binaire : BINARY ; type de caractère, peut être Paramètres : CHAR(); date : DATE ; heure : TIME ; date et type d'heure : DATETIME ; nombre à virgule flottante : DECIMAL ; entier : SIGNED ; entier non signé : UNSIGNED)

6. to_char() to_number()

to_char (123) : Convertissez le nombre 123 en une chaîne 123 ; la fonction correspondante dans MySQL est CAST(123 AS CHAR(3));

to_number('123') : Convertit la chaîne numéro 123 en un type numérique ; la fonction correspondante dans MySQL est cast('123' as SIGNED) ;

7. heure actuelle du système sysdate?                                                                                           sysdate :    guillemets.

2. Concaténation de chaînes || Oracle peut utiliser '||' pour connecter des chaînes, mais MySQL ne prend pas en charge la connexion '||'.

  Le a.studentname||'['||a.studentno||']' d'Oracle est équivalent au concat(a.studentname, '[', a.studentno, ']')

3 de MySQL.

                                                                                                                                                   –   Oracle peut obtenir les n premiers enregistrements via rownum, et MySQL utilise la limite pour obtenir les n premiers enregistrements. Cependant, les méthodes d'écriture des deux sont légèrement différentes dans Oracle, rownum est utilisé dans le cadre de la condition Where, while. dans MySQL, la limite n'est pas une partie de la condition 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条记录
E 空4. Les valeurs nulles en premier et les valeurs nulles en dernier)
-- 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. La table (gauche/droite) associée (+) ou la connexion Oracle gauche, droite peut être utilisée (+) pour implémenter MySQL ne peut utiliser que la jointure gauche. , jointure à droite et autres mots-clés.

-- 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. Syntaxe de suppression

La syntaxe de suppression de MySQL n'est pas aussi arbitraire que celle d'Oracle. Par exemple, le SQL suivant peut être exécuté dans Oracle, mais pas dans 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. Requête récursive (commencer par connecter par avant)

MySQL ne prend pas en charge cette requête récursive (commencer par connecter par avant), mais elle peut être implémentée via une fonction personnalisée.

-- 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. fusionner avec

MySQL ne prend pas en charge (fusionner avec), mais le remplacement fourni dans et lors de la mise à jour de clé en double peut réaliser des fonctions similaires.

-- 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 peut utiliser with pour créer une table temporaire, mais MySQL ne prend pas en charge with Pour la table temporaire correspondante, MySQL peut la gérer via des parenthèses, mais la table temporaire construite doit être configurée. avec un nom de table temporaire.

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

【Recommandations associées : tutoriel vidéo mysql

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn