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、

相关推荐
Hacker_LaoYi25 分钟前
SQL注入的那些面试题总结
数据库·sql
Hacker_LaoYi2 小时前
【渗透技术总结】SQL手工注入总结
数据库·sql
独行soc2 小时前
#渗透测试#漏洞挖掘#红蓝攻防#护网#sql注入介绍06-基于子查询的SQL注入(Subquery-Based SQL Injection)
数据库·sql·安全·web安全·漏洞挖掘·hw
独行soc4 小时前
#渗透测试#漏洞挖掘#红蓝攻防#护网#sql注入介绍08-基于时间延迟的SQL注入(Time-Based SQL Injection)
数据库·sql·安全·渗透测试·漏洞挖掘
White_Mountain4 小时前
在Ubuntu中配置mysql,并允许外部访问数据库
数据库·mysql·ubuntu
百度智能云技术站5 小时前
广告投放系统成本降低 70%+,基于 Redis 容量型数据库 PegaDB 的方案设计和业务实践
数据库·redis·oracle
老王笔记5 小时前
GTID下复制问题和解决
mysql
清平乐的技术专栏5 小时前
Hive SQL 查询所有函数
hive·hadoop·sql
Lojarro6 小时前
【Spring】Spring框架之-AOP
java·mysql·spring
梦想平凡6 小时前
PHP 微信棋牌开发全解析:高级教程
android·数据库·oracle