当前位置: 首页 > article >正文

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

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

1. 字符串连接

Oracle:

SELECT 'Hello' || ' ' || 'World' AS greeting FROM dual;

MySQL:

SELECT CONCAT('Hello', ' ', 'World') AS greeting;

2. 日期函数

Oracle:

SELECT TO_DATE('2024-10-30', 'YYYY-MM-DD') AS date_value FROM dual;

MySQL:

SELECT STR_TO_DATE('2024-10-30', '%Y-%m-%d') AS date_value;

3. 处理空值

Oracle:

SELECT NVL(column_name, 'default_value') AS value FROM table_name;

MySQL:

SELECT COALESCE(column_name, 'default_value') AS value FROM table_name;

4. 行号生成

Oracle:

SELECT ROWNUM AS row_number, column_name FROM table_name;

MySQL:

SELECT @rownum := @rownum + 1 AS row_number, column_name 
FROM table_name, (SELECT @rownum := 0) AS r;

5. CASE 表达式

Oracle:

SELECT 
  CASE 
    WHEN status = 'A' THEN 'Active' 
    WHEN status = 'I' THEN 'Inactive' 
  END AS status_description 
FROM table_name;

MySQL:

SELECT 
  CASE 
    WHEN status = 'A' THEN 'Active' 
    WHEN status = 'I' THEN 'Inactive' 
  END AS status_description 
FROM table_name;

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

6. 插入语句

Oracle:

INSERT INTO table_name (column1, column2) VALUES (value1, value2);

MySQL:

INSERT INTO table_name (column1, column2) VALUES (value1, value2);

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

7. 获取当前日期和时间

Oracle:

SELECT SYSDATE AS current_date FROM dual;

MySQL:

SELECT NOW() AS current_date;

8. 创建序列

Oracle:

CREATE SEQUENCE my_sequence START WITH 1 INCREMENT BY 1;

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

CREATE SEQUENCE my_sequence START WITH 1 INCREMENT BY 1;

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

实战版本:
oracle

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中是如何的

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 格式,可以这样写:

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

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 是一个时间戳类型的字段,像这样使用是完全可以的:

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 的语法如下:

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 的格式,可以这样写:

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、


http://www.kler.cn/a/372912.html

相关文章:

  • AcWing 1303:斐波那契前 n 项和 ← 矩阵快速幂加速递推
  • 34. 在排序数组中查找元素的第一个和最后一个位置
  • Python毕业设计选题:基于协同过滤的校园音乐推荐系统小程序-django+uniapp
  • openpnp - 手工修改配置文件(元件高度,size,吸嘴)
  • JavaFx -- chapter05(多用户服务器)
  • 《DIY项目之“一只眼狗链”》:视频方案
  • 模块化CSS
  • 汽车零部件展|2025 第十二届广州国际汽车零部件加工技术及汽车模具展览会邀您共赏汽车行业盛会
  • 使用 Git 命令将本地项目上传到 GitLab
  • JVM 复习1
  • 修改IP分组头部内容的场景
  • 【部署与升级-会议签到的web安装】
  • c++应用网络编程之十三Linux下的epoll模式应用
  • 2D/3D医学图像配准算法
  • MongoDB-Plus
  • web前后端交互方式有哪些?
  • 在manjaro 2024里使用yay命令安装ROS2
  • Linux初阶——线程(Part2):互斥同步问题
  • Nginx 配置基于主机名的 Web 服务器
  • SpringBoot接收LocalDateTime参数
  • c++中的指针相关
  • [Linux关键词]unmask,mv,dev/pts,stdin stdout stderr,echo
  • 使用原生HTML和css制作一个箭头步骤条
  • 【Nas】X-DOC:Mac mini Docker部署小雅Alist
  • Vue v-on
  • Android 在github网站下载项目:各种很慢怎么办?比如gradle下载慢;访问github慢;依赖下载慢