04 - SQL - Structured Query Language
04 - SQL - Structured Query Language
1
Introdução
• Linguagem padrão para os bancos de dados relacionais;
– Presente praticamente em todos os SGBD´s Relacionais;
– Fácil migração de dados de um SGBD para outro que usa este
mesmo modelo;
– Uma das grandes responsáveis pela grande aceitação dos
SGBDR´s.
2
Introdução
• A linguagem foi desenvolvida inicialmente pela IBM para
ser usada no SGBD System R;
– Chamada inicialmente de SEQUEL (Structured English Query
Language);
• Depois, a ANSI e a ISO começaram a revisar estas
linguagens e chegaram às novas versões;
– SQL-86;
– SQL-92 (SQL-2);
– SQL-99 (SQL-3);
– SQL-2003;
– SQL-2008 (atual)
3
Introdução
• A partir da versão SQL-99, a linguagem SQL foi dividida
em duas partes:
– Núcleo;
• Principais elementos da linguagem;
– Operadores para definição e manipulação de dados, visões, etc;
– Implementado em todo SGBDR;
– Pacotes adicionais;
• Utilizados para aplicações específicas de BD;
– Data warehouse, Data Minning, dados multimídia, dados espaciais,
etc;
4
Introdução
• O núcleo da linguagem SQL é dividido em várias partes;
– DDL;
• Criação, alteração e remoção de tabelas e índices;
– DML;
• Inserção, consulta, alteração e modificação de tuplas;
– Manipulação de dados embutida;
• Acesso ao BD através de linguagens de programação;
– Definição de visões;
• Definição de visões a partir das tabelas criadas;
5
Introdução
• DML - Linguagem de Manipulação de Dados
– Os elementos da DML (Data Manipulation Language):
• A DML é um subconjunto da linguagem SQL usada para inserir, atualizar
e apagar dados.
6
Introdução
• DDL - Linguagem de Definição de Dados
DDL (Data Definition Language - Linguagem de Definição de Dados). Uma DDL permite ao
utilizador definir tabelas novas e elementos associados.
8
Tipos de dados SQL
• Tipos Numéricos:
– INT ou INTEGER;
• Números inteiros (de -2.147.483.648 a 2.147.483.647)
– SMALLINT;
• Números inteiros pequenos (de -32.768 a 32.767)
– BIGINT;
• Números inteiros grandes (de -9.223.372.036.854.775.808 a
9.223.372.036.854.775.807);
9
Tipos de dados SQL
• Tipos Numéricos:
– DOUBLE PRECISION;
• Número real com precisão dupla;
– FLOAT(n);
• Ponto flutuante com precisão definida pelo usuário;
– NUMERIC (p,d);
• Ponto flutuante onde p é a precisão (total de dígitos decimais) e d é a
escala (número de casas depois do ponto);
10
Tipos de dados SQL
• Cadeias de caracteres:
– CHAR(n) ou CHARACTER(N);
• Cadeia de caracteres de tamanho fixo;
– VARCHAR(n);
• Cadeia de caracteres com tamanho variável, onde n é o comprimento
máximo da cadeia;
11
Tipos de dados SQL
• Cadeias de bits:
– BIT(n);
• Conjunto de bits de tamanho fixo;
– BIT VARYING(n);
• Conjunto de bits de tamanho variável, onde n é o tamanho máximo;
12
Tipos de dados SQL
• Tipos Booleanos:
– BOOLEAN:
• Valores booleanos;
• EM SQL, ele pode assumir os valores true, false ou unknow;
• Data e Hora:
– DATE:
• Especifica uma data com o formato YYYY-MM-DD;
– TIME:
• Especifica uma hora com o formato HH:MM:SS;
13
Manipulação de Tabelas
• SQL define três comandos para a definição de dados:
– CREATE (criação);
– ALTER (alteração);
– DROP (exclusão);
14
Manipulação de Tabelas
• Criando uma nova tabela:
– Usamos o comando CREATE TABLE;
– Definimos um nome para a tabela;
– Definimos depois a lista de atributos, cada qual com seu
respectivo tipo;
– Por fim, definimos as restrições;
• Chave primária, chave estrangeira, etc;
15
Linguagem de definição de dados
• Criando uma nova tabela:
– A definição de um atributo tem a seguinte sintaxe:
• Nome tipo [NOT NULL] [UNIQUE] [DEFAULT valor]
– Onde:
• Nome: corresponde ao nome do atributo;
• Tipo: corresponde ao tipo de dado deste atributo (Tipo SQL);
• NOT NULL: restrição que indica que o valor do atributo não pode ser
nulo;
• UNIQUE: restrição que indica que o valor do atributo é único;
– Usada para chaves secundárias;
• DEFAULT: usado para definir um valor inicial para o atributo caso o
valor não seja informado;
16
Manipulação de Tabelas
• Criando uma nova tabela:
– Podemos especificar as seguintes restrições:
• Chave Primária:
– PRIMARY KEY (atributos_chaves);
• Chave Estrangeira:
– FOREIGN KEY (atributo) REFERENCES tabela_base(atributo);
• Restrição de integridade:
– CHECK (condição);
17
Manipulação de Tabelas
• Criando uma nova tabela:
– Exemplo: Criar uma tabela para cada esquema de
relação:
• Fornecedor (Codigo, Nome, Cidade);
• Peça(CodPeca, Nome, Descricao)
• Venda(CodFornecedor, CodPeca, Quantidade, Data);
18
Manipulação de Tabelas
• Criando uma nova tabela:
– Exemplo:
CREATE TABLE Fornecedor(
Codigo INT,
Nome VARCHAR(20) NOT NULL,
Cidade VARCHAR(20) NOT NULL,
PRIMARY KEY (Codigo)
)
19
Manipulação de Tabelas
• Criando uma nova tabela:
– Exemplo:
20
Manipulação de Tabelas
• Criando uma nova tabela:
– Exemplo:
CREATE TABLE Venda(
CodFornecedor INT,
CodPeca INT,
Quantidade INT DEFAULT 1,
Data DATE,
PRIMARY KEY (CodFornecedor,CodPeca),
FOREIGN KEY (CodFornecedor) REFERENCES Fornecedor(Codigo),
FOREIGN KEY (CodPeca) REFERENCES Peca(CodPeca)
)
21
Manipulação de Tabelas
• Definindo chaves estrangeiras:
– Como já vimos, usamos a restrição “FOREIGN KEY” é usada
para a definição de uma chave estrangeira;
• Uma restrição de integridade referencial é gerada;
– Podemos especificar o que o SGBD deve fazer para manter a
integridade referencial dos dados:
• Numa atualização (através da restrição ON UPDATE);
• Numa exclusão (através da restrição ON DELETE);
22
Manipulação de Tabelas
• Definindo chaves estrangeiras:
– Para cada uma destas restrições, temos quatro valores
possíveis;
• Restrict:
– Rejeita a atualização ou exclusão de um registro da tabela pai, se
houver registros na tabela filha.;
• Cascade:
– Atualiza ou exclui os registros da tabela filha automaticamente, ao
atualizar ou excluir um registro da tabela pai;
• Set Null:
– As tuplas relacionadas com a tupla a ser atualizada ou removida
tem o valor do atributo chave estrangeira correspondente alterado
para Null;
• Set Default:
– As tuplas relacionadas com a tupla a ser atualizada ou removida
tem o valor do atributo chave estrangeira correspondente alterado
para um valor default;
23
Manipulação de Tabelas
• Vamos supor uma tabela de cidade e uma de clientes
Cidade
Id | Nome
1 | Cajazeiras
Cliente
Id | Nome | Cidade_Id
1 | Gervasio| 1
Restrict
– o banco irá rejeitar o comando, retornando uma exceção de violação
de chave estrangeira.
Cascade
– Se alterar o valor da coluna id da Cidade, também será alterado o
valor da coluna Cidade_id na tabela de Cliente. Se excluir a cidade
Cajazeiras, também será excluido o Cliente 1, Gervásio.
Set Null
– O valor da coluna Cidade_Id dos registros que estiverem utilizando o
valor 1, Cajazeiras, serão definidos como null
25
Manipulação de Tabelas
• Definindo chaves estrangeiras:
– Vamos recriar uma das tabelas de nosso exemplo;
CodFornecedor INT,
CodPeca INT,
Quantidade INT DEFAULT 1,
Data DATE,
PRIMARY KEY (CodFornecedor,CodPeca),
27
Manipulação de Tabelas
• Nomeando as restrições:
– Exemplo:
CREATE TABLE Venda(
CodFornecedor INT,
CodPeca INT,
Quantidade INT DEFAULT 1,
Data DATE,
PRIMARY KEY (CodFornecedor,CodPeca),
CONSTRAINT Referencia_CodFornecedor
FOREIGN KEY (CodFornecedor) REFERENCES Fornecedor(Codigo) ON
DELETE RESTRICT ON UPDATE CASCADE ,
CONSTRAINT Referencia_CodPeca
FOREIGN KEY (CodPeca) REFERENCES Peca(CodPeca) ON DELETE
RESTRICT ON UPDATE CASCADE
)
28
Manipulação de Tabelas
• Alterando uma Tabela:
– Podemos alterar uma tabela usando o comando ALTER TABLE;
– Ao alterar uma tabela, podemos:
• Adicionar ou eliminar uma coluna;
• Alterar a definição de uma coluna;
• Adicionar ou eliminar restrições;
29
Manipulação de Tabelas
• Alterando uma Tabela:
– Adicionando ou removendo colunas:
• Podemos adicionar uma coluna através da cláusula ADD:
• Se a tabela já foi povoada, todas as tuplas recebem um valor nulo para
o novo atributo;
– A restrição NOT NULL não pode ser aplicada neste tipo de atributo;
30
Manipulação de Tabelas
• Alterando uma Tabela:
– Adicionando ou removendo colunas:
• Podemos remover uma coluna através da cláusula DROP;
• Podemos usar as opções CASCADE ou RESTRICT para tratar as restrições
e visões que referenciam o atributo a ser excluído;
31
Manipulação de Tabelas
• Alterando uma Tabela:
– Alterando a definição de uma coluna:
• Podemos alterar a definição de uma tabela usando as
cláusulas ALTER e SET;
32
Manipulação de Tabelas
• Alterando uma Tabela:
– Adicionando e removendo restrições:
• Podemos adicionar uma restrição através da cláusula ADD
CONSTRAINT;
33
Manipulação de Tabelas
• Alterando uma Tabela:
– Adicionando e removendo restrições:
• Podemos remover uma restrição através da cláusula DROP
CONSTRAINT;
• Para ser removida, uma restrição deve ter sido nomeada;
34
Manipulação de Tabelas
• Removendo uma Tabela:
– Podemos remover uma tabela através do operador DROP;
– Podemos usar as opções CASCADE ou RESTRICT para tratar as
tabelas e visões que referenciam a tabela a ser excluída;
35
Manipulação de Tabelas
• Todos.....
36
Consultas
• As consultas são descritas na linguagem SQL através da
operação SELECT;
• Geralmente, uma consulta tem a forma:
SELECT <lista_de_atributos>
FROM <lista_de_tabelas>
WHERE <condição>
37
Consultas
• Onde:
– <lista_de_atributos> corresponde às colunas que devem ser
selecionadas das tabelas;
• Corresponde à operação de projeção da álgebra relacional;
– <lista_de_tabelas> corresponde às tabelas que serão usadas
para realizar a consulta;
– <condição> é uma expressão booleano que indica o critério de
seleção das tuplas;
• Pode ser omitida, quando quisermos recuperar todas as tuplas de uma
tabela;
• Os operadores relacionais =, <, <=, >,>= e <> podem ser usados para
expressar as condições;
• Os conectores lógicos AND, OR e NOT podem ser usados para
especificar condições compostas;
38
Um estudo de caso
Um estudo de caso
• Para ilustrar as operações relacionais, vamos considerar o
seguinte esquema lógico;
1 Giôvanni 2500,00 4 1
2 Emilton 2500,00 3 2
3 Lucas 4500,00 NULL 2
4 Laires 4500,00 NULL 1
40
Um estudo de caso
1 Financeiro 4
2 Vendas 3
41
Um estudo de caso
1 Bet Fácil 2
2 Rico Novinho 1
3 CEO Foda 1
42
Um estudo de caso
2 Dalina Filho
2 Emilton Jr Filho
3 Joana Cônjuge
43
Um estudo de caso
1 2 12
1 3 12
2 1 12
2 2 12
4 2 12
4 3 12
44
MATRÍCULA NOME SALÁRIO SUPERVISOR COD_DEPARTAMENTO
1 Giôvanni 2500,00 4 1
EMPREGADO
2 Emilton 2500,00 3 2
3 Lucas 4500,00 NULL 2
4 Laires 4500,00 NULL 1
DEPENDENTE DEPARTAMENTO
EMPREGADO NOME_DEP PARENTESCO COD_DEPARTAMENTO NOME GERENTE
2 Dalina Filho 1 Financeiro 4
2 Emilton Jr Filho 2 Vendas 3
Resultado:
MATRÍCULA NOME
2 Emilton
3 Lucas
46
Consultas
• Exemplo 2: Selecionar a matrícula e o nome dos
empregados do departamento 2 que ganham mais de
três mil reais;
Resultado:
MATRÍCULA NOME
3 Lucas
47
Consultas
• Podemos omitir a condição para selecionar todas as tuplas de
uma tabela;
– Exemplo 3: Selecionar a matrícula e o nome de todos os
empregados;
48
Consultas
• Podemos também selecionar todas as colunas de uma tabela
usando o valor *;
– Exemplo 4: Selecionar as informações sobre os empregados do
departamento dois;
2 Emilton 2500,00 3 2
3 Lucas 4500,00 NULL 2
49
Consultas
• Podemos alterar o nome de uma ou mais colunas através da cláusula
AS:
– Exemplo 5: Selecionar a matricula e o nome de todos os
empregados, renomeando somente atributo nome para
Nome_Empregado;
Resultado:
MATRÍCULA NOME_EMPREGADO
1 Giôvanni
2 Emilton
3 Lucas
4 Laires 50
Consultas
• Podemos aplicar cálculos aos valores de uma coluna:
– Exemplo 6: Calcule como ficaria o novo salário de cada empregado caso
eles recebessem um aumento de 15%, recuperando a sua matricula,
nome e o novo salário reajustado.
1 Giôvanni 2875,00
2 Emilton 2875,00
3 Lucas 5175,00
4 Laires 5175,00
51
Consultas
• Podemos realizar junções:
– Exemplo 7: Selecione o nome dos empregados que trabalham no
departamento de Vendas;
Resultado:
NOME
Emilton
Lucas
52
Consultas
• Podemos usar aliases para tabelas para facilitar a consulta e eliminar
ambigüidades;
– Exemplo 8: Selecione o nome dos empregados que trabalham no
departamento de Vendas;
Resultado:
NOME
Emilton
Lucas
53
Consultas
• Podemos também omitir a cláusula AS ao renomear tabelas;
– Exemplo 9: Selecione o nome dos empregados que trabalham no
departamento de Vendas;
Resultado:
NOME
Emilton
Lucas
54
Consultas
• Todos.....
55
Consultas
• Podemos também renomear tabelas para fazer junção
de uma tabela com ela mesma;
– Exemplo 10: Recupere a matrícula, o nome e o nome do supervisor de cada
empregado;
- Resultado:
1 Giôvanni Laires
2 Emilton Lucas
56
Consultas
• Comparando com valores nulos:
– Uma tabela pode conter valores nulos para vários atributos;
– Para selecionar tuplas que possuem um valor de atributo nulo ou não nulo
usamos os operadores IS e IS NOT, respectivamente;
– Exemplo 11: Recupere o nome de todos os empregados que não tem
supervisor;
Resultado:
NOME
Lucas
Laires
57
Consultas
• Comparando com valores nulos:
– Uma tabela pode conter valores nulos para vários atributos;
– Para selecionar tuplas que possuem um valor de atributo nulo ou não nulo
usamos os operadores IS e IS NOT, respectivamente;
– Exemplo 11: Recupere o nome de todos os empregados que possuem
algum supervisor;
Resultado:
NOME
Giôvanni
Emilton
58
Consultas
59
Consultas
• Representando tabelas como conjuntos:
– Exemplo 12: Recupere o salário de cada funcionário da
empresa;
• Resultado:
SALARIO
2500,00
2500,00
4500,00
4500,00
60
Consultas
• Representando tabelas como conjuntos:
– Exemplo 13: Selecione todos os salários distintos pago pela
empresa;
• Resultado:
SALARIO
2500,00
4500,00
61
Consultas
• Representando tabelas como conjuntos:
– SQL define três operadores para trabalhar com
conjuntos:
• UNION (operação de união);
• INTERSECT (operação de interseção);
• EXCEPT (operação de diferença);
– As tabelas devem ser compatíveis de união para
realizar qualquer uma destas operações.
62
Consultas
• Representando tabelas como conjuntos:
– Significando que ambas devem retornar o mesmo
número de colunas, e que as colunas
correspondentes devem possuir tipos de dado
compatíveis.
• O número e a ordem das colunas devem ser os mesmos em
todas as consultas;
• Os tipos de dado devem ser compatíveis.
– Estas operações descartam as tuplas repetidas do
resultado;
63
Consultas
• Representando tabelas como conjuntos:
– Exemplo 14 (UNION): Selecione a matrícula de todos os empregados que
trabalham no departamento 1 ou que trabalham em um projeto:
– Resultado:
MATRICULA
4
64
Consultas
• Representando tabelas como conjuntos:
– Exemplo 14 (INTERSECT): Selecione a matrícula de todos os empregados
do departamento 2 que trabalham em algum projeto
– Resultado:
MATRICULA
65
Consultas
• Representando tabelas como conjuntos:
– Exemplo 14 (EXCEPT): Selecione a matrícula de todos os empregados que
não trabalham em nenhum projeto
– Resultado:
MATRICULA
66
Consultas
• Procurando por substrings:
– Podemos procurar por um substring em uma cadeia
de caracteres usando o operador LIKE;
– Podemos usar o caractere % para substituir zero ou
mais caracteres;
• Exemplo: Para localizar strings que contenham o substring
'Cajazeiras' usamos a expressão '%Cajazeiras%'
67
Consultas
• Procurando por substrings:
– Podemos usar o caractere _ (anderline) para substituir um único caractere;
– Exemplo: Para localizar todos os strings cujo segundo caractere seja a letra
'a', usamos a expressão '_a%';
– Exemplo 15: Recupere a matrícula e o nome de todos os empregados que
possuem o nome Emilton;
– Resultado:
MATRÍCULA NOME
2 Emilton
68
Consultas
• Ordenando o resultado de uma consulta:
– Podemos ordenar o resultado de uma consulta usando o
operador ORDER BY;
– Podemos especificar uma lista de atributos para a ordenação,
onde o primeiro é usado como primeiro critério e os demais
sucessivamente, para ordenar tuplas que apresentam o
mesmo valor para o critério anterior;
– Para cada critério podemos usar os valores ASC ou DESC,
para especificar se ordenação deve ser ascendente ou
descendente;
– A ordenação default é ascendente;
69
Consultas
• Ordenando o resultado de uma consulta:
– Exemplo 16: Recupere o nome de cada empregado,
juntamente com o nome do seu departamento e o nome
de cada projeto em que ele trabalha;
70
Consultas
• Ordenando o resultado de uma consulta:
– Exemplo 16: Recupere o nome de cada empregado,
juntamente com o nome do seu departamento e de cada
projeto em que ele trabalha;
– Resultado: EMPREGADO DEPTO PROJETO
Giôvanni Financeiro CEO Foda
Giôvanni Financeiro Rico Novinho
Laires Financeiro CEO Foda
Laires Financeiro Rico Novinho
Emilton Vendas Rico Novinho
Emilton Vendas Venda Facil
71
Consultas
• Consultas aninhadas:
– São consultas feitas sobre os dados recuperados por uma outra
consulta;
– Usamos o operador IN para verificar se uma tupla está
presente em um conjunto ou multiconjunto;
72
Consultas
• Consultas aninhadas:
– Exemplo 17 (continuação):
MATRÍCULA NOME
– Resultado:
2 Emilton
3 Lucas
73
Consultas
• Consultas aninhadas:
– Podemos usar o quantificador ALL para comparar uma tupla
com um conjunto de tuplas recuperado em uma consulta
aninhada;
– O resultado da operação é verdadeiro se a comparação for
verdadeira para todas as tuplas presentes no resultado da
consulta aninhada;
– Exemplo 18: Recupere o nome dos funcionários que ganham
mais que Giôvanni e Emilton;
74
Consultas
• Consultas aninhadas:
– Exemplo 18 (Continuação):
– Resultado:
NOME
Lucas
Laires
75
Consultas
• Consultas aninhadas:
– O quantificador SOME (ou ANY) também pode ser utilizado
para comparar uma tupla com as tuplas do resultado de uma
consulta aninhada;
– O resultado da operação é verdadeiro se a comparação for
verdadeira para alguma das tuplas presentes no resultado da
consulta aninhada;
– Exemplo 19: Recupere o nome e o salário de todos os
funcionários que não trabalham no departamento 2 mas
ganham mais do que algum funcionário que trabalha no
departamento 2;
76
Consultas
• Consultas aninhadas:
– Exemplo 19 (continuação):
– Resultado:
NOME
Laires
77
Consultas
• A cláusula EXISTS;
– A cláusula EXISTS é usada para verificar se o resultado de uma
consulta aninhada é ou não vazio;
– Ela retorna true caso o resultado da consulta não seja vazio, e
false, caso contrário;
– Podemos definir também a cláusula NOT EXISTS, que funciona
da forma inversa;
78
Consultas
• A cláusula EXISTS;
– Exemplo 20 (continuação, EXITS):
- Resultado:
NOME
Emilton
Lucas
79
Consultas
• A cláusula NOT EXISTS;
– Exemplo 20 (continuação, NOT EXISTS): Recupere o nome de
todos os empregados que não possuem nenhum dependente;
- Resultado:
NOME
Giôvanni
Laires
80
Consultas
• Todos.....
81
Consultas
• Junção de Tabelas:
– Até agora, vimos como fazer junção em SQL da forma clássica;
– Porém a SQL define o operador JOIN e vários tipos de junção
de tabelas:
• Equijunção;
• Junção Natural;
• Junção à esquerda;
• Junção à Direita
• Etc;
82
Consultas
• Junção de Tabelas – Equijunção:
– Sintaxe:
SELECT E.Nome
FROM (Empregado E JOIN Departamento D ON
E.Cod_Departamento=D.Cod_Departamento)
WHERE D.Nome='Financeiro'
– Resultado:
NOME
Giôvanni
Laires
84
Consultas
• Junção de Tabelas – Equijunção:
– Exemplo 22 (outro): Recupere o nome de todos os
dependentes do empregado Emilton.
SELECT D.nome_Dep
FROM (Empregado E JOIN Dependente D ON E. matricula = D.empregado)
WHERE E.Nome = 'Emilton'
– Resultado:
NOME
Dalina
Emilton
85
Consultas
• Junção de Tabelas – Junção Natural:
86
Consultas
• Junção de Tabelas – Junção Natural:
– Exemplo 23: Recupere o nome de todos os empregados que
trabalham no departamento Financeiro;
SELECT E.Nome
FROM (Empregado E NATURAL JOIN Departamento D
(Cod_Departamento, NomeDep, Gerente))
WHERE D.NomeDep = 'Financeiro'
– Resultado:
NOME
Giôvanni
Laires
87
Consultas
• Junção de Tabelas – Junção Externa:
– A equijunção e a junção natural são operações de junção
interna;
• Tuplas que não estão relacionadas, ou que possuem um valor nulo para
o atributo da condição de junção são descartadas do resultado final;
– Podemos incluir todas as tuplas de uma tabela no resultado de
uma junção através de uma junção externa;
– A junção externa é realizada através da cláusula OUTER JOIN;
88
Consultas
• Junção de Tabelas – Junção Externa:
– Existem três tipos de junção externa:
• Junção externa à esquerda (LEFT OUTER JOIN ou LEFT JOIN);
• Junção externa à direita (RIGHT OUTER JOIN ou RIGHT JOIN);
• Junção externa completa (FULL OUTER JOIN ou FULL JOIN);
– Caso os atributos de junção tenham o mesmo nome, podemos
incluir a palavra-chave NATURAL antes da cláusula de junção;
89
Consultas
• Junção de Tabelas – Junção Externa à Esquerda:
– Indica que todas as tuplas da tabela do lado esquerdo da
junção devem ser recuperadas;
• Mesmo que não estejam associadas à nenhuma tupla da tabela
do lado direito;
• Mesmo que tenham um valor nulo para o atributo da condição
de junção;
– As tuplas da direita sem nenhuma tupla correspondente à
esquerda ou com valores nulos para o atributos de junção
recebem valores nulos para todos os atributos da tabela do
lado direito da junção;
90
Consultas
• Junção de Tabelas – Junção Externa à Esquerda:
Exemplo 24: Recupere todos os empregados e os
departamentos que cada um gerencia:
SELECT *
FROM (Empregado LEFT OUTER JOIN Departamento ON
Matricula=Gerente)
- Resultado
MATRICULA NOME SALARIO SUPERVISOR CODDEPTO CODDEPTO NOME GERENTE
Giôvan
1 2500 4 1 Null Null Null
ni
2 Emilton 2500 3 2 Null Null Null
92
Consultas
• Junção de Tabelas – Junção Externa à Direita:
– Exemplo 25: Recupere os dependentes seguido de todos os
seus respectivos empregados
94
Consulta
• Junção de Tabelas – Junção Externa Completa
– Exemplo 26: Recupere os dependentes seguido de todos os
seus respectivos empregados
96
Consulta
• Junção de Tabelas – Produto Cruzado
– Exemplo 26: Combine todos os departamentos com todos os
projetos:
SELECT * FROM (Departamento CROSS JOIN Projeto)
COD_ COD_
NOME GERENTE COD_PROJETO NOME
DEPARTAMENTO DEPARTAMENTO
98
Consultas
• Funções agregadas:
– As principais funções são:
• COUNT:
–Exemplo 27: Verifique quantos empregados
trabalham no departamento 2;
SELECT COUNT(*) AS TotalDeEmpregados
FROM Empregado WHERE Cod_Departamento =2;
101
Consultas
• Funções agregadas:
– As principais funções são:
• COUNT:
– Exemplo 29:
» Obtemos a seguinte resposta;
NOME
Emilton
102
Consultas
• Funções agregadas:
– As principais funções são:
• MIN e MAX:
– Recuperam, respectivamente, o menor e o maior valor
de uma coluna;
– Podem ser aplicados a qualquer tipo de dado que tenha
a noção de ordenação;
» Números, cadeia de caracteres, datas, etc;
• AVG:
– Recupera a média dos valores de uma determinada
coluna;
– Aplicado apenas a tipos numéricos;
103
Consultas
• Funções Agregadas:
– Exemplo 30:
• Recupere o menor salário pago pela empresa, o maior
salário pela empresa e média salarial dos funcionários;
Resultado:
MENOR_SALARIO MAIOR_SALARIO MEDIA_SALARIAL
105
Consultas
• Agrupamento:
– Exemplo 31: Para cada departamento da empresa, recupere o
seu código, o seu total de funcionários e a sua média salarial;
1 2 3500
2 2 3500
106
Consultas
• Agrupamento:
– Para recuperarmos atributos adicionais, podemos incluir os atributos
adicionais desejados na cláusula GROUP BY após o atributo de
agrupamento;
– Exemplo 32: Recupere o código de cada projeto, o nome de cada
projeto, o total de pessoas que trabalha em cada projeto, e o total
de horas trabalhadas por todas as pessoas neste projeto;
107
Consultas
• Agrupamento:
– Exemplo 32 (Resposta):
• Obtemos a seguinte resposta:
1 Bet Fácil 1 12
Rico
2 3 36
Novinho
3 CEO Foda 2 24
108
Consultas
• Agrupamento:
– As vezes não queremos recuperar todos os grupos gerados em
um agrupamento;
– Podemos selecionar apenas os grupos que satisfazem algum
critério de seleção;
– Podemos fazer esta seleção usando a cláusula HAVING,
seguida do critério de seleção desejado;
– Apenas os grupos que satisfazem o critério de seleção são
mostrados no resultado da consulta;
109
Consultas
• Agrupamento:
– Exemplo 33: Recupere o código e o nome dos projetos em que
trabalham mais de um empregado;
111
Consultas
• Criando novas colunas em uma consulta:
– Sintaxe do comando CASE;
• CASE
WHEN <cond1> THEN <valor1>
WHEN <cond2> THEN <valor2>
...
WHEN <condN> THEN <valorN>
ELSE <valorDefault>
END
112
Consultas
• Criando novas colunas em uma consulta:
– Exemplo: Selecione a matricula, nome e salário dos
empregados. Crie no resultado uma nova coluna que informe
se o empregado ganha muito ou pouco segundo a seguinte
regra: se o salário for menor ou igual a 3000 reais o empregado
ganha pouco, mas se o salário for maior que 4000, então ele
ganha muito.
114
Inserções
• Usamos o comando INSERT para fazer inserções de tuplas através da
linguagem SQL;
• Sintaxe:
INSERT INTO Tabela VALUES (valor1, valor2, ...,valorN)
• A ordem dos valores deve ser a mesma ordem em que os atributos
foram definidos na tabela;
• O SGBD se encarrega de verificar se a tupla a ser inserida satisfaz todas
as restrições definidas para a tabela;
– Caso ela não satisfaça alguma restrição, a inserção é rejeitada;
115
Inserções
• Exemplo: Inserir todos os dados do empregado Carlos,
com matrícula 5, salário R$ 4000,00, supervisionado por
Laires e que trabalha no departamento 1;
116
Inserções
• Podemos alterar a ordem dos atributos, desde que
façamos a descrição da ordem considerada na hora da
consulta;
• Atributos não especificados recebem valores default
(caso tenham sido especificados na criação da tabela) ou
nulos;
• Exemplo:
118
Inserções
• Exemplo (Continuação): Inserir na tabela Funcionário
Exemplar os dados dos empregado que trabalham em mais
de 2 projetos
– Podemos inserir dados da seguinte forma:
120
Exclusões
• Exemplo: Excluir na tabela TrabalhaProjeto todas as
tuplas que referenciam o projeto 2;
– Remoção não viola a integridade referencial, pode ser feita
normalmente;
121
Exclusões
• Exemplo: Excluir o departamento 2:
– Remoção viola a integridade referencial;
– Pode ser realizada ou não, dependendo do SGBD e da
definição da tabela;
122
Exclusões
• Podemos omitir a cláusula WHERE para removermos
todas as tuplas de uma tabela;
– Neste caso, as tuplas são removidas, mas a tabela continua
existindo;
– Exemplo: Excluir todas as tuplas da tabela TrabalhaProjeto:
123
Atualizações
• O comando UPDATE é utilizado para fazer atualizações;
• Permite a atualização de uma ou mais tuplas de uma
tabela;
– Ou de outras tabelas, devido à integridade referencial;
• Podemos selecionar as tuplas a serem alteradas através
de um critério de seleção;
• Sintaxe:
UPDATE Tabela SET atr1=vl1, atr2=vl2, ..., atrN=vlN
WHERE condição
124
Atualizações
• A cláusula WHERE pode ser omitida para atualizarmos
todas as tuplas de uma tabela;
125
Visões
• São tabelas derivadas de outras tabelas;
• Permitem controlar a visão que cada usuário ou grupo
de usuário tem sobre os dados armazenados;
– Nem sempre é bom os usuários terem acesso a todos os dados
do banco de dados;
• São tabelas virtuais, não são armazenadas fisicamente;
• Boas para representar consultas que devem ser feitas
com muita freqüência;
126
Visões
• Cada visão tem um nome, um conjunto de atributos e
uma consulta que a representa;
• As visões contém sempre os dados atualizados;
– A consulta é executada sempre que a visão é invocada;
• A definição da visão é armazenada no catálogo do SGBD;
• Usamos a seguinte sintaxe para descrever uma visão:
CREATE VIEW NomeDaVisão
AS Consulta
127
Visões
• Exemplo: Crie uma visão que ao ser invocada possa
retornar os nomes dos empregados, o nome dos
projetos e o número de horas trabalhadas em cada
projeto.
128
Visões
• Exemplo: Crie uma visão que ao ser invocada possa
retornar os nomes dos empregados, o nome dos
projetos e o número de horas trabalhadas em cada
projeto.
131
Visões
• Atualização:
– Muitas vezes, os usuários podem querer inserir e atualizar
dados em visões:
– Isto pode trazer problemas:
• O que aconteceria se o usuário tentasse executar o comando:
132
Visões
• Atualização:
– Em geral, a atualização de visões é tratada da seguinte forma:
• Uma visão definida numa única tabela é atualizável se os
atributos da visão contêm a chave primária e todos os atributos
que possuem a restrição NOT NULL sem nenhum valor default;
• Visões definidas sobre múltiplas tabelas usando junção
geralmente não são atualizáveis;
• Visões usando funções de agrupamento e funções agregadas não
são atualizáveis;
133
Visões
• Redefinindo uma visão:
– Podemos redefinir o nome de uma visão através do operador
ALTER VIEW;
– Sintaxe:
• ALTER VIEW NomeDaVisão RENAME TO NovoNomeDaVisão;
– Exemplo:
ALTER VIEW EmpregadoComProjetos
RENAME TO EmpregadosESeusProjetos
134
Visões
• Exluindo uma visão:
– Podemos excluir uma visão usando o operador DROP VIEW;
– Sintaxe:
• DROP VIEW NomeDaVisão
– Exemplo:
• DROP VIEW EmpregadoComProjetos
135
Índices
• Um índice é uma estrutura de acesso físico aos dados,
usado para acelerar o tempo das consultas;
– Semelhante ao índice de um livro que usamos para encontrar
um determinado assunto;
– Definido sobre o valor de um atributo;
• Geralmente, a chave primária e os atributos com a restrição UNIQUE;
– Uma tabela pode ter mais de um atributo indexado
136
Índices
• Criando um novo índice:
– Podemos criar um novo índice através do operador CREATE
INDEX;
– Sintaxe:
• CREATE INDEX NomeDoÍndice
ON NomeDaTabela(Atributo)
– Exemplo:
• CREATE INDEX ind1
ON Empregado(Matricula)
137
Índices
• Alterando um índice:
– Podemos alterar um índice existente através do operador
ALTER INDEX;
– Sintaxe:
• ALTER INDEX NomeDoÍndice
RENAME TO NomeDoNovoÍndice
– Exemplo:
• ALTER INDEX indiceSalario
RENAME TO indiceSalarioRenomeado
138
Índices
• Removendo um índice:
– Podemos remover um índice usando o operador DROP INDEX;
– Sintaxe:
• DROP INDEX NomeDoIndice ON table;
– Exemplo:
• DROP INDEX indiceSalarioRenomeado ON Empregado;
139
Próxima aula...