AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 196292
Accepted
Dai
Dai
Asked: 2018-01-26 17:35:21 +0800 CST2018-01-26 17:35:21 +0800 CST 2018-01-26 17:35:21 +0800 CST

Algum dialeto SQL permite a sequência lógica de cláusulas SELECT?

  • 772

SELECTno padrão ISO/IEC SQL prescreve a seguinte ordem sintática para as subcláusulas:

SELECT
    projection-expressions
FROM
    sources
WHERE
    predicate-expression
GROUP BY
    key-expression
HAVING
    predicate-expression
ORDER BY
    ordering-expressions

Enquanto a ordem lógica de execução é esta:

FROM
    sources
WHERE
    predicate-expression
GROUP BY
    value-expression
HAVING
    value-expression
SELECT
    projection-expressions
ORDER BY
    ordering-expressions

Para usuários iniciantes de SQL, torna-se surpreendente que uma projeção definida na SELECTcláusula não esteja disponível nas cláusulas WHEREou GROUP BYmesmo que seja declarada primeiro - dado que os programas de computador geralmente seguem a ordem de execução de cima para baixo.

Também é surpreendente que os autores de SQL sejam obrigados a repetir suas expressões em cláusulas SELECT, WHEREe de GROUP BYforma redundante ou usar uma subconsulta que não se presta a uma consulta sucinta. Pelo menos quando o usuário está familiarizado com a ordem real de execução da cláusula, ele sabe por que precisa se repetir, mas isso não impede que seja frustrante.

Este problema e outros problemas relacionados estão documentados neste artigo que encontrei: https://blog.jooq.org/a-beginners-guide-to-the-true-order-of-sql-operations/ e não é surpresa que um controle de qualidade no StackOverflow tem quase 30.000 visualizações: https://stackoverflow.com/questions/3241352/using-an-alias-column-in-the-where-clause-in-postgresql

Isso me fez pensar se alguma implementação de SQL permite essa ordenação mais "lógica" de cláusulas. Observo que o Linq no .NET realmente segue essa ordem, embora eu não o descreva como sendo uma implementação SQL verdadeira, mas, de fato, no Linq o equivalente seria:

source // FROM equivalent
    .Where( predicate-expression )
    .GroupBy( key-expression )
    .Where( predicate-expression ) // HAVING equivalent
    .Select( projection-expression )
    .OrderBy( ordering-expression )

(Também gosto de como o Linq permite adicionar uma Select()projeção em qualquer lugar na sequência de comandos para que você possa usar suas expressões avaliadas sem precisar invocar expressões novamente).

Então, alguma implementação de SQL permite que você expresse consultas em uma estrutura mais lógica?

syntax
  • 1 1 respostas
  • 595 Views

1 respostas

  • Voted
  1. Best Answer
    Evan Carroll
    2018-01-26T18:00:22+08:002018-01-26T18:00:22+08:00

    implementações de SQL

    Não, o SQL é padronizado. Não há implementações muito diferentes de um padrão. Esse tipo de derrota o propósito. Sempre houve/há uma briga sobre o cálculo relacional (que o SQL finge ser) versus a abordagem de álgebra relacional. É uma velha discussão,

    Tendo selecionado um modelo para os dados, nosso próximo passo foi selecionar uma linguagem de consulta. Duas famílias de sublinguagens de dados de nível superior para um banco de dados relacional são baseadas, alternativamente, na álgebra relacional (derivada da álgebra de conjuntos) ou no cálculo relacional [Codd, 197lb, 1971c e Date, 1975] (derivado do cálculo de predicados ). Codd [1971c] e Date [1975] compararam esses dois e descobriram que o cálculo relacional é superior, particularmente para uso como linguagem-alvo para um sistema de linguagem natural. A principal razão para a escolha do cálculo relacional como língua-alvo foi que o cálculo não é procedimental; ou seja, uma consulta no cálculo relacional traz poucas informações sobre como proceder na busca na base de dados. A álgebra relacional é mais procedimental, o que dificulta um pouco a construção automática de uma consulta por um sistema de linguagem natural. -Implementação de uma Linguagem de Consulta baseada no Cálculo Relacional 1970

    E, novamente do próprio Codd,

    No início do desenvolvimento do modelo relacional (1969-1972), inventei duas linguagens para lidar com relações: uma de natureza algébrica e outra baseada na lógica de predicados de primeira ordem [Codd 1971a]. Provei então que as duas linguagens tinham poder expressivo igual [Codd 1971d], mas indiquei que a linguagem baseada em lógica seria mais otimizável (assumindo que o rastreamento de fluxo não foi tentado) e mais fácil de usar como uma interface para software inferencial em cima de o SGBD. - Codd 1990, o modelo relacional para gerenciamento de banco de dados versão 2

    Há certamente uma tonelada de implementações para ambas as abordagens. Dito isto, o SQL como uma implementação é bastante fixo na abordagem de cálculo.

    Problemas de LINQ

    Esses problemas nunca desapareceram com a abordagem algébrica, por exemplo, deste blog, .

    context.Cars
      .OrderBy(x => x.Id)
      .Skip(50000)
      .Take(1000)
      .ToList();
    

    Requer otimização manual como,

    context.Cars
        .Where(x => context.Cars
            .OrderBy(y => y.Id)
            .Select(y => y.Id)
            .Skip(50000)
            .Take(1000)
            .Contains(x.Id)
        )
        .ToList();
    

    Se você tiver várias relações diferentes com diferentes características de desempenho (índices, a maioria dos quais são implementados como indiretos e abstratos) e estatísticas, é difícil escrever uma lógica de conjunto procedural que funcione com eficiência.

    • 9

relate perguntas

  • Como agendar a função no Oracle?

  • ajuda para recursos do servidor sql [fechado]

  • O que significa `x` nesta consulta?

  • Diferença de desempenho para COALESCE versus ISNULL?

  • SQL Server 2005: Como usar o pivô em vez de um monte de instruções case?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve