• Nenhum resultado encontrado

SQL e Modelo Relacional

N/A
N/A
Protected

Academic year: 2021

Share "SQL e Modelo Relacional"

Copied!
51
0
0

Texto

(1)

TREINAMENTOS

(2)
(3)

Modelo Relacional e SQL

14 de junho de 2015

As apostilas atualizadas estão disponíveis em www.k19.com.br

Sumário i Sobre a K19 1 Seguro Treinamento 2 Termo de Uso 3 Cursos 4 1 Introdução 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 Restrições . . . 5 1.9 Exercícios de Fixação . . . 5 1.10 Exercícios Complementares . . . 8 2 Consultas 11 2.1 SELECT . . . 11 2.2 WHERE . . . 12 2.3 Exercícios de Fixação . . . 14 2.4 Exercícios Complementares . . . 15 2.5 ORDER BY . . . 15 2.6 Exercícios de Fixação . . . 16 2.7 Exercícios Complementares . . . 16 2.8 Funções de Agrupamento . . . 17 2.9 Exercícios de Fixação . . . 17 2.10 Exercícios Complementares . . . 18

(4)

2.11 GROUP BY . . . 18 2.12 Exercícios de Fixação . . . 18 2.13 Exercícios Complementares . . . 19 2.14 DISTINCT. . . 19 2.15 LIMIT . . . 19 3 Relacionamentos 21 3.1 UNIQUE . . . 21 3.2 Exercícios de Fixação . . . 22 3.3 Exercícios Complementares . . . 22 3.4 Chaves Primárias . . . 23 3.5 Chaves Estrangeiras . . . 23 3.6 One to One . . . 23 3.7 Exercícios de Fixação . . . 24 3.8 Exercícios Complementares . . . 25

3.9 One to Many ou Many to One . . . 25

3.10 Exercícios de Fixação . . . 26

3.11 Exercícios Complementares . . . 26

3.12 Many to Many . . . 27

3.13 Exercícios de Fixação . . . 28

3.14 Exercícios Complementares . . . 28

4 Subqueries, Joins e Unions 29 4.1 Subqueries . . . 29 4.2 Exercícios de Fixação . . . 30 4.3 Exercícios Complementares . . . 31 4.4 Joins . . . 31 4.5 Exercícios de Fixação . . . 32 4.6 Exercícios Complementares . . . 33 4.7 Unions. . . 33 4.8 Exercícios de Fixação . . . 34 4.9 Exercícios Complementares . . . 35 A Respostas 37

(5)

Sobre a K19

A K19 é uma empresa especializada na capacitação de desenvolvedores de software. Sua equipe é composta por profissionais formados em Ciência da Computação pela Universidade de São Paulo (USP) e que possuem vasta experiência em treinamento de profissionais para área de TI.

O principal objetivo da K19 é oferecer treinamentos de máxima qualidade e relacionados às prin-cipais tecnologias utilizadas pelas empresas. Através desses treinamentos, seus alunos tornam-se capacitados para atuar no mercado de trabalho.

Visando a máxima qualidade, a K19 mantém as suas apostilas em constante renovação e melho-ria, oferece instalações físicas apropriadas para o ensino e seus instrutores estão sempre atualizados didática e tecnicamente.

(6)

Seguro Treinamento

Na K19 o aluno faz o curso quantas vezes quiser!

Comprometida com o aprendizado e com a satisfação 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 não preenchidas até um dia antes do início de uma turma da K19 serão 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.

(7)

Termo de Uso

Termo de Uso

Todo o conteúdo desta apostila é propriedade da K19 Treinamentos. A apostila pode ser utilizada livremente para estudo pessoal . Além disso, este material didático pode ser utilizado como material de apoio em cursos de ensino superior desde que a instituição correspondente seja reconhecida pelo MEC (Ministério da Educação) e que a K19 seja citada explicitamente como proprietária do material. É proibida qualquer utilização desse material que não se enquadre nas condições acima sem o prévio consentimento formal, por escrito, da K19 Treinamentos. O uso indevido está sujeito às medidas legais cabíveis.

(8)

K01- Lógica de Programação

K11 - Orientação a Objetos em Java

K12 - Desenvolvimento Web com JSF2 e JPA2 K21 - Persistência com JPA2 e Hibernate

K22 - Desenvolvimento Web Avançado com JFS2, EJB3.1 e CDI K23 - Integração de Sistemas com Webservices, JMS e EJB

K31 - C# e Orientação a Objetos

K32 - Desenvolvimento Web com ASP.NET MVC

TREINAMENTOSTREINAMENTOSTREI

NAMENTOS

Conheça os nossos cursos

www.k19.com.br/cursos

K02 - Desenvolvimento Web com HTML, CSS e JavaScript K03 - SQL e Modelo Relacional

K41 - Desenvolvimento Mobile com Android K51 - Design Patterns em Java

(9)

I

NTRODUÇÃO

C

A P Í T U L O

1

SGBD

Qualquer empresa necessita armazenar os dados relacionados ao seu negócio. Por exemplo, uma livraria deve manter as informações dos livros que são comercializados por ela. Um banco precisa registrar os dados dos seus clientes. Uma escola deve guardar as informações dos seus alunos.

Hoje em dia, utilizar papel para registrar os dados de uma empresa não é uma boa alternativa. O espaço físico necessário gera custos altos para empresa. Em geral, a consulta das informações registradas é demorada. O risco de um acidente destruir os dados armazenados em papel é alto.

Em vários aspectos, utilizar computadores para o armazenamento de dados é uma abordagem melhor do que utilizar papel. Os dados podem ser armazenados, por exemplo, em arquivos de texto ou planilhas. Contudo, existem sistemas especializados na persistência de dados que oferecem re-cursos mais sofisticados e eficientes para esse tipo de objetivo. Esses sistemas são conhecidos como

Sistemas Gerenciadores de Bancos de Dados - SGBD.

Os principais SGBDs adotados nas empresas utilizam o Modelo Relacional para definir a organi-zação das informações armazenadas e a linguagem SQL para permitir a manipulação desses dados.

Eis uma lista dos SGBDs mais utilizados nas empresas: • MySQL Server

• Oracle Database • SQL Server • PostgreSQL

MySQL Server

Neste treinamento, utilizaremos o MySQL Server, que é mantido pela Oracle e amplamente utili-zado em aplicações comerciais. Para instalar o MySQL Server, você pode consultar o artigo disponível em nosso site:http://www.k19.com.br/artigos/instalando-mysql/

Bases de dados (Databases)

Um sistema gerenciador de banco de dados é capaz de gerenciar informações de diversos siste-mas ao mesmo tempo. Por exemplo, as informações dos clientes de um banco, além dos produtos de uma loja virtual ou dos livros de uma livraria.

(10)

Suponha que os dados fossem mantidos sem nenhuma separação lógica. Implementar regras de segurança específicas seria extremamente complexo. Tais regras criam restrições quanto ao con-teúdo que pode ser acessado por cada usuário. Por exemplo, determinado usuário poderia ter per-missão de acesso aos dados dos clientes do banco, mas não às informações dos produtos da loja virtual, ou dos livros da livraria.

Para obter uma organização melhor, os dados são armazenados separadamente em um SGBD. Daí surge o conceito de base de dados (database). Uma base de dados é um agrupamento lógico das informações de um determinado domínio.

Criando uma base de dados no MySQL Server

Para criar uma base de dados no MySQL Server, podemos utilizar o comando CREATE

DATA-BASE.

mysql > C R E A T E D A T A B A S E l i v r a r i a ; Qu ery OK , 1 row a f f e c t e d ( 0.0 2 sec )

Terminal 1.1: Criando uma base de dados.

Podemos utilizar o comando SHOW DATABASES para listar as bases de dados existentes.

mysql > show d a t a b a s e s ; + - - - -+ | D a t a b a s e | + - - - -+ | i n f o r m a t i o n _ s c h e m a | | l i v r a r i a | | m ysq l | | test | + - - - -+ 4 rows in set ( 0.0 3 sec )

Terminal 1.2: Listando as bases de dados existentes.

Repare que, além da base de dados livraria, há outras três bases. Essas bases foram criadas au-tomaticamente pelo próprio MySQL Server para teste ou para armazenar configurações.

Quando uma base de dados não é mais necessária, ela pode ser removida através do comando

DROP DATABASE.

mysql > DROP D A T A B A S E l i v r a r i a ; Qu ery OK , 0 rows a f f e c t e d ( 0.0 8 sec )

Terminal 1.3: Destruindo uma base de dados.

Tabelas

Um servidor de banco de dados é dividido em bases de dados com o intuito de separar as infor-mações de domínios diferentes. Nessa mesma linha de raciocínio, podemos dividir os dados de uma base a fim de agrupá-los segundo as suas correlações. Essa separação é feita através 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. Então, poderíamos criar uma tabela para os dados relacionados às contas e outra para os dados relacionados aos clientes.

(11)

Cliente nome idade cpf

José 27 31875638735 Maria 32 30045667856

Conta

numero saldo limite 1 1000 500 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 são formados por campos (colunas). Por exemplo, considere uma tabela para armazenar as informações dos clientes de um banco. Cada registro dessa tabela armazena em seus campos os dados de um determinado cliente.

Tabelas no MySQL Server

As tabelas no MySQL Server são criadas através do comando CREATE TABLE. Na criação de uma tabela, é necessário definir quais são os nomes e os tipos das colunas.

mysql > C R E A T E TA BLE ‘ livraria ‘. ‘ Livro ‘ ( -> ‘ titulo ‘ V A R C H A R (255) ,

-> ‘ preco ‘ D O U B L E -> )

-> E N G I N E = M y I S A M ;

Qu ery OK , 0 rows a f f e c t e d ( 0.1 4 sec )

Terminal 1.4: Criando uma tabela.

As tabelas de uma base de dados podem ser listadas através do comando SHOW TABLES. Antes de utilizar esse comando, devemos selecionar uma base de dados através do comando USE.

mysql > USE l i v r a r i a ;

R e a d i n g ta ble i n f o r m a t i o n for c o m p l e t i o n of t abl e and c o l u m n n ame s You can turn off this f e a t u r e to get a q u i c k e r s t a r t u p with - A D a t a b a s e c h a n g e d mysql > SHOW T A B L E S ; + - - - -+ | T a b l e s _ i n _ l i v r a r i a | + - - - -+ | L ivr o | + - - - -+ 1 row in set ( 0.0 0 sec )

Terminal 1.5: Listando as tabelas de uma base de dados.

Se uma tabela não for mais desejada, ela pode ser removida através do comando DROP TABLE.

mysql > DROP TA BLE Li vro ;

Qu ery OK , 0 rows a f f e c t e d ( 0.0 0 sec )

Terminal 1.6: Destruindo uma tabela.

Também podemos alterar a estrutura de uma tabela com o comando ALTER TABLE.

mysql > AL TER TA BLE Li vro R E N A M E l i v r o s ; Qu ery OK , 0 rows a f f e c t e d ( 0.0 0 sec )

(12)

Terminal 1.7: Alterando o nome da tabela.

mysql > AL TER TA BLE Li vro ADD p a g i n a s I N T E G E R ; Qu ery OK , 0 rows a f f e c t e d ( 0.0 0 sec )

Terminal 1.8: Adicionando uma coluna.

mysql > AL TER TA BLE Li vro DROP C O L U M N p a g i n a s ; Qu ery OK , 0 rows a f f e c t e d ( 0.0 0 sec )

Terminal 1.9: Removendo uma coluna.

CRUD

As operações básicas para manipular os dados persistidos são: inserir, ler, alterar e remover. Essas operações são realizadas através de uma linguagem de consulta denominada SQL

(Structu-red Query Language). Essa linguagem oferece quatro comandos básicos: INSERT, SELECT, UPDATE

e DELETE. Esses comandos são utilizados para inserir, ler, alterar e remover registros, respectiva-mente.

mysql > I N S E R T INTO Li vro ( titulo , p rec o ) V A L U E S ( ’ Java ’ , 9 8 . 7 5 ) ; Qu ery OK , 1 row a f f e c t e d ( 0.0 0 sec )

Terminal 1.10: Inserindo um registro.

mysql > S E L E C T * FROM Li vro ; + - - - -+ - - - -+

| t i t u l o | p rec o | + - - - -+ - - - -+

| Java | 9 8.7 5 |

+ - - - -+ - - - -+ 1 row in set ( 0.0 0 sec )

Terminal 1.11: Selecionando registros.

mysql > U P D A T E Li vro SET pr eco = 1 15. 9 W HER E t i t u l o = ’ Java ’; Qu ery OK , 1 row a f f e c t e d ( 0.0 0 sec )

Rows m a t c h e d : 1 C h a n g e d : 1 W a r n i n g s : 0

Terminal 1.12: Alterando registros.

mysql > S E L E C T * FROM Li vro ; + - - - -+ - - - -+

| t i t u l o | p rec o | + - - - -+ - - - -+

| Java | 1 15. 9 |

+ - - - -+ - - - -+ 1 row in set ( 0.0 0 sec )

Terminal 1.13: Selecionando registros.

mysql > D E L E T E FROM Li vro WH ERE t i t u l o = ’ Java ’; Qu ery OK , 1 row a f f e c t e d ( 0.0 0 sec )

Terminal 1.14: Removendo registros.

(13)

Em pty set (0 .00 sec )

Terminal 1.15: Selecionando registros.

Restrições

Podemos estabelecer algumas restrições sobre os valores armazenados nas tabelas para manter a consistência dos dados. Por exemplo, é possível obrigar que um determinado campo possua sempre um valor não nulo.

No MySQL Server, quando criamos uma tabela, podemos adicionar a restrição NOT NULL nas colunas que são obrigatórias.

mysql > C R E A T E TA BLE ‘ livraria ‘. ‘ Livro ‘ ( -> ‘ titulo ‘ V A R C H A R (25 5) NOT NULL , -> ‘ preco ‘ D O U B L E NOT NULL -> )

-> E N G I N E = M y I S A M ;

Qu ery OK , 0 rows a f f e c t e d ( 0.1 4 sec )

Terminal 1.16: Aplicando o comandoNOT NULLnas colunas obrigatórias.

Também podemos definir, no MySQL Server, que uma coluna não pode possuir valores repetidos através do comando UNIQUE.

mysql > C R E A T E TA BLE ‘ livraria ‘. ‘ Livro ‘ ( -> ‘ titulo ‘ V A R C H A R (25 5) NOT NULL UNIQUE , -> ‘ preco ‘ D O U B L E NOT NULL

-> )

-> E N G I N E = M y I S A M ;

Qu ery OK , 0 rows a f f e c t e d ( 0.1 4 sec )

Terminal 1.17: Aplicando o comandoUNIQUEna colunatitulo.

Exercícios de Fixação

1 Abra um terminal, crie e acesse uma pasta com o seu nome.

c o s e n @ k 1 9 :~ $ mkd ir r a f a e l c o s e n @ k 1 9 :~ $ cd r a f a e l / c o s e n @ k 1 9 :~/ r a f a e l $

Terminal 1.18: Criando e acessando uma pasta com o seu nome.

2 Estando dentro da sua pasta, acesse o MySQL Server utilizando o usuário root e a senha root.

k19@k19 - 1 1 : ~ / r a f a e l $ mys ql - u root - p En ter p a s s w o r d :

Terminal 1.19: Logando no MySQL Server.

(14)

DATA-BASES para listar as bases de dados existentes e o comando DROP DATABASE para remover a base Escola se ela existir.

mysql > SHOW D A T A B A S E S ; + - - - -+ | D a t a b a s e | + - - - -+ | i n f o r m a t i o n _ s c h e m a | | e s c o l a | | m ysq l | | test | + - - - -+ 4 rows in set ( 0.0 0 sec ) mysql > DROP D A T A B A S E e s c o l a ; Qu ery OK , 1 row a f f e c t e d ( 0.1 2 sec )

Terminal 1.20: Listando as bases de dados existentes e removendo a baseEscola.

4 Crie uma nova base de dados chamada Escola. Utilize o comando CREATE DATABASE. Você vai

utilizar esta base nos exercícios seguintes.

mysql > C R E A T E D A T A B A S E e s c o l a ; Qu ery OK , 1 row a f f e c t e d ( 0.0 0 sec )

Terminal 1.21: Criando a baseEscola.

5 Abra um editor de texto e digite o código abaixo para criar uma tabela com o nome Sala. Depois

salve o arquivo com o nomecreate-table-sala.sqldentro da pasta com o seu nome.

1 USE e s c o l a ;

2 C R E A T E T ABL E Sala (

3 i d _ s a l a B I G I N T NOT NULL A U T O _ I N C R E M E N T, 4 c a p a c i d a d e INT (3) NOT NULL,

5 a nda r INT (2) NOT NULL, 6 P R I M A R Y KEY ( i d _ s a l a ) 7 )

8 E N G I N E = I n n o D B ;

Código SQL 1.1: Criando a tabelaSala

6 Dentro do terminal, use o comandosourcepara executar o arquivo que você acabou de criar.

mysql > s o u r c e create - table - sala . sql D a t a b a s e c h a n g e d

Qu ery OK , 0 rows a f f e c t e d ( 0.0 8 sec )

Terminal 1.22: Executando a tabelaSala.

7 Abra um novo editor de texto e digite o código abaixo para criar uma tabela com o nome Aluno.

Em seguida, salve o arquivo com o nomecreate-table-aluno.sqldentro da pasta com o seu nome.

1 USE e s c o l a ;

2 C R E A T E T ABL E A lun o (

3 id INT NOT NULL A U T O _ I N C R E M E N T, 4 nome V A R C H A R ( 255 ) ,

5 e mai l V A R C H A R( 255 ) , 6 t e l e f o n e V A R C H A R ( 255 ) , 7 a l t u r a D E C I M A L (3 ,2) ,

(15)

8 P R I M A R Y KEY ( id ) 9 )

10 E N G I N E = I n n o D B ;

Código SQL 1.2: Criando a tabela Aluno

8 Dentro do terminal, use o comandosourcepara executar o código do arquivocreate-table-aluno.sql.

mysql > s o u r c e create - table - al un o . sql D a t a b a s e c h a n g e d

Qu ery OK , 0 rows a f f e c t e d ( 0.0 8 sec )

Terminal 1.23: Executando a tabelaAluno.

9 Abra um novo editor de texto e digite o código abaixo para adicionar alguns registros na tabela Sala. Depois salve o arquivo com o nomeadicionando-registros-sala.sqldentro da pasta com o seu nome.

1 I N S E R T INTO Sala ( c apa cid ade , and ar ) V A L U E S (40 , 1) ; 2

3 I N S E R T INTO Sala ( c apa cid ade , and ar ) V A L U E S (35 , 1) ; 4

5 I N S E R T INTO Sala ( c apa cid ade , and ar ) V A L U E S (38 , 2) ;

Código SQL 1.3: Adicionando registros na tabelaSala

10 Dentro do terminal, execute o arquivo que você acabou de criar, utilizando o comandosource, para adicionar os registros na tabela Sala.

mysql > s o u r c e a d i c i o n a n d o - registros - sala . sql Qu ery OK , 1 row a f f e c t e d ( 0.0 3 sec )

Qu ery OK , 1 row a f f e c t e d ( 0.0 4 sec ) Qu ery OK , 1 row a f f e c t e d ( 0.0 4 sec )

Terminal 1.24: Inserindo salas.

11 Abra um novo editor de texto e digite o código abaixo para adicionar alguns registros na tabela Aluno. Depois salve o arquivo com o nomeadicionando-registros-Aluno.sqldentro da pasta com o seu nome.

1 I N S E R T INTO A lun o ( nome , email , telefone , a l t u r a ) V A L U E S (’ Jon as

2 H i r a t a ’,’ h i r a t a @ k 1 9 . com . br ’,

3 1 1 2 3 8 7 3 7 9 1 , 1 .76 ) ; 4

5 I N S E R T INTO A lun o ( nome , email , telefone , a l t u r a ) V A L U E S (’ R a f a e l C o s e n t i n o ’, 6

7 ’ c o s e n t i n o @ k 1 9 . com . br ’, 1 1 2 3 8 7 3 7 9 1 , 1.8 7) ;

Código SQL 1.4: Adicionando alguns registros na tabelaAluno

12 Dentro do terminal, execute o arquivo que você acabou de criar, utilizando o comandosource,

(16)

mysql > s o u r c e a d i c i o n a n d o - registros - a lun o . sql Qu ery OK , 1 row a f f e c t e d ( 0.0 2 sec )

Qu ery OK , 1 row a f f e c t e d ( 0.0 4 sec )

Terminal 1.25: Inserindo alunos.

13 Consulte os registros da tabela Sala e da tabela Aluno. Utilize o comando SELECT.

mysql > S E L E C T * FROM Sala ; + - - - -+ - - - -+ - - - -+ | i d _ s a l a | c a p a c i d a d e | and ar | + - - - -+ - - - -+ - - - -+ | 1 | 40 | 1 | | 2 | 35 | 1 | | 3 | 38 | 2 | + - - - -+ - - - -+ - - - -+ 3 rows in set ( 0.0 0 sec )

Terminal 1.26: Selecionando as salas.

mysql > S E L E C T * FROM Al uno ;

+ - - - -+ - - - -+ - - - -+ - - - -| | nome | ema il | t e l e f o n e | a l t u r a | + - - - -+ - - - -+ - - - -+ - - - -| | J ona s H i r a t a | h i r a t a @ k 1 9 . com . br | 11 2 3 8 7 3 7 9 1 | 1.76 | | R a f a e l C o s e n t i n o | c o s e n t i n o @ k 1 9 . com . br | 11 2 3 8 7 3 7 9 1 | 1.87 | + - - - -+ - - - -+ - - - -+ - - - -+ 2 rows in set ( 0.0 0 sec )

Terminal 1.27: Selecionando os alunos.

14 Altere alguns dos registros da tabelaAluno. Utilize o comando UPDATE.

mysql > U P D A T E Al uno SET a l t u r a = 1.89 W HER E nome = ’ R a f a e l Cosentino ’; Qu ery OK , 1 row a f f e c t e d ( 0.0 7 sec )

Rows m a t c h e d : 1 C h a n g e d : 1 W a r n i n g s : 0

Terminal 1.28: Alterando alunos.

15 Altere alguns dos registros da tabela Sala. Utilize o comando UPDATE.

mysql > U P D A T E Sala SET c a p a c i d a e = 26 W HER E i d _ s a l a = 1; Qu ery OK , 1 row a f f e c t e d ( 0.0 9 sec )

Rows m a t c h e d : 1 C h a n g e d : 1 W a r n i n g s : 0

Terminal 1.29: Alterando salas.

16 Remova alguns registros da tabelaaluno. Utilize o comando DELETE.

mysql > D E L E T E FROM Al uno WH ER E nome = ’ J ona s Hirata ’; Qu ery OK , 1 row a f f e c t e d ( 0.0 7 sec )

Terminal 1.30: Removendo alunos.

(17)

1 Utilize o MySQL Query Browser para fazer os exercicios complementares. Abra o MySQL Query Browser utilizando localhost como Server Hostname, root como Username e root como Password.

2 Caso exista uma base de dados chamada k03_livraria, remova-a. Crie uma nova base de

da-dos chamada k03_livraria. Você vai utilizar esta base nos exercícios seguintes. Logo em seguida, selecione a base de dados k03_livraria como padrão.

3 Crie uma tabela chamada Editora. Altere o modo de criação da tabela para InnoDB. Crie os

campos: id, nome, email, ano_nascimento, nacional e não esqueça de tornar todos os campos obrigatórios, marcando a opção NOT NULL. Além disso, o campo id deve ser uma chave primária e automaticamente incrementada.

4 Crie e adicione alguns registros na tabelaEditora.

5 Consulte os registros da tabelaEditora.

6 Altere alguns dos registros da tabelaEditora.

(18)
(19)

C

ONSULTAS

C

A P Í T U L O

2

SELECT

Através do comando SELECT, podemos recuperar as informações armazenadas em um banco de dados. Para utilizar o comandoSELECT, devemos indicar as tabelas que serão consultadas e as colunas que queremos recuperar.

No exemplo abaixo, as colunasnomeeemailsão recuperadas da tabelaAluno.

1 S E L E C T nome , e mai l FROM A lu no ;

Código SQL 2.1: Recuperando as colunasnomeeemailda tabelaAluno

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 prático utilizar o caractere “*”. Veja o exemplo abaixo:

1 S E L E C T * FROM A lun o ;

Código SQL 2.2: Recuperando todas as colunas da tabelaAluno

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

É possível recuperar colunas de várias tabelas. Nesse caso, os registros das tabelas consultadas são “cruzados”. Veja o exemplo abaixo:

1 S E L E C T * FROM Aluno , P r o f e s s o r ;

(20)

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.

1 S E L E C T A lun o . nome , P r o f e s s o r . nome FROM Aluno , P r o f e s s o r ;

Código SQL 2.4: Recuperando as colunasnomedas tabelasAlunoeProfessor

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 criação das consultas e a análise dos resultados. Para isso, devemos utilizar o comandoAS.

1 S E L E C T a . nome AS a lun o_n ome , p . nome AS p r o f e s s o r _ n o m e FROM Alu no AS a , P r o f e s s o r AS p

←-;

Código SQL 2.5: Utilizando “apelidos” nas tabelas e colunas

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 através do comandoWHERE. Veja o exemplo abaixo.

(21)

Código SQL 2.6: Aplicando o comandoWHERE

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 funções e operadores de comparação do MySQL Server que podem ser utilizados com o comandoWHERE:

• =

1 S E L E C T * FROM A lun o W HER E a l t u r a = 1.8;

• <> ou !=

1 S E L E C T * FROM A lun o W HER E a l t u r a <> 1.8; 2 S E L E C T * FROM A lun o W HER E a l t u r a != 1.8;

• <=

1 S E L E C T * FROM A lun o W HER E a l t u r a <= 1.8;

• <

1 S E L E C T * FROM A lun o W HER E a l t u r a < 1.8;

• >=

1 S E L E C T * FROM A lun o W HER E a l t u r a >= 1.8;

• >

1 S E L E C T * FROM A lun o W HER E a l t u r a > 1.8;

• IS

1 S E L E C T * FROM A lun o W HER E a p r o v a d o IS TRUE;

• IS NOT

1 S E L E C T * FROM A lun o W HER E a p r o v a d o IS NOT TRUE;

• IS NULL

1 S E L E C T * FROM A lun o W HER E nome IS NULL;

• IS NOT NULL

(22)

• BETWEEEN . . . AND . . .

1 S E L E C T * FROM A lun o W HER E a l t u r a B E T W E E N 1.5 AND 1.8;

• NOT BETWEEEN . . . AND . . .

1 S E L E C T * FROM A lun o W HER E a l t u r a NOT B E T W E E E N 1.5 AND 1.8;

• LIKE

1 S E L E C T * FROM A lun o W HER E nome LIKE ’ R a f a e l % ’;

• NOT LIKE

1 S E L E C T * FROM A lun o W HER E nome NOT LIKE ’ R a f a e l % ’;

• IN()

1 S E L E C T * FROM A lun o W HER E a l t u r a IN (1.5 , 1.6 , 1.7 , 1.8) ;

• NOT IN()

1 S E L E C T * FROM A lun o W HER E a l t u r a NOT IN (1.5 , 1.6 , 1.7 , 1.8) ;

Eis uma lista dos operadores lógicos do MySQL Server que também podem ser utilizados com o comandoWHERE.

• NOT ou !

1 S E L E C T * FROM A lun o W HER E NOT a l t u r a = 1.8 0; 2 S E L E C T * FROM A lun o W HER E ! ( a l t u r a = 1.8 0) ;

• AND ou &&

1 S E L E C T * FROM A lun o W HER E a l t u r a < 1.8 AND nome LIKE ’ R a f a e l % ’; 2 S E L E C T * FROM A lun o W HER E a l t u r a < 1.8 && nome LIKE ’ R a f a e l % ’;

• OR ou ||

1 S E L E C T * FROM A lun o W HER E a l t u r a < 1.8 OR nome LIKE ’ R a f a e l % ’; 2 S E L E C T * FROM A lun o W HER E a l t u r a < 1.8 || nome LIKE ’ R a f a e l % ’;

• XOR

1 S E L E C T * FROM A lun o W HER E a l t u r a < 1.8 XOR nome LIKE ’ R a f a e l % ’;

Exercícios de Fixação

1 Crie ou altere a tabelaAlunoseguindo o codigo abaixo.

(23)

2 id INT A U T O _ I N C R E M E N T NOT NULL, 3 nome V A R C H A R( 255 ) NOT NULL, 4 e mai l V A R C H A R( 255 ) , 5 t e l e f o n e V A R C H A R( 255 ) , 6 a l t u r a D E C I M A L(3 ,2) , 7 a p r o v a d o T I N Y I N T (1) , 8 P R I M A R Y KEY ( id ) 9 ) 10 E N G I N E = I n n o D B ;

Código SQL 2.27: Resposta do exercício

2 Insira alguns registros na tabela evitando valores repetidos.

3 Utilizando a cláusulaWHERErefaça os exemplos criando uma consulta para cada tipo de

opera-dor.

1 S E L E C T * FROM A lun o W HER E a l t u r a = 1.8; 2 S E L E C T * FROM A lun o W HER E a l t u r a != 1.8; 3 S E L E C T * FROM A lun o W HER E a l t u r a <= 1.8; 4 S E L E C T * FROM A lun o W HER E a l t u r a < 1.8; 5 S E L E C T * FROM A lun o W HER E a l t u r a >= 1.8; 6 S E L E C T * FROM A lun o W HER E a l t u r a > 1.8; 7 S E L E C T * FROM A lun o W HER E a p r o v a d o IS TRUE; 8 S E L E C T * FROM A lun o W HER E a p r o v a d o IS NOT TRUE; 9 S E L E C T * FROM A lun o W HER E nome IS NULL;

10 S E L E C T * FROM A lun o W HER E nome IS NOT NULL;

11 S E L E C T * FROM A lun o W HER E a l t u r a B E T W E E N 1.5 AND 1.8; 12 S E L E C T * FROM A lun o W HER E a l t u r a NOT B E T W E E E N 1.5 AND 1.8; 13 S E L E C T * FROM A lun o W HER E nome LIKE ’ R a f a e l % ’;

14 S E L E C T * FROM A lun o W HER E nome NOT LIKE ’ R a f a e l % ’; 15 S E L E C T * FROM A lun o W HER E a l t u r a IN (1.5 , 1.6 , 1.7 , 1.8) ; 16 S E L E C T * FROM A lun o W HER E a l t u r a NOT IN (1.5 , 1.6 , 1.7 , 1.8) ; 17 S E L E C T * FROM A lun o W HER E NOT a l t u r a = 1.8 0;

18 S E L E C T * FROM A lun o W HER E a l t u r a < 1.8 AND nome LIKE ’ R a f a e l % ’; 19 S E L E C T * FROM A lun o W HER E a l t u r a < 1.8 OR nome LIKE ’ R a f a e l % ’; 20 S E L E C T * FROM A lun o W HER E a l t u r a < 1.8 XOR nome LIKE ’ R a f a e l % ’;

Código SQL 2.28: Resposta do exercício

Obs: nas consultas utilize valores que façam sentido de acordo com os valores que você inseriu na tabela.

Exercícios Complementares

1 Consultando a tabelaEditora, faça algumas consultas contendo, pelo menos, um tipo de

ope-rador. Utilize a cláusulaWHERE.

ORDER BY

Os resultados de uma consulta podem ser ordenados através do comandoORDER BY. Para utilizar esse comando, é necessário indicar as colunas que serão utilizadas na ordenação dos registros. Veja o exemplo abaixo.

(24)

1 S E L E C T * FROM A lun o O RDE R BY a l t u r a ;

Código SQL 2.30: Ordenando os registros da tabelaAlunopela colunaaltura

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

No exemplo acima, dois registros podem possuir a mesmaaltura. É possível definir uma se-gunda coluna para “desempatar”. Analogamente, podemos definir uma terceira coluna depois uma quarta e assim sucessivamente. Observe o código abaixo.

1 S E L E C T * FROM A lun o O RDE R BY altura , nome ;

Código SQL 2.31: Definindo uma sequência de colunas para realizar a ordenação dos registros

Para obter uma ordenação invertida, devemos aplicar o comandoDESC. Esse comando é o con-trário do comandoASC. Esses comandos são utilizados na consulta abaixo.

1 S E L E C T * FROM A lun o O RDE R BY a l t u r a DESC, nome ASC;

Código SQL 2.32: Aplicando os comandosDESCeASC

Essa última consulta, ordena os registros utilizando a colunaalturade forma decrescente. Caso ocorra um “empate” a colunanomeserá utilizada de forma crescente para tentar “desempatar”.

Exercícios de Fixação

4 Utilizando a tabelaAlunocrie uma consulta que traga todos os alunos, e o primeiro deve ser o

aluno mais alto.

1 S E L E C T * FROM A lun o O RDE R BY a l t u r a DESC;

Código SQL 2.33: Resposta do exercício

5 Utilizando a tabelaAlunocrie uma consulta que traga todos os alunos maiores que 1.70 de altura,

ordenados pelo e-mail. Para desempate utilize a colunanome.

1 S E L E C T * FROM A lun o W HER E a l t u r a > 1.70 ORD ER BY email , nome ;

Código SQL 2.34: Resposta do exercício

(25)

2 Utilizando a tabelaEditoracrie uma consulta que traga todos os nomes das editoras, em ordem

decrescente conforme o seuid.

3 Utilizando a tabelaEditoracrie uma consulta que traga todos os emails que tenham oidmaior

que 2.

Funções de Agrupamento

O resultado de uma consulta pode ser processado e algumas informações podem ser obtidas. Por exemplo, podemos obter o valor máximo ou mínimo de uma coluna numérica. É possível contabi-lizar a quantidade de registros obtidos através de uma consulta. Também podemos calcular a soma ou a média de uma coluna numérica entre outras informações.

Eis uma lista com as principais funções de agrupamento do MySQL Server e a sintaxe para aplicá-las:

• COUNT

1 S E L E C T C OUN T(*) FROM A lun o ;

• AVG 1 S E L E C T AVG( a l t u r a ) FROM A lu no ; • SUM 1 S E L E C T SUM( a l t u r a ) FROM A lu no ; • MAX 1 S E L E C T MAX( a l t u r a ) FROM A lu no ; • MIN 1 S E L E C T MIN( a l t u r a ) FROM A lu no ; • VARIANCE 1 S E L E C T V A R I A N C E ( a l t u r a ) FROM Alu no ; • STD ou STDDEV 1 S E L E C T STD ( a l t u r a ) FROM A lu no ; 2 S E L E C T S T D D E V ( a l t u r a ) FROM Alu no ;

Exercícios de Fixação

(26)

6 Utilizando a tabelaAlunocrie uma consulta calcule a média das alturas dos alunos menores que

1,70 de altura.

1 S E L E C T AVG ( a l t u r a ) FROM Alu no WHE RE a l t u r a < 1.7 0;

Código SQL 2.44: Resposta do exercício

7 Utilizando a tabelaAlunocrie uma consulta calcule a variância das alturas dos alunos com mais

de 1,70m.

1 S E L E C T V A R I A N C E ( a l t u r a ) FROM Alu no WHE RE a l t u r a > 1.7;

Código SQL 2.45: Resposta do exercício

Exercícios Complementares

4 Utilizando a tabelaEditoracrie uma consulta que calcule a média das editoras que sejam naci-onais.

5 Utilizando a tabelaEditoracrie uma consulta que mostre os nomes das editoras que foram fundadas antes do ano de1980.

GROUP BY

Os registros obtidos através de uma consulta podem ser agrupados com o comandoGROUP BYe uma função de agrupamento pode ser aplicada nos grupos obtidos.

Por exemplo, queremos saber quantos alunos foram aprovados e quantos foram reprovados. Para isso, é necessário agrupar os alunos aprovados e os reprovados e depois contabilizar a quantidade de registros de cada grupo. Veja a consulta abaixo.

1 S E L E C T aprovado , C OUN T(*) FROM Alu no GRO UP BY a p r o v a d o ;

Podemos agrupar os registros utilizando várias colunas. Por exemplo, queremos saber quantos homens e quantas mulheres foram aprovados ou reprovados.

1 S E L E C T sexo , aprovado , C OUN T(*) FROM Alu no GRO UP BY sexo , a p r o v a d o ;

Exercícios de Fixação

8 Utilizando a tabelaAlunocrie uma consulta que calcule o número de alunos maiores que 1.70 de

(27)

com R e terminar com A. Dê um apelido para a coluna com o número de alunos.

1 S E L E C T C OUN T(*) AS t o t a l _ a l u n o s

2 FROM A lun o W HER E a l t u r a > 1.70 AND nome LIKE ’R % ’ XOR nome LIKE ’% A ’

3 G ROU P BY a l t u r a ;

Código SQL 2.50: Resposta do exercício

Exercícios Complementares

6 Utilizando a tabelaEditora, faça uma consulta que calcule o número de editoras nacionais

cujos nomes começam com a letra O ou terminam com a letra O, mas que não começam e terminam com a letra O.

DISTINCT

Resultados repeditos de uma consulta podem ser eliminados através do comandoDISTINCT. Por exemplo, queremos obter uma lista das cidades onde os alunos nasceram.

1 S E L E C T D I S T I N C T( c i d a d e ) FROM Alu no ;

LIMIT

A quantidade de resultados de uma consulta pode ser limitada através do comandoLIMIT. Na consulta abaixo, os 10 primeiros registros da tabelaAlunosão recuperados. Se a quantidade de re-gistros nessa tabela for inferior a 10, todos os rere-gistros são recuperados.

1 S E L E C T * FROM A lun o L IMI T 10;

Também podemos descartar os primeiros registros do resultado de uma consulta. Para isso, basta passar dois parâmetros para o comandoLIMIT.

1 S E L E C T * FROM A lun o L IMI T 5 , 10;

No exemplo acima, os 5 primeiros registros da tabelaAlunosão descartados. O resultado dessa consulta conterá no máximo 10 registros a partir do sexto.

(28)
(29)

R

EL ACIONAMENTOS

C

A P Í T U L O

3

UNIQUE

Em alguns casos nossas tabelas precisam ter a garantia de que uma determinada informação seja única dentre os registros. Por exemplo, uma tabelaClientepoderíamos ter uma colunacpfpara representar o número do CPF de um determinado cliente. Nesse caso seria interessante garantir que não sejam inseridos na tabela dois clientes com o mesmo CPF ou que um cliente não seja inserido duas vezes.

Para evitar esse tipo de problema poderíamos realizar uma consulta na tabela Clienteantes de fazermos a inserção afim de verificarmos se já existe algum cliente cadastrado com o CPF que desejamos inserir. Essa abordagem não seria tão ruim se as operações realizadas em um banco de dados não ocorressem de forma concorrente.

Como esse cenário é muito comum, geralmente os SGBDs disponibilizam formas de garantirmos a unicidade de um registro. No caso do MySQL, podemos utilizar a restriçãoUNIQUE.

1 C R E A T E T ABL E C l i e n t e ( 2 nome V A R C H A R( 255 ) , 3 cpf V A R C H A R(20) U N I Q U E

4 )

5 E N G I N E = I n n o D B ;

Código SQL 3.1: Utilizando a restriçãoUNIQUE

Também podemos apenas alterar uma coluna, caso a tabela já exista.

1 A LTE R T ABL E C l i e n t e ADD U N I Q U E ( cpf ) ;

Código SQL 3.2: Adicionando a restriçãoUNIQUEem uma tabela existente

Em uma tabela podemos ter quantas colunas com a restrição UNIQUEforem necessárias. Por exemplo, na tabelaAlunopoderíamos ter a colunaprimeiro_nomedefinida com a restriçãoUNIQUEe a colunasexosem a restrição. Ao tentarmos inserir um aluno do sexo masculino com oprimeiro_nome

Yuki poderemos ter um problema, pois em alguns países o nome Yuki pode ser usado tanto para ho-mens quanto para mulheres. Nesse caso poderíamos definir a restriçãoUNIQUEem um índice com-posto pelas colunasprimeiro_nomeesexo.

1 C R E A T E T ABL E A lun o ( 2 id INT NOT NULL,

3 p r i m e i r o _ n o m e V A R C H A R (25 5) NOT NULL, 4 sexo V A R C H A R ( 255 ) NOT NULL,

5 U N I Q U E I NDE X( p r i m e i r o _ n o m e , sexo ) 6 )

7 E N G I N E = I n n o D B ;

(30)

Fica claro que no exemplo dado acima a nossa tabelaAlunopermitiria, no máximo, a inserção 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 restrição UNIQUE, por exemplo.

Exercícios de Fixação

1 Utilizando a biblioteca escola, crie uma restrição para a tabelaaluno, como mostra abaixo. Após isso, tente inserir alguns registros com valores repetidos na colunaRGe observe o resultado.

1 C R E A T E T ABL E A lun o ( 2 nome V A R C H A R( 255 ) , 3 rg V A R C H A R(9) U N I Q U E

4 )

5 E N G I N E = I n n o D B ;

Código SQL 3.4: tabela aluno - unique

2 Reescreva o exercício anterior para que a tabelaAlunotenha um índice composto, como mostra

o exemplo abaixo. Insira alguns registros para testar a restriçãoUNIQUE. Observe os resultados.

1 C R E A T E T ABL E A lun o ( 2 m a t r i c u l a INT NOT NULL, 3 nome V A R C H A R ( 255 ) NOT NULL, 4 sexo V A R C H A R ( 255 ) NOT NULL, 5 U N I Q U E I NDE X( p r i m e i r o _ n o m e , sexo ) 6 )

7 E N G I N E = I n n o D B ;

Código SQL 3.5: Resposta do exercício

Exercícios Complementares

1 Crie ou atualize uma tabelaLivropara que ela contenha, pelo menos, as colunas tituloe

autor, ambasVARCHAR(255).

2 Insira alguns valores na tabelaLivro. Tente inserir valores com títulos e autores repetidos e

observe os resultados.

3 Remova todos os registros da tabelaLivroe faça uma alteração na mesma para que não seja

permitida a inserção de valores repetidos nas colunastituloeautor.

(31)

Chaves Primárias

Já vimos que em alguns momentos as tabelas necessitam a garantia da unicidade de um registro. Em alguns casos isso não basta, pois além da unicidade precisamos garantir que o valor de uma coluna não seja nulo e que tal valor seja suficiente para identificar um registro. Para situações como essa devemos utilizar a restriçãoPRIMARY KEY(chave primária).

Uma chave primária deve conter valores únicos, não nulos e uma tabela pode conter apenas uma coluna como chave primária.

É uma prática muito comum criarmos uma coluna com o nomeidpara armazenarmos um có-digo de identificação do nosso registro dentro de uma tabela.

1 C R E A T E T ABL E C l i e n t e ( 2 id INT NOT NULL, 3 cpf V A R C H A R(20) UNIQUE, 4 nome V A R C H A R( 255 ) , 5 P R I M A R Y KEY ( id ) 6 )

7 E N G I N E = I n n o D B ;

Código SQL 3.8: Utilizando a restriçãoPRIMARY ID

Chaves Estrangeiras

Uma coluna com a restriçãoFOREIGN KEY(chave estrangeira) faz referência à uma chave primá-ria definida em uma outra tabela. O uso das chaves estrangeiras nos traz alguns benefícios como previnir que uma operação realizada no banco de dados possa corromper a relação entre duas tabe-las ou que dados inválidos sejam inseridos em uma coluna com a restriçãoFOREIGN KEY.

1 C R E A T E T ABL E C ont a ( 2 id INT NOT NULL, 3 n u m e r o INT UNIQUE, 4 s ald o D E C I M A L(14 ,2) , 5 l i m i t e D E C I M A L(14 ,2) , 6 b a n c o _ i d INT NOT NULL, 7 P R I M A R Y KEY ( id ) ,

8 F O R E I G N KEY ( b a n c o _ i d ) R E F E R E N C E S Ban co ( id ) 9 )

10 E N G I N E = I n n o D B ;

Código SQL 3.9: Utilizando a restriçãoFOREIGN ID

Por enquanto a definição de chave estrangeira pode parecer um tanto vaga, porém tópicos a seguir seu funcionamento e utilidade poderão 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 usuários e poderíamos chegar a algo semelhante a isso:

(32)

1 C R E A T E T ABL E U s u a r i o ( 2 id INT NOT NULL, 3 nome V A R C H A R( 255 ) , 4 n o m e _ u s u a r i o V A R C H A R(10) , 5 s enh a V A R C H A R(10) , 6 e mai l V A R C H A R( 100 ) , 7 sexo T I N Y I N T (1) , 8 p r o f i s s a o V A R C H A R( 255 ) , 9 o n d e _ e s t u d o u V A R C H A R( 25 5) , 10 h o b b i e s V A R C H A R( 255 ) , 11 g o s t o _ m u s i c a l V A R C H A R( 25 5) , 12 P R I M A R Y KEY ( id ) 13 ) 14 E N G I N E = I n n o D B ;

Código SQL 3.10: Modelando a tabelaUsuariode uma rede social

Não há nada de errado com a nossa tabelaUsuario, entretanto podemos dividir a tabela em duas: uma apenas para as informações pertinentes à conta do usuário na rede social e outra para as suas informações pessoais (perfil).

1 C R E A T E T ABL E U s u a r i o ( 2 id INT NOT NULL,

3 n o m e _ u s u a r i o V A R C H A R(10) , 4 s enh a V A R C H A R(10) , 5 e mai l V A R C H A R( 100 ) , 6 P R I M A R Y KEY ( id ) 7 ) 8 E N G I N E = I n n o D B ; 9 10 C R E A T E T ABL E P e r f i l ( 11 id INT NOT NULL, 12 nome V A R C H A R( 255 ) , 13 sexo T I N Y I N T (1) , 14 p r o f i s s a o V A R C H A R( 255 ) , 15 o n d e _ e s t u d o u V A R C H A R( 25 5) , 16 h o b b i e s V A R C H A R( 255 ) , 17 g o s t o _ m u s i c a l V A R C H A R( 25 5) , 18 P R I M A R Y KEY ( id ) , 19 F O R E I G N KEY ( id ) R E F E R E N C E S U s u a r i o ( id ) 20 ) 21 E N G I N E = I n n o D B ;

Código SQL 3.11: Exemplo de relaciomento One to One

No exemplo acima acabamos de definir um relacionamento One to One (um para um), no qual 1 usuário está para 1 perfil assim como 1 perfil está para 1 usuário.

Repare no uso da chave estrangeiraidna tabelaPerfil. A colunaidda tabelaPerfilfaz refe-rência à colunaidda tabelaUsuarioe, por ser uma chave estrangeira, o MySQL não permitirá que um valor inválido (idinexistente de usuário) seja atribuído à colunaid da tabelaPerfil. Sem a restriçãoFOREIGN KEYpoderíamos atribuir qualquer número inteiro.

Ainda com relação à chave estrangeira, se tentarmos remover do banco de dados um usuário que tenha uma entrada relacionada à ele na tabelaPerfil, o MySQL nos informará que a operação não é permitida. Para que possamos remover o usuário devemos primeiro remover o registro relacionado da tabelaPerfile em seguida remover o registro do usuário.

(33)

3 Na escola database, crie uma tabela chamadafichapara descrever o aluno com suas

caracte-rísticas. Adicione atributos como: peso, data_nasc, altura, data de nascimento. Crie um relaciona-mento 1 para 1 assim como no exemplo abaixo:

1 C R E A T E T ABL E A lun o ( 2 id INT NOT NULL, 3 nome V A R C H A R(10) , 4 rg V A R C H A R(10) , 5 sexo T I N Y I N T (1) , 6 t urm a V A R C H A R( 255 ) , 7 P R I M A R Y KEY ( id ) 8 ) 9 E N G I N E = I n n o D B ; 10 11 C R E A T E T ABL E F ich a ( 12 id INT NOT NULL, 13 d a t a _ n a s c DATE, 14 a l t u r a V A R C H A R( 255 ) , 15 peso V A R C H A R( 255 ) , 16 A l u n o _ i d INT NOT NULL, 17 P R I M A R Y KEY ( id ) ,

18 F O R E I G N KEY ( A l u n o _ i d ) R E F E R E N C E S Alu no ( id ) 19 )

20 E N G I N E = I n n o D B ;

Código SQL 3.12: Resposta do exercício

Exercícios Complementares

5 Crie uma tabelaLivroque contenha apenas as colunasid,isbnetitulo. Caso a tabela já exista, remova e crie ela novamente.

6 Crie também uma tabelaLivroDetalhe que contenha as informações adicionais dos livros.

Faça com que essa tabela contenha uma coluna que será a chave primária da tabela, assim como uma chave estrangeira para relacionarmos esta tabela com a tabelaLivro.

7 Adicione alguns registros nas tabelas criadas para testar as restrições e o relacionamento one to

one.

One to Many ou Many to One

Para ilustrar o relacionamento One to Many ou Many to One, vamos voltar ao exemplo da conta bancária utilizado anteriormente:

1 C R E A T E T ABL E C ont a ( 2 id INT NOT NULL, 3 n u m e r o INT UNIQUE, 4 s ald o D E C I M A L(14 ,2) , 5 l i m i t e D E C I M A L(14 ,2) ,

(34)

6 b a n c o _ i d INT, 7 P R I M A R Y KEY ( id ) ,

8 F O R E I G N KEY ( b a n c o _ i d ) R E F E R E N C E S Ban co ( id ) 9 )

10 E N G I N E = I n n o D B ;

Código SQL 3.15: Exemplo de relaciomento One to Many

No exemplo acima vimos apenas uma das pontas do relacionamento. Vamos ver como seria a outra ponta, ou seja, a tabelaBanco:

1 C R E A T E T ABL E B anc o ( 2 id INT NOT NULL, 3 nome V A R C H A R( 255 ) , 4 e n d e r e c o V A R C H A R( 255 ) 5 P R I M A R Y KEY ( id ) 6 )

7 E N G I N E = I n n o D B ;

Código SQL 3.16: Exemplo de relaciomento One to Many - continuação

As tabelasBancoeContapossuem um relacionamento One to Many, pois um banco pode possuir

diversas (many) contas enquanto que uma conta pertence a um único (one) banco.

Exercícios de Fixação

4 Na bilbioteca escola, crie uma tabela para a orientação e outra para as turmas. A tabela orientacaodeve possuir um relacionamento one to many com a tabelaturma. Defina também suas restrições.Turma

1 C R E A T E T ABL E T urm a ( 2 id INT NOT NULL, 3 sala INT NOT NULL, 4 c a p a c i d a d e INT NOT NULL, 5 P R I M A R Y KEY ( id )

6 )

7 E N G I N E = I n n o D B ; 8

9 C R E A T E T ABL E O r i e n t a c a o ( 10 id INT NOT NULL, 11 nome V A R C H A R ( 255 ) , 12 CPF V A R C H A R ( 255 ) , 13 t u r m a _ i d INT, 14 P R I M A R Y KEY ( id ) , 15 F O R E I G N KEY ( t u r m a _ i d ) R E F E R E N C E S Tur ma ( id ) 16 ) 17 E N G I N E = I n n o D B ;

Código SQL 3.17: Resposta do exercício

Exercícios Complementares

(35)

obtermos um relacionamento one to many entre elas. Dica: uma editora pode publicar diversos livros e um livro só pode pertencer à apenas uma editora.

9 Insira alguns valores para testar as restrições e relacionamentos. Observe os resultados.

Many to Many

Em um relacionamento Many to Many vários registros de uma tabela podem estar relacionados com vários registros de outra tabela. Para que isso seja possível é necessário que exista uma tabela intermediária 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.

1 C R E A T E T ABL E A lun o ( 2 id INT NOT NULL, 3 nome V A R C H A R( 255 ) , 4 e mai l V A R C H A R( 255 ) , 5 d a t a _ n a s c i m e n t o DATETIME , 6 P R I M A R Y KEY ( id ) 7 ) 8 E N G I N E = I n n o D B ;

Código SQL 3.19: Exemplo de relaciomento Many to Many - Tabela Aluno

1 C R E A T E T ABL E T urm a ( 2 id INT NOT NULL, 3 i n i c i o DATETIME , 4 fim DATETIME , 5 o b s e r v a c o e s LONGTEXT , 6 P R I M A R Y KEY ( id ) 7 ) 8 E N G I N E = I n n o D B ;

Código SQL 3.20: Exemplo de relaciomento Many to Many - Tabela Turma

Repare que tanto tabelaAlunoquanto na tabelaTurmanão encontramos referências de uma para a outra. As o relacionamento será definido da tabela a seguir:

1 C R E A T E T ABL E A l u n o T u r m a ( 2 a l u n o _ i d INT NOT NULL, 3 t u r m a _ i d INT NOT NULL,

4 P R I M A R Y KEY ( aluno_id , t u r m a _ i d ) ,

5 F O R E I G N KEY ( a l u n o _ i d ) R E F E R E N C E S Alu no ( id ) , 6 F O R E I G N KEY ( t u r m a _ i d ) R E F E R E N C E S Tur ma ( id ) 7 )

8 E N G I N E = I n n o D B ;

Código SQL 3.21: Exemplo de relaciomento Many to Many - Tabela AlunoTurma

Definindo as colunasaluno_ideturma_idcomo chave primária composta garantimos que cada registro será único e não nulo. Além disso, como ambas colunas também são chaves estrangeiras não será possível inserir umidinválido tanto na colunaaluno_idquanto na colunaturma_id.

(36)

Exercícios de Fixação

5 Reproduza o exemplo anterior das tabelasAluno,TurmaeAlunoTurma. Insira alguns registros para testar as restrições e relacionamentos. Observe os resultados.

1 C R E A T E T ABL E A lun o ( 2 id INT NOT NULL, 3 nome V A R C H A R( 255 ) , 4 e mai l V A R C H A R( 255 ) , 5 d a t a _ n a s c i m e n t o DATETIME , 6 P R I M A R Y KEY ( id ) 7 ) 8 E N G I N E = I n n o D B ; 9 10 C R E A T E T ABL E T urm a ( 11 id INT NOT NULL, 12 i n i c i o DATETIME , 13 fim DATETIME , 14 o b s e r v a c o e s LONGTEXT , 15 P R I M A R Y KEY ( id ) 16 ) 17 E N G I N E = I n n o D B ; 18 19 C R E A T E T ABL E A l u n o T u r m a ( 20 a l u n o _ i d INT NOT NULL, 21 t u r m a _ i d INT NOT NULL,

22 P R I M A R Y KEY ( aluno_id , t u r m a _ i d ) ,

23 F O R E I G N KEY ( a l u n o _ i d ) R E F E R E N C E S Alu no ( id ) , 24 F O R E I G N KEY ( t u r m a _ i d ) R E F E R E N C E S Tur ma ( id ) 25 )

26 E N G I N E = I n n o D B ;

Código SQL 3.22: Resposta do exercício

Exercícios Complementares

10 Crie ou altere duas tabelas: AutoreLivro. 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 tabelasAutoreLivro. Não se esqueça das restrições.

(37)

S

UBQUERIES

, J

OINS E

U

NIONS

C

A P Í T U L O

4

Conforme trabalhamos com um banco de dados é inevitável que em algum momento seja ne-cessário gerar uma consulta que trabalhe com mais de uma tabela ao mesmo tempo. Neste capítulo iremos abordar as principais técnicas utilizadas em situações como esta e identificar em quais situ-ações devemos aplicá-las.

Subqueries

Uma subquery é uma query como qualquer outra, porém ela é executada dentro de uma outra query de SELECT, INSERT, UPDATE ou DELETE. A função da subquery é produzir um resultado que será utilizado pela query que a contém. Alguns autores se referem à subquery como query interna e a query que a contém como query externa.

Subqueries podem ser utilizadas em qualquer parte de uma query onde uma expressão é aceita. Além disso, subqueries podem ocorrer em outras subqueries e assim por diante, ou seja, em uma query podemos encontrar vários níveis de subqueries.

Vamos supor que no sistema de cadastro de alunos de uma escola tenhamos a tabelaNotana qual ficam registradas as notas dos alunos em cada turma.

1 C R E A T E T ABL E Nota ( 2 id INT NOT NULL, 3 a l u n o _ i d INT, 4 t u r m a _ i d INT, 5 nota D E C I M A L(4 ,2) , 6 P R I M A R Y KEY ( id ) , 7 F O R E I G N KEY ( a l u n o _ i d ) R E F E R E N C E S Alu no ( id ) , 8 F O R E I G N KEY ( t u r m a _ i d ) R E F E R E N C E S Tur ma ( id ) 9 ) 10 E N G I N E = I n n o D B ;

Código SQL 4.1: Tabela Nota

Se quisermos saber quais foram os alunos que tiraram uma nota maior que a média das notas de cada turma, poderíamos realizar a seguinte consulta:

1 S E L E C T * 2 FROM Nota AS n1 3 W HER E n1 . nota > ( 4 S E L E C T AVG( n2 . nota ) 5 FROM Nota AS n2 6 W HER E n2 . t u r m a _ i d = n1 . t u r m a _ i d 7 ) ;

Código SQL 4.2: Consultando notas acima da média da turma

(38)

utiliza-mos o valorn1.turmaproveniente da query externa. Isso nos mostra que a subquery é dependente da query que a contém e, por isso, a chamamos de subquery correlacionada.

Uma subquery correlacionada, devido à sua dependência de um valor da query externa, pode custar muito processamento, pois cada registro encontrado pela query externa irá executar a sub-query.

Quando uma subquery não necessita de nenhum valor da query externa nós as chamamos de

subquery independente. Diferentemente de uma subquery correlacionada, a subquery

indepen-dente pode ser executada apenas uma vez mesmo que a query externa retorne mais de um registro.

1 S E L E C T n1 .* , ( 2 S E L E C T MAX( n2 . nota ) 3 FROM Nota AS n2 4 W HER E n2 . t u r m a _ i d = 1 5 ) AS m a i o r _ n o t a 6 FROM Nota AS n1 7 W HER E n1 . t u r m a _ i d = 1;

Código SQL 4.3: Consultando notas de uma turma

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 valorturma_idnão depende de um valor da query externa nossa subquery é independente.

Exercícios de Fixação

1 Utilizando a bibliotecaescola, crie uma nova tabela chamadaNota. Após isso, crie e adicione alguns registros para essa tabela.

1 C R E A T E T ABL E Nota ( 2 id INT NOT NULL, 3 a l u n o _ i d INT, 4 t u r m a _ i d INT, 5 nota D E C I M A L(4 ,2) , 6 P R I M A R Y KEY ( id ) , 7 F O R E I G N KEY ( a l u n o _ i d ) R E F E R E N C E S Alu no ( id ) , 8 F O R E I G N KEY ( t u r m a _ i d ) R E F E R E N C E S Tur ma ( id ) 9 ) 10 E N G I N E = I n n o D B ; Código SQL 4.4: nota

2 Faça uma consulta que retorne apenas as notas que são maiores que a nota média da turma.

Observe os resultados. 1 S E L E C T * 2 FROM Nota AS n1 3 W HER E n1 . nota > ( 4 S E L E C T AVG( n2 . nota ) 5 FROM Nota AS n2 6 W HER E n2 . t u r m a _ i d = n1 . t u r m a _ i d 7 ) ;

(39)

3 Faça uma consulta que retorne a maior nota da turma cujoidda turma seje igual a 1. Mostre

essa nota em uma nova coluna chamadamaior_nota.

1 S E L E C T n1 .* , ( 2 S E L E C T MAX( n2 . nota ) 3 FROM Nota AS n2 4 W HER E n2 . t u r m a _ i d = 1 5 ) AS m a i o r _ n o t a 6 FROM Nota AS n1 7 W HER E n1 . t u r m a _ i d = 1;

Código SQL 4.6: Resposta do exercício

Exercícios Complementares

1 Crie ou altere a tabelaLivro. A tabela deve conter uma colunaprecoque irá armazenar o preço

de cada livro. Crie uma consulta que devolva todas as colunas de todos os livros registrados. Além das colunas normais da tabela, crie uma coluna virtual que irá conter a média dos preços dos livros.

2 Ainda utilizando a tabelaLivro, crie uma consulta que devolva todas as colunas de todos os livros registrados cujos preços sejam superiores em relação aos livros mais baratos.

3 Na tabelaLivrocrie a colunaautor_idcaso ela ainda não exista. Também crie ou altere a tabela Autorcom, pelo menos, as colunasidenome. Crie uma consulta que devolva todos os livros escritos por autores cujos nomes começam com a letra A.

Joins

Utilizamos joins do SQL para extrairmos as informações 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 primária em cada uma delas. Não 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 usuário em duas tabelas: Usuariocom as informações pertinentes à conta do usuário na rede social ePerfilcom as informações pessoais do mesmo.

1 C R E A T E T ABL E U s u a r i o ( 2 id INT NOT NULL,

3 n o m e _ u s u a r i o V A R C H A R(10) , 4 s enh a V A R C H A R(10) , 5 e mai l V A R C H A R( 100 ) , 6 P R I M A R Y KEY ( id ) 7 ) 8 E N G I N E = I n n o D B ; 9 10 C R E A T E T ABL E P e r f i l ( 11 id INT NOT NULL,

(40)

12 nome V A R C H A R( 255 ) , 13 sexo T I N Y I N T (1) , 14 p r o f i s s a o V A R C H A R( 255 ) , 15 o n d e _ e s t u d o u V A R C H A R( 25 5) , 16 h o b b i e s V A R C H A R( 255 ) , 17 g o s t o _ m u s i c a l V A R C H A R( 25 5) , 18 P R I M A R Y KEY ( id ) , 19 F O R E I G N KEY ( id ) R E F E R E N C E S U s u a r i o ( id ) 20 ) 21 E N G I N E = I n n o D B ;

Código SQL 4.10: TabelaUsuarioePerfil

Para trazer as informações das duas tabelas em um único conjunto de resultados utilizaremos a instruçãoJOIN.

1 S E L E C T *

2 FROM U s u a r i o AS u 3 JOIN P e r f i l AS p

Código SQL 4.11: Cruzando os dados dos usuários e seus perfis

Repare que o resultado obtido não foi o desejado, pois para cada registro da tabelaUsuariofoi feita uma relação com todos os registros da tabelaPerfil. Isso ocorreu porque não 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 instruçãoJOINjuntamente com a instruçãoON.

1 S E L E C T *

2 FROM U s u a r i o AS u 3 JOIN P e r f i l AS p 4 ON u . id = p . id ;

Código SQL 4.12: Consultando usuários e seus respectivos perfis

No exemplo acima utilizamos a instruçãoJOIN, porém 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.

Exercícios de Fixação

4 Utilizandojoins, crie consultas para os alunos e suas respectivas notas. Faça uma consulta sem

o uso da instruçãoONe depois com a instrução como mostrado abaixo.

1 S E L E C T * 2 FROM A lun o AS a

(41)

3 JOIN Nota AS n ; 4 5 S E L E C T * 6 FROM A lun o AS a 7 JOIN Nota AS n 8 ON a . id = n . A l u n o _ i d ;

Código SQL 4.13: Resposta do exercício

Exercícios Complementares

4 Crie ou altere a tabelaLivroe faça com que ela contenha a colunaautor_idcaso esta ainda não exista. Também crie ou altere a tabelaAutorcom, pelo menos, as colunasidenome. Crie uma consulta que devolva todos os livros escritos por autores cujos nomes começam com a letra A.

5 Crie uma consulta que gere como resultado uma lista com todos os autores que possuam livros

publicados. Além disso, o resultado deve conter o número de livros que cada autor publicou.

6 Refaça o exercício anterior ordenando decrescentemente o resultado pelo nome do autor.

Unions

Nos exemplos anteriores conseguimos obter resultados de duas ou mais tabelas concatenando suas colunas ou criando campos virtuais.

Porém nem sempre é isso que desejamos. Às vezes queremos que duas ou mais tabelas sejam unidas aumentando o número de registros. Para atingirmos este objetivo devemos utilizar a instru-çãoUNION.

Vamos supor que, em nossa rede social, armazenamos os usuários administrativos do site em uma tabela diferente dos usuários normais. A tabela poderia ser assim:

1 C R E A T E T ABL E U s u a r i o A d m i n i s t r a t i v o ( 2 id INT NOT NULL,

3 n o m e _ u s u a r i o V A R C H A R(10) , 4 s enh a V A R C H A R(10) , 5 e mai l V A R C H A R( 100 ) , 6 g rup o INT, 7 P R I M A R Y KEY ( id ) 8 ) 9 E N G I N E = I n n o D B ;

Código SQL 4.17: Tabela UsuarioAdministrativo

Para obter uma lista com o nome e e-mail de todos os usuários, inclusive os usuários administra-tivos utilizaremos a instruçãoUNION.

1 S E L E C T n o m e _ u s u a r i o , e ma il 2 FROM U s u a r i o

(42)

4 S E L E C T n o m e _ u s u a r i o , e ma il 5 FROM U s u a r i o A d m i n i s t r a t i v o ;

Código SQL 4.18: Obtendo a lista de todos os usuários da rede social

Repare que no primeiro e segundoSELECTescolhemos quais colunas queríamos no resultado. A instruçãoUNIONnos obriga que cadaSELECTretorne o mesmo número de colunas. Como a tabela

UsuarioAdministradorpossui uma coluna a mais, se tivéssemos utilizado o caractere wildcard *

em ambas colunas, nossa consulta teria retornado um erro.

Por padrão a instruçãoUNIONseleciona registros distintos. Portanto, caso um usuário administra-tivo também seja um usuário 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 usuário.

Se quisermos que o resultado traga entradas duplicadas, devemos utilizar a instruçãoUNION ALL.

1 S E L E C T n o m e _ u s u a r i o , e ma il 2 FROM U s u a r i o

3 U NIO N ALL

4 S E L E C T n o m e _ u s u a r i o , e ma il 5 FROM U s u a r i o A d m i n i s t r a t i v o ;

Código SQL 4.19: Obtendo a lista de todos os usuários da rede social

Exercícios de Fixação

5 Utilize a instruçãoUNION

Reproduza os exemplos anteriores utilizando a instruçãoUNIONe depoisUNION ALL. Insira alguns registros nas tabelas e observe os resultados.

1 C R E A T E T ABL E U s u a r i o A d m i n i s t r a t i v o ( 2 id INT NOT NULL,

3 n o m e _ u s u a r i o V A R C H A R(10) , 4 s enh a V A R C H A R(10) , 5 e mai l V A R C H A R( 100 ) , 6 g rup o INT, 7 P R I M A R Y KEY ( id ) 8 ) 9 E N G I N E = I n n o D B ; 10 11 S E L E C T n o m e _ u s u a r i o , e mai l 12 FROM U s u a r i o 13 U NIO N 14 S E L E C T n o m e _ u s u a r i o , e mai l 15 FROM U s u a r i o A d m i n i s t r a t i v o ; 16 17 S E L E C T n o m e _ u s u a r i o , e mai l 18 FROM U s u a r i o 19 U NIO N ALL 20 S E L E C T n o m e _ u s u a r i o , e mai l 21 FROM U s u a r i o A d m i n i s t r a t i v o ;

(43)

Exercícios Complementares

7 Utilizando as tabelasUsuarioeUsuarioAdministrativodo exercício de fixação, crie uma con-sulta que gere uma lista com todos os usuarios (administrativos e normais). Além disso, quando um usuário não possuir um valor na colunanome_usuario, imprima no seu lugar o e-mail deste usuário.

(44)
(45)

R

ESPOSTAS

A

P Ê N D I C E

A

Exercício Complementar 1.2 mysql > SHOW D A T A B A S E S ; + - - - -+ | D a t a b a s e | + - - - -+ | i n f o r m a t i o n _ s c h e m a | | l i v r a r i a | | m ysq l | | test | + - - - -+ 4 rows in set ( 0.0 0 sec ) mysql > DROP D A T A B A S E l i v r a r i a ; Qu ery OK , 1 row a f f e c t e d ( 0.1 2 sec )

Terminal 1.31: Removendo a database k03_livraria.

Exercício Complementar 1.3

1 USE k 0 3 _ l i v r a r i a ; 2 C R E A T E T ABL E E d i t o r a (

3 id = B I G I N T NOT NULL A U T O _ I N C R E M E N T, 4 nome V A R C H A R ( 255 ) NOT NULL,

5 e mai l V A R C H A R ( 255 ) NOT NULL, 6 a n o _ f u d a c a o YEAR NOT NULL, 7 n a c i o n a l T I N Y I N T (1) NOT NULL

8 )

9 E N G I N E = I n n o D B ;

Código SQL 1.5: Criando a tabelaEditora

mysql > s o u r c e create - table - e d i t o r a . sql D a t a b a s e c h a n g e d

Qu ery OK , 0 rows a f f e c t e d ( 0.0 8 sec )

Terminal 1.32: Executando a tabelaEditora

Exercício Complementar 1.4

1 I N S E R T INTO E d i t o r a ( nome , email , a n o _ f u n d a c a o , n a c i o n a l ) V A L U E S(’ O r e i l l y ’, ’

←-o r e i l l y @ e m a i l . c←-om ’, 1982 , 1) ;

2

3 I N S E R T INTO E d i t o r a ( nome , email , a n o _ f u n d a c a o , n a c i o n a l ) V A L U E S(’ Wrox ’, ’ w r o x @ e m a i l .

(46)

4

5 I N S E R T INTO E d i t o r a ( nome , email , a n o _ f u n d a c a o , n a c i o n a l ) V A L U E S(’ A p r e s s ’, ’

←-a p r e s s @ e m ←-a i l . com ’, 1968 , 0) ;

Código SQL 1.6: adicionando registros para a tabelaEditora

mysql > s o u r c e a d i c i o n a n d o - registros - e d i t o r a . sql Qu ery OK , 1 row a f f e c t e d ( 0.0 3 sec )

Qu ery OK , 1 row a f f e c t e d ( 0.0 4 sec ) Qu ery OK , 1 row a f f e c t e d ( 0.0 4 sec )

Terminal 1.33: executando a adição de registros na tabelaEditora

Exercício Complementar 1.5 mysql > S E L E C T * FROM E d i t o r a ; + - - - -+ - - - -+ - - - -+ | id | nome | e mai l | + - - - -+ - - - -+ - - - -+ | 1 | O r e i l l y | o r e i l l y @ e m a i l . com | | 2 | Wrox | w r o x @ e m a i l . com | | 3 | A p r e s s | a p r e s s @ e m a i l . com | + - - - -+ - - - -+ - - - -+ 3 rows in set ( 0.0 0 sec )

Terminal 1.34: Selecionando asEditoras

Exercício Complementar 1.6

mysql > U P D A T E E d i t o r a SET nome = ’ OReilly ’ W HER E id =1; Qu ery OK , 1 row a f f e c t e d ( 0.0 9 sec )

Rows m a t c h e d : 1 C h a n g e d : 1 W a r n i n g s : 0

Terminal 1.35: Alterando asEditoras

Exercício Complementar 1.7

mysql > D E L E T E FROM E d i t o r a WH ER E id =2; Qu ery OK , 1 row a f f e c t e d ( 0.0 7 sec )

Terminal 1.36: Deletando umaEditora

Exercício Complementar 2.1

(47)

2 S E L E C T * FROM E d i t o r a W HER E id != 1; 3 S E L E C T * FROM E d i t o r a W HER E nome IS NULL; 4 S E L E C T * FROM E d i t o r a W HER E nome IS NOT NULL; 5 S E L E C T * FROM E d i t o r a W HER E id B E T W E E N 1 AND 3; 6 S E L E C T * FROM E d i t o r a W HER E nome LIKE ’ O r e i l y % ’; 7 S E L E C T * FROM E d i t o r a W HER E nome NOT LIKE ’ O r e i l y%’; 8 S E L E C T * FROM E d i t o r a W HER E id < 3 AND nome like ’ Wrox%’;

Código SQL 2.29: Consultando a tabelaEditora

Exercício Complementar 2.2

1 S E L E C T * FROM E d i t o r a O RDE R BY id DESC;

Código SQL 2.35: Resposta do complementar

Exercício Complementar 2.3

1 S E L E C T * FROM E d i t o r a W HER E id >= 2 ORD ER BY ema il DESC;

Código SQL 2.36: Resposta do complementar

Exercício Complementar 2.4

1 S E L E C T AVG( id ) FROM E d i t o r a WHE RE n a c i o n a l = 1;

Código SQL 2.46: Calculando a média dos autores com bibliografia.

Exercício Complementar 2.5

1 S E L E C T C OUN T ( nome ) FROM E d i t o r a WHE RE d a t a _ f u n d a c a o <= 1 9 8 0 / 0 1 / 0 1 ;

Código SQL 2.47: Mostrando autores nascidos antes de1980.

Exercício Complementar 2.6

1 S E L E C T C OUN T (*) AS n a c i o n a i s _ t o t a l

2 FROM E d i t o r a W HER E n a c i o n a l = 1 AND nome LIKE ’O % ’ XOR nome LIKE ’% O ’

Referências

Documentos relacionados

Resultados: constatou- se que os estudantes não apresentam a síndrome de Burnout, manifestando médias altas em exaustão emocional, baixas em descrença e altas em eficácia

Qualquer um pode jogar futebol, mas, para jogar basquetebol ou râguebi, poucos atletas são suficientemente altos ou musculosos.. E pode-se jogar futebol em qualquer lugar, desde

Os alunos realizarão atividades de acompanhamento de consultas médicas a indivíduos da área de abrangência da unidade, participando de grupos educativos dos programas de

A actuação das entidades que ao nível do concelho possuem responsabilidades na área da protecção civil compreende necessariamente três fases: a fase de normalidade (isto

Para um homem “negar a si mesmo” totalmente, deverá renunciar completamente sua própria vontade. A atitude do servo verdadeiro é, “Para mim, o viver

Deve salvar o estado atual da aplicação (registros de vôos, pistas, e aviões) em arquivos binários para que a simulação possa ser

Na perspectiva de percepção das HQs como elemento favorecedor das interações em sala de aula desenvolvemos a nossa pesquisa, a qual buscou caracterizar os

Quando a luz acende, o console está sob a condição de monitoramento, com os medidores de nível principal mostrando o nível do sinal do canal do monitor e o sinal do canal é