You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GraphQL中Select *的正确语法及相关语法变更等问题咨询

GraphQL 类SQL Select * 语法问题解答

1. Select * 的正确语法是什么?

GraphQL原生没有SQL里SELECT *的语法,但对接数据库的GraphQL实现(比如Hasura、PostGraphile这类)会支持类SQL查询,此时select *的写法分两种场景:

  • 不使用表别名时:
select * from "categories" where label = $1
  • 使用表别名时(用T作为categories的别名):
select T.* from "categories" T where T."label" = $1

2. 如何编写全选查询?开启自省(introspection)时是否支持Select *?

  • 原生GraphQL全选:必须明确列出目标类型的所有字段,比如针对Category类型的全选查询示例:
query GetCategories($label: String!) {
  categories(where: {label: $label}) {
    id
    label
    description
    # 手动列出该类型的所有其他字段
  }
}

如果是兼容SQL的GraphQL服务,直接用select *就等价于全选对应表的所有字段。

  • 自省功能:自省是用来查询Schema结构的工具,它本身不支持select *语法,但可以通过自省查询获取某个类型的所有字段,再基于这些字段构建全选查询。比如用以下自省查询拿到Category的所有字段名:
query GetCategoryFields {
  __type(name: "Category") {
    fields {
      name
    }
  }
}

3. 部分版本要求使用T.前缀,语法是否发生变更?

T.是SQL标准里的表别名引用语法,并非GraphQL本身的语法变更。要求使用前缀通常是因为:

  • 查询涉及多表关联时,用别名前缀区分不同表的字段,避免字段名冲突
  • 部分GraphQL数据库服务的版本更新后,为了语法严谨性,强制要求对设置了别名的表,必须用别名前缀引用其字段
    你给出的第二个示例就是规范的表别名用法,用T指代categories表,T.*表示选中该表所有字段,T."label"明确指定字段所属的表,属于SQL的标准写法,不是语法变更。

内容的提问来源于stack exchange,提问作者DevKev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 11:48:25