开发指南—DQL语句—SELECT

简介: SELECT用于从一个或多个表中查询数据。

语法


SELECT
    [ALL | DISTINCT]
    select_expr [, select_expr ...]
    [FROM table_references
    [WHERE where_condition]
    [GROUP BY {col_name | expr | position}
    [HAVING where_condition]
    [ORDER BY {col_name | expr | position}
      [ASC | DESC], ...]
    [LIMIT {[offset,] row_count | row_count OFFSET offset}]
    [FOR UPDATE]

SELECT子句说明:

  • select_expr:表示查询的列,SELETE必须至少有一个select_expr。
  • table_references:表示从哪些表中获取数据。
  • WHERE子句:指定查询条件,即从表中获取满足where_condition的行,若没有指定,则获取所有行。
  • GROUP BY子句:支持列名,表达式以及输出列中的位置引用。
  • HAVING子句:与WHERE类似,不同点在于可以使用聚合函数。
  • ORDER BY:指定排序,支持列名、表达式以及输出列中的位置引用,同时支持指定排序方向,ASC(升序)或 DESC(降序)。
  • LIMIT/OFFSET:限定输出结果集的偏移量和大小。LIMIT 接受一个或两个数字参数。参数必须是一个整数常量。如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。初始记录行的偏移量是 0(而不是 1): 为了与PostgreSQL兼容,MySQL也支持句法: LIMIT # OFFSET #。
  • FOR UPDATE:对查询结果所有行加排他锁,以阻止其他事务的并发修改,或阻止在某些事务隔离级别时的并发读取。

注意事项

  • 不支持在HAVING中使用适用于WHERE子句的表达式,如下SQL1应改写为SQL2。SQL1:
SELECT col_name FROM tbl_name HAVING col_name > 0;
  • SQL2:
SELECT col_name FROM tbl_name WHERE col_name > 0;
  • HAVING子句可以引用聚合函数,但WHERE子句不可以。
SELECT user, MAX(salary) FROM users

GROUP BY user HAVING MAX(salary) > 10;
  • LIMIT若有两个参数,第一个参数表示返回第一行的偏移量,第二个参数表示返回的行数;若仅有一个参数,则表示返回的行数,默认偏移量为0。
  • GROUP BY子句不支持ASC和DESC。
  • 同时存在GROUP BY和ORDER BY时,ORDER BY后面的表达式必须在SELECT表达式或GROUP BY表达式中,如不支持以下SQL。
SELECT user FROM users GROUP BY age ORDER BY salary;
  • 暂不支持ORDER BY子句中使用聚合函数以及包含聚合函数的表达式,可将表达式作为select_expr,并赋予别名,在ORDER BY子句中引用该别名。
  • 暂不支持以空字符串作为别名。

JOIN

PolarDB-X支持在SELECT语句的table_references中使用如下JOIN语法:


table_references:
escaped_table_reference [, escaped_table_reference] ...
escaped_table_reference:
table_reference
| { OJ table_reference }
table_reference:
table_factor
| join_table
table_factor:
[schema_name.]tbl_name [[AS] alias] [index_hint_list]
| table_subquery [AS] alias
| ( table_references )
join_table:
table_reference [INNER | CROSS] JOIN table_factor [join_condition]
| table_reference {LEFT|RIGHT} [OUTER] JOIN table_reference join_condition
join_condition:
ON conditional_expr
| USING (column_list)
index_hint_list:
index_hint [, index_hint] ...
index_hint:
USE {INDEX|KEY}
[FOR {JOIN|ORDER BY|GROUP BY}] ([index_list])
| IGNORE {INDEX|KEY}
[FOR {JOIN|ORDER BY|GROUP BY}] (index_list)
| FORCE {INDEX|KEY}
[FOR {JOIN|ORDER BY|GROUP BY}] (index_list)
index_list:
index_name [, index_name] ...

使用JOIN语句时,应考虑如下因素:

  • JOIN、CROSS JOIN与INNER JOIN语法是等价的,这种设定与MySQL保持一致。
  • 如果INNER JOIN没有ON条件,其与”逗号“连接是等价的,均表示笛卡尔积。如下两条SQL等价:
SELECT * FROM t1 INNER JOIN t2 WHERE t1.id > 10
SELECT * FROM t1, t2 WHERE t1.id > 10
  • USING(column_list)指定连接两表中都存在的列名,PolarDB-X会按照这些列构建等值条件。如下两条SQL等价:
a LEFT JOIN b USING(c1, c2)
a LEFT JOIN b ON a.c1 = b.c1 AND a.c2 = b.c2
  • JOIN的优先级高于”逗号“操作符,对于连接表达式t1, t2 JOIN t3会转换为(t1, (t2 JOIN t3),而不是((t1, t2) JOIN t3)。
  • 外连接LEFT/RIGHT JOIN必须有ON条件。
  • index_hint用于告知MySQL使用哪个索引,PolarDB-X会将该Hint下推至底层MySQL。
  • 暂不支持STRAIGHT_JOIN和NATURAL JOIN。

UNION

PolarDB-X支持如下UNION语法:


SELECT ...
UNION [ALL | DISTINCT] SELECT ...
[UNION [ALL | DISTINCT] SELECT ...]


说明 对于UNION中的每个SELECT,PolarDB-X暂不支持使用多个同名的列。例如以下SQL的SELECT中存在重复的列名,暂不支持。


SELECT id, id, name FROM t1 UNION SELECT pk, pk, name FROM t2;

相关文档

相关文章
|
存储 供应链 数据挖掘
计算机的作用及其应用
一、什么是计算机 计算机是一种能够执行程序和进行数据处理的电子设备。它由硬件和软件两部分组成。硬件包括中央处理器(CPU)、内存、硬盘、输入设备(如键盘和鼠标)、输出设备(如显示器和打印机)等。软件则是指计算机程序,包括操作系统、应用程序等。计算机能够接收、存储、处理和输出数据,实现各种任务和功能,如文字处理、图像处理、数据分析、网络通信等。计算机的发展使得人们能够更加高效地处理信息和解决问题。 二、计算机的作用 计算机在现代社会中发挥着重要的作用,它在各个领域都有广泛的应用。以下是计算机的一些主要作用: 1. 数据处理和存储:计算机可以处理和存储大量的数据,包括文字、图像、音频和视频等。它们
1229 1
|
XML SQL JavaScript
SpringBoot+vue实现导入导出excel,使用hutool工具
在实际应用场景中,我们常常需要迁移应用到另一个环境中。「应用的导入导出」功能可以便捷实现应用的迁移与重塑,甚至可以选择不同菜单,数据模型,与审批流程,业务事件,选择性导入,更高效便捷完成应用的迁移。其次,在导入的应用中,选择所需导入的部分,可以全选,也可以选择部分导入。「部分导入」实现了模块迁移的效果,对于企业级应用迁移来说,不仅利用率高,适用性也极为普遍。有了「应用导入导出」功能,就可以轻松迁移各类应用。同时,在使用应用市场中的应用,与更新应用方面,都非常灵活易用。 下面来介绍,这个功能性是如何实现的。
2348 0
SpringBoot+vue实现导入导出excel,使用hutool工具
|
存储 安全 Java
javax.security.auth.login.LoginException: Receive timed out
`亲测可用,之前搜索了很多博客,啥样的都有,就是不介绍报错以及配置用处,根本不懂照抄那些配置是干啥的,稀里糊涂的按照博客搭完也跑不起来,因此记录这个。` `项目背景`:公司项目当前采用http协议+shiro+mysql的登录认证方式,而现在想支持ldap协议认证登录然后能够访问自己公司的项目网站。 `举例说明`:假设我们公司有自己的门户网站,现在我们收购了一家公司,他们数据库采用ldap存储用户数据,那么为了他们账户能登陆我们公司项目所以需要集成,而不是再把他们的账户重新在mysql再创建一遍,万一人家有1W个账户呢,不累死了且也不现实啊。
215 10
|
SQL 前端开发 JavaScript
基于java+springboot的宠物商店、宠物管理系统
该系统是基于java+springboot开发的宠物商城,用户可以登录该网站购买宠物。该系统是给师弟开发的课程作业。运行过程中的问题,可以咨询github或留言。
373 0
|
数据库
掌握数据模型的精细控制:深入探索Entity Framework Core中的自定义类型转换器与值转换器
【8月更文挑战第31天】在软件开发中,数据模型常需在数据库类型与 .NET 类型之间进行映射。尽管 Entity Framework Core 提供了默认的类型映射,但在某些情况下,我们可能需要自定义映射规则。这时,类型转换器和值转换器就派上了用场。本文将介绍如何在 EF Core 中使用自定义类型转换器和值转换器,以实现更灵活的数据映射。
215 0
|
机器学习/深度学习 人工智能 监控
构建未来:人工智能在持续学习系统中的进化
【5月更文挑战第28天】 随着机器学习技术的不断进步,人工智能(AI)已经从静态算法演变为具备自我更新能力的动态系统。本文探讨了AI在设计自适应学习机制方面的最新进展,重点分析了持续学习系统如何通过累积知识和优化策略来提升性能。我们审视了多个关键领域,包括神经网络架构的创新、数据效率的学习策略以及模型泛化能力的增强。此外,文章还提出了一系列挑战和未来的研究方向,旨在推动智能系统的自主学习和决策能力,以适应不断变化的环境。
|
Linux 数据安全/隐私保护
Linux命令(64)之unzip
Linux命令(64)之unzip
386 3
|
存储 Java C++
大端(Big Endian)与小端(Little Endian)简介与实现
【大端(Big Endian)与小端(Little Endian)简介】Byte Endian是指字节在内存中的组织,所以也称它为Byte Ordering,或Byte Order。     对于数据中跨越多个字节的对象,我们必须为它建立这样的约定: (1) 它的地址是多少? (2) 它的字节在内存中是如何组织的?     针对第一个问题,有这样的解释:     对于跨
2807 0
|
JSON Java API
【Java技术指南】「Unirest编程专题」一起认识一下一个“灰常”优秀的Http工具,让Http开发变得如此简单
Unirest-Java是一个轻量级的HTTP客户端库,它提供了简单易用的API,可以帮助Java开发人员快速地发送HTTP请求和处理响应。在本文中,我们将深入探讨Unirest-Java的技术细节和使用方法。
536 1
将手机声音用电脑播放的方法
本文介绍基于Bluetooth Audio Receiver软件实现用电脑播放手机声音,且与电脑自身声音不冲突同时播放的方法~
1625 1
将手机声音用电脑播放的方法