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 / 60493
Accepted
newprint
newprint
Asked: 2014-03-09 15:14:20 +0800 CST2014-03-09 15:14:20 +0800 CST 2014-03-09 15:14:20 +0800 CST

Como diferentes cláusulas tratam Nulo/Desconhecido no SQL Server 2012?

  • 772

(relativamente novo em SQL e SQL Server) Estou lendo SQL Server 2012 T-SQL Fundamentals de Itzik Ben-Gan. Autor afirma que:

SQL tem diferentes tratamentos para UNKNOWN em diferentes elementos de linguagem

Então, eu examinei a documentação do SQL Server, e em particular a WHEREcláusula , mas não consegui encontrar nada específico sobre como NULL/UNKNOWNé tratado.

Alguém poderia me indicar o documento correto ou indicar o que estou lendo de errado na documentação? (Suspeito muito que a resposta à minha pergunta esteja enterrada em algum lugar do padrão SQL, mas pode ser muito complexa para mim, pelo menos neste momento.)

sql-server null
  • 1 1 respostas
  • 1258 Views

1 respostas

  • Voted
  1. Best Answer
    ypercubeᵀᴹ
    2014-03-09T18:16:26+08:002014-03-09T18:16:26+08:00

    Existem diferenças sutis sobre como UNKNOWNe NULLsão tratados nas várias cláusulas.

    Três cláusulas em que uma expressão booleana pode aparecer são WHERE, HAVINGe FROM(na ONsubcláusula). Em todos os três, o UNKNOWNé tratado da mesma maneira.

    • WHERE <boolean expression>:

      uma linha "passa" pelo <boolean expression>e é retornada se a expressão for avaliada como TRUE. Se a expressão for avaliada como FALSEou UNKNOWN, a linha não passará e será removida da avaliação posterior da consulta.

    • HAVING <boolean expression>:

      As linhas examinadas na HAVINGcláusula são aquelas criadas pela agregação da GROUP BYcláusula anterior. Semelhante a uma linha acima (criada pela agregação) "passa" o <boolean expression>e é retornado se a expressão for avaliada como TRUE. Se a expressão for avaliada como FALSEou UNKNOWN, a linha não passará e será removida da avaliação posterior da consulta.

    • a JOIN b ON <boolean expression>:

      Cada linha de aé verificada em cada linha de b. Se a expressão for TRUE, a verificação será aprovada e a combinação das duas linhas será válida para o processamento posterior da consulta. Se FALSEou UNKNOWN, então a combinação é rejeitada.
      Há uma pequena alteração quando a junção é uma junção externa ( LEFT, RIGHTou FULL), mas não em relação a como UNKNOWNé tratada. O que acontece aqui é que se uma linha da tabela à esquerda (em uma LEFTjunção) não corresponder a nenhuma linha da tabela à direita (ou seja, todas as suas verificações são avaliadas como FALSEou UNKNOWN), essa linha ainda será encaminhada e os valores ausentes para as bcolunas serão preenchidos com nulos.)

    A situação é diferente nas restrições, há um tratamento mais "relaxado" para UNKNOWN. Acho que isso tem a ver com a decisão de permitir nulos em primeiro lugar. Um valor nulo resultará em um UNKNOWNresultado na maioria das restrições, portanto, faz sentido permitir que essas linhas sejam inseridas. Caso contrário, o efeito seria o mesmo que declarar as colunas como NOT NULL.

    • CHECKrestrição:CHECK <expression>

      uma linha pode ser inserida (ou atualizada) se a expressão for avaliada como TRUE ouUNKNOWN . Ele é rejeitado apenas se a expressão for avaliada como FALSE.

    • FOREIGN KEYrestrição, com colunas anuláveis.

      semelhante às restrições de verificação, se uma linha tiver um nulo em uma das colunas que participam de uma restrição de chave estrangeira, a verificação da FOREIGN KEYrestrição é ignorada e a linha pode ser inserida (ou atualizada). restrição de chave estrangeira na tabela a:

      FOREIGN KEY (column) REFERENCES b (column)
      

      ser equivalente a:

      CHECK (column IN (SELECT column IN b))
      

      Portanto, se a.columnfor NULL, a expressão é avaliada como UNKNOWNe, portanto, a linha é permitida.

    • UNIQUErestrições

      Aqui, o SQL-Server se desvia do padrão que afirma que, se uma linha com uma restrição exclusiva contiver NULL, a verificação exclusiva será ignorada e a linha será permitida.
      O SQL-Server trata nulos como se fossem valores regulares, quando se trata de restrições únicas e permite apenas um NULLvalor , em tais colunas.


    NULLvalores também têm tratamento especial em algumas cláusulas:

    • GROUP BY:

      Se uma coluna de agrupamento contiver valores nulos, todos os valores nulos serão considerados iguais e colocados em um único grupo (a mesma coisa acontece em uma SELECT DISTINCTconsulta).

      Funções agregadas ( MIN(), MAX(), SUM()e AVG()outras) ignoram nulos, com exceção de COUNT()que podem fazer várias coisas diferentes:

      • COUNT(*)e COUNT(constant)contará todas as linhas.
      • COUNT(column)e COUNT(expression)irá ignorar nulos como as outras funções de agregação e contar apenas linhas onde a coluna ou expressão não é nula.
      • COUNT(DISTINCT column)e COUNT(DISTINCT expression)também irá ignorar nulos e contar apenas as colunas ou expressões não nulas distintas.

      Portanto, as 4 consultas a seguir podem retornar 4 resultados diferentes se houver nulos na coluna:

         SELECT COUNT(*) FROM t ;
         SELECT COUNT(c) FROM t ;
         SELECT COUNT(DISTINCT c) FROM t ;
         SELECT COUNT(*) FROM (SELECT DISTINCT c FROM t) AS x ;
      
    • ORDER BY:

      • Nas comparações entre eles, os NULLvalores são tratados como iguais.
      • Ao compará-los com valores não nulos, os valores nulos são tratados como o menor valor possível, inferior a qualquer valor não nulo. Como resultado, eles aparecem primeiro quando o pedido é ASCe por último quando o pedido é DESC.
        (Existe um atributo NULLS LASTand NULLS FIRSTdefinido no padrão mais recente, mas o SQL Server ainda não o implementou.)
    • 8

relate perguntas

  • Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • NULL ou NOT NULL por padrão?

  • Quando usar NULL e quando usar uma string vazia?

  • Como determinar se um Índice é necessário ou necessário

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