k19-k03 - SQL e Modelo Relacional
k19-k03 - SQL e Modelo Relacional
k19-k03 - SQL e Modelo Relacional
30 de julho de 2012
Sumrio i
Sobre a K19 1
Seguro Treinamento 2
Termo de Uso 3
Cursos 4
1 Introduo 1
1.1 SGBD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.2 MySQL Server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.3 Bases de dados (Databases) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.4 Criando uma base de dados no MySQL Server . . . . . . . . . . . . . . . . . . . . . . . . 2
1.5 Tabelas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.6 Tabelas no MySQL Server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.7 CRUD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.8 Restries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.9 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2 Consultas 9
2.1 SELECT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.2 WHERE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
2.3 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
2.4 ORDER BY . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.5 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.6 Funes de Agrupamento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.7 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
2.8 GROUP BY . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
2.9 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
2.10 DISTINCT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
2.11 LIMIT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
www.k19.com.br i
S UMRIO ii
3 Relacionamentos 17
3.1 UNIQUE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
3.2 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
3.3 Exerccios Complementares . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
3.4 Chaves Primrias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
3.5 Chaves Estrangeiras . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
3.6 One to One . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
3.7 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
3.8 Exerccios Complementares . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
3.9 One to Many ou Many to One . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
3.10 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
3.11 Exerccios Complementares . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
3.12 Many to Many . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
3.13 Exerccios de Fixao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
3.14 Exerccios Complementares . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
A Respostas 31
ii www.k19.com.br
1 S UMRIO
Sobre a K19
Visando a mxima qualidade, a K19 mantm as suas apostilas em constante renovao e melho-
ria, oferece instalaes fsicas apropriadas para o ensino e seus instrutores esto sempre atualizados
didtica e tecnicamente.
www.k19.com.br 1
S UMRIO 2
Seguro Treinamento
Comprometida com o aprendizado e com a satisfao dos seus alunos, a K19 a nica que pos-
sui o Seguro Treinamento. Ao contratar um curso, o aluno poder refaz-lo quantas vezes desejar
mediante a disponibilidade de vagas e pagamento da franquia do Seguro Treinamento.
As vagas no preenchidas at um dia antes do incio de uma turma da K19 sero destinadas ao
alunos que desejam utilizar o Seguro Treinamento. O valor da franquia para utilizar o Seguro Treina-
mento 10% do valor total do curso.
2 www.k19.com.br
3 S UMRIO
Termo de Uso
Termo de Uso
Todo o contedo desta apostila propriedade da K19 Treinamentos. A apostila pode ser utilizada
livremente para estudo pessoal . Alm disso, este material didtico pode ser utilizado como material
de apoio em cursos de ensino superior desde que a instituio correspondente seja reconhecida pelo
MEC (Ministrio da Educao) e que a K19 seja citada explicitamente como proprietria do material.
proibida qualquer utilizao desse material que no se enquadre nas condies acima sem
o prvio consentimento formal, por escrito, da K19 Treinamentos. O uso indevido est sujeito s
medidas legais cabveis.
www.k19.com.br 3
S UMRIO 4
TR
EIN
AM
EN
TR
TO
EIN
S
TREINAMENTOS
AM
EN
TO
S
Conhea os nossos cursos
www.k19.com.br/cursos
4 www.k19.com.br
CAPTULO
I NTRODUO
1
SGBD
Qualquer empresa necessita armazenar os dados relacionados ao seu negcio. Por exemplo, uma
livraria deve manter as informaes dos livros que so comercializados por ela. Um banco precisa
registrar os dados dos seus clientes. Uma escola deve guardar as informaes dos seus alunos.
Hoje em dia, utilizar papel para registrar os dados de uma empresa no uma boa alternativa.
O espao fsico necessrio gera custos altos para empresa. Em geral, a consulta das informaes
registradas demorada. O risco de um acidente destruir os dados armazenados em papel alto.
Os principais SGBDs adotados nas empresas utilizam o Modelo Relacional para definir a organi-
zao das informaes armazenadas e a linguagem SQL para permitir a manipulao desses dados.
MySQL Server
Oracle Database
SQL Server
PostgreSQL
MySQL Server
Neste treinamento, utilizaremos o MySQL Server, que mantido pela Oracle e amplamente utili-
zado em aplicaes comerciais. Para instalar o MySQL Server, voc pode consultar o artigo disponvel
em nosso site: http://www.k19.com.br/artigos/instalando-mysql/
www.k19.com.br 1
I NTRODUO 2
Suponha que os dados fossem mantidos sem nenhuma separao lgica. Implementar regras
de segurana especficas seria extremamente complexo. Tais regras criam restries quanto ao con-
tedo que pode ser acessado por cada usurio. Por exemplo, determinado usurio poderia ter per-
misso de acesso aos dados dos clientes do banco, mas no s informaes dos produtos da loja
virtual, ou dos livros da livraria.
Para criar uma base de dados no MySQL Server, podemos utilizar o comando CREATE DATA-
BASE.
Podemos utilizar o comando SHOW DATABASES para listar as bases de dados existentes.
Repare que, alm da base de dados livraria, h outras trs bases. Essas bases foram criadas au-
tomaticamente pelo prprio MySQL Server para teste ou para armazenar configuraes.
Quando uma base de dados no mais necessria, ela pode ser removida atravs do comando
DROP DATABASE.
Tabelas
Um servidor de banco de dados dividido em bases de dados com o intuito de separar as infor-
maes de domnios diferentes. Nessa mesma linha de raciocnio, podemos dividir os dados de uma
base a fim de agrup-los segundo as suas correlaes. Essa separao feita atravs de tabelas. Por
exemplo, no sistema de um banco, interessante separar o saldo e o limite de uma conta, do nome e
CPF de um cliente. Ento, poderamos criar uma tabela para os dados relacionados s contas e outra
para os dados relacionados aos clientes.
2 www.k19.com.br
3 I NTRODUO
Cliente Conta
nome idade cpf numero saldo limite
Jos 27 31875638735 1 1000 500
Maria 32 30045667856 2 2000 700
Tabela 1.1: Tabelas para armazenar os dados relacionados aos clientes e s contas
Uma tabela formada por registros (linhas) e os registros so formados por campos (colunas).
Por exemplo, considere uma tabela para armazenar as informaes dos clientes de um banco. Cada
registro dessa tabela armazena em seus campos os dados de um determinado cliente.
As tabelas no MySQL Server so criadas atravs do comando CREATE TABLE. Na criao de uma
tabela, necessrio definir quais so os nomes e os tipos das colunas.
As tabelas de uma base de dados podem ser listadas atravs do comando SHOW TABLES. Antes
de utilizar esse comando, devemos selecionar uma base de dados atravs do comando USE.
Database changed
mysql > SHOW TABLES ;
+ - - - - - - - - - - - - - - - - - - - -+
| Tables_in_livraria |
+ - - - - - - - - - - - - - - - - - - - -+
| Livro |
+ - - - - - - - - - - - - - - - - - - - -+
1 row in set (0.00 sec )
Se uma tabela no for mais desejada, ela pode ser removida atravs do comando DROP TABLE.
Tambm podemos alterar a estrutura de uma tabela com o comando ALTER TABLE.
www.k19.com.br 3
I NTRODUO 4
CRUD
As operaes bsicas para manipular os dados persistidos so: inserir, ler, alterar e remover.
Essas operaes so realizadas atravs de uma linguagem de consulta denominada SQL (Structu-
red Query Language). Essa linguagem oferece quatro comandos bsicos: INSERT, SELECT, UPDATE
e DELETE. Esses comandos so utilizados para inserir, ler, alterar e remover registros, respectiva-
mente.
mysql > INSERT INTO Livro ( titulo , preco ) VALUES ( Java , 98.75);
Query OK , 1 row affected (0.00 sec )
mysql > UPDATE Livro SET preco = 115.9 WHERE titulo = Java ;
Query OK , 1 row affected (0.00 sec )
Rows matched : 1 Changed : 1 Warnings : 0
4 www.k19.com.br
5 I NTRODUO
Restries
Podemos estabelecer algumas restries sobre os valores armazenados nas tabelas para manter a
consistncia dos dados. Por exemplo, possvel obrigar que um determinado campo possua sempre
um valor no nulo.
No MySQL Server, quando criamos uma tabela, podemos adicionar a restrio NOT NULL nas
colunas que so obrigatrias.
Tambm podemos definir, no MySQL Server, que uma coluna no pode possuir valores repetidos
atravs do comando UNIQUE.
Exerccios de Fixao
2 Estando dentro da sua pasta, acesse o MySQL Server utilizando o usurio root e a senha root.
3 Caso exista uma base de dados chamada livraria, remova-a. Utilize o comando SHOW DATA-
BASES para listar as bases de dados existentes e o comando DROP DATABASE para remover a base
livraria se ela existir.
www.k19.com.br 5
I NTRODUO 6
| mysql |
| test |
+ - - - - - - - - - - - - - - - - - - - -+
4 rows in set (0.00 sec )
4 Crie uma nova base de dados chamada livraria. Utilize o comando CREATE DATABASE. Voc
vai utilizar esta base nos exerccios seguintes.
5 Abra um editor de texto e digite o cdigo abaixo para criar uma tabela com o nome Editora.
Depois salve o arquivo com o nome create-table-editora.sql dentro da pasta com o seu nome.
1 USE livraria ;
2 CREATE TABLE Editora (
3 id BIGINT NOT NULL AUTO_INCREMENT ,
4 nome VARCHAR (255) NOT NULL ,
5 email VARCHAR (255) NOT NULL ,
6 )
7 ENGINE = InnoDB ;
6 Dentro do terminal, use o comando source para executar o arquivo que voc acabou de criar.
7 Abra um novo editor de texto e digite o cdigo abaixo para criar uma tabela com o nome Livro.
Em seguida, salve o arquivo com o nome create-table-livro.sql dentro da pasta com o seu nome.
1 USE livraria ;
2 CREATE TABLE Livro (
3 id BIGINT NOT NULL AUTO_INCREMENT ,
4 titulo VARCHAR (255) NOT NULL ,
5 preco DOUBLE NOT NULL ,
6 )
7 ENGINE = InnoDB ;
8 Dentro do terminal, use o comando source para executar o cdigo do arquivo create-table-livro.sql.
9 Abra um novo editor de texto e digite o cdigo abaixo para adicionar alguns registros na tabela
6 www.k19.com.br
7 I NTRODUO
10 Dentro do terminal, execute o arquivo que voc acabou de criar para adicionar alguns registro
na tabela Editora.
11 Abra um novo editor de texto e digite o cdigo abaixo para adicionar alguns registros na tabela
Livro. Depois salve o arquivo com o nome adicionando-registros-livro.sql dentro da pasta
com o seu nome.
12 Dentro do terminal, execute o arquivo que voc acabou de criar para adicionar alguns registros
na Livro.
www.k19.com.br 7
I NTRODUO 8
8 www.k19.com.br
CAPTULO
C ONSULTAS
2
SELECT
Aluno
nome email
Rafael Cosentino rafael.cosentino@k19.com.br
Jonas Hirata jonas.hirata@k19.com.br
Tabela 2.1: Resultado da consulta: SELECT nome, email FROM Aluno
Quando todas as colunas devem ser recuperadas, mais prtico utilizar o caractere *. Veja o
exemplo abaixo:
Aluno
nome email telefone altura
Rafael Cosentino cosentino@k19.com.br 11 23873791 1.87
Jonas Hirata hirata@k19.com.br 11 23873791 1.76
Tabela 2.2: Resultado da consulta: SELECT * FROM Aluno
possvel recuperar colunas de vrias tabelas. Nesse caso, os registros das tabelas consultadas
so cruzados. Veja o exemplo abaixo:
Cdigo SQL 2.3: Recuperando todas as colunas das tabelas Aluno e Professor
www.k19.com.br 9
C ONSULTAS 10
Aluno x Professor
nome email telefone altura nome codigo
Rafael Cosentino cosentino@k19.com.br 11 23873791 1.87 Marcelo Martins 1
Rafael Cosentino cosentino@k19.com.br 11 23873791 1.87 Rafael Lobato 2
Jonas Hirata hirata@k19.com.br 11 23873791 1.76 Marcelo Martins 1
Jonas Hirata hirata@k19.com.br 11 23873791 1.76 Rafael Lobato 2
Tabela 2.3: Resultado da consulta: SELECT * FROM Aluno, Professor
Duas tabelas podem ter colunas com o mesmo nome. Nesse caso, para recuper-las, devemos
eliminar a ambiguidade utilizando os nomes das tabelas.
Cdigo SQL 2.4: Recuperando as colunas nome das tabelas Aluno e Professor
Aluno x Professor
nome nome
Rafael Cosentino Marcelo Martins
Rafael Cosentino Rafael Lobato
Jonas Hirata Marcelo Martins
Jonas Hirata Rafael Lobato
Tabela 2.4: Resultado da consulta: SELECT Aluno.nome, Professor.nome FROM Aluno, Professor
As tabelas e as colunas consultadas podem ser apelidadas. Esse recurso pode facilitar a criao
das consultas e a anlise dos resultados. Para isso, devemos utilizar o comando AS.
Aluno x Professor
aluno_nome professor_nome
Rafael Cosentino Marcelo Martins
Rafael Cosentino Rafael Lobato
Jonas Hirata Marcelo Martins
Jonas Hirata Rafael Lobato
Tabela 2.5: Resultado da consulta: SELECT a.nome AS aluno_nome, p.nome AS professor_nome FROM Aluno AS a, Professor AS p
WHERE
Os resultados de uma consulta podem ser filtrados atravs do comando WHERE. Veja o exemplo
abaixo.
10 www.k19.com.br
11 C ONSULTAS
Aluno
nome email telefone altura
Rafael Cosentino cosentino@k19.com.br 11 23873791 1.87
Tabela 2.6: Resultado da consulta: SELECT * FROM Aluno WHERE altura > 1.80
Eis uma lista de algumas funes e operadores de comparao do MySQL Server que podem ser
utilizados com o comando WHERE:
<> ou !=
<=
<
>=
>
IS
IS NOT
IS NULL
IS NOT NULL
www.k19.com.br 11
C ONSULTAS 12
BETWEEEN . . . AND . . .
1 SELECT * FROM Aluno WHERE altura NOT BETWEEEN 1.5 AND 1.8;
LIKE
NOT LIKE
IN()
NOT IN()
1 SELECT * FROM Aluno WHERE altura NOT IN (1.5 , 1.6 , 1.7 , 1.8) ;
Eis uma lista dos operadores lgicos do MySQL Server que tambm podem ser utilizados com o
comando WHERE.
NOT ou !
AND ou &&
1 SELECT * FROM Aluno WHERE altura < 1.8 AND nome LIKE Rafael % ;
2 SELECT * FROM Aluno WHERE altura < 1.8 && nome LIKE Rafael % ;
OR ou ||
1 SELECT * FROM Aluno WHERE altura < 1.8 OR nome LIKE Rafael % ;
2 SELECT * FROM Aluno WHERE altura < 1.8 || nome LIKE Rafael % ;
XOR
1 SELECT * FROM Aluno WHERE altura < 1.8 XOR nome LIKE Rafael % ;
Exerccios de Fixao
1 Crie uma tabela Aluno com as colunas nome (VARCHAR(255)), email (VARCHAR(255)) telefone
(VARCHAR(10)), altura (DECIMAL(3,2)) e aprovado (TINYINT(1)).
12 www.k19.com.br
13 C ONSULTAS
3 Utilizando a clusula WHERE refaa os exemplos criando uma consulta para cada tipo de opera-
dor.
Obs: nas consultas utilize valores que faam sentido de acordo com os valores que voc inseriu
na tabela.
ORDER BY
Os resultados de uma consulta podem ser ordenados atravs do comando ORDER BY. Para utilizar
esse comando, necessrio indicar as colunas que sero utilizadas na ordenao dos registros. Veja
o exemplo abaixo.
Cdigo SQL 2.29: Ordenando os registros da tabela Aluno pela coluna altura
Aluno
nome email telefone altura
Jonas Hirata hirata@k19.com.br 11 23873791 1.76
Rafael Cosentino cosentino@k19.com.br 11 23873791 1.87
Tabela 2.7: Resultado da consulta: SELECT * FROM Aluno ORDER BY altura
www.k19.com.br 13
C ONSULTAS 14
No exemplo acima, dois registros podem possuir a mesma altura. possvel definir uma se-
gunda coluna para desempatar. Analogamente, podemos definir uma terceira coluna depois uma
quarta e assim sucessivamente. Observe o cdigo abaixo.
Cdigo SQL 2.30: Definindo uma sequncia de colunas para realizar a ordenao dos registros
Para obter uma ordenao invertida, devemos aplicar o comando DESC. Esse comando o con-
trrio do comando ASC. Esses comandos so utilizados na consulta abaixo.
Essa ltima consulta, ordena os registros utilizando a coluna altura de forma decrescente. Caso
ocorra um empate a coluna nome ser utilizada de forma crescente para tentar desempatar.
Exerccios de Fixao
4 Utilizando a tabela Aluno crie uma consulta que traga todos os alunos, sendo que os primeiro
devem ser listados os alunos aprovados e em seguida os reprovados.
5 Utilizando a tabela Aluno crie uma consulta que traga todos os alunos aprovados ordenados
pelo e-mail. Para desempate utilize as colunas altura (na orderm descrescente) e depois nome.
1 SELECT * FROM Aluno WHERE aprovado = 1 ORDER BY email , altura DESC , nome ;
Funes de Agrupamento
O resultado de uma consulta pode ser processado e algumas informaes podem ser obtidas. Por
exemplo, podemos obter o valor mximo ou mnimo de uma coluna numrica. possvel contabi-
lizar a quantidade de registros obtidos atravs de uma consulta. Tambm podemos calcular a soma
ou a mdia de uma coluna numrica entre outras informaes.
Eis uma lista com as principais funes de agrupamento do MySQL Server e a sintaxe para aplic-
las:
COUNT
AVG
14 www.k19.com.br
15 C ONSULTAS
SUM
MAX
MIN
VARIANCE
STD ou STDDEV
Exerccios de Fixao
6 Utilizando a tabela Aluno crie uma consulta calcule a mdia das alturas dos alunos reprova-
dos.
7 Utilizando a tabela Aluno crie uma consulta calcule a varincia das alturas dos alunos com mais
de 1,7m.
GROUP BY
Os registros obtidos atravs de uma consulta podem ser agrupados com o comando GROUP BY e
uma funo de agrupamento pode ser aplicada nos grupos obtidos.
Por exemplo, queremos saber quantos alunos foram aprovados e quantos foram reprovados. Para
isso, necessrio agrupar os alunos aprovados e os reprovados e depois contabilizar a quantidade de
registros de cada grupo. Veja a consulta abaixo.
www.k19.com.br 15
C ONSULTAS 16
Podemos agrupar os registros utilizando vrias colunas. Por exemplo, queremos saber quantos
homens e quantas mulheres foram aprovados ou reprovados.
1 SELECT sexo , aprovado , COUNT (*) FROM Aluno GROUP BY sexo , aprovado ;
Exerccios de Fixao
8 Utilizando a tabela Aluno crie uma consulta que calcule o nmero de alunos aprovados cujos
nomes comeam com a letra A ou terminam com a letra A, mas que no comeam textbfe terminam
com a letra A. D um apelido para a coluna com o nmero de alunos aprovados.
DISTINCT
Resultados repeditos de uma consulta podem ser eliminados atravs do comando DISTINCT. Por
exemplo, queremos obter uma lista das cidades onde os alunos nasceram.
LIMIT
A quantidade de resultados de uma consulta pode ser limitada atravs do comando LIMIT. Na
consulta abaixo, os 10 primeiros registros da tabela Aluno so recuperados. Se a quantidade de re-
gistros nessa tabela for inferior a 10, todos os registros so recuperados.
Tambm podemos descartar os primeiros registros do resultado de uma consulta. Para isso, basta
passar dois parmetros para o comando LIMIT.
16 www.k19.com.br
CAPTULO
R ELACIONAMENTOS
3
UNIQUE
Em alguns casos nossas tabelas precisam ter a garantia de que uma determinada informao seja
nica dentre os registros. Por exemplo, uma tabela Cliente poderamos ter uma coluna cpf para
representar o nmero do CPF de um determinado cliente. Nesse caso seria interessante garantir que
no sejam inseridos na tabela dois clientes com o mesmo CPF ou que um cliente no seja inserido
duas vezes.
Para evitar esse tipo de problema poderamos realizar uma consulta na tabela Cliente antes
de fazermos a insero afim de verificarmos se j existe algum cliente cadastrado com o CPF que
desejamos inserir. Essa abordagem no seria to ruim se as operaes realizadas em um banco de
dados no ocorressem de forma concorrente.
Como esse cenrio muito comum, geralmente os SGBDs disponibilizam formas de garantirmos
a unicidade de um registro. No caso do MySQL, podemos utilizar a restrio UNIQUE.
Em uma tabela podemos ter quantas colunas com a restrio UNIQUE forem necessrias. Por
exemplo, na tabela Aluno poderamos ter a coluna primeiro_nome definida com a restrio UNIQUE e
a coluna sexo sem a restrio. Ao tentarmos inserir um aluno do sexo masculino com o primeiro_nome
Yuki poderemos ter um problema, pois em alguns pases o nome Yuki pode ser usado tanto para ho-
mens quanto para mulheres. Nesse caso poderamos definir a restrio UNIQUE em um ndice com-
posto pelas colunas primeiro_nome e sexo.
www.k19.com.br 17
R ELACIONAMENTOS 18
Fica claro que no exemplo dado acima a nossa tabela Aluno permitiria, no mximo, a insero
de dois alunos com o primeiro nome Yuki: um do sexo masculino e outro do sexo feminino. Para
resolver esse problema podemos adicionar outras colunas ao nosso ndice composto que possui a
restrio UNIQUE, por exemplo.
Exerccios de Fixao
1 Reproduza o exemplo anterior da tabela Cliente e tente inserir alguns registros com valores
repetidos na coluna cpf.
Exerccios Complementares
1 Crie ou atualize uma tabela Livro para que ela contenha, pelo menos, as colunas titulo e
autor, ambas VARCHAR(255).
2 Insira alguns valores na tabela Livro. Tente inserir valores com ttulos e autores repetidos. Tente
inserir valores com ttulos e autores repetidos e observe os resultados.
3 Remova todos os registros da tabela Livro e faa uma alterao na mesma para que no seja
permitida a insero de valores repetidos nas colunas titulo e autor.
Chaves Primrias
18 www.k19.com.br
19 R ELACIONAMENTOS
Uma chave primria deve conter valores nicos, no nulos e uma tabela pode conter apenas
uma coluna como chave primria.
uma prtica muito comum criarmos uma coluna com o nome id para armazenarmos um c-
digo de identificao do nosso registro dentro de uma tabela.
Chaves Estrangeiras
Uma coluna com a restrio FOREIGN KEY (chave estrangeira) faz referncia uma chave primria
definida em uma outra tabela. O uso das chaves estrangeiras nos traz alguns benefcios como previ-
nir que uma operao realizada no banco de dados possa corromper a relao entre duas tabelas ou
que dados invlidos sejam inseridos em uma coluna com a restrio FOREIGN KEY.
Por enquanto a definio de chave estrangeira pode parecer um tanto vaga, porm tpicos a
seguir seu funcionamento e utilidade podero ser observadas mais claramente.
One to One
Suponha que nos foi dada a tarefa de modelar o banco de dados de uma rede social. Em algum
momento iremos modelar a tabela de usurios e poderamos chegar a algo semelhante a isso:
www.k19.com.br 19
R ELACIONAMENTOS 20
14 ENGINE = InnoDB ;
No h nada de errado com a nossa tabela Usuario, entretanto podemos dividir a tabela em duas:
uma apenas para as informaes pertinentes conta do usurio na rede social e outra para as suas
informaes pessoais (perfil).
No exemplo acima acabamos de definir um relacionamento One to One (um para um), no qual
1 usurio est para 1 perfil assim como 1 perfil est para 1 usurio.
Repare no uso da chave estrangeira id na tabela Perfil. A coluna id da tabela Perfil faz refe-
rncia coluna id da tabela Usuario e, por ser uma chave estrangeira, o MySQL no permitir que
um valor invlido (id inexistente de usurio) seja atribudo coluna id da tabela Perfil. Sem a
restrio FOREIGN KEY poderamos atribuir qualquer nmero inteiro.
Ainda com relao chave estrangeira, se tentarmos remover do banco de dados um usurio que
tenha uma entrada relacionada ele na tabela Perfil, o MySQL nos informar que a operao no
permitida. Para que possamos remover o usurio devemos primeiro remover o registro relacionado
da tabela Perfil e em seguida remover o registro do usurio.
Exerccios de Fixao
3 Reproduza o exemplo anterior das tabelas Usuario e Perfil. Insira alguns registros para testar
as restries e relacionamentos. Observe os resultados.
20 www.k19.com.br
21 R ELACIONAMENTOS
9
10 CREATE TABLE Perfil (
11 id INT NOT NULL ,
12 nome VARCHAR (255) ,
13 sexo TINYINT (1) ,
14 profissao VARCHAR (255) ,
15 onde_estudou VARCHAR (255) ,
16 hobbies VARCHAR (255) ,
17 gosto_musical VARCHAR (255) ,
18 PRIMARY KEY ( id ) ,
19 FOREIGN KEY ( id ) REFERENCES Usuario ( id )
20 )
21 ENGINE = InnoDB ;
Exerccios Complementares
5 Crie uma tabela Livro que contenha apenas as colunas id, isbn e titulo. Caso a tabela j
exista, remova e crie ela novamente.
6 Crie tambm uma tabela LivroDetalhe que contenha as informaes adicionais dos livros.
Faa com que essa tabela contenha uma coluna que ser a chave primria da tabela, assim como
uma chave estrangeira para relacionarmos esta tabela com a tabela Livro.
7 Adicione alguns registros nas tabelas criadas para testar as restries e o relacionamento one to
one.
Para ilustrar o relacionamento One to Many ou Many to One, vamos voltar ao exemplo da conta
bancria utilizado anteriormente:
No exemplo acima vimos apenas uma das pontas do relacionamento. Vamos ver como seria a
outra ponta, ou seja, a tabela Banco:
www.k19.com.br 21
R ELACIONAMENTOS 22
As tabelas Banco e Conta possuem um relacionamento One to Many, pois um banco pode possuir
diversas (many) contas enquanto que uma conta pertence a um nico (one) banco.
Exerccios de Fixao
4 Reproduza o exemplo anterior das tabelas Conta e Banco. Insira alguns registros para testar as
restries e relacionamentos. Observe os resultados.
Exerccios Complementares
8 Crie ou altere duas tabelas: Editora e Livro. Crie as colunas e restries necessrias para
obtermos um relacionamento one to many entre elas. Dica: uma editora pode publicar diversos
livros e um livro s pode pertencer apenas uma editora.
Many to Many
Em um relacionamento Many to Many vrios registros de uma tabela podem estar relacionados
com vrios registros de outra tabela. Para que isso seja possvel necessrio que exista uma tabela
intermediria que chamaremos de tabela de relacionamento. Ela recebe esse nome justamente por
existir apenas para representar o relacionamento entre duas outras tabelas.
Para ilustrarmos o relacionamento Many to Many vamos pegar o exemplo do sistema de cadastro
de alunos de uma escola. Nesse sistema um aluno pode se matricular em diversas turmas e uma
turma pode ter matriculados diversos alunos.
22 www.k19.com.br
23 R ELACIONAMENTOS
Repare que tanto tabela Aluno quanto na tabela Turma no encontramos referncias de uma para
a outra. As o relacionamento ser definido da tabela a seguir:
Definindo as colunas aluno_id e turma_id como chave primria composta garantimos que cada
registro ser nico e no nulo. Alm disso, como ambas colunas tambm so chaves estrangeiras no
ser possvel inserir um id invlido tanto na coluna aluno_id quanto na coluna turma_id.
Exerccios de Fixao
5 Reproduza o exemplo anterior das tabelas Aluno, Turma e AlunoTurma. Insira alguns registros
para testar as restries e relacionamentos. Observe os resultados.
www.k19.com.br 23
R ELACIONAMENTOS 24
15 PRIMARY KEY ( id )
16 )
17 ENGINE = InnoDB ;
18
19 CREATE TABLE AlunoTurma (
20 aluno_id INT NOT NULL ,
21 turma_id INT NOT NULL ,
22 PRIMARY KEY ( aluno_id , turma_id ) ,
23 FOREIGN KEY ( aluno_id ) REFERENCES Aluno ( id ) ,
24 FOREIGN KEY ( turma_id ) REFERENCES Turma ( id )
25 )
26 ENGINE = InnoDB ;
Exerccios Complementares
10 Crie ou altere duas tabelas: Autor e Livro. Defina algumas colunas em ambas tabelas tendo
em mente que um autor pode escrever diversos livros e um livro pode ser escrito por um ou mais
autores.
11 Crie uma tabela de relacionamento entre as tabelas Autor e Livro. No se esquea das restri-
es.
24 www.k19.com.br
CAPTULO
S UBQUERIES , J OINS E U NIONS
4
Conforme trabalhamos com um banco de dados inevitvel que em algum momento seja ne-
cessrio gerar uma consulta que trabalhe com mais de uma tabela ao mesmo tempo. Neste captulo
iremos abordar as principais tcnicas utilizadas em situaes como esta e identificar em quais situ-
aes devemos aplic-las.
Subqueries
Uma subquery uma query como qualquer outra, porm ela executada dentro de uma outra
query de SELECT, INSERT, UPDATE ou DELETE. A funo da subquery produzir um resultado que
ser utilizado pela query que a contm. Alguns autores se referem subquery como query interna e
a query que a contm como query externa.
Subqueries podem ser utilizadas em qualquer parte de uma query onde uma expresso aceita.
Alm disso, subqueries podem ocorrer em outras subqueries e assim por diante, ou seja, em uma
query podemos encontrar vrios nveis de subqueries.
Vamos supor que no sistema de cadastro de alunos de uma escola tenhamos a tabela Nota na
qual ficam registradas as notas dos alunos em cada turma.
Se quisermos saber quais foram os alunos que tiraram uma nota maior que a mdia das notas de
cada turma, poderamos realizar a seguinte consulta:
1 SELECT *
2 FROM Nota AS n1
3 WHERE n1 . nota > (
4 SELECT AVG ( n2 . nota )
5 FROM Nota AS n2
6 WHERE n2 . turma_id = n1 . turma_id
7 );
No exemplo acima utilizamos uma subquery na clusula WHERE. Repare que na subquery utiliza-
www.k19.com.br 25
S UBQUERIES , J OINS E U NIONS 26
mos o valor n1.turma proveniente da query externa. Isso nos mostra que a subquery dependente
da query que a contm e, por isso, a chamamos de subquery correlacionada.
Uma subquery correlacionada, devido sua dependncia de um valor da query externa, pode
custar muito processamento, pois cada registro encontrado pela query externa ir executar a sub-
query.
1 SELECT n1 .* , (
2 SELECT MAX ( n2 . nota )
3 FROM Nota AS n2
4 WHERE n2 . turma_id = 1
5 ) AS maior_nota
6 FROM Nota AS n1
7 WHERE n1 . turma_id = 1;
No exemplo acima utilizamos uma subquery como um campo virtual da query externa para ob-
termos a maior nota de uma determinada turma. Como o valor turma_id no depende de um valor
da query externa nossa subquery independente.
Exerccios de Fixao
1 SELECT *
2 FROM Nota AS n1
3 WHERE n1 . nota > (
4 SELECT AVG ( n2 . nota )
5 FROM Nota AS n2
6 WHERE n2 . turma_id = n1 . turma_id
7 );
8
9 SELECT n1 .* , (
10 SELECT MAX ( n2 . nota )
11 FROM Nota AS n2
12 WHERE n2 . turma_id = 1
13 ) AS maior_nota
14 FROM Nota AS n1
15 WHERE n1 . turma_id = 1;
Exerccios Complementares
1 Crie ou altere a tabela Livro. A tabela deve conter uma coluna preco que ir armazenar o preo
de cada livro. Crie uma consulta que devolva todas as colunas de todos os livros registrados. Alm
das colunas normais da tabela, crie uma coluna virtual que ir conter a mdia dos preos dos livros.
2 Ainda utilizando a tabela Livro, crie uma consulta que devolva todas as colunas de todos os
26 www.k19.com.br
27 S UBQUERIES , J OINS E U NIONS
livros registrados cujos preos sejam superiores em relao aos livros mais baratos.
3 Na tabela Livro crie a coluna autor_id caso ela ainda no exista. Tambm crie ou altere a tabela
Autor com, pelo menos, as colunas id e nome. Crie uma consulta que devolva todos os livros escritos
por autores cujos nomes comeam com a letra A.
Joins
Utilizamos joins do SQL para extrairmos as informaes de uma ou mais tabelas em um nico
conjunto de resultados baseando-se nos relacionamentos entre as colunas das tabelas envolvidas.
At agora criamos as nossas tabelas definindo uma coluna como chave primria em cada uma
delas. No fizemos isso toa, pois agora veremos como utilizar esse relacionamento entre colunas
de tabelas diferentes em uma nica consulta.
Vamos voltar ao exemplo da rede social. Quando modelamos as tabelas separamos as informa-
es do usurio em duas tabelas: Usuario com as informaes pertinentes conta do usurio na
rede social e Perfil com as informaes pessoais do mesmo.
Para trazer as informaes das duas tabelas em um nico conjunto de resultados utilizaremos a
instruo JOIN.
1 SELECT *
2 FROM Usuario AS u
3 JOIN Perfil AS p
Repare que o resultado obtido no foi o desejado, pois para cada registro da tabela Usuario foi
feita uma relao com todos os registros da tabela Perfil. Isso ocorreu porque no informamos qual
a coluna queremos utilizar para definir o relacionamento entre as tabelas.
Para definirmos qual a coluna ir definir o relacionamento entre as tabelas devemos utilizar a
www.k19.com.br 27
S UBQUERIES , J OINS E U NIONS 28
1 SELECT *
2 FROM Usuario AS u
3 JOIN Perfil AS p
4 ON u . id = p . id ;
No exemplo acima utilizamos a instruo JOIN, porm o MySQL oferece outros tipos de joins.
Abaixo segue uma lista com cada tipo:
JOIN: retorna registros quando existe algum valor na coluna de relacionamento em pelo menos
uma das tabelas.
LEFT JOIN: retorna registros quando existe algum valor na coluna de relacionamento da tabela
informada esquerda na consulta.
RIGHT JOIN: retorna registros quando existe algum valor na coluna de relacionamento da ta-
bela informada direita na consulta.
Exerccios de Fixao
2 Reproduza os exemplos anteriores sem o uso da instruo ON e depois com. Insira alguns regis-
tros nas tabelas e observe os resultados.
28 www.k19.com.br
29 S UBQUERIES , J OINS E U NIONS
Exerccios Complementares
4 Crie ou altere a tabela Livro e faa com que ela contenha a coluna autor_id caso esta ainda
no exista. Tambm crie ou altere a tabela Autor com, pelo menos, as colunas id e nome. Crie uma
consulta que devolva todos os livros escritos por autores cujos nomes comeam com a letra A.
5 Crie uma consulta que gere como resultado uma lista com todos os autores que possuam livros
publicados. Alm disso, o resultado deve conter o nmero de livros que cada autor publicou.
Unions
Nos exemplos anteriores conseguimos obter resultados de duas ou mais tabelas concatenando
suas colunas ou criando campos virtuais.
Porm nem sempre isso que desejamos. s vezes queremos que duas ou mais tabelas sejam
unidas aumentando o nmero de registros. Para atingirmos este objetivo devemos utilizar a instru-
o UNION.
Vamos supor que, em nossa rede social, armazenamos os usurios administrativos do site em
uma tabela diferente dos usurios normais. A tabela poderia ser assim:
Para obter uma lista com o nome e e-mail de todos os usurios, inclusive os usurios administra-
tivos utilizaremos a instruo UNION.
Repare que no primeiro e segundo SELECT escolhemos quais colunas queramos no resultado. A
instruo UNION nos obriga que cada SELECT retorne o mesmo nmero de colunas. Como a tabela
UsuarioAdministrador possui uma coluna a mais, se tivssemos utilizado o caractere wildcard *
em ambas colunas, nossa consulta teria retornado um erro.
Por padro a instruo UNION seleciona registros distintos. Portanto, caso um usurio administra-
www.k19.com.br 29
S UBQUERIES , J OINS E U NIONS 30
tivo tambm seja um usurio normal da rede social, com nome e e-mail cadastrados com os mesmos
valores nas duas tabelas, a consulta do exemplo acima nos teria retornado apenas um resultado para
esse usurio.
Se quisermos que o resultado traga entradas duplicadas, devemos utilizar a instruo UNION ALL.
Exerccios de Fixao
3 Reproduza os exemplos anteriores utilizando a instruo UNION e depois UNION ALL. Insira al-
guns registros nas tabelas e observe os resultados.
Exerccios Complementares
30 www.k19.com.br
APNDICE
R ESPOSTAS
A
Resposta do Complementar 3.1
www.k19.com.br 31
R ESPOSTAS 32
32 www.k19.com.br
33 R ESPOSTAS
1 SELECT l1 .* , (
2 SELECT AVG ( l2 . preco )
3 FROM Livro AS l2
4 ) AS media_preco
5 FROM Livro AS l1 ;
1 SELECT l1 .*
2 FROM Livro AS l1
3 WHERE l1 . preco > (
4 SELECT MIN ( l2 . preco )
5 FROM Livro AS l2
6 );
1 SELECT *
2 FROM Livro
3 WHERE Livro . autor_id IN (
4 SELECT id
5 FROM Autor
6 WHERE nome LIKE A %
7 );
1 SELECT Livro .*
2 FROM Livro
3 JOIN Autor
4 ON Livro . autor_id = Autor . id
5 WHERE Autor . nome LIKE A % ;
www.k19.com.br 33
R ESPOSTAS 34
1 SELECT * FROM (
2 SELECT Autor .* , COUNT ( Livro . id ) AS total_livros
3 FROM Autor JOIN Livro
4 ON Livro . autor_id = Autor . id
5 GROUP BY Autor . id
6 ) AS A
7 ORDER BY A . nome DESC ;
34 www.k19.com.br