SQL> desc dual
Name Null? Type
----------------------------------------- -------- ----------------------------
DUMMY VARCHAR2(1)
SQL> select 4*5 from dual;
4*5
----------
20
SQL>
Eu acho realmente estranho. Se não houver uma coluna chamada 4*5 em dual, como funciona a instrução select?
Além disso, por que não vejo o mesmo comportamento quando crio minha própria tabela dupla?
SQL> create table dual2(dummy varchar2(1));
Table created.
SQL> desc dual2
Name Null? Type
----------------------------------------- -------- ----------------------------
DUMMY VARCHAR2(1)
SQL> select 4*5 from dual2;
no rows selected
SQL>
Da Wikipédia :
Assim, a tabela dupla é uma maneira de realizar operações contra o que equivale a uma tabela vazia, mas não nula. Isso é útil quando não se importa com a tabela, mas precisa realizar operações por meio de uma instrução select. Se a tabela tivesse mais de uma linha ou coluna, vários resultados seriam retornados (devido à operação em todo o conjunto de tuplas ao realizar a operação).
Ele não deve ser usado em produção, a menos que você precise invocar especificamente determinados procedimentos por meio de SQL.
4*5
é uma operação matemática, assim como'Foo'
uma string. Assim, assim como se pode selecionar 4*5 de qualquer mesa, assim como se pode selecionar 'Foo' de qualquer mesa, DUAL é uma maneira de selecioná-lo de uma mesa conhecida que nunca terá vários resultados.Da documentação (CONCEITOS):
E a Referência SQL :
DUAL
é uma tabela com exatamente uma linha, como a seguinte instrução SQL mostrará:Sua
dual2
tabela não tem linhas. Se você inserir um, verá o mesmo comportamento.4*5 é uma expressão que o Oracle pode avaliar sem realmente usar os dados da tabela. Ele irá avaliá-lo uma vez para cada linha, assim como faria com uma expressão de coluna normal. Portanto, se não houver linha, nenhum resultado será retornado, se houver duas linhas, você obterá o 20 duas vezes.
A
dual
tabela "funciona" quase como qualquer outra tabela: é uma tabela da qual você pode selecionar registros.Isso significa, por exemplo, que você pode descrever a tabela. Aqui, em
SQL*Plus
:Portanto, a tabela tem uma coluna, chamada
dummy
que é um arquivovarchar2(1)
.A tabela tem, por design, um registro (pelo menos se ninguém mexeu nele):
Então, para obter o mesmo comportamento
dual2
que você tem comdual
, você precisa inserir um registro em dual. Melhor ainda, crie-o com umcreate table as select
(ctas):Agora, sua consulta funciona:
Anteriormente, eu disse que o dual funciona quase como qualquer outra mesa. Então, quando não funciona como qualquer outra tabela?
Ele se comporta de maneira diferente, se nenhum valor da própria tabela for selecionado. Novamente, com suas dúvidas, deixo a Oracle explicá -las...
... para ver como a tabela é acessada:
Pode-se ver que a instrução faz um
full table access
ondual2
.Agora, a mesma coisa com
dual
:É aqui que a
dual
tabela se comporta de forma diferente: o valor dedummy
não é necessário, então umafast dual
operação é executada, para que a instância não leia o valor real no disco.Aliás, DUAL é uma das poucas 'tabelas' que funciona quando a instância foi iniciada, mas o banco de dados não foi aberto.
Você consegue algo como
Além de outras respostas, o Oracle não é tão exigente quanto aos espaços do texto SQL (pelo menos em alguns lugares). O analisador SQL também tokeniza por diferenças de classe de caractere em alguns casos, não apenas por espaço em branco.
Por exemplo, você pode executar essas instruções:
Também é possível executar o SQL sem nenhum espaço em branco:
Tenho mais alguns exemplos aqui:
http://blog.tanelpoder.com/2008/01/14/can-you-write-a-working-sql-statement-without-using-any-whitespace/
Tanel Poder
Uma operação dupla rápida reescreve seu código para consultar x$dual. Como essa "tabela" é uma estrutura de dados C na SGA, você pode consultá-la no modo nomount.
A pergunta já está respondida. Estas são algumas notas para o propósito da mesa dupla. Dual pode ser usado para avaliar expressões em uma cláusula select. Muitos outros sistemas de banco de dados não precisam dessa tabela para esse propósito. MS SQL Server, MySql, Posgres pode avaliar a seguinte declaração
Oráculo não pode. Uma instrução de seleção do Oracle sempre precisa de uma cláusula "de".
Algumas funções não podem ser usadas em expressões pl/sql como DUMP .
Então
irá gerar uma exceção, mas
vai funcionar.
Ele pode ser usado para estender o conjunto de resultados de uma consulta
que deu
ou gere dados com consultas selecionadas usando
CONNECT BY
:ou um CTE recursivo:
que retorna
em sqlfiddle
Por que vale a pena, funciona exatamente da mesma maneira no MySQL.
E também parece que o DUAL é algum tipo de estrutura de memória no MySQL também. Observe a diferença nos dois planos de explicação - "sem tabelas usadas" para DUAL no MySQL.
Curiosamente, no entanto, não posso fazer um DESC no dual do MySQL, que é diferente do Oracle - mas foi introduzido especificamente AIUI para permitir que a sintaxe do Oracle funcione no MySQL.
No banco de dados oracle, a tabela Dual é basicamente usada para obter o valor das pseudo-colunas. Ele contém as seguintes propriedades:
Se você quiser obter mais detalhes, verifique aqui