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;
-- 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. 空數據排序(nulls first 和nulls last)
-- 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 左關聯 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. 刪除語法
-- 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. 遞歸查詢(start with connect by prior)
MySQL不支持(start with connect by prior)的這種遞歸查詢,但可以通過自定義函數來實現。
-- 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 和on duplicate key update可實現相似的功能。
-- 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