case when

条件:语法是通用的

 
CASE  
    WHEN condition1 THEN result1  
    WHEN condition2 THEN result2  
    ...  
    ELSE default_result  
END
    

示例

 
SELECT employee_id, salary,  
CASE   
    WHEN salary < 3000 THEN 'Low'  
    WHEN salary BETWEEN 3000 AND 7000 THEN 'Medium'  
    WHEN salary > 7000 THEN 'High'  
    ELSE 'Unknown'  
END AS salary_level  
FROM employees;

SELECT name, salary,  
CASE   
    WHEN salary >= 5000 THEN 'T1'  
    WHEN salary >= 4000 THEN 'T2'  
    WHEN salary >= 3000 THEN 'T3'  
    WHEN salary >= 2000 THEN 'T4'  
    ELSE 'T5'  
END AS salary_level  
FROM staff;

KV:语法是通用的

 
CASE column_name  
    WHEN value1 THEN result1  
    WHEN value2 THEN result2  
    ...  
    ELSE default_result  
END
    

 

    

 

    

 


 

  

 


decode

DECODE函数主要是Oracle数据库中的功能,而不是MySQL的

 
DECODE函数是Oracle数据库中的一种条件表达式函数,用于执行条件判断并返回对应的结果
    
DECODE(expr, search1, result1, [search2, result2, ...], default)

 
SELECT employee_name, 
    DECODE(gender, 0, 'Female', 1, 'Male', 'Unknown') AS gender 
FROM employees;
    

 

    

替代方案

 
CASE语句:MySQL中的CASE语句是一种条件表达式,
可以根据不同的条件返回不同的值,可以用来模拟DECODE函数的功能。

SELECT column1, 
    CASE column2 
    WHEN search_value1 THEN result1 
    WHEN search_value2 THEN result2 
    ELSE default_result END AS result 
FROM table;
    

 

    

 

    

 


 

  

 


instr

 
INSTR函数既存在于Oracle数据库中,也存在于MySQL数据库中,是一个用于查找字符串中某个子字符串位置的函数。尽管这两个数据库系统都支持INSTR函数,但它们的具体语法和用法可能略有不同。以下是对Oracle和MySQL中INSTR函数的详细比较和归纳:

Oracle中的INSTR函数
基本语法:
格式1:INSTR(string1, string2)
格式2:INSTR(string1, string2, [start_position, [nth_appearance]])
其中,string1是源字符串,string2是要查找的子字符串,start_position是可选参数,表示开始查找的位置(默认为1),nth_appearance也是可选参数,表示要查找的子字符串的第几次出现(默认为1)。
返回值:
返回一个整数,表示子字符串在源字符串中的位置(位置计数从1开始)。
示例:
SELECT INSTR('helloworld', 'l') FROM DUAL; 返回结果:3(默认第一次出现“l”的位置)
SELECT INSTR('helloworld', 'l', 2, 2) FROM DUAL; 返回结果:4(从第2个字符开始,查找第二次出现的“l”的位置)


 

    

 

    

 
MySQL中的INSTR函数
基本语法:
格式1:INSTR(str, substr)
格式2:INSTR(str, substr, pos, occurence)
其中,str是要搜索的字符串,substr是要查找的子字符串,pos是可选参数,表示搜索的起始位置(默认为1),occurence也是可选参数,表示要查找的子字符串的第几次出现(默认为1)。
返回值:
返回一个整数,表示子字符串在原字符串中的位置(位置计数从1开始)。
示例:
SELECT INSTR('helloworld', 'l') FROM DUAL; 返回结果:3(默认第一次出现“l”的位置)
SELECT INSTR('helloworld', 'l', 2, 2) FROM DUAL; 返回结果:4(从第2个字符开始,查找第二次出现的“l”的位置)
总结
共性:Oracle和MySQL的INSTR函数都用于查找字符串中子字符串的位置,并返回该位置(从1开始计数)。
差异:尽管基本功能和用法相似,但具体语法细节(如参数名称和默认值)可能略有不同。在实际使用中,应参考各自数据库系统的官方文档。
综上所述,INSTR函数既是Oracle数据库的,也是MySQL数据库的,但使用时应注意各自的具体语法和用法。
    
    

 


 


格式1:INSTR(str, substr)

 
此用法完全一致 

 

  

 


row_number() over

 
ROW_NUMBER() OVER (PARTITION BY id ORDER BY org DESC) 是SQL标准的一部分,并且在多个数据库系统中都得到了支持,包括Oracle和MySQL。这个语法用于生成一个唯一的序号,该序号是根据PARTITION BY子句中指定的列(在这个例子中是id)进行分区,并在每个分区内根据ORDER BY子句中指定的列(在这个例子中是org,且以降序排列)进行排序后得到的。

Oracle:Oracle数据库完全支持这种语法,
并广泛使用窗口函数(包括ROW_NUMBER())来执行复杂的查询和分析。

MySQL:从MySQL 8.0开始,MySQL也支持窗口函数,包括ROW_NUMBER()。
在MySQL 8.0之前的版本中,需要使用变量或其他复杂的查询技巧来模拟这种功能。

mysql示例

按partition by指定的字段分组,并对每一组数据按1,2,3,...编号

 
select student_id,
    row_number() over(partition by student_id order by sumbit_data desc) RN 
from students;
    

 

    

 
SELECT  
    o1.customer_id,  
    o1.order_date  
FROM  
    orders o1  
LEFT JOIN orders o2  
    ON o1.customer_id = o2.customer_id AND o1.order_date > o2.order_date  
WHERE  
    o2.order_date IS NULL;
    

 
这个查询通过左连接orders表自身(别名为o1和o2),
其中o1表代表当前正在考虑的订单,而o2表代表同一客户的其他订单。

连接条件是这两个订单属于同一客户,并且o1的订单日期晚于o2的订单日期。
然后,在WHERE子句中,
我们筛选出那些没有比自身更早的订单(即o2.order_date IS NULL)的订单,
这实际上就是每个客户的第一个订单。

具有更广泛的兼容性

 

    

 
如果是oracle向mysql的迁移,因为mysql本身性能不如oracle,
数据库量越大越明显,可以考虑使用其他方案替换

 
在比较方法1(使用窗口函数)和方法2(使用子查询和自连接)的性能时,通常方法1(窗口函数)在处理大数据集和复杂查询时会有更好的性能。这是因为窗口函数是SQL标准的一部分,并且在现代数据库系统中得到了高度优化。

方法1(窗口函数)的优势:
优化:数据库系统通常会对窗口函数进行优化,因为它们在现代SQL中非常常见且重要。这些优化可能包括减少数据扫描次数、更有效的内存使用和更快的计算速度。
直接性:窗口函数直接表达了你的查询意图,即“对于每个分组,我需要第一个元素”。这种直接性有助于数据库查询优化器生成更有效的执行计划。
易于理解和维护:对于熟悉SQL的人来说,窗口函数通常比复杂的子查询和自连接更容易理解和维护。

方法2(子查询和自连接)的潜在问题:
数据重复扫描:在自连接中,数据库可能需要多次扫描同一表,尤其是在处理大数据集时,这会导致性能下降。
复杂性:复杂的子查询和自连接可能更难于理解和维护,特别是在查询变得非常复杂时。
优化限制:尽管数据库查询优化器会尝试优化子查询和自连接,但它们可能不如优化窗口函数那样高效。

实际应用中的考虑:
数据库版本:如果你使用的是MySQL 8.0或更高版本,那么你应该优先考虑使用窗口函数,因为它们提供了更好的性能和更清晰的查询语法。
数据量:对于小型数据集,两种方法之间的性能差异可能不明显。然而,在处理大型数据集时,窗口函数的性能优势将更加明显。
查询复杂性:如果你的查询非常复杂,并且涉及到多个窗口函数和复杂的分组逻辑,那么使用窗口函数可能会使查询更易于理解和维护。
综上所述,如果你正在使用支持窗口函数的数据库系统(如MySQL 8.0及以上版本),并且希望获得更好的性能和更清晰的查询语法,那么你应该优先考虑使用方法1(窗口函数)。


 


 

  

 


to_date

 
SELECT TO_DATE('2023-04-01 01:01:01', 'yyyy-mm-dd hh24:mi:ss') FROM DUAL;
    

 

    

 

    

 
SELECT STR_TO_DATE('2023-04-01 01:01:01', '%Y-%m-%d %H:%i:%s') AS converted_date;
    

 


 


 


 

  

 


to_number

 
在MySQL中,并没有直接对应于Oracle中TO_NUMBER函数的内置函数。
然而,你可以通过其他方式来实现将字符串转换为数字类型的功能,这
在处理数据导入、数据转换以及数据分析等场景中非常有用。
以下是几种在MySQL中替代TO_NUMBER函数的方法:

    

 
SELECT CAST('123' AS SIGNED) AS num_int; -- 转换为有符号整数  
SELECT CAST('123.45' AS DECIMAL(5,2)) AS num_decimal; -- 转换为定点数,保留两位小数

SELECT CONVERT('123', SIGNED) AS num_int; -- 转换为有符号整数

通用替换方法:隐匿转换

 
select '1.33' + 0.0 from table_name;

该方式不管是oracle还是Mysql,都会将字符串隐式转换为数字
    

 

    

 


 

  

 


参考文章
    Oracle用户密码过期,修改永不过期