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
CRIANDO VIEWS
CREATE VIEW MANAGERS AS
SELECT ENAME
, JOB
, SAL
FROM EMP
WHERE JOB = 'MANAGER';
|
DELETANDO VIEWS
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:
- Selecionar todos os atributos de cada funcionário:
SELECT * FROM FUNCIONARIO;
- Selecionar todos os atributos dos funcionários da cidade de Tubarão:
SELECT * FROM funcionário WHERE cidafunc = “Tubarão”;
- 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;
- 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;
- 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
|
- 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