0% acharam este documento útil (0 voto)
17 visualizações37 páginas

Linguagem SQL

Enviado por

victohpaulo90
Direitos autorais
© © All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato DOCX, PDF, TXT ou leia on-line no Scribd
0% acharam este documento útil (0 voto)
17 visualizações37 páginas

Linguagem SQL

Enviado por

victohpaulo90
Direitos autorais
© © All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato DOCX, PDF, TXT ou leia on-line no Scribd
Você está na página 1/ 37

Base de Dados Prof.

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).

Modelo Entidade Relacionamento

Localização Número Nome


Código

1 N Tempo de
DEPARTAMENTO Tem EMPREGADO Serviço

Nome Orçamento Função Salário

Admissão

Modelo Relacional

departamento (codigoDep, nomeDep, localizacaoDep, orcamentoDep)


empregado (numeroEmp, codigoDep, nomeEmp, funcaoEmp, salarioEmp,
admissaoEmp)

SQL - STRUCTURED QUERY LANGUAGE

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.

SEQUÊNCIA DOS COMANDO:

SELECT => Coloca-se os nomes das colunas a serem exibidas


FROM => Coloca-se os nomes das tabelas em que se encontram as colunas a serem
exibidas.
WHERE => Estabelece-se as condições para restringir a exibição dos registros
GROUP BY => Estabelece-se a condição de agrupamento dos registros a exibir
HAVING => Estabelece-se uma restrição a condição de agrupamento
ORDER BY => Ordena os registros em função de uma determinada coluna

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

BETWEEN ... AND ... entre dois valores ( inclusive )


IN ( .... ) lista de valores
LIKE com um padrao de caracteres
IS NULL é um valor nulo

FUNÇÕES DE CARACTERES

LOWER - força caracteres maiúsculos aparecerem em minúsculos.


UPPER - força caracteres minúsculos aparecerem em maiúsculos.
CONCAT(x,y) - concatena a string "x" com a string "y".

FUNÇÕES AGREGADAS (OU DE AGRUPAMENTO)

Função Retorno

AVG (n) média do valor n, ignorando nulos


COUNT (expr) número de elementos da coluna (expr)
MAX (expr) maior valor da expr
MIN (expr) menor valor da expr
SUM (n) soma dos valores de n, ignorando nulos

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;

CALCULATR TEMPO EM ANOS

YEAR(FROM_DAYS(TO_DAYS(NOW())-TO_DAYS(nascimentoHospede))))
Ou
TIMESTAMPDIFF(YEAR,nascimentoHospede,NOW()))

Obs: - nascimentoHospede é a coluna na tabela hospede que contém a data de nascimento.


- Podese-se usar NOW() ou CURDATE() ou ainda CURRENT_DATE().

CALCULAR O TEMPO EM DIAS

DATEDIFF(CURDATE(),"2016/10/01")
DATEDIFF("2016/10/02","2016/10/01")
DATEDIFF(dataSaidaHospede,dataEntradaHospede)

DISTINCT: Numa consulta permite eliminar registros repetidos.


UNIQUE: Não permite duplicidade de valores numa determinada coluna.
DESCRIBE: Exibe os dados da tabela.

TIPO DE DADOS

INT: Inteiro
FLOAT: Real
VARCHAR(x): String
DATE: Data

FORMATAR

Ex: CAST(AVG(salarioEmp)AS DECIMAL(10,2)) "MÉDIA SALÁRIO"

Página 4 de 37
Base de Dados Prof. Gilberto Cunha

CRIAR BASE DE DADOS:

Sintaxe: CREATE DATABASE < nomeBaseDados >;

Ex: CREATE DATABASE empresa;

APAGAR BASE DE DADOS:

Sintaxe: DROP SCHEMA <nome_banco>;

Ex: DROP SCHEMA empresa;

CRIAR TABELA:

Sintaxe: CREATE TABLE < nomeTabela>


(nomeAtributo1 <tipo> [ NOT NULL ],
nomeAtributo2 <tipo> [ NOT NULL ],
......
nomeAtributoN <tipo> [ NOT NULL ] ) ;

Ex1: Criar a Tabela de nome Departamento com as colunas Código, Nome e


Localização:

CREATE TABLE IF NOT EXISTS departamento (


codigoDep INT NOT NULL AUTO_INCREMENT,
nomeDep VARCHAR (50) NOT NULL,
localizacaoDep VARCHAR (50) NOT NULL,
PRIMARY KEY (codigoDep)
) ENGINE=INNODB;

Ex2: Criar a Tabela de nome Empregado com as colunas Número, Código, Nome,
Função, Salário e Admissão:

CREATE TABLE IF NOT EXISTS empregado (


numeroEmp INT NOT NULL AUTO_INCREMENT,
codigoDep INT,
nomeEmp VARCHAR (50) NOT NULL,
funcaoEmp VARCHAR (50) NOT NULL,
salarioEmp FLOAT,

Página 5 de 37
Base de Dados Prof. Gilberto Cunha

admissaoEmp DATE NOT NULL,


PRIMARY KEY (numeroEmp, codigoDep)
) ENGINE=INNODB;

Nota: DATE (Pronúncia: Deite)

ALTERAR TABELA:

- Adiciona um novo atributo (coluna) na tabela.

Sintaxe: ALTER TABLE < nome_tabela > ADD (


nomeAtributo1 < tipo > [ NOT NULL ],
...
nomeAtributoN < tipo > [ NOT NULL ] ) ;

Ex1: Adicionar na Tabela de nome Departamento a coluna Orçamento:


ALTER TABLE departamento ADD (orcamentoDep FLOAT)

Ex2: Criar a Chave Estrangeira de nome Departamento_ID na tabela Empregado:


ALTER TABLE empregado ADD CONSTRAINT departamento_fk1 FOREIGN KEY
(codigoDep) REFERENCES departamento (codigoDep);

Nota: ADD CONSTRAINT (Adiciona Restrição)


departamento_fk1 (Nome da Chave Estrangeira, não deve ser repetida se a chave
primária estiver a ser referenciada em outra tabela)

- Apaga um novo atributo (coluna) na tabela.

EX3: ALTER TABLE departamento DROP COLUMN orcamentoDep;

CREATE TABLE IF NOT EXISTS empregado (


numeroEmp INT NOT NULL AUTO_INCREMENT,
codigoDep INT,
nomeEmp VARCHAR (50) NOT NULL,
funcaoEmp VARCHAR (50) NOT NULL,
salarioEmp FLOAT,
admissaoEmp DATE NOT NULL,
PRIMARY KEY (numeroEmp),
FOREIGN KEY(codigoDep) references departamento(codigoDep)
) ENGINE=INNODB;

Ok

Página 6 de 37
Base de Dados Prof. Gilberto Cunha

INSERIR REGISTROS NA TABELA:

Sintaxe: INSERT INTO <tabela> [<campos>] [VALUES <valores>]

Ex1: Cadastrar Departamentos:


INSERT INTO departamento (nomeDep, localizacaoDep, orcamentoDep)
VALUES ("Comercial","Luanda",200000),
("Marketing","Benguela",100000),
("Produção","Huambo",500000);

Ex2: Cadastrar Empregados:


INSERT INTO empregado (codigoDep, nomeEmp, funcaoEmp, salarioEmp,
admissaoEmp)
VALUES (1,'Gil Cunha','Gerente',300000,'2010/11/27'),
(1,'Ana Paula','Secretária',80000,'2010/11/27'),
(1,'Maria João','Vendedora',40000,'2010/11/27'),
(1,'Ana Bela','Vendedora',40000,'2010/11/27'),
(2,'Rui Veloso','Publicitário',150000,'2014/10/11'),
(3,'Paulo Abreu','Operador',100000,'2012/02/08'),
(3,'Rui Jorge','Operador',100000,'2012/02/08');

APAGAR TABELA:

Sintaxe: DROP TABLE <nome_tabela> ;


Nota: Este comando apaga a definição da tabela, seus dados e referências.

Ex1: DROP TABLE empregado;

APAGAR REGISTROS:

Sintaxe: DELETE FROM <tabela> [WHERE <condição>];


Nota: Apaga todos registros de uma tabela sem apagar as páginas de dados.

Ex2: DELETE FROM empregado;

Ex3: DELETE FROM empregado


WHERE salarioEmp > 5000;

Sintaxe: DELETE FROM <tabela_1> [ INNER | LEFT | RIGHT ]


JOIN <tabela_2> <tabela_1>.<campo_tabela_1> = <tabela_2>.<campo_tabela_2>
WHERE <condição>
Nota: Apaga com efeito cascate, analogamente, apagamos um cliente e todas as suas
compras na tabela relacionada.

Página 7 de 37
Base de Dados Prof. Gilberto Cunha

Ex4:

Sintaxe: TRUNCATE <tabela>;


Nota: Apaga todos os registros juntamente com as páginas de dados de uma só vez.
Nota: Não é possível usar esse comando numa tabela que tem uma chave primária como
chave estrangeira numa outra tabela.

Ex5: TRUNCATE estudante;

ATUALIZAR

Altera os valores da tabela.

Sintaxe: UPDATE <tabela> SET <campo> = <expressão> [WHERE <condição>];

Ex: UPDATE empregado SET salarioEmp = salarioEmp * 1.2


WHERE salarioEmp < 40000;
Nota: Aumenta o valor do salário em 20% para os funcionários com salário abaixo de
40.000.

VER

Exibe as tabelas da base de dados.

Sintaxe: SHOW TABLES;

SELECIONAR

Sintaxe: SELECT <colunas> FROM <tabela>;

Ex1: Exibe todas as colunas da tabela Departamento.

SELECT * FROM departamento;

Página 8 de 37
Base de Dados Prof. Gilberto Cunha

Ex2: Exibe todas as colunas da tabela Empregado.

SELECT * FROM empregado;

Ex3: Exibe os nomes dos departamentos localizados em Luanda.

SELECT nomeDep AS DEPARTAMENTO, localizacaoDep AS LOCALIZAÇÃO


FROM departamento
WHERE localizacaoDep = 'Luanda';

Ex4: Exibe nomes e salários dos empregados com salários no intervalo indicado.

SELECT nomeEmp AS NOME, salarioEmp AS SALÁRIO


FROM empregado
WHERE salarioEmp BETWEEN 40000 AND 150000;

Ex5: Exibe nome e salário dos empregados com salário nos valores indicado.

SELECT nomeEmp AS NOME, salarioEmp AS SALÁRIO

Página 9 de 37
Base de Dados Prof. Gilberto Cunha

FROM empregado
WHERE salarioEmp IN (40000, 150000);

Ex6: Exibe os nomes dos empregados com a função de Gerente.

SELECT nomeEmp AS NOME, funcaoEmp AS FUNÇÃO


FROM empregado
WHERE funcaoEmp = 'Gerente';

Ex7: Exibe nome e função dos empregados com nomes que começam com G.

SELECT nomeEmp AS NOME, funcaoEmp AS FUNÇÃO


FROM empregado
WHERE nomeEmp LIKE 'G%';

Ex8: Exibe os nomes dos empregados com salário maior que 20.000.

SELECT nomeEmp AS NOME, alarioEmp AS SALÁRIO


FROM empregado
WHERE salarioEmp > 20000;

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.

SELECT nomeEmp AS NOME, salarioEmp AS SALÁRIO


FROM empregado
WHERE salarioEmp NOT BETWEEN 100000 AND 200000;

Ex10: Exibe nome, salário e função dos empregados com salários entre 100.000 e
200.000 e que sejam Operadores.

SELECT nomeEmp AS NOME, salarioEmp AS SALÁRIO,


funcaoEmp AS FUNÇÃO
FROM empregado
WHERE salarioEmp BETWEEN 100000 AND 200000
AND funcaoEmp = 'Operador';

Ex11: Exibe nome, salário e função dos empregados com salários entre 100.000 e
200.000 ou que sejam vendedoras.

SELECT nomeEmp AS NOME, salarioEmp AS SALÁRIO,


funcaoEmp AS FUNÇÃO
FROM empregado
WHERE salarioEmp BETWEEN 100000 AND 200000
OR funcaoEmp = 'Vendedora';

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.

SELECT nomeEmp AS NOME, salarioEmp AS SALÁRIO,


funcaoEmp AS FUNÇÃO
FROM empregado
WHERE salarioEmp BETWEEN 200000 AND 300000
AND (funcaoEmp = 'Gerente' OR funcaoEmp = 'Secretária');

Ex13: Exibe o nome de todos os empregados em letras minúsculas.

SELECT LOWER (nomeEmp) AS NOME


FROM empregado;

Ex14: Exibe o nome de todos os empregados em letras maiúsculas.

SELECT UPPER (nomeEmp) AS NOME


FROM empregado;

Página 12 de 37
Base de Dados Prof. Gilberto Cunha

Ex15: Exibe os dados de todos os empregados admitidos em 27/11/2010.

SELECT *
FROM empregado
WHERE admissaoEmp = '2010/11/27';

Ex16: Exibe todas as Funções existentes na empresa:

SELECT DISTINCT funcaoEmp AS FUNÇÃO


FROM empregado;

Ex17: Exibe a quantidade de salários pagos.

SELECT COUNT(salarioEmp) AS "QTDE SALÁRIO"


FROM empregado;

Ex18: Exibe o somatório do valor dos salários.

SELECT SUM(salarioEmp) AS " SOMA SALÁRIO"


FROM empregado;

Ex19: Exibe a média do salário.

SELECT CAST(AVG(salarioEmp)AS DECIMAL(10,2)) "MÉDIA SALÁRIO"


FROM empregado;

Página 13 de 37
Base de Dados Prof. Gilberto Cunha

Ex20: Exibe o valor mais alto dos salários.

SELECT MAX(salarioEmp) AS SALÁRIO_MAX


FROM empregado;

Ex21: Exibe o valor mais baixo dos salários.

SELECT MIN(salarioEmp) AS SALÁRIO_MIN


FROM empregado;

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.

Ex22: Exibe o nome do empregado com o salário mais baixo.

SELECT nomeEmp AS NOME, salarioEmp AS SALÁRIO_MIN


FROM empregado
ORDER BY salarioEmp ASC LIMIT 1;

Ex23: Exibe o nome do empregado com o salário mais alto.

SELECT nomeEmp AS NOME, salarioEmp AS SALÁRIO_MAX


FROM empregado
WHERE salarioEmp = (SELECT MAX(salarioEmp) FROM empregado);

Página 14 de 37
Base de Dados Prof. Gilberto Cunha

Ex24: Exibe os anos de serviço de todos empregados.

SELECT nomeEmp AS NOME, admissaoEmp AS ADMISSÃO,


YEAR(FROM_DAYS(TO_DAYS(NOW())-TO_DAYS(admissaoEmp))) AS TEMPO
FROM empregado;

EQUI-JUNÇÃO ( JUNÇÃO POR IGUALDADE )

O relacionamento existente entre tabelas é chamado de Equi-Junção, pois os valores de


colunas das duas tabelas são iguais. A equi-junção é possível apenas quando tivermos
definido de forma adequada a Chave Estrangeira (Fk) de uma tabela e sua referência a
Chave Primária (Pk) da tabela precedente.

Exemplo: Listar Nomes de Empregados, Funções e Nome do Departamento onde o


empregado trabalha.

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.

SELECT nomeEmp, funcaoEmp, nomeDep


FROM empregado, departamento
WHERE empregado.codigoDep = departamento.codigoDep;

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

tabela antecedendo o nome do atributo unidos por um ponto (Ex: empregado.nome e


departamento.nome) ou cria-se Alias.

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.

SELECT nomeEstudante, nomeDisciplina


FROM estudante, disciplina
WHERE nomeDisciplina = 'Informática';

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

Ex25: Exibir os nomes e as funções de cada funcionário classificados alfabeticamente


(A..Z).

SELECT nomeEmp AS NOME, funcaoEmp AS FUNÇÃO


FROM empregado
ORDER BY nomeEmp ASC;

Página 19 de 37
Base de Dados Prof. Gilberto Cunha

Ex26: Exibir o nome dos empregados em ordem alfabética que trabalham no


departamento comercial.

SELECT nomeEmp AS NOME, nomeDep AS DEPARTAMENTO


FROM empregado, departamento
WHERE empregado.codigoDep = departamento.codigoDep
AND departamento.codigoDep = 1
ORDER BY nomeEmp;

Ex27: Exibe o nome do departamento e a média de salários pagos por departamento


em ordem decrescente do salário.

SELECT nomeDep AS DEPARTAMENTO, AVG(salarioEmp)SALÁRIO_MÉD


FROM empregado, departamento
WHERE empregado.codigoDep = departamento.codigoDep
GROUP BY nomeDep
ORDER BY SALÁRIO_MÉD DESC;

Ex28: Exibe o nome do departamento com a média de salários mais baixa.

SELECT nomeDep AS DEPARTAMENTO, AVG(salarioEmp) SALÁRIO_MÉD


FROM empregado, departamento

Página 20 de 37
Base de Dados Prof. Gilberto Cunha

WHERE empregado.codigoDep = departamento.codigoDep


GROUP BY nomeDep
ORDER BY SALÁRIO_MÉD ASC LIMIT 1;

Ex29: Exibe o nome do departamento com a média de salários mais alta.

SELECT nomeDep AS DEPARTAMENTO, AVG(salarioEmp) SALÁRIO_MÉD


FROM empregado, departamento
WHERE empregado.codigoDep = departamento.codigoDep
GROUP BY nomeDep
ORDER BY SALÁRIO_MÉD DESC LIMIT 1;

Ex30: Exibe o nome do departamento e a média de salários pagos por departamento


em ordem decrescente do valor do salário, mas apenas para departamentos com mais
de 2 empregado.

SELECT nomeDep AS DEPARTAMENTO, AVG(salarioEmp) SALÁRIO_MÉD


FROM empregado, departamento
WHERE empregado.codigoDep = departamento.codigoDep
GROUP BY nomeDep
HAVING COUNT(empregado.codigoDep) > 2
ORDER BY SALÁRIO_MÉD DESC;

Ex31: Exibe o nome do departamento e a média de salários pagos por departamento


em ordem decrescente do valor do salário, mas apenas para médias de salário maior
que 100.000.

SELECT nomeDep AS DEPARTAMENTO, AVG(salarioEmp) SALÁRIO_MÉD


FROM empregado, departamento
WHERE empregado.codigoDep = departamento.codigoDep
GROUP BY nomeDep
HAVING AVG(salarioEmp) > 100000
ORDER BY SALÁRIO_MÉD DESC;

Página 21 de 37
Base de Dados Prof. Gilberto Cunha

Ex32: Exibie as funções que se repetem e quantidade de vezes.

SELECT funcaoEmp AS FUNÇÃO, COUNT(*) QTDE


FROM empregado
GROUP BY funcaoEmp
HAVING COUNT(*)>1;

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.

Modelo Entidade Relacionamento

Matrícula Código
Tipo Nota
Página 22 de 37
Base de Dados Prof. Gilberto Cunha

M N
ESTUDANTE Avaliação DISCIPLINA

Nome Data Nome


Completo

M N M
Nome Sobrenome
Inscrição
Leciona

N
Data
PROFESSOR

Nome
Número
Completo

Nome Sobrenome
Modelo Relacional

disciplina (codigoDisc, nomeDisc)


professor (numeroProf, nomeProf, sobrenomeProf)
estudante (matriculaEst, nomeEst, sobrenomeEst)
leciona (numeroProf, codigoDisc)
inscricao (matrisculaEst, codigoDisc, dataInsc)
avaliacao (matriculaEst, codigoDisc, notaAval, dataAval, tipoAval)

Nota: Aceita caracteres acentuados.

Pode fazer avaliação sem estar inscrito?? Como garantir que todo professor leciona???

Página 23 de 37
Base de Dados Prof. Gilberto Cunha

USANDO A LÍNGUAGEM SQL NO MySQL QUERY BROWSER

- Criar a Base de Dados de nome faculdade:


CREATE DATABASE faculdade;

- Criar a Tabela de nome disciplina com as colunas codigo e nome:


CREATE TABLE IF NOT EXISTS disciplina (
codigoDisc INT NOT NULL AUTO_INCREMENT,
nomeDisc VARCHAR(50) NOT NULL,
PRIMARY KEY (codigoDisc)
) ENGINE=INNODB;

- Criar a Tabela de nome professor com as colunas número, nome e sobrenome:


CREATE TABLE IF NOT EXISTS professor (
numeroProf INT NOT NULL AUTO_INCREMENT,
nomeProf VARCHAR(30) NOT NULL,
sobrenomeProf VARCHAR(30) NOT NULL,
PRIMARY KEY (numeroProf)
) ENGINE=INNODB;

Página 24 de 37
Base de Dados Prof. Gilberto Cunha

- Criar a Tabela de nome estudante com as colunas matricula, nome e sobrenome:


CREATE TABLE IF NOT EXISTS estudante (
matriculaEst INT NOT NULL AUTO_INCREMENT,
nomeEst VARCHAR(30) NOT NULL,
sobrenomeEst VARCHAR(30) NOT NULL,
PRIMARY KEY (matriculaEst)
) ENGINE=INNODB;

- Criar a Tabela de nome inscrito com as colunas matricula, codigo e data:


CREATE TABLE IF NOT EXISTS leciona (
numeroProf INT NOT NULL,
codigoDisc INT NOT NULL,
PRIMARY KEY (numeroProf, codigoDisc)
) ENGINE=INNODB;

- Criar a Tabela de nome inscrito com as colunas matricula, codigo e data:


CREATE TABLE IF NOT EXISTS inscricao (
matriculaEst INT NOT NULL,
codigoDisc INT NOT NULL,
dataInsc DATE NOT NULL,
PRIMARY KEY (matriculaEst, codigoDisc)
) ENGINE=INNODB;

- 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;

- Criar as Chaves Estrangeiras na tabela Avaliação:


ALTER TABLE avaliacao
ADD CONSTRAINT estudante_fk1 FOREIGN KEY (matriculaEst)
REFERENCES estudante (matriculaEst),
ADD CONSTRAINT disciplina_fk1 FOREIGN KEY (codigoDisc)
REFERENCES disciplina (codigoDisc);

- Criar as Chaves Estrangeiras na tabela Inscrição:


ALTER TABLE inscricao
ADD CONSTRAINT estudante_fk2 FOREIGN KEY (matriculaEst)
REFERENCES estudante (matriculaEst),
ADD CONSTRAINT disciplina_fk2 FOREIGN KEY (codigoDisc)

Página 25 de 37
Base de Dados Prof. Gilberto Cunha

REFERENCES disciplina (codigoDisc);


- Criar as Chaves Estrangeiras na tabela Leciona:
ALTER TABLE leciona
ADD CONSTRAINT professor_fk1 FOREIGN KEY (numeroProf)
REFERENCES professor (numeroProf),
ADD CONSTRAINT disciplina_fk3 FOREIGN KEY (codigoDisc)
REFERENCES disciplina (codigoDisc);

Nota: Não pode ter nomes de chaves estrangeiras iguais.

- Cadastrar as Disciplinas:
INSERT INTO disciplina (nomeDisc)
VALUES ("Informática"), ("Programação I"), ("Química"),
("Matmática"), ("Português"), ("História");

1 - Exibir todas Disciplinas Cadastradas:


SELECT * FROM disciplina;

- Cadastrar os Professores:
INSERT INTO professor (nomeProf, sobrenomeProf)
VALUES ("Gilberto", "Cunha"),("Irina","Peterson"), ("Jaime", "Gerónimo"),
("Glaura", "Bravo"),("Emanuel", "Francisco");

2 - Exibir todos os Professores Cadastrados:


SELECT * FROM professor;

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");

3 - Exibir todos os Estudantes Cadastrados:


SELECT * FROM estudante;

- Afectar os Professores as Disciplinas:


INSERT INTO leciona (numeroProf, codigoDisc)
VALUES (1,1),(1,2), (2,3), (3,4),(4,5), (5,6);

4 - Exibir todos os Estudantes Cadastrados:


SELECT * FROM leciona;

- Inscrever os Estudantes nas Disciplinas:


INSERT INTO inscricao (matriculaEst, codigoDisc,dataInsc)
VALUES
(1,1,"2018/03/01"),(2,1,"2018/03/01"),(3,1,"2018/03/01"),(4,1,"2018/03/01"),
(5,1,"2018/03/01"),(6,1,"2018/03/01"),(1,2,"2018/03/02"),(2,2,"2018/03/02"),
(3,2,"2018/03/02"),(4,2,"2018/03/02"),(5,2,"2018/03/02"),(6,2,"2018/03/02"),
(7,1,"2018/03/01"),(8,3,"2018/03/03"),(9,3,"2018/03/03");

Inscritos disciplinas diferentes

Página 27 de 37
Base de Dados Prof. Gilberto Cunha

Inscritos sem avaliação

5 - Exibir todos os Estudantes Cadastrados:


SELECT * FROM inscricao;

- Cadastrar as Avaliações dos Estudantes:


INSERT INTO avaliacao (matriculaEst, codigoDisc, notaAval, dataAval, tipoAval)
VALUES (1,1,18,"2018/04/15","Primeira"), (2,1,18,"2018/04/15","Primeira"),
(3,1,14,"2018/04/15","Primeira"), (4,1,16,"2018/04/15","Primeira"),
(5,1,6,"2018/04/15","Primeira"), (6,1,8,"2018/04/15","Primeira"),

(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

6 - Exibir todas Notas e Datas Cadastradas:


SELECT * FROM avaliacao;

7 - Exibir a Pauta da 1.ª Frequência da disciplina de Informática:


SELECT estudante.matriculaEst AS MATRÍCULA, nomeEst AS NOME,
sobrenomeEst AS SOBRENOME, nomeDisc AS DISCIPLINA,
tipoAval AS AVALIAÇÃO, notaAval AS NOTA
FROM avaliacao, disciplina, estudante
WHERE avaliacao.matriculaEst = estudante.matriculaEst
AND avaliacao.codigoDisc = disciplina.codigoDisc
AND nomeDisc = "Informática";

Página 29 de 37
Base de Dados Prof. Gilberto Cunha

8 - Exibir o Boletim de Notas da estudante com matrícula número 1:


SELECT estudante.matriculaEst AS MATRÍCULA, nomeEst AS ESTUDANTE,
sobrenomeEst AS SOBRENOME, nomeDisc AS DISCIPLINA,
notaAval AS NOTA
FROM avaliacao, disciplina, estudante
WHERE avaliacao.matriculaEst = estudante.matriculaEst
AND avaliacao.codigoDisc = disciplina.codigoDisc
AND estudante.matriculaEst = 1;

9 - Exibir o Nome do estudante 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 1;

10 - Qual a Menor Nota em Informática?


SELECT nomeDisc AS DISCIPLINA, MIN(notaAval)
FROM disciplina, avaliacao
WHERE avaliacao.codigoDisc = disciplina.codigoDisc
AND nomeDisc= "Informática";

11 - Qual a Maior Nota em Informática?


SELECT nomeDisc AS DISCIPLINA, MAX(notaAval)
FROM disciplina, avaliacao

Página 30 de 37
Base de Dados Prof. Gilberto Cunha

WHERE avaliacao.codigoDisc = disciplina.codigoDisc


AND nomeDisc= "Informática";

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

15 - Qual a Média das notas de Informática?


SELECT nomeDisc AS DISCIPLINA, AVG(notaAval)MÉDIA
FROM disciplina, avaliacao
WHERE avaliacao.codigoDisc = disciplina.codigoDisc
AND nomeDisc= "Informática";

16 - Listar Aprovados em Informática em Ordem Alfabética (A-Z) e letras


Maiúsculas.
SELECT UPPER(nomeEst) AS NOME, UPPER(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"
AND notaAval >= 10
ORDER BY nomeEst ASC;

17 - Listar Reprovados em Informática em Ordem Alfabética (A-Z) e letras


Minúsculas.
SELECT LOWER(nomeEst) AS NOME, LOWER(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"
AND notaAval < 10
ORDER BY nomeEst ASC;

Página 32 de 37
Base de Dados Prof. Gilberto Cunha

18 - Em que Data foi realizada a Prova de Infomática de 1.ª Frequência?


SELECT DISTINCT nomeDisc AS DISCIPLINA, dataAval AS DATA
FROM disciplina, avaliacao
WHERE avaliacao.codigoDisc = disciplina.codigoDisc
AND nomeDisc= "Informática";

Datas diferentes???

19 - Quantos Avaliados em Informática?


SELECT nomeDisc AS DISCIPLINA, COUNT(notaAval)
FROM avaliacao, disciplina
WHERE avaliacao.codigoDisc = disciplina.codigoDisc
AND nomeDisc= "Informática";

20 - Quantos Aprovados em Informática?


SELECT nomeDisc AS DISCIPLINA, COUNT(notaAval)
FROM avaliacao, disciplina
WHERE avaliacao.codigoDisc = disciplina.codigoDisc
AND nomeDisc= "Informática" AND notaAval >= 10;

21 - Quantos Reprovados em Informática?


SELECT nomeDisc AS DISCIPLINA, COUNT(notaAval)
FROM avaliacao, disciplina
WHERE avaliacao.codigoDisc = disciplina.codigoDisc
AND nomeDisc= "Informática" AND notaAval < 10;

Página 33 de 37
Base de Dados Prof. Gilberto Cunha

22 - Quantos tiveram 18 valores em Informática?


SELECT nomeDisc AS DISCIPLINA, COUNT(notaAval)
FROM avaliacao, disciplina
WHERE avaliacao.codigoDisc = disciplina.codigoDisc
AND nomeDisc= "Informática" AND notaAval = 18;

23 - Quem teve 18 valores em Informática?


SELECT nomeEst AS ESTUDANTE, sobrenomeEst SOBRENOME,
nomeDisc AS DISCIPLINA, notaAval AS NOTA
FROM avaliacao, disciplina, estudante
WHERE avaliacao.codigoDisc = disciplina.codigoDisc
AND avaliacao.matriculaEst = estudante.matriculaEst
AND nomeDisc= "Informática" AND notaAval = 18;

24 - Que Provas foram Realizadas no Dia 15/04/2018?


SELECT DISTINCT nomeDisc AS DISCIPLINA, dataAval AS DATA
FROM avaliacao, disciplina
WHERE avaliacao.codigoDisc = disciplina.codigoDisc
AND dataAval = "2018/04/15";

25 - Quantas Provas foram Realizadas no dia 15/04/2018?


SELECT dataAval AS DATA,COUNT(DISTINCT disciplina.codigoDisc) AS
QTDE_PROVAS
FROM avaliacao, disciplina
WHERE avaliacao.codigoDisc = disciplina.codigoDisc
AND dataAval = "2018/04/15";

Página 34 de 37
Base de Dados Prof. Gilberto Cunha

26 - Quem são os Estudantes Inscritos em Informática?


SELECT nomeEst AS NOME, sobrenomeEst SOBRENOME,
nomeDisc AS DISCIPLINA
FROM inscricao, disciplina, estudante
WHERE inscricao.codigoDisc = disciplina.codigoDisc
AND inscricao.matriculaEst = estudante.matriculaEst
AND nomeDisc= "Informática";

27 - Quem são os Estudantes Avaliados em Informática?


SELECT nomeEst AS NOME, sobrenomeEst SOBRENOME,
nomeDisc AS DISCIPLINA
FROM avaliacao, disciplina, estudante
WHERE avaliacao.codigoDisc = disciplina.codigoDisc
AND avaliacao.matriculaEst = estudante.matriculaEst
AND nomeDisc= "Informática";

28 – Quais são as Disciplinas por Professor?


SELECT nomeDisc AS DISCIPLINA, nomeProf AS NOME,
sobrenomeProf AS SOBRENOME
FROM disciplina, professor, leciona
WHERE leciona.numeroProf = professor.numeroProf
AND leciona.codigoDisc = disciplina.codigoDisc;

Página 35 de 37
Base de Dados Prof. Gilberto Cunha

29 - Quantas Disciplinas Leciona O Professor Gilberto Cunha?


SELECT nomeProf AS NOME, sobrenomeProf AS SOBRENOME,
COUNT(disciplina.codigoDisc)
FROM disciplina, professor, leciona
WHERE leciona.numeroProf = professor.numeroProf
AND leciona.codigoDisc = disciplina.codigoDisc
AND nomeProf = "Gilberto" AND sobrenomeProf = "Cunha";

30 - Quais Disciplinas Leciona o Professor Gilberto Cunha?


SELECT nomeProf AS NOME, sobrenomeProf AS SOBRENOME, nomeDisc AS
DISCIPLINA
FROM disciplina, professor, leciona
WHERE leciona.numeroProf = professor.numeroProf
AND leciona.codigoDisc = disciplina.codigoDisc
AND nomeProf = "Gilberto" AND sobrenomeProf = "Cunha";

31 - Quantidade de Disciplinas por Professor?


SELECT nomeProf AS NOME, sobrenomeProf AS SOBRENOME,
COUNT(disciplina.codigoDisc) AS DISCIPLINA
FROM disciplina, professor, leciona
WHERE leciona.numeroProf = professor.numeroProf
AND leciona.codigoDisc = disciplina.codigoDisc
GROUP BY professor.numeroProf;

Página 36 de 37
Base de Dados Prof. Gilberto Cunha

Quais disciplinas por professor

Página 37 de 37

Você também pode gostar