DB2 - Banco de dados - A Linguagem SQL - www.cadcobol.com.br



Desenvolvido por DORNELLES Carlos Alberto - Analista de Sistemas - Brasília DF. - cad_cobol@hotmail.com

A Linguagem SQL

Introdução

Entre 1974 e 1979, o San José Research Laboratory da IBM desenvolveu um SGDB relacional que ficou conhecido como Sistema R.

Para a criação e acesso aos dados foi adotada uma linguagem chamada SEQUEL, mais tarde rebatizada SQL (Structured Query Language).

A SQL foi adotada como padrão mundial em 1987, é uma linguagem exclusiva de banco de dados relacionais;

A SQL Não dispõe dos seguinte recursos:

  • Repetição e desvio, do tipo WHILE, IF, FOR e GOTO;
  • Comandos para manipulação de telas e impressão de relatórios;
  • Comandos para manipulação de arquivos;

Os Fabricantes de SGBD podem expandir a linguagem SQL padrão ANSI, desde que os comandos básicos sejam aceitos.

Na verdade, cada fabricante possui uma extensão própria da SQL, para adicionar recursos específicos de cada banco de dados.

Embora tenha sido uma linguagem orientada à query em sua definição, a SQL foi projetada de forma a permitir que além de consultas (queries), inserções, alterações e deleções fossem feitas, além da própria criação das tabelas e campos.

Dividiu-se a SQL então em duas partes:

  • DDL: Data Description Language (Linguagem de Descrição de Dados);
  • DML: Data Manipulation Language (Linguagem de Manipulação de Dados).

Alguns autores ainda consideram uma terceira parte da SQL que cuida de controle de acesso aos dados:

  • DCL : Data Control Language ( Linguagem de Controle de Dados )

A Álgebra Relacional e a SQL

A Álgebra Relacional ajuda no raciocinio lógico para efetuar as operações de consulta ou atualização no banco de dados.
Ela deve ser usada antes de se implementar a operação em SQL.

Praticamente toda operação da Álgebra Relacional pode ser implementada em SQL com os comandos SELECT, UPDATE e DELETE.

O comando SELECT é usado para consultas no banco de dados.
Por outro lado, os comandos UPDATE e DELETE são usados para atualizar e remover informações do banco de dados e usam também a Álgebra Relacional para definirem o conjunto de informações, linhas das tabelas, que deve ser atualizado ou removido.

Por isso é importante conhecer a Álgebra Relacional e saber raciocinar em termos de suas operações Antes de se implementar as operações em SQL.

Abaixo mostro como isso pode ser feito para cada operação da Álgebra Relacional.

SELEÇÃO

Questão: Empregados com salário maior que 3000 Solução: Selecionar as linhas da tabela EMPREGADO que atendem a condição acima.
Álgebra Relacional: SELECAO

Em SQL:

   SELECT *
   FROM   EMPREGADOS
   WHERE  SALARIO > 3000;

JUNÇÂO INNER ( PC + SELEÇÃO )

Questão: nome dos Empregados e nome dos projetos que cada um trabalha.
Solução: Juntar as tabelas EMPREGADO e PARTICIPACAO, do resultado desta junção deve-se juntar com a tabela PROJETOS e do resultado desta segunda junção deve-se projetar o nome do empregado e o nome do projeto
Álgebra Relacional: JOIN ( PC + SELECAO )

Em SQL:

   SELECT E.nome
   ,      P.nome
   FROM   EMPREGADOS E
   ,      PROJETOS P
   ,      PARTICIPACAO PA
   WHERE  E.matric = PA.matric
   AND    P.PN     = PA.PN

JUNÇÂO OUTER ( PC + SELEÇÃO )

Questão: nome dos Empregados e nome dos projetos que cada um trabalha, considerando os Empregados que não trabalham em projeto algum.
Solução: Juntar as tabelas EMPREGADO e PARTICIPACAO, do resultado desta junção deve-se juntar com a tabela PROJETOS e do resultado desta segunda junção deve-se projetar o nome do empregado e o nome do projeto
Álgebra Relacional: JOIN ( PC + SELECAO )

Em SQL:

   SELECT E.nome
   ,      P.nome
   FROM   EMPREGADOS E
   ,      PROJETOS P
   ,      PARTICIPACAO PA
   WHERE  E.matric = PA.matric
   AND    P.PN = PA.PN (+)

MINUS

Questão:Empregados sem Projetos ( estão de bobeira ).
Solução: Retirar da tabela de Empregados aqueles empregados que estão alocados em algum projeto na tabela Participacao.
Álgebra Relacional: Empregados ( matric ) - Participacao ( matric )

Em SQL:

   SELECT E.nome
   FROM   EMPREGADOS E
   WHERE  NOT EXISTS 
          ( SELECT * 
            FROM   PARTICIPACAO P
            WHERE  P.matric = E.matric )

PROJEÇÃO

Questão:Listar nome e salarios dos empregados da Empresa.
Solução: Projetar as colunas nome e salario da tabela Empresa.
Álgebra Relacional: Empregados ( nome, salario )

Em SQL:

   SELECT E.nome
   ,      E.salario
   FROM   EMPREGADOS E;

Questão:Listar matricula dos empregados que estão trabalhando em algum projeto.
Solução: Projetar a coluna matricula da tabela Participacao.
Álgebra Relacional: Participacao ( matric ) Em SQL:

   SELECT P.matric
   FROM   PARTICIPACAO P;

Para evitar linhas repetidas em uma projeção podemos usar a clausula DISTINCT, conforme abaixo:

Em SQL:

   SELECT DISTINCT P.matric
   FROM   PARTICIPACAO P;

UNION

Questão: Nome e matrícula dos empregados chefes de departamento e/ou projeto.
Solução: Juntar as tabelas Empregado e Departamento, do resultado fazer uma uniao com o resultado da junção das tabelas Empregado e Projeto, do resultado projetar o nome e a matricula dos empregados.
Em Álgebra Relacional: JOIN ( PC + SELECAO ) com União

Em SQL:

   SELECT E1.nome
   ,      D.CHEFE
   ,     'Chefe de Departamento'
   FROM   EMPREGADO    E1
   ,      DEPARTAMENTO D
   WHERE  E1.matric = D.chefe
   UNION
   SELECT E2.NOME
   ,      P.CHEFE
   ,     'Lider de Projeto'
   FROM   EMPREGADO E2
   ,      PROJETO   P
   WHERE  E2.matric = P.CHEFE;

DIVIDE

Questão: Nome dos empregados que trabalham em todos os projetos.
Solução: Retirar da tabela Empregados os empregados e os projetos nos quais não trabalham
Em Álgebra Relacional: Empregados(matric) - ( ( Empregados(matric) * Projeto(pn) ) - participacao(matric, pn) )

Em SQL:

   SELECT DISTINCT E.nome
   FROM   EMPREGADO E
   WHERE  NOT EXISTS 
         (SELECT * 
          FROM   PROJETO PJ
          WHERE NOT EXISTS 
               (SELECT * 
                FROM   PARTICIPACAO P
                WHERE  E.matric = P.matric AND PJ.pn = P.pn ) );

DDL - Linguagem de Definição de Dados

A DDL, do inglês Data Definition Language, é uma parte muito pequena da SQL, que permite a criação, a alteração e a remoção de objetos do banco de dados.
Os objetos podem ser tabelas, índices, visões e qualquer outro objeto criado pelo usuário para armazenamento ou apresentação de informações.
Desta forma, a DDL permite a manutenção do dicionário de dados. O dicionário de dados contém a definição de cada tabela, de cada campo, cada objeto enfim, contém a definição da base de dados propriamente dita.
Em outras palavras, o dicionário de dados guarda dados sobre os objetos do banco de dados.
Embora existam algumas outras construções, a mais importante das construções da DDL é a destinada a criação de tabelas.
Também é possível a criação de outros objetos como visões, índices, usuários, sequencias, procedimentos armazenados ( stored procedures ) e gatilhos ( triggers ).

Abaixo um exemplo de uso da SQL para criação de uma tabela de funcionários:

CRIANDO TABELAS

   CREATE TABLE FUNCIONáRIO
         (MATRFUNC NUMBER(5) NOT NULL
   ,      NOMEFUNC CHAR(40)
   ,      CDSETFUNC NUMBER(3)
   ,      RUANOFUNC CHAR (40)
   ,      BAIRROFUNC CHAR(15)
   ,      CDCIDFUNC NUMBER(5)
   ,      SALRFUNC NUMBER (11,2);

   CREATE TABLE DEPT
         (DEPTNO NUMBER(2) NOT NULL
   ,      DNAME VARCHAR2(14)
   ,      LOC VARCHAR2(13));

   CREATE TABLE EMP
         (EMPNO NUMBER(4) NOT NULL
   ,      ENAME VARCHAR2(10)
   ,      JOB CHAR(9)
   ,      MGR NUMBER(4)
   ,      HIREDATE DATE
   ,      SAL NUMBER(7,2)
   ,      COMM NUMBER(7,2)
   ,      DEPTNO NUMBER(2) NOT NULL);

Abaixo um exemplo de uso da SQL para alterar uma tabela

ADICIONANDO UMA NOVA COLUNA NA TABELA

   ALTER TABLE DEPT
         ADD (CCUSTO NUMBER(6));

ALTERANDO O TAMANHO DE UMA COLUNA

   ALTER TABLE DEPT
         MODIFY DNAME CHAR(20);

REMOVENDO UMA TABELA

   DROP TABLE funcionario;

CRIANDO VIEWS

   CREATE VIEW MANAGERS AS
          SELECT ENAME
          ,      JOB
          ,      SAL
          FROM   EMP
          WHERE  JOB = 'MANAGER';

DELETANDO VIEWS

   DROP VIEW MANAGERS;

DEFININDO A INTEGRIDADE REFERENCIAL

CHAVE PRIMÁRIA ( PRIMARY KEY )

   CREATE TABLE FILIAL
         (CD_EMPRESA NUMBER(6,0) NOT NULL
   ,      CD_FILIAL NUMBER(4,0) NOT NULL
   ,      CD_TIPO VARCHAR2(20)
   ,      DT_CADASTRO DATE,
          CONSTRAINT PK_FILIAL PRIMARY KEY(CD_EMPRESA,CD_FILIAL));

DML - Linguagem de Manipulação de Dados

A DML, do inglês Data Manipulation Language, é a parte mais ampla da SQL que permite manipular os dados com operações de consulta e atualização de dados.
São suportadas operações para se pesquisar, alterar, incluir e deletar dados no banco de dados.
São quatro os comandos mais importantes da DML:

  • SELECT: permite a consulta de linhas de uma ou mais tabelas;
  • UPDATE: permite a atualização de uma única linha ou um conjunto de linhas de uma tabela;
  • DELETE: permite a exclusão de uma única linha ou um conjunto de linhas de uma tabela;
  • INSERT: permite a inclusão de linhas em uma tabela;

Abaixo um exemplo de uso dos comandos DML de atualização de dados:

INSERINDO DADOS EM TABELAS

   INSERT INTO DEPT 
        ( DNAME
        , DEPTNO )
   VALUES
        ( ´CAIXA'
        , 60);

ALTERANDO DADOS EM TABELAS

   UPDATE EMPREGADO
          SET    SALARIO = SALARIO * 1.05;

   UPDATE EMPREGADO
          SET    SALARIO = SALARIO * 1.06
          WHERE  COD_DEPTO = 100;

   UPDATE EMPREGADO
          SET    SALARIO = SALARIO * 1.07
          WHERE  MATRIC = 1004560;

REMOVENDO DADOS EM TABELAS

   DELETE FROM EMPREGADO;

   DELETE FROM EMPREGADO 
         WHERE cod_depto = 200;

   DELETE FROM EMPREGADO 
         WHERE matric = 1004560;

ATUALIZANDO REGISTROS

   UPDATE EMP
          SET JOB='MANAGER'
        WHERE ENAME='MARTIN';

ATUALIZANDO VÁRIOS REGISTROS

   UPDATE EMP
          SET JOB='VENDEDOR'
        WHERE JOB='SALESMAN';

   UPDATE EMP
      SET DEPTNO=40, JOB='SALESMAN'
    WHERE JOB='VENDEDOR';

DELETANDO LINHAS DAS TABELAS

   DELETE FROM EMP
    WHERE ENAME='MARTINS';

   DELETE FROM DEPT
    WHERE DEPTNO=60;

O Comando SELECT

O comando SELECT realiza uma consulta nas tabelas do Banco de Dados.
Ele permite lista os atributos do resultado de uma consulta;

O comando SELECT implementa as operações de projeção, seleção, join, union, minus e divide da Àlgebra Relacional;

Formato:

SELECT coluna1, coluna2, coluna3, ..., colunaN
FROM A lista de tabelas deve ser separada por vírgula: Exemplo: tabela1, tabela2, ..., tabelaN>
WHERE ORDER BY A lista de colunas deve ser separada por vírgula: Exemplo: coluna1, coluna2, ..., colunaN >
GROUP BY Utilizada em conjunto com as funções de agregação.
A lista de colunas deve ser separada por vírgula:

Abaixo um exemplo de uso dos comandos DML de consulta de dados:

  1. Selecionar todos os atributos de cada funcionário:
    SELECT * FROM FUNCIONARIO;

  2. Selecionar todos os atributos dos funcionários da cidade de Tubarão:
    SELECT * FROM funcionário WHERE cidafunc = “Tubarão”;

  3. Selecionar os nomes de todos os funcionários da cidade de Tubarão e salários maior que R$ 500,00
    SELECT nomefunc FROM funcionário Where cidafunc = “Tubarão” and salafunc > 500;

  4. Selecionar o nome e rua onde moram os funcionários com matrícula maior que 100 e cidade igual a 25:
    SELECT nomefunc, ruanofunc FROM funcionário WHERE cdcidfunc= 25 AND matrfunc > 100;

  5. Selecionar o nome rua onde moram os funcionários com matrícula maior do que 100 e cidade igual a 25, ordenados por nome em ordem decrescente:

       SELECT NOMEFUNC
       ,      RUANOFUNC
       FROM   FUNCIONARIO
       WHERE  CDCIDFUNC = 25
       AND    MATRFUNC  > 100
       ORDER  BY NOMEFUNC DESC

  6. Selecionar para cada funcionário o seu nome e o de sua cidade:

       SELECT NOMEFUNC
       ,      NOMECID
       FROM   FUNCIONARIO
       ,      CIDADE
       WHERE  CDCIDFUNC = CDCIDADE;

Cláusulas para uso na cláusula WHERE

BETWEEN Faz uma pesquisa entre uma faixa de valores para um campo da tabela.

   SELECT *
   FROM   FUNCIONARIO
   WHERE  IDADEFUNC BETWEEN 18 AND 30;

NOT BETWEEN Faz uma pesquisa descartando uma faixa de valores.

   SELECT *
   FROM   FUNCIONARIO
   WHERE  IDADEFUNC NOT BETWEEN 18 AND 30;

IN Consulta a presença de um campo em um conjunto de valores

NOT IN Consulta a não presença de um campo em um conjunto de valores

   SELECT *   FROM   FUNCIONARIO
   WHERE  CDCIDFUNC IN ( 10, 20, 30 ,35);

LIKE Compara a existência de uma caracter em uma determinada posição em uma string.

  • ‘_‘ Testa a existência de um caracter não nulo na posição;
  • ‘%’ representa qualquer seqüência de n caracteres.

NOT LIKE Compara a não existência de um caracter em uma determinada posição em uma string.

   SELECT *
   FROM   FUNCIONARIO
   WHERE  NOMEFUNC LIKE ‘RUDINEY%’

   Esta consulta traz todos os funcionários com primeiro nome Rudiney não importa o resto do nome.

   SELECT *
   FROM   FUNCIONARIO
   WHERE  NOMEFUNC LIKE ‘%DA SILVA’

   Neste caso localiza todos os funcionários com sobrenome “ da Silva” .

NULL Verifica se o valor do campo comparado é vazio;

NOT NULL Verifica se o valor do campo comparado não é vazio; Se está preenchido.

   SELECT *
   FROM   FUNCIONARIO
   WHERE  ENDERECO IS NULL;

   SELECT *
   FROM   FUNCIONARIO
   WHERE  DATA_DEMISSAO IS NOT NULL;

EXISTS Verifica se o resultado do cálculo da subconsulta representada por “select * from “ Não é vazia.

   SELECT X
   FROM   A
   WHERE  EXISTS 
          ( SELECT *
            FROM   B
            WHERE Y = X)

O campo X da relação A será selecionado, se existir um elemento y=x na relação B.

Exemplo: Matricula dos Empregados que estão trabalhando em algum projeto.

   SELECT E.MATRIC
   FROM   EMPREGADOS E
   WHERE  EXISTS 
          ( SELECT 1 
            FROM   PARTICIPACAO P
            WHERE  E.MATRIC = P.MATRIC )

UTILIZANDO FUNÇÕES AGREGAÇÃO

  • AVG - Retorna a Média dos valores da Coluna
  • COUNT - Retorna a contagem o número de valores da coluna
  • MAX - Retorna o Maior valor da coluna
  • MIN - Retorna oMenor valor da coluna
  • SUM - Retorna a Soma dos valores da Coluna
   SELECT MAX(SAL)
   FROM   EMP

   SELECT DEPTNO, SUM(SAL)
   FROM   EMP
   GROUP  BY DEPTNO;

   SELECT MAX(IDADE), NIM(IDADE)
   FROM   ALUNOS;

   SELECT AVG(SALARIO)
   FROM   FUNCIONARIO;

   SELECT NOME
   FROM   FUNCIONARIO
   WHERE  IDADE > (SELECT AVG(IDADE) FROM FUNCIONARIO)

   Neste exemplo o comando SQL vai selecionar o nome dos funcionários com idade acima da média.

OPERADORES ARITMÉTICOS + (soma), - (subtração), * (multiplicação), / (divisão)

   SELECT ENAME
   ,      SAL
   ,      COMM
   ,      SAL + COMM
   FROM   EMP
   WHERE  JOB = 'SALESMAN';

   SELECT ENAME
   ,      SAL
   ,      COMM
   FROM   EMP
   WHERE  COMM > 0.25 * SAL

   SELECT ENAME
   ,      COMM / SAL
   ,      COMM
   ,      SAL
   FROM   EMP
   WHERE  JOB = 'SALESMAN'
   ORDER   BY COMM / SAL ASC;

   SELECT ENAME
   ,      SAL
   ,      COMM
   ,      12 * (SAL+COMM)
   FROM   EMP
   WHERE  JOB = 'SALESMAN';

   SELECT ENAME
   ,      SAL
   ,      SAL / 22
   ,      ROUND(SAL / 22 , 0)
   ,      ROUND(SAL / 22 ,2)
   FROM   EMP
   WHERE  EMP.DEPTNO = 30;

   SELECT ENAME
   ,      SAL
   ,      SAL / 22
   ,      TRUNC(SAL/22,0=, TRUNC(SAL/22,2)
   FROM   EMP
   WHERE  DEPTNO = 30;



© Copyright Professor Fernando De Siqueira - Banco de Dados I