|
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;
----------------------------------------------------------------------
|
|
case K when V:语法是通用的
CASE column_name
WHEN value1 THEN result1
WHEN value2 THEN result2
...
ELSE default_result
END
|
|
|
|
|
|
|
|
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函数既存在于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”的位置)
SELECT INSTR('helloworld', 'h') FROM DUAL
- 1
|
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 (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(窗口函数)。 |
|
|
|
|
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;
|
|
|
|
|
|
|
在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,都会将字符串隐式转换为数字
|
db.select("select '1.23'+ '3' from dual")
|
|
|
|
|
|
|
Oracle用户密码过期,修改永不过期