Oracle和MySQL竟然可以这么写这样的SQL?(r12笔记第99天)

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
全局流量管理 GTM,标准版 1个月
简介: 今天看到Franck Pachot? 发了一个Twitter,意思是Oracle里的SQL还能这么写。猛一看确实让人有些意外。 禁不住诱惑,自己也尝试了一番。

今天看到发了一个Twitter,意思是Oracle里的SQL还能这么写。猛一看确实让人有些意外。

禁不住诱惑,自己也尝试了一番。我现在12cR2的环境中测试了一下。

Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production

尝试上面的步骤,先来看看dual表。

SQL> select count(*)from dual;
  COUNT(*)
----------
         1

开始测试,这样看起来不规范的SQL照样能够正常解析

SQL> select +count(*) from dual;
 +COUNT(*)
----------
         1

SQL> select -count(*)from dual;
 -COUNT(*)
----------
        -1SQL> select +dummy from dual;
DU
--
X
SQL> select -dummy from dual;
select -dummy from dual
        *
ERROR at line 1:
ORA-01722: invalid number如果对dual表抱有一丝幻想,那么我们换一个数据字典cat

SQL> select count(*)from cat;
  COUNT(*)
----------
      8113

SQL> select +count(*)from cat;
 +COUNT(*)
----------
      8113SQL> select -count(*)from cat;
 -COUNT(*)
----------
     -8113看起来依旧可以,我们换一个堆表。

SQL> create table test_data as select *from user_objects;
Table created.

SQL> select count(*)from test_data;
  COUNT(*)
----------
     51907SQL> select +count(*)from test_data;
 +COUNT(*)
----------
     51907SQL> select -count(*)from test_data;
 -COUNT(*)
----------
    -51907换成object_id字段 

SQL> select -object_id from test_data where rownum<3;
-OBJECT_ID
----------
       -16
       -20SQL> select +object_id from test_data where rownum<3;
 OBJECT_ID
----------
        16
        20  对此如果还有一些疑问,我们可以使用10053来解析一下,看看优化器是如何处理的。       
SQL> alter session set events '10053 trace name context forever,level 12';
SQL>  select -object_id from test_data where rownum<3;
-OBJECT_ID
----------
       -16
       -20
SQL> alter session set events '10053 trace name context off';    
查询转换后的SQL如下:

Final query after transformations:******* UNPARSED QUERY IS *******
SELECT (-"TEST_DATA"."OBJECT_ID") "-OBJECT_ID" FROM "SYS"."TEST_DATA" "TEST_DATA" WHERE ROWNUM<3
*************************

而如果是字符型数据,则使用这种方式的减号就不可行了。

SQL> select  -object_name from test_data where rownum<2;
select  -object_name from test_data where rownum<2
         *
ERROR at line 1:
ORA-01722: invalid number如果你以为是12c里面的一些新特性这类的,其实在10g也是类似的结果。

MySQL篇

如果你认为这是Oracle优化器的强大,其实不然,我们看看MySQL里的表现,假设表为test_tab.

> select -count(*) from test_tab;
+-----------+
| -count(*) |
+-----------+
|   -548650 |
+-----------+
1 row in set (0.39 sec)

使用运算符,可以看到也是支持的。

> select +count(*)from test_tab;
+-----------+
| +count(*) |
+-----------+
|    548650 |
+-----------+
1 row in set (0.39 sec)

如果查询两条数据,进行比对测试。

> select login_account from test_tab limit 2;
+-------------------------------+
| login_account                 |
+-------------------------------+
| 0000000180000000@test.com |
| 000000111000@test.com     |
+-------------------------------+
2 rows in set (0.00 sec)

我们继续使用运算符来处理。

> select -login_account from test_tab limit 2;
+----------------+
| -login_account |
+----------------+
|     -180000000 |
|        -111000 |
+----------------+
2 rows in set, 2 warnings (0.00 sec)

注意这里有两个警告,我们看看警告内容,原来内容都被处理过了。

> show warnings;
+---------+------+-------------------------------------------------------------------+
| Level   | Code | Message                                                           |
+---------+------+-------------------------------------------------------------------+
| Warning | 1292 | Truncated incorrect DOUBLE value: '0000000180000000@test.com' |
| Warning | 1292 | Truncated incorrect DOUBLE value: '000000111000@test.com'     |
+---------+------+-------------------------------------------------------------------+
2 rows in set (0.00 sec)如果我们手动换一种形式,写为0-xxx的形式,结果是一样的。

> select 0-login_account from test_tab limit 2;
+-----------------+
| 0-login_account |
+-----------------+
|      -180000000 |
|         -111000 |
+-----------------+
2 rows in set, 2 warnings (0.01 sec)

这里的结果其实涉及到sql_mode的设置,在此就不再展开了。
回到这个问题,上面的语句竟然可以解析,在优化器中是什么样的呢?可以使用explain extended的方式来解析,结果如下:
> explain extended select -count(*) from test_tab;
+----+-------------+----------+-------+---------------+-----------------------+---------+------+--------+----------+-------------+
| id | select_type | table    | type  | possible_keys | key                   | key_len | ref  | rows   | filtered | Extra       |
+----+-------------+----------+-------+---------------+-----------------------+---------+------+--------+----------+-------------+
|  1 | SIMPLE      | test_tab | index | NULL          | ind_tmp_login_account | 303     | NULL | 548474 |   100.00 | Using index |
+----+-------------+----------+-------+---------------+-----------------------+---------+------+--------+----------+-------------+
1 row in set, 1 warning (0.00 sec)解析的结果如下,可以看到原本的count(*)自动转换为了count(0),然后做了运算处理。

> show warnings;
+-------+------+----------------------------------------------------------+
| Level | Code | Message                                                  |
+-------+------+----------------------------------------------------------+
| Note  | 1003 | select -(count(0)) AS `-count(*)` from `test`.`test_tab` |
+-------+------+----------------------------------------------------------+
1 row in set (0.00 sec)


相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
6天前
|
SQL 存储 关系型数据库
【MySQL基础篇】全面学习总结SQL语法、DataGrip安装教程
本文详细介绍了MySQL中的SQL语法,包括数据定义(DDL)、数据操作(DML)、数据查询(DQL)和数据控制(DCL)四个主要部分。内容涵盖了创建、修改和删除数据库、表以及表字段的操作,以及通过图形化工具DataGrip进行数据库管理和查询。此外,还讲解了数据的增、删、改、查操作,以及查询语句的条件、聚合函数、分组、排序和分页等知识点。
【MySQL基础篇】全面学习总结SQL语法、DataGrip安装教程
|
25天前
|
SQL 存储 关系型数据库
SQL自学笔记(3):SQL里的DCL,DQL都代表什么?
本文介绍了SQL的基础语言类型(DDL、DML、DCL、DQL),并详细说明了如何创建用户和表格,最后推荐了几款适合初学者的免费SQL实践平台。
112 3
SQL自学笔记(3):SQL里的DCL,DQL都代表什么?
|
24天前
|
SQL 存储 缓存
MySQL进阶突击系列(02)一条更新SQL执行过程 | 讲透undoLog、redoLog、binLog日志三宝
本文详细介绍了MySQL中update SQL执行过程涉及的undoLog、redoLog和binLog三种日志的作用及其工作原理,包括它们如何确保数据的一致性和完整性,以及在事务提交过程中各自的角色。同时,文章还探讨了这些日志在故障恢复中的重要性,强调了合理配置相关参数对于提高系统稳定性的必要性。
|
22天前
|
SQL 关系型数据库 MySQL
MySQL 高级(进阶) SQL 语句
MySQL 提供了丰富的高级 SQL 语句功能,能够处理复杂的数据查询和管理需求。通过掌握窗口函数、子查询、联合查询、复杂连接操作和事务处理等高级技术,能够大幅提升数据库操作的效率和灵活性。在实际应用中,合理使用这些高级功能,可以更高效地管理和查询数据,满足多样化的业务需求。
76 3
|
25天前
|
SQL 关系型数据库 MySQL
MySQL导入.sql文件后数据库乱码问题
本文分析了导入.sql文件后数据库备注出现乱码的原因,包括字符集不匹配、备注内容编码问题及MySQL版本或配置问题,并提供了详细的解决步骤,如检查和统一字符集设置、修改客户端连接方式、检查MySQL配置等,确保导入过程顺利。
|
27天前
|
SQL 存储 关系型数据库
MySQL进阶突击系列(01)一条简单SQL搞懂MySQL架构原理 | 含实用命令参数集
本文从MySQL的架构原理出发,详细介绍其SQL查询的全过程,涵盖客户端发起SQL查询、服务端SQL接口、解析器、优化器、存储引擎及日志数据等内容。同时提供了MySQL常用的管理命令参数集,帮助读者深入了解MySQL的技术细节和优化方法。
|
25天前
|
SQL 数据挖掘 数据库
SQL自学笔记(2):如何用SQL做简单的检索
本文深入介绍了SQL的基本语法,包括数据查询、过滤、排序、分组及表连接等操作,并通过实际案例展示了SQL在用户研究中的应用,如用户行为分析、用户细分、用户留存分析及满意度调查数据分析。
28 0
SQL自学笔记(2):如何用SQL做简单的检索
|
25天前
|
SQL 数据挖掘 关系型数据库
SQL自学笔记(1):什么是SQL?有什么用?
本文为用户研究新手介绍SQL(结构化查询语言),解释了SQL的基本概念、入门方法及在用户研究中的应用通过实际案例说明,如用户行为分析、用户细分和满意度调查数据分析,展示了SQL在用户研究中的重要作用。
61 0
SQL自学笔记(1):什么是SQL?有什么用?
|
SQL Oracle 关系型数据库
Oracle SQL性能优化40条,值得收藏(一)
之前有发布一些Mysql的性能优化方法,有些小伙伴想了解一下Oracle的性能优化有哪些,特地去找了一些比较全和实用的文章,这篇就是其中一篇。对Oracle性能优化感兴趣的不妨收藏一些,以备不时之需。(部分内容存在错别字和技术性错误,有改动)
Oracle SQL性能优化40条,值得收藏(一)
|
2月前
|
SQL 监控 Oracle
Oracle SQL性能优化全面指南
在数据库管理领域,Oracle SQL性能优化是确保数据库高效运行和数据查询速度的关键

推荐镜像

更多