SQL em Oracle > DML > SELECT > Operadores do SQL
Operadores do SQL tl_logo2.jpg

O SQL possui cinco operadores especiais:

OPERADOR SIGNIFICADO
BETWEEN
NOT BETWEEN
Intervalo fechado compreendido entre os dois valores val1 e val2
IN (val1,val2,val3,val4)
NOT IN (val1,val2,val3,val4)
Pertence à lista de valores val1, val2, val3, val4
LIKE
NOT LIKE
Cadeia de caracteres que satisfaz a condição. Utilizar % e _
REGEXP_LIKE Cadeia de caracteres que satisfaz uma expressão regular
IS NULL
IS NOT NULL
É um valor NULL


BETWEEN

Permite pesquisar valores compreendidos entre um valor minimo e máximo (inclusivé). Utilizado na construção de condições, por exemplo para cláusula WHERE.

Ex: Listar empregados cujo salário está compreendido entre 1000 e 2000:

SELECT ename, sal
FROM emp
WHERE sal BETWEEN 1000 AND 2000;
ENAME            SAL
---------- ---------
ALLEN           1600
WARD            1250
MARTIN          1250
TURNER          1500
ADAMS           1100
MILLER          1300

6 rows selected.

Ex: Listar empregados cujo salário não está compreendido entre 1000 e 2000 (menor que 1000 ou maior que 2000):

SELECT ename, sal
FROM emp
WHERE sal NOT BETWEEN 1000 AND 2000;
ENAME            SAL
---------- ---------
SMITH            800
JONES           2975
BLAKE           2850
CLARK           2450
SCOTT           3000
KING            5000
JAMES            950
FORD            3000
clark           3333
5CHARLES        5000

10 rows selected.

bthome.gifTopo


IN (val1,val2,val3,val4)

Procura os valores numa lista especificada. Ex: encontrar todos os empregados que têm como chefe (MGR) o 7902, 7566 ou 7788:

SELECT empno, ename, sal, mgr
FROM emp
WHERE mgr IN (7902, 7566, 7788);
    EMPNO ENAME            SAL       MGR
--------- ---------- --------- ---------
     7369 SMITH            800      7902
     7788 SCOTT           3000      7566
     7876 ADAMS           1100      7788
     7902 FORD            3000      7566

4 rows selected.

Ex: Para encontrar todos os empregados que não têm como chefe (MGR) o 7902, 7566 ou 7788:

SELECT empno, ename, sal, mgr
FROM emp
WHERE mgr NOT IN (7902, 7566, 7788);
    EMPNO ENAME            SAL       MGR
--------- ---------- --------- ---------
     7499 ALLEN           1600      7698
     7521 WARD            1250      7698
     7566 JONES           2975      7839
     7654 MARTIN          1250      7698
     7698 BLAKE           2850      7839
     7782 CLARK           2450      7839
     7844 TURNER          1500      7698
     7900 JAMES            950      7698
     7934 MILLER          1300      7782
     7799 clark           3333      5555
     7798 5CHARLES        5000      5556

11 rows selected.

bthome.gifTopo


LIKE

Quando não se conhece o valor exacto a procurar, mas temos uma ideia aproximada, podemos utilizar o operador LIKE. Permite seleccionar linhas que concordem com um dado padrão de caracteres. A cadeia de caracteres usada como padrão de pesquisa pode utilizar dois símbolos especiais:

SIMBOLO REPRESENTA
% Qualquer cadeia com nenhum ou vários caracteres
_ Um caracter qualquer

Ex: listar todos os empregados cujo nome começa por 'S':

SELECT ename
FROM emp
WHERE ename LIKE 'S%';
ENAME
----------
SMITH
SCOTT

2 rows selected.

Ex: listar todos os empregados cujos nomes tenham exactamente 4 caracteres de dimensão:

SELECT ename
FROM emp
WHERE ename LIKE '____';
ENAME
----------
WARD
KING
FORD

3 rows selected.

Ex: listar empregados cuja função não começa por um M:

SELECT ename, job
FROM emp
WHERE job NOT LIKE 'M%';
ENAME      JOB
---------- ---------
SMITH      CLERK
ALLEN      SALESMAN
WARD       SALESMAN
MARTIN     SALESMAN
SCOTT      ANALYST
KING       PRESIDENT
TURNER     SALESMAN
ADAMS      CLERK
JAMES      CLERK
FORD       ANALYST
MILLER     CLERK

11 rows selected.

SELECT ename, job
FROM emp
WHERE NOT job LIKE 'M%';
ENAME      JOB
---------- ---------
SMITH      CLERK
ALLEN      SALESMAN
WARD       SALESMAN
MARTIN     SALESMAN
SCOTT      ANALYST
KING       PRESIDENT
TURNER     SALESMAN
ADAMS      CLERK
JAMES      CLERK
FORD       ANALYST
MILLER     CLERK

11 rows selected.

note04.gif

bthome.gifTopo


REGEXP_LIKE

Permite pesquisar valores que satisfazem uma expressão regular. Estas têm desempenho mais lento que o LIKE, mas possuem uma sintaxe mais rica, que permite maior variedade na condição de pesquisa.

Máscara Significado
^ No inicio da string
$ No fim da string
* Zero ou mais ocorrências
+ Uma ou mais ocorrências
. Representa qualquer carater excepto NULL
| OR - permite introduzir um critério de pesquisa alternativo
[] Permite introduzir uma lista de caracteres que será usada como referência obrigatória na pesquisa
[^] Nega o caracter ou sequência que for escrita a seguir
() Usado para criar um grupo de alternativas
{m} Tem que existir "match" em m resultados. O número m é o valor máximo e minimo
{n,m} A linha aparece se houver n ou mais matchs, mas sempre sem exceder os m matches (n<=m)
{n,} A linha aparece se houver n ou mais matchs
[A-Z] Letras maiúsculas
[a-z] Letras minusculas

Sites com exemplos de expressões regulares:

Neste exemplo procuramos linhas onde o valor da coluna first_name começa por S ("case sensitive"):

SELECT first_name
FROM employees
WHERE REGEXP_LIKE (first_name, '^S');

A mesma pesquisa mas "case insensitive" (repare no terceiro argumento da função):

SELECT first_name
FROM employees
WHERE REGEXP_LIKE (first_name, '^S', 'i');

First_name termina por s ("case sensitive"):

SELECT first_name
FROM employees
WHERE REGEXP_LIKE (first_name, 'S$');

first_name começa por S e tem mais 5 carateres (6 no total)

SELECT first_name
FROM employees
WHERE REGEXP_LIKE (first_name, '^S....');

O exemplo anterior não funciona se colocar-mos 3, pois como não existem ocorrências o SGBD lista todos os que começam por S. O próximo exemplo dá o mesmo resultado que o anterior, mas já funciona corretamente quando variamos para 3,4 ou 6 caracteres:

SELECT first_name
FROM employees
WHERE REGEXP_LIKE (first_name, '^S[a-z]{5}$');

O mesmo que o exemplo anterior mas com pesquisa "case insensitive":

SELECT first_name
FROM employees
WHERE REGEXP_LIKE (first_name, '^S[a-z]{5}$', 'i');

first_name começa por S,tem mais 5 carateres e o terceiro é "e"":

SELECT first_name
FROM employees
WHERE REGEXP_LIKE (first_name, '^S.e...');

first_name começa por S, tem mais 5 carateres e o último carater é um ponto, que é um simbolo reservado e por isso tem que ser "scaped". Não temos linhas nestas condições:

SELECT first_name
FROM employees
WHERE REGEXP_LIKE (first_name, '^S.....\.');

first_name não começa por "S". Os parentesis retos são usados como obrigatoriedade e o simbolo ^ funciona como negação:

SELECT first_name
FROM employees
WHERE REGEXP_LIKE (first_name, '^[^S]');

first_name começa por "Ste" termina em "en" e no meio tem "v" ou "ph". Os parentesis curvos são usados para alternativas de valores:

SELECT first_name
FROM employees
WHERE REGEXP_LIKE (first_name, '^Ste(v|ph)en$');

bthome.gifTopo


IS NULL

Utilizado para procurar valores NULL. Ex: Procurar todos os empregados que não têm chefe:

SELECT ename, mgr
FROM emp
WHERE mgr IS NULL;
ENAME            MGR
---------- ---------
KING

1 row selected.

Ex: procurar todos os empregados que têm chefe:

SELECT ename, mgr
FROM emp
WHERE mgr IS NOT NULL;
ENAME            MGR
---------- ---------
SMITH           7902
ALLEN           7698
WARD            7698
JONES           7839
MARTIN          7698
BLAKE           7839
CLARK           7839
SCOTT           7566
TURNER          7698
ADAMS           7788
JAMES           7698
FORD            7566
MILLER          7782
clark           5555
5CHARLES        5556

15 rows selected.

note04.gif


SELECT ename, comm
FROM emp
WHERE comm=NULL;
no rows selected.
SELECT ename, comm
FROM emp
WHERE comm!=NULL;
no rows selected.

bthome.gifTopo


Realizado por Turtle Learning ®. Última alteração em 2011-02-26