首页 > 数据库 >mysql,PostgreSQL,Oracle数据库sql的细微差异(2) [whith as; group by; 日期引用]

mysql,PostgreSQL,Oracle数据库sql的细微差异(2) [whith as; group by; 日期引用]

时间:2025-01-11 12:05:00浏览次数:3  
标签:02 PostgreSQL mysql 查询 CTE 日期 2020 whith

sql示例(MySQL)

WITH

    temp1 AS (

        SELECT name AS results

        FROM Users u

        JOIN MovieRating m ON u.user_id = m.user_id

        GROUP BY m.user_id

        ORDER BY COUNT(*) DESC,left(name,1)

        LIMIT 1

    ),

    temp2 AS (

        SELECT title AS results

        FROM Movies m

        JOIN MovieRating r ON m.movie_id = r.movie_id

        WHERE r.created_at BETWEEN '2020-02-01' AND '2020-02-29'

        GROUP BY m.title

        ORDER BY AVG(r.rating) DESC, m.title ASC

        LIMIT 1

)

SELECT * FROM temp1

UNION ALL

SELECT * FROM temp2;

 这里使用了CTE,即WITH子句中定义的临时表,temp1temp2 是临时的结果集,它们在 WITH 子句后面被创建,并在主查询中被引用,SELECT * FROM temp1 这部分被称作查询块(query block)或者查询语句(query statement)。

易犯的书写错误:

结果集缺乏( )括号 ; 

结果集之间缺失逗号; 

查询块的表名写错;

错写无效日期: 比如'2020-02-30',在 SQL 中,日期值必须有效。2 月并没有 31 日,这是一个无效的日期

whith  as

在oracle,mysql中,不允许在 CTE 内部使用 ORDER BY/LIMIT 组合,如果你需要在 CTE 中限制结果集,考虑使用子查询或者在 CTE 外部应用 LIMIT,

PostgreSQL可以,但是在多次引用 CTE 时,ORDER BY 的顺序不一定会被保留。此外,CTE 在 PostgreSQL 中总是被物化,这意味着它们的结果集会被实际存储,而不是仅仅作为一个临时的查询结果。这可能会导致性能问题,特别是当处理大量数据时.

解决方案:

  1. 在 CTE 外部使用 LIMIT

  2. 使用窗口函数,如 ROW_NUMBER(),来为每行分配一个唯一的序号,然后在 CTE 外部的查询中使用这个序号来限制结果集

  3.  PostgreSQL( 9.4 及以上版本),Oracle (12c 及以上版本) 可以在 CTE 中使用 FETCH FIRST 子句来限制结果集的大小

group by 

oracle和PostgreSQL里面,出现group by分组,则select 后的必须是聚合函数,或者在group by里出现的分组字段

在mysql没有这方面的要求 (上面的示例的temp1里面name)

日期格式

3个数据库都使用都使用单引号引用字符字面量

不同: mysql比较宽松,哪怕使用了双引号,日期格式正确也可以识别;

        oracle和PostgreSQL,对于字符字面量的引用只能是单引号;  

关于字面量的引用(3个数据库)

  • 字符串字面量(包括纯英文和中文)使用单引号。
  • 日期字面量使用单引号。
  • 数字字面量无需。

补充

标识符的引用:

oracle/PostgreSQL-----双引号" "

mysql-----反引号``

标识符:数据库对象,比如表名,列名,存储过程

避免日期的隐式转换

'2020-02-01'

oracle 用 to_date('日期','YYYY-MM-DD')

TO_DATE('2020-02-01', 'YYYY-MM-DD')

PostgreSQL 用  ::date 

'2020-02-01'::date

建议:

始终使用单引号来定义日期字符串,可以确保你的代码在不同的数据库系统中具有更好的可移植性和可读性。

日期存在隐式转换可能存在的问题

  1. 性能问题:这可能会增加查询的执行时间,尤其是在处理大量数据时。

  2. 数据一致性问题:如果应用程序在不同地方使用不同的日期格式,可能会导致数据不一致性,因为隐式转换可能在不同情况下产生不同的结果。

  3. 时区问题:如果数据库服务器和应用程序服务器位于不同的时区,隐式转换可能会导致时区处理上的问题

  4. 文化差异问题:不同的文化和地区可能有不同的日期格式习惯,隐式转换可能不会正确处理这些差异,导致日期被错误解析。

标签:02,PostgreSQL,mysql,查询,CTE,日期,2020,whith
From: https://blog.csdn.net/weixin_40121264/article/details/145071731

相关文章

  • MySQL 中常见的几种高可用架构部署方案
    MySQL中的集群部署方案前言这里来聊聊,MySQL中常用的部署方案。MySQLReplicationMySQLReplication 是官方提供的主从同步方案,用于将一个MySQL的实例同步到另一个实例中。Replication为保证数据安全做了重要的保证,是目前运用最广的MySQL容灾方案。Replication用两个......
  • MySQL 8.0.27 集群搭建——基于MGR方式的一主两从架构
    数据库:MySQL8.0.27安装包:mysql-8.0.27-1.el7.x86_64.rpm-bundle.tar系统:rhel7.364位 1、准备工作说明:1.1至1.3均需在三台服务器执行.1.1、修改hosts文件--在hosts中设置hostname与IP映射绑定关系.[root@MySQL-827MGR-Master~]#cat<<EOF>>/etc/hosts192.168.133.11......
  • MySQL root密码忘记解决
    skip-grant-tables的解法 首先,关闭实例这里,只能通过killmysqld进程的方式。注意:不是mysqld_safe进程,也切忌使用kill-9。#ps-ef|grepmysqldroot62206171008:14pts/000:00:00/bin/shbin/mysqld_safe--defaults-file=my.cnfmysql63476220......
  • MySQL基础
    MySQL基础目录MySQL基础一、概述启动与停止客户端连接数据模型二、基础内容01SQLSQL通用语法SQL分类DDLDMLDQLDCL02函数字符串函数数值函数日期函数流程函数03约束约束演示外键约束04多表查询多表关系内连接外连接自连接联合查询(union,unionall)子查询表子查询05事务事务操作事务......
  • Java项目:衣依服装销售平台(java+SpringBoot+Mybaits+Vue+elementui+mysql)
     源码获取:俺的博客首页"资源"里下载!项目介绍基于springboot的“衣依”服装销售平台的设计与实现环境需要1.运行环境:最好是javajdk1.8,我们在这个平台上运行的。其他版本理论上也可以。2.IDE环境:IDEA,Eclipse,Myeclipse都可以。推荐IDEA;3.硬件环境:windows7/8/101G......
  • Nlog写入MySql
    1.安装相关Nuget包mysql.data,Nlog,Nlog.Database2.新建配置文件,并右击配置文件修改属性复制到输出目录-始终复制<?xmlversion="1.0"encoding="utf-8"?><configuration><nlogxmlns="http://www.nlog-project.org/schemas/nlog.xsd"xml......
  • 【MySQL】第五章 数据类型
    系列文章目录《【MySQL】第一章MySQL5.7的安装与卸载》《【MySQL】第二章初识数据库》《【MySQL】第三章库的操作》《【MySQL】第四章表的操作》《【MySQL】第五章数据类型》文章目录系列文章目录环境准备数据类型分类数值类型数值类型分类整数类型浮点数FL......
  • MySQL索引原理及慢查询优化13
    背景MySQL凭借着出色的性能、低廉的成本、丰富的资源,已经成为绝大多数互联网公司的首选关系型数据库。虽然性能出色,但所谓“好马配好鞍”,如何能够更好的使用它,已经成为开发工程师的必修课,我们经常会从职位描述上看到诸如“精通MySQL”、“SQL语句优化”、“了解数据库原理”等......
  • MySQL 学习指南与资料分享
    MySQL学习资料https://pan.quark.cn/s/4102ccd1336dMySQL学习资料https://pan.quark.cn/s/4102ccd1336dMySQL学习资料https://pan.quark.cn/s/4102ccd1336d在如今数据驱动发展的大趋势下,MySQL作为开源关系型数据库管理系统的佼佼者,广泛应用于各个领域,从个人博客搭建到......
  • 【MySQL8】压缩包方式卸载
    版本:v8.0.26今天mysql启动的时候报错,跟着网上的教程排查了几次,最后决定卸了重装,反正是学习环境备份数据(可选)如果是生产环境/开发环境,第一步是备份数据,我不备份你可以选择更简单的方式:复制data文件夹,但是版本兼容性很差,会出现各种毛病,导致数据无法展示也无法恢复,不推荐我......