Aplicando regras de precedência para operadores em uma expressão

Temos no título três conceitos que devemos entender:

  1. Expressão
  2. Operadores
  3. Regras de precedência

Mas antes vamos entender alguns recursos da instrução SELECT: a cláusula WHERE e a cláusula ORDER BY.

A cláusula WHERE é um filtro que contém expressões critérios necessários para que uma linha seja incluída em uma instrução SQL. Sem esta cláusula todas as linhas em uma determinada tabela serão retornadas, mas com ela, uma instrução SQL pode filtrar linhas específicas para o retorno do processamento.

A cláusula ORDER BY ordena as linhas recuperadas. É muito flexível: pode classificar linhas em ordem crescente ou decrescente, ou por listas de expressão ou tirar proveito de outros recursos avançados.

expressao

Expressão

Usamos SQL basicamente para retornar informações do banco de dados e em algumas ocasiões necessitamos realizar operações ou cálculos nesses registros, por exemplo, ao executar um comando SQL para retornar o salário pode ser solicitado que aumente em 5%, trazendo assim o novo salário já com aumento, observe a consulta SQL abaixo:

SELECT id_funcionario, nome, salario, salario * 1.05 AS novo_salario FROM Pessoa

A consulta SQL acima traz o salário adicionado de 5%, utilizamos o cálculo matemático de multiplicação para realizar esta expressão, vamos analisar a instrução realizada, o comando começa com a palavra reservada SELECT seguido das colunas que desejamos retornar como id_funcionario, nome e o salario que é a informação que grava o salário atual e em seguida a expressão salario * 1.05, depois a palavra reservada AS que é o comando para apelidar uma coluna que foi apelidada de novo_salario, seguido da palavra reservada FROM que serve para dizer em qual tabela a consulta está sendo realizada que no caso é a tabela Pessoa.

Como resultado da consulta SQL acima temos o seguinte retorno:

Figura 1

A consulta foi realizada para ilustrar a expressão (salario * 1.05), podemos ter outros cálculos e expressões em outras partes do SQL como nas cláusulas WHERE e ORDER BY.

Cláusula ORDER BY

O ORDER BY é uma cláusula SQL que ordena o resultado da consulta SQL em ordem crescente ou decrescente, a forma padrão é a ordem crescente. Vimos na Figura 1 que o resultado da consulta na coluna NOME não está em ordem alfabética, para isso usamos a cláusula ORDER BY para ordená-la, vejamos um exemplo:

SELECT id_funcionario, nome, salario, salario * 1.05 AS novo_salario FROM Pessoa ORDER BY nome

Figura 2

Após o uso da cláusula (ORDER BY nome) podemos observar na Figura 2 que os nomes retornaram em ordem alfabética crescente, a ordem crescente é padrão e não é necessário informar o parâmetro, agora se desejar que liste em ordem decrescente então deverá passar o parâmetro DESC, a consulta ficaria assim:

SELECT id_funcionario, nome, salario, salario * 1.05 AS novo_salario FROM Pessoa ORDER BY nome DESC

Executando o comando acima teremos como resultado a seguinte tabela abaixo:

Figura 3

Observe a Figura 3 obtivemos a coluna NOME ordenado da forma decrescente, isso foi possível através do parâmetro DESC da cláusula ORDER BY, a ordenação se dá através de dois parâmetros o ASC que é o parâmetro default não sendo necessário informá-lo, já para ordenação decrescente é necessário informar o parâmetro DESC.

Podemos informar mais de uma coluna para ordenação, sendo o primeiro parâmetro o mais prioritário, em seguida o segundo e assim por diante. ORDER BY é sempre a última cláusula em uma instrução SELECT. É usado apenas no SELECT; ao contrário da cláusula WHERE, que também pode ser usada em UPDATE e DELETE, a cláusula ORDER BY é exclusiva da instrução SELECT e não é usada nas outras instruções SQL.

ORDER BY não altera os dados salvos, os dados da tabela permanecem inalterados em relação ao resultado do ORDER BY. O ORDER BY faz parte da instrução SELECT e a instrução SELECT não pode alterar os dados no banco de dados. Observe, no entanto, que, quando SELECT é incorporado a outras instruções SQL, como INSERT ou UPDATE, que podem efetuar alterações no banco de dados, mas não apenas por causa do SELECT. Você verá como isso funciona nos próximos posts. ORDER BY classifica a saída de uma instrução SELECT apenas para fins de exibição. É sempre a última etapa em uma instrução SELECT e executa sua classificação após todos os dados terem sido recuperados e processados pela instrução SELECT.

Quando a coluna for ordenada em modo crescente e ela possuir valores NULL (valores não preenchidos) então eles irão aparecer por último nos resultados.

Podemos incluir expressões tanto em colunas, que já mostramos um exemplo do salário aumentado em 5%, e podemos incluir expressões também nas cláusulas ORDER BY e WHERE. Qualquer expressão pode ser usada. Para ser útil, a expressão deve incluir um valor na tabela; caso contrário, o valor não poderá ser alterado e não haverá nenhum efeito significativo nas linhas da tabela. Por exemplo, aqui está uma lista de dados para a tabela PROJETOS:

Figura 4

Esta listagem de dados mostra uma série de projetos. Para cada projeto, vemos o SHIP_ID para o qual o projeto se destina, o custo total do projeto e o número estimado de dias necessários para concluir cada projeto. Observando os valores de PROJECT_COST e DAYS, vemos informações suficientes para calcular o custo médio por dia para cada projeto.

PROJECT_COST / DAYS

Por exemplo, o custo diário da inspeção de “Lifeboat Inspection” Figura 4 de três dias será 4000 ou 12000 dividido por 3. E se quisermos ordenar essas linhas de acordo com o valor calculado de PROJECT_COST / DAYS? Sem problemas. Esse cálculo será realizado para cada linha e cada linha terá um valor de resultado da expressão PROJECT_COST / DAYS, dessa forma o ORDER BY irá mostrar os registros ordenados de acordo com o resultado dos valores obtidos pela expressão.

SELECT * FROM PROJECTS ORDER BY PROJECT_COST / DAYS

Figura 5

Observe a Figura 5 que mostra os resultados desta consulta. Observe que as linhas da última coluna são ordenadas por um valor que não existe na tabela, mas sim por um valor resultante de uma expressão no ORDER BY que extrai valores da tabela.

Fizemos a ordenação colocando a expressão direto no ORDER BY, assim o resultado retornou ordenado em forma crescente de acordo com o resultado do cálculo. Também podemos apelidar essa expressão e usar o apelido da coluna no ORDER BY, dessa forma teremos o mesmo resultado da Figura 5 com a diferença de agora termos um código mais limpo:

SELECT PROJECT_ID, PROJECT_NAME, PROJECT_COST, DAYS, PROJECT_COST / DAYS AS PER_DAY_COST FROM PROJECTS ORDER BY PER_DAY_COST

ORDER BY através de Apelido em coluna – ALIAS

Vimos no exemplo anterior a expressão do cálculo sendo apelidado de PER_DAY_COST, em comando SQL isso se chama ALIAS, algumas observações devem ser feitas sobre apelidos de colunas ALIAS:

Cada expressão na lista SELECT pode, opcionalmente, ser seguida por um ALIAS (apelido de coluna). Um ALIAS é colocado após a expressão na lista de seleção, separado pela palavra-chave opcional AS e um espaço necessário. Se o ALIAS da coluna estiver entre aspas duplas, ele poderá incluir espaços e outros caracteres especiais.

Se o ALIAS da coluna não estiver entre aspas duplas, ele será nomeado de acordo com as regras padrão para nomear objetos de banco de dados. O ALIAS da coluna existe dentro da instrução SQL e seus resultados e não existe fora da instrução SQL. O ALIAS da coluna deve ser exclusivo; ele se tornará o novo cabeçalho na saída da instrução SQL.

O ALIAS da coluna pode ser referenciado na cláusula ORDER BY, mas não pode ser usado em outro lugar, como WHERE, GROUP BY ou HAVING.

ORDER BY com Referência por Posição

Outra maneira da cláusula ORDER BY identificar colunas a serem classificadas é através do método “referência por posição”. Isso funciona apenas se a intenção do ORDER BY for classificar linhas de acordo com as informações incluídas na lista SELECT. Aqui está um exemplo:

SELECT id_funcionario, nome, salario, salario * 1.05 AS novo_salario FROM Pessoa ORDER BY 2

Cada coluna pode ser identificada por um número, a primeira coluna da consulta acima é a id_funcionario e é a número 1, a coluna nome é a número 2 e assim por diante, o resultado dessa consulta é exatamente a Figura 2. Caso haja uma expressão ou subselect segue a mesma regra.

Combinação

Podemos usar combinação das formas apresentadas, veja um exemplo:

Figura 6

Analise o ORDER BY da consulta acima: O valor de SHIP_ID está em ordem decrescente, seguido do “The Project” que é o apelido da coluna PROJECT_NAME, em seguida temos o número 2 que é a referência por posição da coluna PROJECT_COST, que é o segundo item na lista SELECT.

ORDER BY e NULL

Quando SELECT executa uma classificação usando ORDER BY, ele trata todos os valores que considerar NULL como “maiores que” qualquer outro valor. Em outras palavras, quando você classifica por uma coluna de tipo de dados numéricos e essa coluna contém valores NULL, os valores NULL serão classificados como maiores que todos os valores NOT NULL da lista. O mesmo vale para tipos de dados de caracteres e tipos de dados de data.

limitando linhas

Cláusula WHERE

Basicamente a cláusula WHERE serve para limitar as linhas que são recuperadas por uma consulta. Ao criar uma instrução SELECT, sua primeira tarefa é identificar qual tabela de banco de dados (ou tabelas ou visualizações) contém os dados necessários. Você também precisa examinar a estrutura da tabela para escolher as colunas que serão incluídas na lista de seleção da sua instrução SELECT. Mas raramente você pára por aí. Na maioria das vezes, você deseja limitar as linhas a serem recuperadas para algumas, com base em algum tipo de regras de negócios. Essa tarefa é realizada com a cláusula WHERE da instrução SELECT. Esta seção examinará a cláusula WHERE e seu uso.

A cláusula WHERE é uma das cláusulas mais importantes de três instruções SQL diferentes: SELECT, UPDATE e DELETE. O objetivo da cláusula WHERE é identificar as linhas que você deseja incluir na sua instrução SQL. Se você estiver trabalhando com um SELECT, sua cláusula WHERE escolhe quais linhas serão incluídas no retorno do SELECT. Se você está trabalhando com um UPDATE, a cláusula WHERE define quais linhas serão atualizadas. Se for um DELETE, a cláusula WHERE define quais linhas serão excluídas.

A cláusula WHERE deve ser seguida da palavra reservada FROM, o WHERE é opcional mas se for incluído deve der depois do FROM, o WHERE irá verificar se a expressão é verdadeira ou falsa para cada linha da tabela(s) analisadas na consulta.

operadores

Operadores

A cláusula WHERE usa operadores de comparação para comparar duas expressões entre si. Consulte a tabela abaixo para obter uma lista completa dos operadores de comparação.

Tabela 1

Comparando expressões com operadores

A cláusula WHERE usa uma série de comparações, cada uma avaliada para cada linha como verdadeira ou falsa. Cada comparação envolve duas expressões avaliadas por um operador de comparação. As expressões são avaliadas primeiro e depois comparadas. Por exemplo, na comparação a seguir, à esquerda é uma expressão que consiste apenas na coluna SALARY e à direita é uma expressão que multiplica dois números juntos:

SALARY >= 50899 * 1.12

Neste exemplo, se o valor em SALARY for maior ou igual ao resultado da equação matemática 50899 vezes 1,12, o resultado será verdadeiro. Caso contrário, é falso. Os exemplos que você viu até agora mostraram nomes de colunas à esquerda, mas isso não é obrigatório. qualquer expressão válida pode ser colocada em ambos os lados do operador de comparação. Idealmente, uma das expressões deve incluir dados da tabela. Mas em termos de sintaxe, isso não é necessário. Tudo o que é necessário é uma expressão válida nos dois lados do operador de comparação. Vejamos outro exemplo:

START_DATE < END_DATE

Para uma determinada linha, se o valor na coluna intitulado START_DATE for menor que o valor na coluna intitulada END_DATE, a expressão será verdadeira; caso contrário, é falso. (Observe que quando o SQL compara datas, “menor que” significa “anterior a”. Por exemplo, 1º de janeiro é menor que 2 de janeiro do mesmo ano).

Comparando Tipo de Dados

Dentro de uma comparação, ambas as expressões devem ter o mesmo tipo de dados para que a comparação funcione. Existem essencialmente três categorias gerais de tipos de dados a serem consideradas ao realizar comparações – numérico, caracteres e data. A Tabela 2 lista as regras para comparar tipos de dados.

Tipo de DadosRegras de Comparação (em ordenação com ORDER BY)
NúmeroNúmero 1 é menor que 10 e -3 é menor que -1. zero é maior que qualquer número negativo.
CaractereA é menor que Z e Z é menor que a, ou seja, letras maiúsculas são menores que letras minúsculas. O caractere ‘2’ é maior que o caractere ’10’ porque é tratado como texto e não número.
DataOntem é menor que Amanhã.
regras

Regras de Precedência

As regras de precedência indica o que devemos considerar primeiro em expressões quando realizamos um filtro numa consulta. Vamos ver alguns conceitos antes:

Lógica Booleana

A cláusula WHERE inclui suporte à lógica booleana, na qual várias expressões podem ser conectadas a uma série de operadores booleanos. Esta seção analisa esses operadores, o que são, como são usados e sua ordem de precedência.

AND, OR

A maioria das cláusulas WHERE contém várias comparações. É aqui que os operadores booleanos entram. Duas ou mais comparações de expressões podem ser conectadas usando várias combinações dos operadores booleanos AND e OR. Há também um terceiro operador – NOT – e pode ser usado para inverter uma condição AND ou OR. Operadores booleanos avaliam várias expressões de comparação e produzem uma única conclusão verdadeira ou falsa a partir da série de comparações. Para um melhor entendimento pesquise sobre tabela verdade. Aqui está um exemplo:

SELECT EMPLOYEE_ID
FROM WORK_HISTORY
WHERE SHIP_ID = 3
AND
STATUS = 'Pending';

Basicamente a consulta acima irá validar para cada linha da tabela WORK_HISTORY se o SHIP_ID = 3 AND STATUS = ‘Pending’, se ambos valores forem verdadeiros então a linha será retornada na consulta. Caso fosse o operador OR bastaria uma condição ser verdadeira para retornar a linha não sendo as duas necessárias como no operador AND.

Em uma consulta poderá ter vários AND, OR, NOT e vários outros operadores que vimos anteriormente nesta página na Tabela 1, para resolver uma expressão com vários operadores deve seguir a uma regra de precedência conforme tabela abaixo.

OrdemOperadorDescrição
1( )Parênteses
2/ , *Divisão e Multiplicação
3+ , –Adição e subtração
4||Concatenação
5= , < , > , <= , =>Operadores de igualdade
6[NOT] LIKE, IS [NOT] NULL, [NOT] INOperador coringa, null e conjunto
7[NOT] BETWEENOperador de intervalo
8 != , <> , ^=Diferença
9NOTNOT condição lógica
10ANDAND condição lógica
11OROR condição lógica

Referência Bibliográfica

SQL Fundamentals I – Exam Guide 1Z0-061 – Página 168-169

Oracle Database SQL Exam Guide 1Z0-071 – Página 216-234