# Instrução SELECT

A instrução SELECT consiste de uma consulta com uma Cláusula ORDER BY opcional, e uma Cláusula FOR UPDATE opcional. A instrução SELECT possui este nome porque tipicamente a primeira palavra da construção da consulta é SELECT (A consulta inclui a expressão VALUES, as expressões UNION, INTERSECT e EXCEPT, além de expressões SELECT).

A Cláusula ORDER BY garante a ordem do ResultSet. A Cláusula FOR UPDATE torna o resultado um cursor atualizável. A instrução SELECT suporta a cláusula FOR FETCH ONLY. A cláusula FOR FETCH ONLY é sinônimo da cláusula FOR READ ONLY.

Lembre-se: Para se obter um ResultSet atualizável, deve ser incluída a cláusula FOR UPDATE com a cláusula SELECT.

#### Sintaxe

    Consulta
    [Cláusula ORDER BY]
    [Cláusula FOR UPDATE]
    WITH {RR|RS|CS|UR}

Pode ser definido o nível de isolamento da instrução SELECT utilizando a sintaxe WITH {RR|RS|CS|UR}.

    -- listar o nome da expressão SALÁRIO+BÔNUS+COMISS
    -- como PAGAMENTO_TOTAL,
    -- e ordenar pelo novo nome PAGAMENTO_TOTAL
    SELECT PRIMEIRO_NOME, SALÁRIO+BÔNUS+COMISS AS PAGAMENTO_TOTAL
    FROM EMPREGADOS
    ORDER BY PAGAMENTO_TOTAL;

    -- criar um cursor atualizável através da cláusula FOR UPDATE
    -- para atualizar as colunas data de início (PROJ_DATA_INÍCIO) e
    -- data de término (PROJ_DATA_FIM) da tabela PROJETO
    SELECT NUM_PROJ, PROJ_DATA_INÍCIO, PROJ_DATA_FIM
    FROM PROJETO
    FOR UPDATE OF PROJ_DATA_INÍCIO, PROJ_DATA_FIM;

    -- definir o nível de isolamento como RR apenas para esta instrução
    SELECT *
    FROM VÔOS
    WHERE ID_VÔO BETWEEN 'AA1111' AND 'AA1112'
    WITH RR;

A instrução SELECT retorna um ResultSet. O cursor é um ponteiro para uma linha específica do ResultSet. Nos aplicativos Java, todos os ResultSets são cursores. O cursor é atualizável, ou seja, podem ser atualizadas e excluídas linhas ao se caminhar através do ResultSet, se a instrução SELECT que gerou o cursor e sua consulta subjacente atenderem aos requisitos de poder ser atualizável, conforme detalhado abaixo. Deve ser utilizada a cláusula FOR UPDATE quando se deseja gerar um cursor atualizável.
Nota: A cláusula ORDER BY permite ordenar os resultados do SELECT. Sem a cláusula ORDER BY, os resultados são retornados em ordem aleatória.

Se a instrução SELECT atender aos requisitos listados abaixo, os cursores serão atualizáveis apenas se for especificado FOR UPDATE na cláusula FOR (consulte a Cláusula FOR UPDATE).

#### Requisitos para cursores atualizáveis e ResultSets atualizáveis

Somente os cursores simples, com SELECT em uma única tabela, e os ResultSets FORWARD_ONLY, podem ser atualizáveis. A instrução SELECT para ResultSet atualizável possui a mesma sintaxe que a instrução SELECT para cursor atualizável. Para gerar cursores atualizáveis:

- A instrução SELECT não pode incluir a cláusula ORDER BY.
- A Consulta subjacente deve ser uma ExpressãoSeleção.
- A ExpressãoSeleção da Consulta subjacente não pode incluir:
  - DISTINCT
  - Agregações
  - Cláusula GROUP BY
  - Cláusula HAVING
- A cláusula FROM na Consulta subjacente não pode ter:
  - mais de uma tabela
  - qualquer outra coisa além de um nome de tabela
  - ExpressãoSeleção
  - subconsultas

Não existe instrução na linguagem SQL para atribuir nome a um cursor. Em vez disso, deve ser utilizada a API do JDBC para atribuir nomes a cursores ou obter os nomes gerados pelo sistema. Para obter mais informações, deve ser consultado "Atribuir nome ou acessar o nome do cursor" no capítulo 5 do Guia do Desenvolvedor do Derby.

Os cursores são apenas-de-leitura por padrão. Para um cursor ser atualizável, deve ser especificado FOR UPDATE na cláusula FOR (consulte a Cláusula FOR UPDATE).

#### Sistema de dependência de instrução

A instrução SELECT depende de todas as tabelas e visões especificadas na consulta, e dos conglomerados (unidades de armazenamento, como heaps e índices) escolhidos como caminho de acesso para estas tabelas. A instrução CREATE INDEX não invalida a instrução SELECT preparada. A instrução DROP INDEX invalida a instrução SELECT preparada, se o índice for um caminho de acesso na instrução. Quando o SELECT inclui visões, também depende dos objetos do dicionário dos quais as visões dependem (consulte a Instrução CREATE VIEW).

Toda instrução UPDATE WHERE CURRENT ou DELETE WHERE CURRENT preparada sobre cursor de SELECT depende do SELECT. A remoção do SELECT através de uma instrução java.sql.Statement.close invalida UPDATE WHERE CURRENT e DELETE WHERE CURRENT.

O SELECT depende de todos os aliases utilizados na consulta. Remover um aliás invalida a instrução SELECT preparada, se a instrução utilizar o aliás.

Tópico pai: Instruções
Conceitos relacionados
Interação com o sistema de dependências
Instruções CREATE
Instruções DROP
Instruções RENAME
Instruções SET
Referências relacionadas
Instrução ALTER TABLE
CALL (PROCEDIMENTO)
Cláusula CONSTRAINT
Instrução DECLARE GLOBAL TEMPORARY TABLE
Instrução DELETE
Cláusula FOR UPDATE
Cláusula FROM
Cláusula GROUP BY
Cláusula HAVING
INNER JOIN
Instrução INSERT
Operação JOIN
LEFT OUTER JOIN
Instrução LOCK TABLE
Cláusula ORDER BY
Consulta
RIGHT OUTER JOIN
SubconsultaEscalar
ExpressãoSeleção
ExpressãoTabela
SubconsultaTabela
Instrução UPDATE
VALUES Expressão
Cláusula WHERE
Cláusula WHERE CURRENT OF