Restringindo e classificando dados
Os recursos essenciais da instrução SELECT são Seleção, Projeção e União. Exibir colunas específicas de uma tabela é conhecido como operação de projeto. Agora vamos nos concentrar na exibição de linhas específicas de saída. Isso é conhecido como operação de seleção. Linhas específicas podem ser selecionadas adicionando uma cláusula WHERE a uma consulta SELECT. Na verdade, a cláusula WHERE aparece logo após a cláusula FROM na hierarquia de consulta SELECT. A sequência deve ser mantida em todos os cenários. Se violado, o Oracle levanta uma exceção.
Sintaxe:
SELECT *|{[DISTINCT] column| expression [alias],..}
FROM table
[WHERE condition(s)]
Na sintaxe,
A cláusula WHERE é a palavra-chave
[condição] contém nomes de coluna, expressões, constantes, literais e um operador de comparação.
Suponha que seu gerente esteja trabalhando no orçamento trimestral de sua organização. Como parte dessa atividade, é necessário produzir uma lista dos detalhes essenciais de cada funcionário, mas apenas para funcionários que recebem pelo menos $ 25.000 por ano. A consulta SQL abaixo realiza essa tarefa. Observe o uso da cláusula WHERE mostrada em negrito.
SELECT Employee_ID, Last_Name, First_Name, Salary
FROM employees
WHERE Salary >= 25000;
EMPLOYEE_ID LAST_NAME FIRST_NAME SALARY
---------- --------------- --------------- -----------
88303 Jones Quincey $30,550.00
88404 Barlow William $27,500.00
88505 Smith Susan $32,500.00
3 rows selected
Pontos a serem observados -
Uma cláusula SELECT pode conter apenas uma cláusula WHERE. No entanto, várias condições de filtro podem ser anexadas à cláusula WHERE usando o operador AND ou OR.
As colunas, literais ou expressões em uma cláusula de predicado devem ser de tipos de dados semelhantes ou interconvertíveis.
O alias da coluna não pode ser usado na cláusula WHERE.
Literais de caracteres devem ser colocados entre aspas simples e diferenciam maiúsculas de minúsculas.
Literais de data devem ser colocados entre aspas simples e diferenciam o formato. O formato padrão éDD-MON-RR.
Operadores de comparação
Operadores de comparação são usados em predicados para comparar um termo ou operando com outro termo. SQL oferece um conjunto abrangente de operadores de igualdade, desigualdade e diversos. Eles podem ser usados dependendo dos dados e da lógica da condição do filtro na consulta SELECT. Quando você usa operadores de comparação em uma cláusula WHERE, os argumentos (objetos ou valores que você está comparando) em ambos os lados do operador devem ser um nome de coluna ou um valor específico. Se um valor específico for usado, o valor deve ser um valor numérico ou uma string literal. Se o valor for uma sequência de caracteres ou data, você deve inserir o valor entre aspas simples ('').
O Oracle tem nove operadores de comparação para serem usados em condições de igualdade ou desigualdade.
Operator Meaning
= equal to
< less than
> greater than
>= greater than or equal to
<= less than or equal to
!= not equal to
<> not equal to
Outros operadores Oracle são BETWEEN..AND, IN, LIKE e IS NULL.
O operador BETWEEN
O operador BETWEEN pode ser usado para comparar um valor de coluna dentro de um intervalo definido. O intervalo especificado deve ter um limite inferior e superior, onde ambos são inclusivos durante a comparação. Seu uso é semelhante ao operador de desigualdade composta (<= e> =). Pode ser usado com valores numéricos, de caracteres e de tipo de data.
Por exemplo, a condição WHERE SALARY BETWEEN 1500 AND 2500 em uma consulta SELECT listará os funcionários cujo salário está entre 1.500 e 2.500.
O Operador IN
O operador IN é usado para testar um valor de coluna em um determinado conjunto de valores. Se a coluna pode ser igualada a qualquer um dos valores do conjunto fornecido, a condição é validada. A condição definida usando o operador IN também é conhecida como condição de associação.
Por exemplo, a condição WHERE SALARY IN (1500, 3000, 2500) em uma consulta SELECT restringirá as linhas em que o salário é 1.500, 3.000 ou 2.500.
O operador LIKE
O operador LIKE é usado para correspondência de padrões e pesquisas curinga em uma consulta SELECT. Se uma parte do valor da coluna for desconhecida, o curinga pode ser usado para substituir a parte desconhecida. Ele usa operadores curinga para construir a string de pesquisa, portanto, a pesquisa é conhecida como pesquisa curinga. Esses dois operadores são percentil ('%') e sublinhado ('_'). O sublinhado ('_') substitui um único caractere, enquanto o percentil ('%') substitui mais de um caractere. Eles também podem ser usados em combinação.
Por exemplo, a consulta SELECT abaixo lista os primeiros nomes dos funcionários cujo sobrenome começa com 'SA'.
SELECT first_name
FROM employees
WHERE last_name LIKE 'SA%';
Condições IS (NÃO) NULL
Para ser observado, os valores NULL não podem ser testados usando o operador de igualdade. É porque os valores NULL são desconhecidos e não atribuídos enquanto o operador de igualdade testa um valor definido. O operador IS NULL serve como operador de igualdade para verificar os valores NULL de uma coluna.
Por exemplo, a condição WHERE COMMISSION_PCT IS NULL em uma consulta SELECT listará os funcionários que não têm porcentagem de comissão.
Operadores lógicos
Várias condições de filtro podem ser adicionadas ao predicado da cláusula WHERE. Mais de uma condição pode ser combinada usando os operadores lógicos AND, OR e NOT.
AND: une duas ou mais condições e retorna resultados apenas quando todas as condições são verdadeiras.
OR: une duas ou mais condições e retorna resultados quando qualquer uma das condições for verdadeira.
NÃO: nega a expressão que o segue.
O operador AND vincula duas ou mais condições em uma cláusula WHERE e retorna TRUE apenas se todas as condições forem verdadeiras. Suponha que um gerente precise de uma lista de funcionárias. Além disso, a lista deve incluir apenas funcionários com sobrenomes que comecem com a letra "E" ou que venham posteriormente no alfabeto. Além disso, a tabela de resultados deve ser classificada pelo sobrenome do funcionário. Existem duas condições simples a serem atendidas. A cláusula WHERE pode ser escrita como: WHERE Gênero = 'F' AND last_name> 'E'.
SELECT last_name "Last Name", first_name "First Name", Gender "Gender"
FROM employees
WHERE Gender = 'F' AND last_name > 'E'
ORDER BY last_name;
O operador OR vincula mais de uma condição em uma cláusula WHERE e retorna TRUE se alguma das condições retornar verdadeira. Suponha que os requisitos de seu gerente organizacional mudem um pouco. É necessária outra lista de funcionários, mas nessa lista os funcionários devem: (1) ser mulheres ou, (2) ter um sobrenome que comece com a letra "T" ou uma letra que venha posteriormente no alfabeto. A tabela de resultados deve ser classificada pelo sobrenome do funcionário. Nessa situação, qualquer uma das duas condições pode ser atendida para satisfazer a consulta. As funcionárias devem ser listadas junto com as funcionárias cujo nome atenda à segunda condição.
O operador NOT é usado para negar uma expressão ou condição.
A cláusula ORDER BY
Quando você exibe apenas algumas linhas de dados, pode ser desnecessário classificar a saída; no entanto, quando você exibe várias linhas, os gerentes podem ser auxiliados na tomada de decisão, tendo as informações classificadas. A saída de uma instrução SELECT pode ser classificada usando a cláusula ORDER BY opcional. Quando você usa a cláusula ORDER BY, o nome da coluna na qual você está ordenando também deve ser um nome de coluna especificado na cláusula SELECT.
A consulta SQL a seguir usa uma cláusula ORDER BY para classificar a tabela de resultados pela coluna last_name em ordem crescente. A ordem crescente é a ordem de classificação padrão.
SELECT last_name, first_name
FROM employees
WHERE last_name >= 'J'
ORDER BY last_name;
last_name first_name
--------------- ---------------
Jones Quincey
Klepper Robert
Quattromani Toni
Schultheis Robert
A classificação também pode ser baseada em valores numéricos e de data. A classificação também pode ser feita com base em várias colunas.
Por padrão, a cláusula ORDER BY classificará as linhas de saída na tabela de resultados em ordem crescente. Podemos usar a palavra-chave DESC (abreviação de decrescente) para habilitar a classificação decrescente. O padrão alternativo é ASC, que classifica em ordem crescente, mas a palavra-chave ASC raramente é usada, pois é o padrão. Quando a palavra-chave opcional ASC ou DESC é usada, ela deve seguir o nome da coluna na qual você está classificando na cláusula WHERE.
Positional Sorting - A posição numérica da coluna na lista de colunas selecionada pode ser fornecida na cláusula ORDER BY, em vez do nome da coluna. É usado principalmente em consultas UNION (discutidas posteriormente). A Consulta ordena o resultado definido por salário, uma vez que aparece em segundo lugar na lista de colunas.
SELECT first_name, salary
FROM employees
ORDER BY 2;
Variáveis de Substituição
Quando uma consulta SQL precisa ser executada mais de uma vez para os diferentes conjuntos de entradas, as variáveis de substituição podem ser usadas. As variáveis de substituição podem ser usadas para solicitar entradas do usuário antes da execução da consulta. Eles são amplamente usados na geração de relatórios com base em consulta, que obtém a faixa de dados dos usuários como entrada para a filtragem condicional e exibição de dados. Variáveis de substituição são prefixadas por um único símbolo de e comercial (&) para armazenar valores temporariamente. Por exemplo,
SELECT EMPLOYEE_ID, LAST_NAME, SALARY
FROM employees
WHERE LAST_NAME = &last_name
OR EMPLOYEE_ID = &EMPNO;
Quando a consulta SELECT acima é executada, o oracle identifica o '&' como variável de substituição. Ele solicita que o usuário insira o valor para 'last_name' e 'EMPNO' conforme abaixo.
Enter value for last_name:
Enter value for empno:
Depois que o usuário fornece entradas para ambas as variáveis, os valores são substituídos, a consulta é verificada e executada.
Pontos a serem observados -
Se a variável se destina a substituir um caractere ou valor de data, o literal precisa ser colocado entre aspas simples. Uma técnica útil é colocar a variável de substituição "e" comercial entre aspas simples ao lidar com valores de caracteres e datas.
Tanto o SQL Developer quanto o SQL * Plus suportam as variáveis de substituição e os comandos DEFINE / UNDEFINE. Embora o SQL Developer ou SQL * Plus não ofereça suporte a verificações de validação (exceto para tipo de dados) na entrada do usuário.
Você pode usar as variáveis de substituição não apenas na cláusula WHERE de uma instrução SQL, mas também como substituição para nomes de colunas, expressões ou texto.
Usando a variável de substituição de E comercial duplo
Quando a mesma variável de substituição é usada em mais de um lugar, então, para evitar a reinserção dos mesmos dados novamente, usamos a substituição do e comercial dupla. Nesses casos, o valor da variável de substituição, uma vez inserido, seria substituído em todos os instantes de uso.
SELECT first_name, HIRE_DATE, SEPARATION_DATE
FROM employees
WHERE HIRE_DATE LIKE '%&DT%' AND SEPARATION_DATE '%&&DT%'
Observe que o mesmo valor de & DT é substituído duas vezes na consulta acima. Assim, seu valor uma vez fornecido pelo usuário será substituído em dois locais.
Os comandos DEFINE e VERIFY
A definição de variáveis em uma sessão é feita pelo recurso DEFINE do SQL * Plus. As variáveis podem ser definidas na sessão, de forma a evitar paradas durante a execução da consulta. O Oracle lê a mesma variável sempre que encontrada em uma consulta SQL. Ele está no estado LIGADO por padrão. Com a ajuda da cláusula DEFINE, pode-se declarar uma variável na linha de comando antes da execução da consulta comoDEFINE variable=value;.
O comando Verify verifica a substituição acima exibida como instrução OLD e NEW. Está DESLIGADO por padrão e pode ser definido como LIGADO usando o comando SET.
SQL> SET DEFINE ON
SQL> SET VERIFY ON
SQL> DEFINE NAME = MARTIN'
SQL> SELECT first_name, SALARY
FROM employees
WHERE first_name = '&NAME';
OLD 1: select first_name, sal from employee where first_name = '&first_name'
new 1: select first_name, sal from employee where first_name = 'MARTIN'
first_name SALARY
------- -------
MARTIN 5000