JQuick-SQL SELECT 投影:字段、别名与表达式查询
Meta 描述:学习 jquick-sql 的 SELECT 投影、字段别名、表达式与 DISTINCT,用嵌入式 Java 示例把已注册数据集转换为可复用查询结果。
标签:jquick-sql、SELECT 投影、字段别名、SQL 表达式、轻量级 SQL 引擎、Java 分布式 SQL 查询引擎
官网示例:
- FORMULAS 示例页:https://www.jquick.org/jquick-curl
- github 地址:https://github.com/dromara/jquick-curl
前言
SELECT 决定查询结果中保留哪些列、计算哪些表达式。jquick-sql 是运行在应用已注册数据集之上的 Java 分布式 SQL 查询引擎:先用 registerTable(...) 注册元数据和行数据,再通过 SQL 形成结果集;它不是 JDBC 直连产品。对于由上游组件整理后的异构数据源联邦查询结果,这种投影能力可统一输出字段口径。
选择字段与使用别名
可使用 SELECT * 快速检查数据,也可明确列出需要的字段。生产查询通常应列出字段,并通过 AS 给表达式或重复名称取清晰别名:
sql
SELECT id, name, age AS user_age
FROM users
明确投影能缩小结果集,也便于 Java 跨库查询流程在服务层继续消费 JQuickDataSet。
在 SELECT 中使用表达式和 DISTINCT
测试示例验证了算术表达式、函数、常量和 DISTINCT:
sql
SELECT 0 AS row_flag,
id,
toUpper(name) AS upper_name,
(age + 1) * 3 AS score
FROM users
SELECT DISTINCT age FROM users
表达式别名应在同一结果集中保持唯一。DISTINCT 用于对投影后的值去重,而不是替代业务主键治理。
可执行 Java 案例
下面示例使用 README 中的嵌入式 API 注册内存数据后执行投影;finally 中关闭引擎:
java
import com.github.paohaijiao.engine.JQuickSQL;
import com.github.paohaijiao.statement.JQuickColumnMeta;
import com.github.paohaijiao.statement.JQuickDataSet;
import com.github.paohaijiao.statement.JQuickRow;
import java.util.Arrays;
import java.util.List;
public class SelectProjectionDemo {
public static void main(String[] args) {
JQuickSQL sql = JQuickSQL.embedded();
try {
List<JQuickColumnMeta> columns = Arrays.asList(
new JQuickColumnMeta("id", Integer.class, "users"),
new JQuickColumnMeta("name", String.class, "users"),
new JQuickColumnMeta("age", Integer.class, "users")
);
List<JQuickRow> rows = Arrays.asList(
row("id", 1, "name", "Alice", "age", 25),
row("id", 2, "name", "Bob", "age", 30)
);
sql.registerTable("users", columns, rows);
JQuickDataSet result = sql.execute(
"SELECT id, toUpper(name) AS upper_name, (age + 1) * 3 AS score FROM users"
);
result.printTable();
} finally {
sql.shutdown();
}
}
private static JQuickRow row(Object... kv) {
JQuickRow r = new JQuickRow();
for (int i = 0; i < kv.length; i += 2) r.put((String) kv[i], kv[i + 1]);
return r;
}
}
常见问题
**投影时一定要写表前缀吗?**单表且列名无歧义时不必;多表查询应使用限定列名。
**SELECT * 能用于正式接口吗?**可以执行,但字段变化会影响下游,建议关键接口显式列出列。
**这里会连接远程数据库吗?**不会。数据由应用或上游接入层先转换并注册。
总结与拓展
SELECT 投影让轻量级 SQL 引擎把应用数据转换成面向报表、规则或接口的稳定输出。结合 WHERE、ORDER BY 与 LIMIT,可在不改变上游数据所有权的前提下,组织异构数据源联邦查询链路中的结果视图。
Core Advantage
Explicit projections keep embedded query outputs compact, named, and reusable.
Applicable Scenarios
API result shaping, offline reports, service-side transformations, and normalized cross-source datasets.