More than Just Lines on a Map: Best Practices for U.S Bike Routes
aula14 UFMG bd sql server testes e comandos
1. DCC011
Introdução a Banco de Dados
SQL select
Mirella M. Moro
Departamento de Ciência da Computação
Universidade Federal de Minas Gerais
mirella@dcc.ufmg.br
2. Programa
•Introdução
• Conceitos básicos, características da abordagem de banco
de dados, modelos de dados, esquemas e instâncias,
arquitetura de um sistema de banco de dados,
componentes de um sistema de gerência de banco de
dados.
•Modelos de dados e linguagens
• Modelo entidade-relacionamento (ER), modelo relacional,
álgebra relacional, SQL.
•Projeto de bancos de dados
• Fases do projeto de bancos de dados, projeto lógico de
bancos de dados relacionais, normalização.
•Novas Tecnologias e Aplicações de Banco de Dados
2
DCC011 - profa. Mirella M. Moro
4. Problema
•Dado um conjunto de
tabelas e seus dados
•Como recuperar os
dados?
•Como realizar consultas a
esses dados?
•“Me diz aí os nomes das
alunas do curso de
Ciência da Computação
ordenados
alfabeticamente”
Matr Nome Sexo Cr
1 A F CC
2 B M CC
3 C M CC
4 D F MC
5 E M MC
6 F M SI
7 G F SI
8 H F SI
9 I M SI
10 J M ECA
ALUNOS
4
DCC011 - profa. Mirella M. Moro
5. SQL select-from
1. SELECT Matr
FROM ALUNOS;
2. SELECT Cr
FROM ALUNOS;
3. SELECT Matr, Cr
FROM ALUNOS;
4. SELECT Matr, Nome, Sexo, Cr
FROM ALUNOS;
5. SELECT *
FROM ALUNOS;
5
DCC011 - profa. Mirella M. Moro
Matr Nome Sexo Cr
1 A F CC
2 B M CC
3 C M CC
4 D F MC
5 E M MC
6 F M SI
7 G F SI
8 H F SI
9 I M SI
10 J M ECA
ALUNOS
6. SQL select-from-where
1. SELECT Matr
FROM ALUNOS
WHERE Sexo = ‘F’;
2. SELECT Nome
FROM ALUNOS
WHERE Sexo = ‘F’
AND Cr = ‘SI’;
3. SELECT Matr
FROM ALUNOS
WHERE Sexo = ‘F’
AND Cr <> “CC”;
6
DCC011 - profa. Mirella M. Moro
7. Solução: SQL select-from-where
“Me diz aí os nomes das
alunas do curso de Ciência
da Computação ordenados
alfabeticamente”
7
DCC011 - profa. Mirella M. Moro
SELECT Nome
FROM ALUNOS
WHERE Sexo = ‘F’
AND Cr = ‘CC’
ORDER BY Nome;
8. Mais Problemas
1. Nomes de todos os
alunos acompanhados
dos nomes de seus
cursos
2. Nomes de todos os
alunos acompanhados
das disciplinas
matriculadas em 20162
8
DCC011 - profa. Mirella M. Moro
Matr Nome Sexo Cr
1 A F CC
2 B M CC
3 C M CC
4 D F MC
5 E M MC
6 F M SI
7 G F SI
8 H F SI
9 I M SI
10 J M ECA
ALUNOS
9. ALUNOS
Matr Nome Sexo Cr
1 A F CC
2 B M CC
3 C M CC
4 D F MC
5 E M MC
6 F M SI
7 G F SI
8 H F SI
9 I M SI
10 J M ECA
Cr Nome Depto Coord
CC
Ciência da
Computação DCC RG
MC
Matemática
Computacional DCC TN
SI
Sistemas de
Informação DCC CDJ
ECA
Engenharia de
Controle e
Automação
ENG XYZ
CURSOS
Matr Disc T Sem
1 DCC011 Z 20162
1 DCC851 A 20162
1 DCC834 A 20161
2 DCC011 Z 20161
... ... ... ...
MATRICULAS
9
DCC011 - profa. Mirella M. Moro
10. Em formato texto
ALUNOS (Matr, Nome, Sexo, Cr)
Cr referencia CURSOS
CURSOS (Cr, Nome, Depto, Coord)
Depto referencia DEPARTAMENTOS
Coord referencia PROFESSORES
MATRICULAS (Matr, Disc, T, Sem)
Matr referencia ALUNOS
Disc referencia DISCIPLINAS
DEPARTAMENTOS (...)
PROFESSORES (...)
DISCIPLINAS (...)
10
DCC011 - profa. Mirella M. Moro
11. Mais Problemas
1. Nomes de todos os alunos
acompanhados dos nomes de
seus cursos
11
DCC011 - profa. Mirella M. Moro
12. Mais Problemas
1. Nomes de todos os alunos acompanhados
dos nomes de seus cursos
SOLUÇÃO A
SELECT Nome, Nome
FROM ALUNOS, CURSOS;
SOLUÇÃO B
SELECT ALUNOS.Nome, CURSOS.Nome
FROM ALUNOS, CURSOS;
SOLUÇÃO C
SELECT A.Nome, C.Nome
FROM ALUNOS as A, CURSOS as C;
SOLUÇÃO D
SELECT A.Nome, C.Nome
FROM ALUNOS A, CURSOS C
WHERE A.Cr = C.Cr;
12
DCC011 - profa. Mirella M. Moro
13. Mais Problemas
2. Nomes de todos os alunos
acompanhados das disciplinas
matriculadas em 20162
13
DCC011 - profa. Mirella M. Moro
14. Mais Problemas
2. Nomes de todos os alunos
acompanhados das disciplinas
matriculadas em 20162
SOLUÇÃO A
SELECT Nome, Disc
FROM ALUNOS, MATRICULAS;
SOLUÇÃO B
SELECT Nome, Disc
FROM ALUNOS, MATRICULAS
WHERE Sem=“20162”;
SOLUÇÃO C
SELECT Nome, Disc
FROM ALUNOS, MATRICULAS
WHERE Sem=“20162” AND
ALUNOS.Matr = MATRICULAS.Matr;
14
DCC011 - profa. Mirella M. Moro
16. 1. Consultas Básicas em SQL
•Formato básico do comando SELECT:
SELECT <lista de atributos>
FROM <lista de tabelas>
[ WHERE <condição>; ]
•Exemplo:
SELECT datanast, endereco
FROM EMPREGADO
WHERE pnome=‘John’ AND
minicial=‘B’ AND
unome=‘Smith’;
π Bdate,AddressσFname=‘John’ AND Minit=‘B’ AND Lname=‘Smith’ (EMPLOYEE)
EM PORTUGUÊS
EMPREGADO (ssn, pnome, minicial, unome,
datanasc, endereco, sexo, salario, superssn, dno)
superssn REFERENCIA EMPREGADO
dno REFERENCIA DEPARTAMENTO
DEPARTAMENTO (dnumero, dnome, gerssn,
gerdatainicio)
gerssn REFERENCIA EMPREGADO.ssn
16
DCC011 - profa. Mirella M. Moro
17. Consultas Básicas em SQL
B. Atributos Ambíguos e Pseudônimos (alias)
SELECT dname, dlocation
FROM DEPARTMENT, DEPT_LOCATIONS
WHERE DEPARTMENT.dnumber =
DEPT_LOCATIONS.dnumber;
SELECT e.fname, e.lname, s.fname, s.lname
FROM EMPLOYEE AS E, EMPLOYEE AS S
WHERE e.superssn=s.ssn;
EM INGLÊS
EMPLOYEE(ssn, fname, lname, address,bdate, superssn, dno)
superssn REFERENCIA EMPLOYEE
dno REFERENCIA DEPARTMENT
DEPARTAMENT (dnum, dname, mgrssn, mgrinitialdate)
mgrssn REFERENCIA EMPLOYEE.ssn
PROJECT (pnumber, pname, plocation, dnum)
dnum REFERENCIA DEPARTAMENT
DEPT_LOCATIONS (dnumber,dlocation)
dnumber REFERENCIA DEPARTAMENT
(Q8)
17
DCC011 - profa. Mirella M. Moro
18. Consultas Básicas em SQL
B. Atributos Ambíguos e Pseudônimos (alias)
• SELECT pnumber, dnum, lname, address, bdate
FROM PROJECT P, DEPARTMENT D, EMPLOYEE E
WHERE plocation=‘Stafford’ AND
D.dnum=P.dnum AND D.mgrssn=E.ssn;
π pnumber,dnum,lname,address,bdate σplocation=‘Stafford’
(EMPLOYEE ⋈ ssn=mgrssn (DEPARTMENT ⋈ PROJECT))
condição de seleção
condição de junção
EMPLOYEE(ssn, fname, lname, address,bdate, superssn, dno)
superssn REFERENCIA EMPLOYEE
dno REFERENCIA DEPARTMENT
DEPARTAMENT (dnum, dname, mgrssn, mgrinitialdate)
mgrssn REFERENCIA EMPLOYEE.ssn
PROJECT (pnumber, pname, plocation, dnum)
dnum REFERENCIA DEPARTAMENT
(Q2)
18
DCC011 - profa. Mirella M. Moro
19. Consultas Básicas em SQL
C. SELECT FROM sem o WHERE
SELECT ssn, lname, salary
FROM EMPLOYEE;
SELECT lname, dname
FROM EMPLOYEE, DEPARTMENT
Atenção! A consulta em vermelho corresponde a um produto
cartesiano das tabelas EMPLOYEE e DEPARTMENT :
π lname,dname (EMPLOYEE x DEPARTMENT)
WHERE dno=dnumber; com a junção
EMPLOYEE(ssn, fname, lname, address,bdate, superssn, dno)
superssn REFERENCIA EMPLOYEE
dno REFERENCIA DEPARTMENT
DEPARTAMENT (dnum, dname, mgrssn, mgrinitialdate)
mgrssn REFERENCIA EMPLOYEE.ssn
(Q10)
19
DCC011 - profa. Mirella M. Moro
20. Consultas Básicas em SQL
D. TODOS OS ATRIBUTOS
•Consultas a todos os atributos
SELECT *
FROM EMPLOYEE
WHERE Dno=5;
SELECT *
FROM EMPLOYEE, DEPARTMENT
WHERE Dname=‘Research’ AND Dno=Dnumber;
EMPLOYEE(ssn, fname, lname, address,bdate, superssn, dno)
superssn REFERENCIA EMPLOYEE
dno REFERENCIA DEPARTMENT
DEPARTAMENT (dnum, dname, mgrssn, mgrinitialdate)
mgrssn REFERENCIA EMPLOYEE.ssn
(Q1C)
(Q1D)
20
DCC011 - profa. Mirella M. Moro
21. Consultas Básicas em SQL
E. TABELAS COMO CONJUNTOS
• SQL trata uma tabela como um multi-conjunto
• Tuplas duplicadas PODEM aparecer em uma tabela
• E no resultado de uma consulta
• SQL não elimina automaticamente as duplicatas porque…
• Eliminação de duplicatas é uma operação cara (ordenar)
• O usuário pode estar interessado nelas
• Funções de agregação utilizam duplicatas (funções de agregação serão
explicadas a seguir)
• Operações
• SELECT DISTINCT, SELECT ALL
• ∪: UNION, : EXCEPT, ∩: INTERSECT
21
DCC011 - profa. Mirella M. Moro
22. Tabelas como Conjuntos
SELECT salary
FROM EMPLOYEE;
SELECT DISTINCT salary
FROM EMPLOYEE;
(SELECT pnumber
FROM PROJECT, DEPARTMENT, EMPLOYEE
WHERE dnum=dnumber AND mgrssn=ssn AND
lname=‘Smith’)
UNION
(SELECT pnumber
FROM PROJECT, WORKS_ON, EMPLOYEE
WHERE pnumber=pno AND essn=ssn AND
lname=‘Smith’);
Não elimina linhas (tuplas) duplicatas
Para eliminar precisa usar DISTINCT, por exemplo:
(Q4)
(Q11)
EMPLOYEE(ssn, fname, lname, address,bdate, superssn, dno)
superssn REFERENCIA EMPLOYEE
dno REFERENCIA DEPARTMENT
DEPARTAMENT (dnum, dname, mgrssn, mgrinitialdate)
mgrssn REFERENCIA EMPLOYEE.ssn
PROJECT (pnumber, pname, plocation, dnum)
dnum REFERENCIA DEPARTAMENT
22
DCC011 - profa. Mirella M. Moro
PORÉM: union, intersect, except eliminam duplicatas!
UNION ALL
23. 2. Facilidades Adicionais
A. JOINS
•Uso do operador JOIN, na cláusula FROM
•SELECT FNAME, LNAME, ADDRESS
FROM (EMPLOYEE JOIN DEPARTMENT
ON DNO=DNUMEBR)
WHERE DNAME=‘Research’;
•A cláusula FROM contém então uma única tabela
resultante da junção de Empregado e Departamento
EMPLOYEE(ssn, fname, lname, address,bdate, superssn, dno)
superssn REFERENCIA EMPLOYEE
dno REFERENCIA DEPARTMENT
DEPARTAMENT (dnum, dname, mgrssn, mgrinitialdate)
mgrssn REFERENCIA EMPLOYEE.ssn
23
DCC011 - profa. Mirella M. Moro
24. Facilidades Adicionais
A. JOINS
•Pode-se especificar outros tipos de junção na cláusula
FROM
•Junção natural: equijoin em cada par de atributos com
o mesmo nome
•SELECT DNAME, DLOCATION
FROM (DEPARTMENT NATURAL JOIN
DEPT_LOCATIONS);
DEPARTAMENT (dnum, dname, mgrssn, mgrinitialdate)
mgrssn REFERENCIA EMPLOYEE.ssn
DEPT_LOCATIONS (dnum, dlocal)
dnum REFERENCIA DEPARTAMENT
24
DCC011 - profa. Mirella M. Moro
25. Facilidades Adicionais
A. JOINS
Renomeando atributos para o natural join:
•SELECT pnome, unome, dnome
FROM (EMPREGADO NATURAL JOIN
(DEPARTMENTO AS DEPT (dno, dnome,
gerssn, gerdatainicio)))
WHERE dnome = ‘Pesquisa’;
EMPREGADO (ssn, pnome, minicial, unome, …superssn, dno)
superssn REFERENCIA EMPREGADO
dno REFERENCIA DEPARTAMENTO
DEPARTAMENTO (dnumero, dnome, gerssn, gerdatainicio)
gerssn REFERENCIA EMPREGADO.ssn
25
DCC011 - profa. Mirella M. Moro
26. Facilidades Adicionais
A. JOINS
•SELECT fname, lname, dependent_name
FROM (EMPLOYEE JOIN DEPENDENT ON ssn=essn);
•[INNER] JOIN..ON: pares empregado/dependente
•OUTER JOIN..ON: pares + empregados que não têm
dependente
[NATURAL] LEFT/RIGHT/FULL OUTER JOIN .. ON
•SELECT fname, lname, dependent_name
FROM (EMPLOYEE LEFT OUTER JOIN
DEPENDENT ON ssn=essn);
26
DCC011 - profa. Mirella M. Moro
27. Outer Join
INSERE dois cursos {ENF,MED}
•select A.Matr, C.Cr from ALUNOS A
RIGHT OUTER JOIN CURSOS C
ON A.Cr=C.Cr
• SE a única coluna em comum fosse Cr:
select A.Matr, C.Cr from ALUNOS A
NATURAL RIGHT OUTER JOIN CURSOS C
DCC011 - profa. Mirella M. Moro 27
Matr Cr
1 CC
2 CC
3 CC
4 MC
5 MC
6 SI
7 SI
8 SI
9 SI
10 ECA
null ENF
null MED
28. Cuidado com o número de colunas do
resultado quando se realiza
junção natural
NATURAL JOIN
NATURAL LEFT OUTER JOIN
NATURAL RIGHT OUTER JOIN
A palavra OUTER é opcional
DCC011 - profa. Mirella M. Moro 28
29. PraticandoSQL
DCC011 - profa. Mirella M. Moro 29
Item(Cod_Item, Descricao, Preco_Unit)
Pedido(Num_Pedido, Data, Cod_Cliente, Valor_Total),
Cod_Cliente --> Cliente
Item_Pedido(Num_Pedido, Cod_Item, Quantidade)
Num_Pedido --> Pedido, Cod_Item --> Item
SQL #Colunas #Linhas
select * from Item, Item_Pedido 6 234
select * from Item I, Item_Pedido IP
where I.Cod_Item=IP.Cod_Item
6 18
select * from Item NATURAL JOIN Item_Pedido 5 18
select * from Item I JOIN Item_Pedido IP
ON I.Cod_Item=IP.Cod_Item
6 18
select * from (Item I LEFT OUTER JOIN Item_Pedido IP
ON I.Cod_Item=IP.Cod_Item)
6 19
select * from (Item NATURAL LEFT OUTER JOIN Item_Pedido) 5 19
?
30. A B B
A
A B
B
A
A B
A B
A B
SQL JOINS
SELECT …
FROM A LEFT JOIN B
ON A.key = B.key
SELECT …
FROM A RIGHT JOIN B
ON A.key = B.key
SELECT …
FROM A LEFT JOIN B
ON A.key = B.key
WHERE B.key IS NULL
SELECT …
FROM A RIGHT JOIN B
ON A.key = B.key
WHERE A.key IS NULL
SELECT …
FROM A INNER JOIN B
ON A.key = B.key
SELECT …
FROM A FULL OUTER JOIN B
ON A.key = B.key
SELECT …
FROM A FULL OUTER JOIN B
ON A.key = B.key
WHERE A.key IS NULL
OR B.key IS NULL
30
DCC011 - profa. Mirella M. Moro
31. Facilidades Adicionais
B. FUNÇÕES DE AGREGAÇÃO
• Funções de agregação: COUNT, SUM, MAX, MIN, AVG
• Sempre aparecem na cláusula SELECT ou HAVING
• Ou seja, não existe “where max(salario)=5000”
• COUNT, duas possibilidades
• count(*) : retorna quantas linhas existe no resultado da consulta
• count(coluna): retorna quantas linhas possuem valores válidos para coluna
• SUM(coluna): retorna a soma de todos os valores válidos para a
coluna especificada
• AVG(coluna): retorna o valor médio de todos os valores válidos
para a coluna especificada
• MAX(coluna) e MIN(coluna): retornam os valores máximo e
mínimo (respectivamente) da coluna especificada
• NULL não conta como mínimo, pois não é valor válido
31
DCC011 - profa. Mirella M. Moro
32. Exemplos funções agregação
• select count(*) from ALUNOS;
• select count(*) as Qtde
from ALUNOS
where sexo = ‘F’;
• select max(Matr) as max,
min(Matr) as min
from ALUNOS;
• select sum(Matr) as sum,
avg(Matr) as avg
from ALUNOS
where sexo = ‘F’;
DCC011 - profa. Mirella M. Moro 32
count(*)
10
Qtde
4
max min
10 1
sum avg
20 5
33. FUNÇÕES DE AGREGAÇÃO – exemplos do livro
• SELECT SUM(SALARY), MAX(SALARY), MIN(SALARY), AVG(SALARY)
FROM EMPLOYEE;
• SELECT SUM(SALARY), MAX(SALARY), MIN(SALARY), AVG(SALARY)
FROM EMPLOYEE, DEPARTMENT
WHERE DNO=DNUMBER AND DNAME=‘Research’;
• SELECT COUNT(*)
FROM EMPLOYEE, DEPARTMENT
WHERE DNO=DNUMBER AND DNAME=‘Research’;
33
DCC011 - profa. Mirella M. Moro
34. Exercícios
podem ser executados no site www.lbd.dcc.ufmg.br/praticandosql
selecionar o banco de dados COMPANY
1. Retorne o SSN dos empregados:
a. que trabalham no departamento 4;
b. que trabalham no departamento 4 ou 5;
c. que trabalham no departamento gerenciado pelo empregado 987654321;
d. que trabalham mais de 9 horas no projeto 10;
2. Retorne o total de horas que o empregado 333445555 trabalha em projetos;
3. Retorne o máximo, mínimo e média de horas que os empregados trabalham no projeto 30;
4. Retorne todos os projetos (incluindo os sem empregados) seguidos do ssn dos seus
empregados;
DEPARTMENT(DNAME, DNUMBER, MGRSSN, MGRSTARTDATE) mgrssn é o gerente
MGRSSN referencia EMPLOYEE
DEPENDENT(ESSN, DEPENDENT_NAME, SEX, BDATE, RELATIONSHIP)
ESSN referencia EMPLOYEE
DEPT_LOCATIONS(DNUMBER, DLOCATION)
DNUMBER referencia DEPARTMENT
EMPLOYEE(FNAME, MINIT, LNAME,SSN, BDATE, ADDRESS, SEX, SALARY, SUPERSSN, DNO)
SUPERSSN referencia EMPLOYEE; DNO referencia DEPARTMENT
PROJECT(PNAME, PNUMBER, PLOCATION, DNUM)
DNUM referencia DEPARTMENT
WORKS_ON(ESSN, PNO, HOURS) ESSN referencia EMPLOYEE ; PNO referencia PROJECT
34
DCC011 - profa. Mirella M. Moro
35. SSN dos empregados:
a. que trabalham no
departamento 4;
b. que trabalham no
departamento 4 ou 5;
35
DCC011 - profa. Mirella M. Moro
36. SSN dos empregados:
c. que trabalham no
departamento
gerenciado pelo
empregado 987654321;
d. que trabalham mais de 9
horas no projeto 10;
36
DCC011 - profa. Mirella M. Moro
37. 2. Retorne o total de horas
que o empregado
333445555 trabalha
em projetos;
3. Retorne o máximo,
mínimo e média de
horas que os
empregados
trabalham no projeto
30;
4. Retorne todos os
projetos (incluindo os
sem empregados)
seguidos do ssn dos
seus empregados;
37
DCC011 - profa. Mirella M. Moro
38. Exercícios: BD Universidade-simplificado
ALUNOS (Matr, Nome, Sexo, Cr)
Cr referencia CURSOS
CURSOS (Cr, Nome, Depto, Coord)
Depto referencia DEPARTAMENTOS
Coord referencia PROFESSORES
MATRICULAS (Matr, Disc, T, Sem)
Matr referencia ALUNOS
Disc referencia DISCIPLINAS
DEPARTAMENTOS (Dep, NomeDep, Localização, Chefe)
Chefe referencia PROFESSORES
PROFS (CPF, NomeProf, DataAdm, Nível)
DISCIP (Disc, NomeDisc, Creditos, CH)
PROF-DISC (CPFprof, Disc, T, Sem)
CPFprof referencia PROFS
Disc referencia DISCIP
DCC011 - profa. Mirella M. Moro 38
39. Escrever o comando SQL para as consultas
1. Obter todos os dados de Disciplinas
2. Obter os nomes das Disciplinas e o respectivo número de créditos
3. Obter os nomes das Disciplinas para as quais existem alunos
matriculados SEM utilizar o operador de junção
4. Refazer a consulta 3 utilizando o operador de junção
5. Obter os nomes dos professores e os nomes das disciplinas que
ensinam
6. Obter os nomes dos professores e os nomes das disciplinas que
ensinam no semestre atual
7. Obter os nomes dos professores e os nomes das disciplinas que
ensinam no semestre atual e no anterior
8. Obter os nomes dos professores que são chefes de departamento e
as disciplinas que ensinam no semestre atual
9. Obter os nomes cursos do Departamento DCC ordenados
alfabeticamente
10. Obter os nomes cursos que começam com Engenharia
DCC011 - profa. Mirella M. Moro 39