ホームページ > データベース > mysql チュートリアル > データベースoracleとmysqlの構文の違いは何ですか

データベースoracleとmysqlの構文の違いは何ですか

青灯夜游
リリース: 2021-12-21 13:37:16
オリジナル
26029 人が閲覧しました

違い: 1. MySQL には Number 型がありませんが、Oracle にはあります; 2. MySQL の Date 型は日付のみを表し、Oracle の Date 型は日付と時刻を表します; 3. 長さを取得するには文字列の場合、Oracle は length() を使用し、MySQL は char_length() を使用します。

データベースoracleとmysqlの構文の違いは何ですか

このチュートリアルの動作環境: Windows7 システム、mysql8 バージョン、Dell G3 コンピューター。

最近、プロジェクトを移行し、データベースを Oracle から MySQL に変更する必要があります。両者の構文は一部異なるため、Oracle では使用できて MySQL では使用できない関数/型を、MySQL で使用できる関数/型に変更する必要があります。

1. データ型

1. 数値型

には数値型がありません。 MySQL には int/Decimal 型があり、Oracle の Number(5,1) は MySQL の decimal(5,1) に対応し、Number(5) は int(5) に対応します。

MySQL には多くの数値型があり、tinyint、smallint、mediumint、bigint およびその他の型を含む、より詳細なカテゴリに分類されます

2. Varchar2(n) 型

MySQL の Oracle Varchar2(n) 型に対応する代替型は、varchar(n) 型です。

3. 日付型

MySQL の日付と時刻の型には、Date、Time、Datetime などの型が含まれます。MySQL の Date 型は、日付 (年) のみを表します。 -month-day )、Time 型は時刻 (時:分:秒) のみを表しますが、Datetime 型は日付と時刻 (年-月-日 時:分:秒) を表します。Oracle の Date 型は、 MySQL の日時型。

2. 関数

1. length(str) 関数

Oracle での長さ ( str) は文字列の長さを取得する関数で、MySQL での対応する関数は char_length(str) です。

2. sys_guid() 関数

Oracle は sys_guid() 関数を使用してランダム シーケンスを生成でき、MySQL は UUID() を通じてランダム シーケンスを生成できます。

3. 時刻フォーマット関数

時刻を文字列時刻に変換します。 MySQL date_format(NOW(),'%Y-%m-%d') Oracle の to_char に対応します。 (sysdate, 'YYYY-MM-DD');

文字列時刻を時刻型に変換する MySQL str_to_date('2019-01-01','%Y-% m-%d') は to_date( '2019-01-01', 'YYYY-MM-DD');時、分、秒の関数変換を含む Oracle の

: 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) です。

DECODE(value, val1, val2, val3): value が val1 と等しい場合は val2 を返し、それ以外の場合は val3 を返します。MySQL は IF 関数で表すことができます: if (value=val1, val2, val3) ;

DECODE(value, if1, val1, if2,val2,...,ifn, valn, val): value が if1 と等しい場合は val1 を返し、value が if2 と等しい場合は value2 を返します。 .. value が ifn に等しい場合は valn を返し、それ以外の場合は val を返します。MySQL は、case when then else end;l、つまり、case when value=if1 then val1 when value=if2 then val2 を通じてこの種の判断を判断できます。 ,,when value=ifn then valn else val end;

5. trunc() function

TRUNC(12.123): 整数 (12) を返します; MySQL に対応function: truncate(12.123, 0) ;

TRUNC(12.123, 2): 戻り値は 2 を 10 進数として保持します (12.12); MySQL 対応関数: truncate(12.123, 2);

TRUNC(SYSDATE): 戻り値は (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; 浮動小数点数: DECIMAL; 整数: SIGNED; 符号なし整数: UNSIGNED)

6.to_char() to_number()

to_char(123): 数値を Convert 123 to string 123; MySQL の対応する関数は CAST(123 AS CHAR(3));

to_number('123'): を変換します。文字列番号 123 を数値型に変換します。MySQL の対応する関数は Cast('123' as SIGNED);

7.sysdate 現在の時刻

sysdate: 現在の日付と時刻を返します。MySQL の対応する関数は now();

3. その他

##1 . 引用符

MySQL は二重引用符と一重引用符を認識できますが、Oracle は一重引用符のみを認識します。

2. 文字列の連結 ||

Oracle は '||' を使用して文字列を接続できますが、MySQL は '||' 接続をサポートしません。MySQL では ' ||' で文字列を連結します。 concat() 関数は文字列を連結します。

Oracle の a.studentname||'['||a.studentno||']' は、MySQL の concat(a.studentname, '[', a.studentno, ']')

3. ROWNUM

Oracle は rownum を通じて最初の n レコードを取得でき、MySQL はlimit を通じて最初の n レコードを取得できますが、この 2 つの書き込み方法は少し異なります。 Oracle では、Rownum は where 条件の一部として使用されますが、MySQL では、limit は 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 では実行できますが、Oracle では実行できません。 MySQL。

-- Oracle 可执行,但MySQL中不能执行
DELETE FROM FW_DEPARTMENT A WHERE A.DEPID = &#39;111&#39;;
DELETE FW_DEPARTMENT WHERE DEPID = &#39;111&#39;;
-- MySQL中删除语句格式如下:
DELETE FROM FW_DEPARTMENT WHERE DEPID = &#39;111&#39;;
ログイン後にコピー

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 は (merge into) をサポートしていませんが、提供されている replace into と重複キー更新で同様の機能を実現できます。

-- 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 は with を使用できます。括弧を使用して処理しますが、構築される一時テーブルには一時テーブル名を設定する必要があります。

-- 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 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート