Linguagem SQL
Linguagem SQL
Gilberto Cunha
CASO PRÁTICO 1: Projetar um Sistema que permite gerenciar uma Base de Dados para
uma Empresa. O sistema deverá registrar os Departamentos (Código, Nome, Localização e
Orçamento) e os Empregados (Número, Nome, Função, Admissão e Salário).
1 N Tempo de
DEPARTAMENTO Tem EMPREGADO Serviço
Admissão
Modelo Relacional
Página 1 de 37
Base de Dados Prof. Gilberto Cunha
SQL é uma linguagem padrão internacional usada em Base de Dados Relacionais para
criar, manipular e consultar os dados.
PALAVRA-
DESCRIÇÃO
CHAVE
SELECT Recupera colunas de uma ou mais tabelas.
FROM Tabelas envolvidas na consulta. Requeridas em cada SELECT.
Critérios de seleção que determinam as linhas a serem
WHERE recuperadas, excluídas ou alteradas. Opcional numa consulta ou
numa instrução SQL.
GROUP BY Critérios para agrupar linhas. Opcional numa consulta SELECT.
ORDER BY Critérios para ordenar linhas. Opcional numa consulta SELECT.
INNER JOIN Mescla linhas de múltiplas tabelas.
INSERT Insere linhas numa tabela específica.
UPDATE Atualiza linhas numa tabela específica.
DELETE Apaga linhas numa tabela específica.
OPERADORES LÓGICOS
Operador Significado
AND E lógico
OR OU lógico
OPERADORES RELACIONAIS
Operador Significado
= igual a
> maior que
>= maior que ou igual a
< menor que
<= menor que ou igual a
Página 2 de 37
Base de Dados Prof. Gilberto Cunha
OPERADORES NEGATIVOS
Operador Significado
<> diferente
NOT nomeColuna = diferente da coluna
NOT nomeColuna > não maior que
NOT BETWEEN não entre dois valores informados
NOT IN não existente numa dada lista de valores
NOT LIKE diferente do padrão de caracteres informado
IS NOT NULL não é um valor nulo
DEMAIS OPERADORES
Operador Significado
FUNÇÕES DE CARACTERES
Função Retorno
O símbolo "%" pode ser usado para construir a pesquisa ("%" = qualquer sequência de
nenhum até vários caracteres).
Página 3 de 37
Base de Dados Prof. Gilberto Cunha
AGRUPAMENTOS
GROUP BY: Usado para dividir as tuplas de uma tabela em grupos iguais menores.
HAVING: Utilizado para especificar quais grupos deverão ser exibidos, portanto
restringindo-os.
ORDER BY ASC (padrão): Ordena de forma ascendente uma coluna.
ORDER BY DESC: Ordena de forma descendente uma coluna.
ORDER BY coluna (ASC / DESC) LIMIT quantidade de registros a exibir a partir do
topo;
YEAR(FROM_DAYS(TO_DAYS(NOW())-TO_DAYS(nascimentoHospede))))
Ou
TIMESTAMPDIFF(YEAR,nascimentoHospede,NOW()))
DATEDIFF(CURDATE(),"2016/10/01")
DATEDIFF("2016/10/02","2016/10/01")
DATEDIFF(dataSaidaHospede,dataEntradaHospede)
TIPO DE DADOS
INT: Inteiro
FLOAT: Real
VARCHAR(x): String
DATE: Data
FORMATAR
Página 4 de 37
Base de Dados Prof. Gilberto Cunha
CRIAR TABELA:
Ex2: Criar a Tabela de nome Empregado com as colunas Número, Código, Nome,
Função, Salário e Admissão:
Página 5 de 37
Base de Dados Prof. Gilberto Cunha
ALTERAR TABELA:
Ok
Página 6 de 37
Base de Dados Prof. Gilberto Cunha
APAGAR TABELA:
APAGAR REGISTROS:
Página 7 de 37
Base de Dados Prof. Gilberto Cunha
Ex4:
ATUALIZAR
VER
SELECIONAR
Página 8 de 37
Base de Dados Prof. Gilberto Cunha
Ex4: Exibe nomes e salários dos empregados com salários no intervalo indicado.
Ex5: Exibe nome e salário dos empregados com salário nos valores indicado.
Página 9 de 37
Base de Dados Prof. Gilberto Cunha
FROM empregado
WHERE salarioEmp IN (40000, 150000);
Ex7: Exibe nome e função dos empregados com nomes que começam com G.
Ex8: Exibe os nomes dos empregados com salário maior que 20.000.
Página 10 de 37
Base de Dados Prof. Gilberto Cunha
Ex9: Exibe nome e salário dos empregados com salários menores que 100.000 ou
maiores que 200.000.
Ex10: Exibe nome, salário e função dos empregados com salários entre 100.000 e
200.000 e que sejam Operadores.
Ex11: Exibe nome, salário e função dos empregados com salários entre 100.000 e
200.000 ou que sejam vendedoras.
Página 11 de 37
Base de Dados Prof. Gilberto Cunha
Ex12: Exibe nome, salário e função dos empregados com salários entre 200.000 e
300.000 e que sejam gerentes ou secretárias.
Página 12 de 37
Base de Dados Prof. Gilberto Cunha
SELECT *
FROM empregado
WHERE admissaoEmp = '2010/11/27';
Página 13 de 37
Base de Dados Prof. Gilberto Cunha
Nota: Para relacionar o maior / menor salário a quem pertence não pode ser com as funções
Max / Min mas sim com Limit. As funções (Max, Min, Avg, Sum e Count) são usadas para
calcular valores de uma coluna ou de agrupamentos (Group By) em colunas.
Página 14 de 37
Base de Dados Prof. Gilberto Cunha
Observemos que dois dos três dados solicitados estão na Tabela Empregado, enquanto o
outro dado está na Tabela Departamento. Deveremos então acessar os dados restringindo
convenientemente as relações existentes entre as tabelas. De fato sabemos que “codigoDep”
é Chave Primária da Tabela Departamento e também é Chave Estrangeira da Tabela
Empregado. Portanto, este campo será o responsável pela Equi-Junção.
Obs: Imagine que tivesse definido NOME para ser o Nome do Empregado na Tabela
Empregado e também NOME para ser o Nome do Departamento na Tabela Departamento.
Para evitar ambiguidade (nomenclatura idêntica para campos de tabelas), usa-se o nome da
Página 15 de 37
Base de Dados Prof. Gilberto Cunha
Nota: No caso da Consulta abaixo não necessita da Equi-Junção, pois não existe uma chave
estrangeira a relacionar as duas tabelas da base de dados faculdade.
CRIAR “ALIAS”
// sem alias
SELECT empregado.codigo, empregado.nome, funcao, departamento.codigo,
departamento.nome
FROM empregado, departamento
WHERE empregado.codigo = departamento.codigo;
// com alias
SELECT a.codigo, a.nome, a.funcao, b.codigo, b.nome
FROM empregado a, departamento b
WHERE a.codigo = b.codigo;
OPERAÇÕES MATEMÁTICAS:
Levando em consideração que as relações podem ser tratadas como conjuntos, podemos
então aplicar um conjunto de operações matemáticas sobre as mesmas. Estás operações são:
união, interseção e diferença. Este conjunto de operações não é unário, ou seja, podem ser
aplicadas sobre mais de uma tabela, porém, existe a necessidade das tabelas possuírem
tuplas exatamente do mesmo tipo.
União (ᴗ): O resultado desta operação representada por R ᴗ S é uma relação T que inclui
todas as tuplas que se encontram em R e todas as tuplas que se encontram em S;
Interseção (ᴖ): O resultado desta operação representada por R ᴖ S é uma relação T que
inclui as tuplas que se encontram em R e S ao mesmo tempo;
Diferença ( - ): O resultado desta operação representada por R - S é uma relação T que
inclui todas as tuplas que estão em R mas não estão em S;
JUNÇÃO DE TABELAS
Página 16 de 37
Base de Dados Prof. Gilberto Cunha
A junção de tabelas no comando SELECT também pode ser feita com o comando JOIN.
Este comando deve ser utilizado com a palavra reservada INNER ou com a palavra
OUTER:
- INNER: Semelhante ao uso do operador “=” na junção de tabelas. Aqui os registros sem
correspondências não são incluídos. Esta cláusula é opcional e pode ser omitida no
comando JOIN.
- OUTER: Os registros que não se relacionam também são exibidos. Neste caso, é possível
definir qual tabela será incluída na seleção, mesmo não tendo correspondência.
SELECT * SELECT *
FROM Tabela_1; FROM Tabela_2;
SELECT *
FROM Tabela_1, Tabela_2
WHERE Tabela_1.id = Tabela_2.fk
Ou
SELECT *
FROM Tabela_1 INNER JOIN Tabela_2
ON Tabela_1.id = Tabela_2.fk
SELECT *
FROM Tabela_1 LEFT OUTER JOIN Tabela_2
ON Tabela_1.id = Tabela_2.fk
SELECT *
FROM Tabela_1 RIGHT OUTER JOIN Tabela_2
ON Tabela_1.id = Tabela_2.fk
Página 17 de 37
Base de Dados Prof. Gilberto Cunha
SELECT *
FROM Tabela_1 FULL OUTER JOIN Tabela_2
ON Tabela_1.id = Tabela_2.fk
Ou
SELECT *
FROM Tabela_1 CROSS JOIN Tabela_2;
SELECT *
FROM Tabela_1 LEFT JOIN Tabela_2
ON Tabela_1.id = Tabela_2.fk
WHERE Tabela_2.fk IS NULL;
SELECT *
FROM Tabela_1 LEFT OUTER JOIN Tabela_2
ON Tabela_1.id = Tabela_2.fk
WHERE Tabela_1.id IS NULL;
SELECT *
FROM Tabela_1 FULL OUTER JOIN Tabela_2
ON Tabela_1.id = Tabela_2.fk
WHERE Tabela_1.id IS NULL OR Tabela_2.fk IS NULL;
SELECT *
FROM Tabela_1 FULL OUTER JOIN Tabela_2
ON Tabela_1.id = Tabela_2.fk
FULL OUTER JOIN Tabela_3
Página 18 de 37
Base de Dados Prof. Gilberto Cunha
ON Tabela_1.id = Tabela_3.fk
SELECT *
FROM Tabela_1 LEFT OUTER JOIN Tabela_2
ON Tabela_1.id = Tabela_2.fk
LEFT OUTER JOIN Tabela_3
ON Tabela_1.id = Tabela_3.fk
SELECT *
FROM Tabela_1 INNER OUTER JOIN Tabela_2
ON Tabela_1.id = Tabela_2.fk
LEFT OUTER JOIN Tabela_3
ON Tabela_1.id = Tabela_3.fk
SELECT *
FROM Tabela_1 INNER OUTER JOIN Tabela_2
ON Tabela_1.id = Tabela_2.fk
INNER OUTER JOIN Tabela_3
ON Tabela_1.id = Tabela_3.fk
Página 19 de 37
Base de Dados Prof. Gilberto Cunha
Página 20 de 37
Base de Dados Prof. Gilberto Cunha
Página 21 de 37
Base de Dados Prof. Gilberto Cunha
CASO PRÁTICO 2: Projetar um Sistema que permite gerenciar uma Base de Dados para
uma Faculdade. O sistema deverá registrar os Estudantes (Número de Matrícula e Nome do
Estudante) e as Disciplinas (Código e Nome da Disciplina) que são avaliadas. O sistema
deverá permitir também inserir as Notas e as Datas de avaliações.
Matrícula Código
Tipo Nota
Página 22 de 37
Base de Dados Prof. Gilberto Cunha
M N
ESTUDANTE Avaliação DISCIPLINA
M N M
Nome Sobrenome
Inscrição
Leciona
N
Data
PROFESSOR
Nome
Número
Completo
Nome Sobrenome
Modelo Relacional
Pode fazer avaliação sem estar inscrito?? Como garantir que todo professor leciona???
Página 23 de 37
Base de Dados Prof. Gilberto Cunha
Página 24 de 37
Base de Dados Prof. Gilberto Cunha
- Criar a Tabela de nome avaliacao com as colunas matricula, codigo, nota, data e
tipo:
CREATE TABLE IF NOT EXISTS avaliacao (
matriculaEst INT NOT NULL,
codigoDisc INT NOT NULL,
notaAval FLOAT NOT NULL,
dataAval DATE NOT NULL,
tipoAval VARCHAR(8) NOT NULL,
PRIMARY KEY (matriculaEst, codigoDisc)
) ENGINE=INNODB;
Página 25 de 37
Base de Dados Prof. Gilberto Cunha
- Cadastrar as Disciplinas:
INSERT INTO disciplina (nomeDisc)
VALUES ("Informática"), ("Programação I"), ("Química"),
("Matmática"), ("Português"), ("História");
- Cadastrar os Professores:
INSERT INTO professor (nomeProf, sobrenomeProf)
VALUES ("Gilberto", "Cunha"),("Irina","Peterson"), ("Jaime", "Gerónimo"),
("Glaura", "Bravo"),("Emanuel", "Francisco");
Página 26 de 37
Base de Dados Prof. Gilberto Cunha
- Cadastrar os Estudantes:
INSERT INTO estudante (nomeEst, sobrenomeEst)
VALUES ("Pedro", "Manuel"),("Rui","Jorge"), ("Francisco", "Paulo"),
("Maria", "Fernanda"),("Ana", "Bela"),("Ana", "Catarina"),
("Tito", "Faria"),("António", "Samuel"),("Domingos", "Paulo");
Página 27 de 37
Base de Dados Prof. Gilberto Cunha
(1,2,18,"2018/04/16","Primeira"), (2,2,13,"2018/04/16","Primeira"),
(3,2,11,"2018/04/16","Primeira"), (4,2,12,"2018/04/16","Primeira"),
(5,2,4,"2018/04/16","Primeira"), (6,2,0,"2018/04/16","Primeira"),
(1,3,10,"2018/04/17","Primeira"), (2,3,14,"2018/04/17","Primeira"),
(3,3,11,"2018/04/17","Primeira"), (4,3,16,"2018/04/17","Primeira"),
(5,3,16,"2018/04/17","Primeira"), (6,3,18,"2018/04/17","Primeira"),
(1,4,18,"2018/04/18","Primeira"), (2,4,18,"2018/04/18","Primeira"),
(3,4,14,"2018/04/18","Primeira"), (4,4,16,"2018/04/18","Primeira"),
(5,4,6,"2018/04/18","Primeira"), (6,4,8,"2018/04/18","Primeira"),
(1,5,12,"2018/04/19","Primeira"), (2,5,15,"2018/04/19","Primeira"),
(3,5,9,"2018/04/19","Primeira"), (4,5,6,"2018/04/19","Primeira"),
(5,5,16,"2018/04/19","Primeira"), (6,5,12,"2018/04/19","Primeira");
Página 28 de 37
Base de Dados Prof. Gilberto Cunha
Página 29 de 37
Base de Dados Prof. Gilberto Cunha
Página 30 de 37
Base de Dados Prof. Gilberto Cunha
12 - Exibir o Nome dos Dois estudantes com a Nota mais Baixa na disciplina de
Informática:
SELECT nomeEst AS NOME, sobrenomeEst SOBRENOME,
nomeDisc AS DISCIPLINA, notaAval AS NOTA
FROM avaliacao, disciplina, estudante
WHERE avaliacao.matriculaEst = estudante.matriculaEst
AND avaliacao.codigoDisc = disciplina.codigoDisc
AND nomeDisc= "Informática"
ORDER BY notaAval ASC LIMIT 2;
13 - Exibir o Nome dos Três estudantes com a Nota mais Alta na disciplina de
Informática:
SELECT nomeEst AS NOME, sobrenomeEst SOBRENOME,
nomeDisc AS DISCIPLINA, notaAval AS NOTA
FROM avaliacao, disciplina, estudante
WHERE avaliacao.matriculaEst = estudante.matriculaEst
AND avaliacao.codigoDisc = disciplina.codigoDisc
AND nomeDisc= "Informática"
ORDER BY notaAval DESC LIMIT 3;
Notas iguas????
14 - Exibir a Média das notas de cada uma das Disciplinas. Exibir em Ordem
Decrescente em função do valor da média:
SELECT nomeDisc AS DISCIPLINA, AVG(notaAval)MÉDIA
FROM avaliacao, disciplina
WHERE avaliacao.codigoDisc = disciplina.codigoDisc
GROUP BY nomeDisc
ORDER BY MÉDIA DESC;
Página 31 de 37
Base de Dados Prof. Gilberto Cunha
Página 32 de 37
Base de Dados Prof. Gilberto Cunha
Datas diferentes???
Página 33 de 37
Base de Dados Prof. Gilberto Cunha
Página 34 de 37
Base de Dados Prof. Gilberto Cunha
Página 35 de 37
Base de Dados Prof. Gilberto Cunha
Página 36 de 37
Base de Dados Prof. Gilberto Cunha
Página 37 de 37