Neste post, falaremos sobre o tópico 1.2 da prova de SQL básico.

A sintaxe básica para executar um SELECT é a seguinte:
SELECT lista_colunas FROM lista_tabelas
[WHERE condições]
[AND|OR condições]
[ORDER BY lista_coluna[ASC|DESC]]

É importante deixar bem claro que a sintaxe acima aborda o mínimo necessário para recuperar as informações armazenadas no banco de dados. Existe uma quase infinidade de outras cláusulas que podem ser usadas no SQL para refinar a busca, gerando relatórios para os mais diversos objetivos.

[ESTRUTURA DE TESTES]

Vamos usar as seguintes tabelas para exemplificar algumas capacidades de um SELECT:

CREATE TABLE CERTIFICACAO.TAB_EMPREGADOS ( 
       ID_EMP                       NUMBER(6) NOT NULL,
       NOME_EMP                VARCHAR2(30) NOT NULL,
       SALARIO                     NUMBER(8,2) NOT NULL,
       DATA_ADMISSAO      DATE,
       ID_DEPARTAMENTO NUMBER
 );

CREATE TABLE CERTIFICACAO.TAB_DEPARTAMENTOS (
       ID_DEPARTAMENTO        NUMBER(6) NOT NULL,
       NOME_DEPARTAMENTO VARCHAR2(30) NULL,
       ID_GERENTE                     NUMBER(6) NULL
 );

[SELECT BÁSICO]

Para recuperar todas as colunas dessa tabela, sem aplicar restrições ou filtros:

SELECT * FROM CERTIFICACAO.TAB_EMPREGADOS;

OBS: Caso você esteja logado como usuário CERTIFICACAO então o schema antes da tabela não é necessário. Caso contrário, basta ou cria-se um sinônimo público para essa tabela, ou usar o schema antes de seu nome.

Para filtrar o resultado de uma query, basta usar a cláusula WHERE. Ela possui o seguinte formato:

WHERE COLUNA|EXPRESSAO OPERADOR_CONDICIONAL COLUNA|EXPRESSAO;

* COLUNA|EXPRESSAO: Coluna ou expressão a ser comparada

* OPERADOR_CONDICIONAL: “=” (igual), “>” (maior), “<“, (menor) “>=” (maior ou igual), “<=” (menor ou igual), “!=” (diferente), “<>” (diferente)

No exemplo a seguir a query retornará apenas a linha cuja coluna ID_EMP for igual a 100:

      SELECT * FROM CERTIFICACAO.TAB_EMPREGADOS
       WHERE ID_EMP = 100

[ALIAS]

É possível atribuir aliases para colunas de tabelas, que servem como apelidos. É possível atribuir aliases usando a palavra AS após a coluna, ou usando o alias entre aspas. Ex:

      SELECT ID_EMP AS ID_EMPREGADO,
                       SALARIO "Salário (R$)",
                       DATA_ADMISSAO
           FROM CERTIFICACAO.TAB_EMPREGADOS
        WHERE ID_EMP > 1000

[OPERADORES AND E OR]

Os operadores AND e OR podem ser usados quando for necessário usar mais de um filtro no resultado da query, especificando mais as condições de busca. Ao usar o AND, a linha só será retornada caso a primeira e a segunda condição for TRUE. No caso do OR, a linha retornada será a que apresentar pelo menos uma condição TRUE.

--a query abaixo retornara um, ou mais registro apenas se existir um 
--empregado de id   = 1000 e de salario = 2000. Teóricamente só retornaria uma 
--linha, pois ID_EMP seria a chave primária da tabela, e dois empregados não 
--poderiam ter o mesmo ID:

       SELECT * FROM CERTIFICACAO.TAB_EMPREGADOS
       WHERE ID_EMP = 1000 AND SALARIO = 2000

--a query abaixo retornara um, ou mais registro apenas se existir um empregado 
--de id = 1000 ou um empregado de salario = 2000

        SELECT * FROM CERTIFICACAO.TAB_EMPREGADOS
        WHERE ID_EMP = 1000 OR SALARIO = 2000

[ORDER BY]

A cláusula ORDER BY serve para ordenar o resultado do SELECT. Ele deve ser a última linha do SELECT. Os valores NULL são considerados maiores que os não-nulos. Sua sintaxe é:

ORDER BY [lista_colunas] [ASC|DESC]

A seguir é possível ver alguns exemplos do uso do ORDER BY:

--ordenando o resultado pelo id de cada empregado, ordenando de forma 
--ascendente (a palavra ASC pode ser omitida, já que ordenar de forma 
--ascendente é o default)

       SELECT * 
          FROM CERTIFICACAO.TAB_EMPREGADOS
       ORDER BY ID_EMP ASC;

--ordenando o resultado pelo id de cada empregado, ordenando de forma descendente

       SELECT * 
           FROM CERTIFICACAO.TAB_EMPREGADOS
        ORDER BY ID_EMP DESC;

--é possível ordenar usando mais de uma coluna. Neste caso eu estou ordenando
--de forma decrescente pelo departamento do empregado e de forma ascendente 
--pelo salário de cada empregado

       SELECT * 
          FROM CERTIFICACAO.TAB_EMPREGADOS
       ORDER BY ID_DEPARTAMENTO DESC, SALARIO ASC;

--também é possível ordenar pela posição da coluna no SELECT. 
--Abaixo eu estou ordenando pelas colunas ID_EMP (1º coluna do SELECT) e SALARIO (3º coluna do SELECT)
    
       SELECT ID_EMP, NOME_EMP, SALARIO 
           FROM CERTIFICACAO.TAB_EMPREGADOS 
         ORDER BY 1 ASC, 3 DESC

--No ORDER BY, podem aparecer nomes de colunas, expressões, funções 
--e aliases de colunas. Ex:

       SELECT E.NOME_EMP, 
                      TO_CHAR(E.SALARIO, '999G999G999D99'), 
                      E.ID_DEPARTAMENTO "Setor Empregado" 
          FROM CERTIFICACAO.TAB_EMPREGADOS E
       ORDER BY E.NOME_EMP, TO_CHAR(E.SALARIO, '999G999G999D99'), "Setor  Empregado"

[LIKE]

O operador LIKE serve para buscar cadeias de caracteres em uma string maior. Trabalha com os tipos de dados CHAR e VARCHAR2. Com o tipo de dados DATE, o ORACLE executa uma conversão implícita, fazendo com que o LIKE possa ser usado com tipos DATE. Sua sinxate básica é:

WHERE NOME_COLUNA LIKE ‘%STRING%’ [ESCAPE “CARACTERE_ESCAPE”];

A seguir, é possível ver alguns exemplos usando o LIKE:

--busca os empregados que possuam a letra "F" em seu nome 
--(coluna NOME_EMP)

       SELECT * 
           FROM CERTIFICACAO.TAB_EMPREGADOS
        WHERE NOME_EMP LIKE '%F%';

--busca os empregados cujo nome comece com "A"

       SELECT * 
          FROM CERTIFICACAO.TAB_EMPREGADOS
       WHERE NOME_EMP LIKE 'A%'
 
 --o caractere "underline" (_) serve para indicar qualquer caractere
 --o exemplo abaixo retorna "ANA", "ASA", "AGA" e etc...

       SELECT * 
          FROM CERTIFICACAO.TAB_EMPREGADOS
       WHERE NOME_EMP LIKE 'A_A%'
      
--caso seja necessario usar caracteres de escape, deve-se usar a cláusula ESCAPE.
--no exemplo abaixo, eu estou buscando o empregado que possua o nome "RICK_"
--se eu não usasse o ESCAPE, o ORACLE iria buscar os empregados cujo nome
--seguisse o padrão "RICK[A até Z]", pois o underline indica qualquer caractere.

       SELECT * 
          FROM CERTIFICACAO.TAB_EMPREGADOS
       WHERE NOME_EMP LIKE 'RICK_%' ESCAPE ''


[IN e NOT IN]

Os operadores IN e NOT IN servem para comparar os valores de uma coluna com uma lista de valores. Pode ser usado com datas, numeros e strings. A lista de expressões deve ser do mesmo tipo de dados, ou similar o suficiente para que o ORACLE possa converter implicitamente os valores. Sua sintaxe básica é:

WHERE NOME_COLUNA IN|NOT IN (LISTA_VALORES)

A seguir é possível ver alguns exemplos de uso do IN e NOT IN:

--retorna os empregados de id 100000 e 110000

       SELECT * 
           FROM CERTIFICACAO.TAB_EMPREGADOS
        WHERE ID_EMP IN (100000, 110000)

--retorna os empregados que não possuam id de 120000 e 130000

       SELECT * 
          FROM CERTIFICACAO.TAB_EMPREGADOS
       WHERE ID_EMP NOT IN (120000, 130000)

[BETWEEN]

O operador BETWEEN é usado para verificar registros entre um limite inicial e final de valores. Ele é inclusivo, ou seja, ele compara os valores determinados na faixa de valores, inclusive os 2 valores delimitadores da faixa. Sua sintaxe básica é:

WHERE NOME_COLUNA [NOT] BETWEEN LIMITE_INICIAL AND LIMITE_FINAL

A seguir é possível ver alguns exemplos de uso do BETWEEN:

--retorna os empregados que possuam id entre 100000 e 140000, inclusive os empregados de id 100000 e 140000

      SELECT * 
          FROM CERTIFICACAO.TAB_EMPREGADOS
       WHERE ID_EMP BETWEEN 100000 AND 140000

--retorna os empregados não possuam id entre 130000 e 180000

       SELECT * 
           FROM CERTIFICACAO.TAB_EMPREGADOS
        WHERE ID_EMP NOT BETWEEN 130000 AND 180000

[DICAS RÁPIDAS PARA O EXAME]

Quando se executa uma query, comparando uma coluna com NULL, esta query nunca retornará nada. Isso ocorre porque se está pedindo para o compilador SQL, por exemplo, comparar o valor da coluna XYZ com um valor “desconhecido”, que é isso o que o NULL representa… um valor desconhecido, e não um valor vazio. Qualquer coisa = NULL retornará FALSE. Por exemplo, caso eu possua uma linha na tabela CERTIFICACAO.TAB_EMPREGADOS com o valor da coluna ID_DEPARTAMENTO como NULL, caso eu execute a seguinte query:

      SELECT * 
           FROM CERTIFICACAO.TAB_EMPREGADOS
        WHERE ID_DEPARTAMENTO = NULL

… ela não vai retornar nada. Para verificar se uma coluna possui um valor nulo, usa-se o IS NULL | IS NOT NULL:

      SELECT * 
           FROM CERTIFICACAO.TAB_EMPREGADOS
        WHERE ID_DEPARTAMENTO IS NULL

A regra para validar operadores booleanos em queries é: NOT é validado antes, depois o AND e por fim o OR.

Na comparação de caracteres, as letras maiusculas possuem um peso menor que as letras minusculas, e os números possuem um peso menor que as letras. Ex:

‘A’ é menor que ‘Z’;
‘Z’ é menor que ‘a’
‘2’ é maior que ’10’

…caso eu execute a seguinte query:

      SELECT * FROM CERTIFICACAO.TAB_EMPREGADOS ORDER BY NOME_EMP DESC

…os empregados com nomes iniciados em letras minúsculas aparecerão primeiro, seguidos dos empregagos cadastrados com nomes iniciados em letras maiúsculas. Por último, aparecerão os empregados cadastrados com nomes iniciados por números (provavelmente um erro de digitação).

É isso ai. No próximo post, falaremos sobre o tópico de limitação e ordenação de dados, sendo que já falei um pouco sobre o ORDER BY.