違い: 1. MySQL には Number 型がありませんが、Oracle にはあります; 2. MySQL の Date 型は日付のみを表し、Oracle の Date 型は日付と時刻を表します; 3. 長さを取得するには文字列の場合、Oracle は length() を使用し、MySQL は char_length() を使用します。
このチュートリアルの動作環境: 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 = '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='1111' CONNECT BY PRIOR DEPID = PARENTDEPID; -- Oracle 递归查询 查询部门ID为‘1111’的所有父部门(包含自身) SELECT * FROM FW_DEPARTMENT START WITH DEPID='1111' 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='$'; SET cTemp=rootId; WHILE cTemp is not null DO set pTemp=CONCAT(pTemp,',',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('1111')); -- 查询部门ID为‘1111’的所有父部门(包含自己) select * from fw_department where FIND_IN_SET('1111', fun_getDepIDList(DEPID));
8. merge into
MySQL は (merge into) をサポートしていませんが、提供されている replace into と重複キー更新で同様の機能を実現できます。
-- Oracle merge into (有则修改,无则新增) MERGE INTO TMPDEPTAB A USING (SELECT '1111' DEPID, '哈哈' 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('1111111', '1234','123', '哈哈'); -- MySQL on duplicate key update (特点:1、插入/更新的表必须有主键或唯一索引; -- 2、未修改/新增的数据项,如果必填,则必须有默认值) insert into fw_department(depid,parentdepid,depno,depname) select '1111111' depid, '123' parentdepid, 'e12' depno, '哈哈哈哈' 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 サイトの他の関連記事を参照してください。