oracle和mysql的区别常用的sql语句

当然可以!以下是一些常见的 Oracle 和 MySQL 之间的 SQL 语法差异示例:

1. 字符串连接

Oracle:

sql 复制代码
SELECT 'Hello' || ' ' || 'World' AS greeting FROM dual;

MySQL:

sql 复制代码
SELECT CONCAT('Hello', ' ', 'World') AS greeting;

2. 日期函数

Oracle:

sql 复制代码
SELECT TO_DATE('2024-10-30', 'YYYY-MM-DD') AS date_value FROM dual;

MySQL:

sql 复制代码
SELECT STR_TO_DATE('2024-10-30', '%Y-%m-%d') AS date_value;

3. 处理空值

Oracle:

sql 复制代码
SELECT NVL(column_name, 'default_value') AS value FROM table_name;

MySQL:

sql 复制代码
SELECT COALESCE(column_name, 'default_value') AS value FROM table_name;

4. 行号生成

Oracle:

sql 复制代码
SELECT ROWNUM AS row_number, column_name FROM table_name;

MySQL:

sql 复制代码
SELECT @rownum := @rownum + 1 AS row_number, column_name 
FROM table_name, (SELECT @rownum := 0) AS r;

5. CASE 表达式

Oracle:

sql 复制代码
SELECT 
  CASE 
    WHEN status = 'A' THEN 'Active' 
    WHEN status = 'I' THEN 'Inactive' 
  END AS status_description 
FROM table_name;

MySQL:

sql 复制代码
SELECT 
  CASE 
    WHEN status = 'A' THEN 'Active' 
    WHEN status = 'I' THEN 'Inactive' 
  END AS status_description 
FROM table_name;

(注意:CASE 语法在两个数据库中基本相同。)

6. 插入语句

Oracle:

sql 复制代码
INSERT INTO table_name (column1, column2) VALUES (value1, value2);

MySQL:

sql 复制代码
INSERT INTO table_name (column1, column2) VALUES (value1, value2);

(插入语法相同,但 MySQL 允许多行插入。)

7. 获取当前日期和时间

Oracle:

sql 复制代码
SELECT SYSDATE AS current_date FROM dual;

MySQL:

sql 复制代码
SELECT NOW() AS current_date;

8. 创建序列

Oracle:

sql 复制代码
CREATE SEQUENCE my_sequence START WITH 1 INCREMENT BY 1;

MySQL :

MySQL 8.0 及以上版本支持序列:

sql 复制代码
CREATE SEQUENCE my_sequence START WITH 1 INCREMENT BY 1;

在较旧版本中,通常用 AUTO_INCREMENT 来处理。

实战版本:

oracle

sql 复制代码
SELECT
  ROWNUM AS  "序号",
  TO_CHAR( runtime.cleardate, 'YYYY-MM-DD' ) AS "结算日期",
  firm.firmid AS "会员编号",
  firm.name AS "会员名称",
  runtime.totalfund AS "设定金额",
  runtime.tohandlefund AS "余额",
CASE
    
    WHEN NVL( runtime.totalfund, 0 ) = 0 THEN
    '0.00%' ELSE TO_CHAR( ROUND( ( runtime.tohandlefund / runtime.totalfund ) * 100, 2 ) ) || '%' 
  END AS "待返还比例",
CASE
    
    WHEN runtime.status = 0 THEN
    '暂停' 
    WHEN runtime.status = 1 THEN
    '正常' 
  END AS "状态" 
FROM
  m_firm firm,
  T_REBATE_RUNTIME_h runtime 
WHERE
  runtime.firmid = firm.firmid;

这个是oracle的sql,在mysql中是如何的

sql 复制代码
SELECT 
  @rownum := @rownum + 1 AS "序号",
  DATE_FORMAT(runtime.cleardate, '%Y-%m-%d') AS "结算日期",
  firm.firmid AS "会员编号",
  firm.name AS "会员名称",
  runtime.totalfund AS "设定金额",
  runtime.tohandlefund AS "余额",
  CASE
    WHEN COALESCE(runtime.totalfund, 0) = 0 THEN '0.00%' 
    ELSE CONCAT(ROUND((runtime.tohandlefund / runtime.totalfund) * 100, 2), '%') 
  END AS "待返还比例",
  CASE
    WHEN runtime.status = 0 THEN '暂停' 
    WHEN runtime.status = 1 THEN '正常' 
  END AS "状态" 
FROM
  m_firm firm,
  T_REBATE_RUNTIME_h runtime,
  (SELECT @rownum := 0) AS r
WHERE
  runtime.firmid = firm.firmid;

关键修改点:

  1. 序号生成

    • 使用 MySQL 的用户定义变量 @rownum 来生成序号。
  2. 日期格式化

    • 使用 DATE_FORMAT 代替 TO_CHAR
  3. 空值处理

    • 使用 COALESCE 函数代替 Oracle 的 NVL
  4. 字符串拼接

    • 使用 CONCAT 来拼接字符串。
      下面关于这个oracle的几个问题和解释?

1、WHEN NVL(runtime.totalfund, 0) = 0 THEN '0.00%'什么意思?
WHEN NVL(runtime.totalfund, 0) = 0 THEN '0.00%' 是 SQL 中的一个条件表达式,意思是:

  • NVL(runtime.totalfund, 0):这个函数会检查 runtime.totalfund 的值。如果它为 NULL,就返回 0。这样可以避免在计算中遇到空值的问题。
  • = 0:检查这个值是否等于 0
  • THEN '0.00%':如果条件为真(即 runtime.totalfundNULL0),则返回字符串 '0.00%'

这个逻辑的目的是确保在 totalfund0 时,比例的显示值是 0.00%,而不是进行除法运算可能导致的错误或 NULL 值。这样可以让输出更清晰和用户友好。


2、ELSE TO_CHAR(ROUND((runtime.tohandlefund / runtime.totalfund) * 100, 2)) || '%'这个是什么意思?
ELSE TO_CHAR(ROUND((runtime.tohandlefund / runtime.totalfund) * 100, 2)) || '%' 的意思是:

  1. 计算比例(runtime.tohandlefund / runtime.totalfund) * 100:这一部分计算 tohandlefundtotalfund 的比率,并乘以 100 将其转换为百分比形式。

  2. 四舍五入ROUND(..., 2):这一部分将计算得到的百分比值四舍五入到小数点后两位。

  3. 格式化为字符串TO_CHAR(...):将四舍五入后的数值转换为字符串,以便后续可以与其他字符串连接。

  4. 连接百分号|| '%':将字符串形式的数字与 '%' 连接,形成最终的百分比格式字符串。

总的来说,这一行的作用是将比例计算结果格式化为一个带有百分号的字符串,例如 "75.00%",并在 totalfund 不为 0 的情况下返回该值。这样可以清晰地显示待返还比例。


3、这个runtime.status = '0'换成runtime.status = 0区别大吗?

在 SQL 中,runtime.status = '0'runtime.status = 0 的区别主要在于数据类型的比较:

  1. runtime.status = '0' :这里 status 被视为字符串(字符类型)。这意味着你在比较一个字符串类型的值与 '0' 这个字符串。

  2. runtime.status = 0 :这里 status 被视为数值(整数类型)。这意味着你在比较一个数值类型的值与 0 这个整数。

选择哪个

  • 如果 runtime.status 的数据类型是字符串,使用 runtime.status = '0' 是正确的。
  • 如果 runtime.status 的数据类型是整数,使用 runtime.status = 0 更合适。

影响

如果两者的数据类型不匹配,可能会导致查询结果不正确,或者在某些数据库中会引发错误。因此,建议确认 runtime.status 的实际数据类型后再决定使用哪一种比较方式。


4、 TO_CHAR( runtime.cleardate, 'YYYY-MM-DD' ) AS "结算日期",中的'YYYY-MM-DD'换成'YYYY-mm-DD'有什么影响或者换成'YYYY'是什么结果举个例子?

TO_CHAR 函数中,日期格式化字符串的大小写非常重要,具体影响如下:

  1. 'YYYY-MM-DD' :这表示四位年份、两位月份和两位日期。例如,如果 runtime.cleardate2024-10-30,结果将是 2024-10-30

  2. 'YYYY-mm-DD' :在这里,mm 被解释为分钟(minute),而不是月份(month)。所以如果你使用 YYYY-mm-DD,结果可能会不如预期。例如,2024-10-30 的输出将是 2024-30,其中 30 表示分钟,日期部分被省略。

  3. 'YYYY' :如果只使用 'YYYY',结果将只返回年份。例如,2024-10-30 的输出将是 2024

示例

假设 runtime.cleardate2024-10-30

  • 使用 'YYYY-MM-DD':输出为 2024-10-30
  • 使用 'YYYY-mm-DD':输出为 2024-30(不符合预期)
  • 使用 'YYYY':输出为 2024

因此,为了确保输出格式正确,应使用 'YYYY-MM-DD' 来表示年月日。


5、如果是转换成年月日,时分秒这种怎么处理啊?

要将日期时间转换为包含年月日、时分秒的格式,你可以使用 TO_CHAR 函数,并指定相应的格式字符串。例如,如果你想将 runtime.cleardate 转换为 YYYY-MM-DD HH24:MI:SS 格式,可以这样写:

sql 复制代码
TO_CHAR(runtime.cleardate, 'YYYY-MM-DD HH24:MI:SS') AS "结算日期时间"

格式说明:

  • YYYY:四位年份
  • MM:两位月份(01到12)
  • DD:两位日期(01到31)
  • HH24:24小时制的小时(00到23)
  • MI:分钟(00到59)
  • SS:秒(00到59)

示例

假设 runtime.cleardate 的值是 2024-10-30 14:35:22,使用上面的格式化字符串,结果将是:

复制代码
2024-10-30 14:35:22

如果你想使用12小时制,可以将 HH24 改为 HH,并可以添加 AMPM

sql 复制代码
TO_CHAR(runtime.cleardate, 'YYYY-MM-DD HH:MI:SS AM') AS "结算日期时间"

这样,结果可能是 2024-10-30 02:35:22 PM。根据需求选择合适的格式即可。


6、TO_CHAR(runtime.cleardate, 'YYYY-MM-DD HH:MI:SS AM')中的to_char中的第一个参数是什么类型的参数,能是时间戳吗?

TO_CHAR 函数中,第一个参数通常是一个日期或时间戳类型的数据。具体来说,它可以是:

  1. 日期类型(DATE):表示特定的日期和时间,通常包含年、月、日、时、分、秒。

  2. 时间戳类型(TIMESTAMP):表示特定的时间点,精确到纳秒,可以包含时区信息。

所以,你可以使用时间戳作为第一个参数。例如,如果 runtime.cleardate 是一个时间戳类型的字段,像这样使用是完全可以的:

sql 复制代码
TO_CHAR(runtime.cleardate, 'YYYY-MM-DD HH:MI:SS AM') AS "结算日期时间"

这将根据你指定的格式输出时间戳的内容。

示例

如果 runtime.cleardate 的值是 2024-10-30 14:35:22.123456(一个时间戳),输出将是:

复制代码
2024-10-30 02:35:22 PM

这样,你可以放心地使用时间戳作为参数。


7、mysql中的to_char函数给我好好解释一下

在 MySQL 中,TO_CHAR 函数并不存在,但可以使用其他函数来达到类似的效果。通常,我们使用 DATE_FORMAT 函数来格式化日期和时间。

DATE_FORMAT 函数

DATE_FORMAT 的语法如下:

sql 复制代码
DATE_FORMAT(date, format)
  • date :要格式化的日期或时间,可以是 DATEDATETIMETIMESTAMP 等类型。
  • format:格式字符串,指定输出的日期时间格式。

常用格式化符号

以下是一些常用的格式化符号:

  • %Y:四位年份
  • %y:两位年份
  • %m:两位月份(01到12)
  • %d:两位日期(01到31)
  • %H:24小时制的小时(00到23)
  • %i:分钟(00到59)
  • %s:秒(00到59)
  • %p:AM或PM

示例

假设有一个 DATETIME 类型的字段 cleardate,要将其格式化为 YYYY-MM-DD HH:MI:SS AM 的格式,可以这样写:

sql 复制代码
SELECT DATE_FORMAT(cleardate, '%Y-%m-%d %h:%i:%s %p') AS formatted_date
FROM your_table;

示例输出

如果 cleardate 的值是 2024-10-30 14:35:22,上面的查询将返回:

复制代码
2024-10-30 02:35:22 PM

注意事项

  • 24小时制与12小时制 :使用 %H 获取24小时制时间,而 %h 获取12小时制时间。
  • 日期类型:确保传入的日期类型正确,格式化字符串也要与之匹配。

总之,虽然 MySQL 没有 TO_CHAR 函数,但通过 DATE_FORMAT 你可以灵活地格式化日期和时间。

8、

相关推荐
不想写bug呀1 天前
MySQL索引介绍
数据库·mysql
北辰当尹1 天前
【小迪安全2023】day42 php应用&mysql架构&sql注入&跨库查询&文件读写&权限操作
mysql·安全·php
zhangxl-jc1 天前
Doris 窗口函数之 LEAD 最佳实践
大数据·sql·数据分析
陌上丨1 天前
假如不小心把数据库删了,请问应该怎么把数据恢复出来?
数据库·oracle
Yan.971 天前
SQLI靶场
sql
从天而降的扣篮1 天前
MySQL自动添加分区表的函数
数据库·mysql
悄悄敲敲敲1 天前
MySQL 事务
数据库·mysql
NineData1 天前
NineData 新增支持 Azure SQL Database > PolarDB PostgreSQL
数据库·sql·azure·数据库管理工具·ninedata·数据库迁移·数据库迁移工具
山峰哥1 天前
破解SQL性能瓶颈:索引优化核心策略
大数据·数据库·sql·oracle·编辑器·深度优先·数据库架构
Linux蓝魔1 天前
外网同步清华源mysql到内网搭建mysql源
数据库·mysql