Buscar

LivroSQL

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 91 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 91 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 9, do total de 91 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

Jorge Costa Leite Júnior
[ 2 ]
Ficha catalográfica (opcional). 
Caso deseje, a Câmara Brasileira do Livro faz este serviço,
cobrando R$ 25 para associados e R$ 50 para não associados. 
Para saber mais, visite a página:
http://www.cbl.org.br/telas/servicos/sobreFicha.aspx
[ 3 ]
http://www.cbl.org.br/telas/servicos/sobreFicha.aspx
[ 4 ]
Título de capítulo 1.................................................................8
Título de capítulo 2.................................................................9
Título de capítulo n....................................................................10
[ 5 ]
 Aprendendo Banco de Dados com MySQL, por Jorge Costa Leite Júnior
Espaço para dedicatória. 
[ 7 ]
 Aprendendo Banco de Dados com MySQL, por Jorge Costa Leite Júnior
Introdução
No contexto atual da sociedade, a quantidade de informação e
dados é gigantesca, indo desde meros dados pessoais como
data de nascimento e nome a um conjunto enorme de
informações em fichas e históricos médicos, dados escolares,
censos demográficos, dados registrados em redes sociais na
forma de imagens, sons, vídeos, textos e todo tipo de mídia
capaz de representar alguma informação ou representar
conhecimento. 
Para entender a importância dos bancos de dados, precisamos
primeiro compreender os conceitos básicos que nos conduzem
a toda uma sistemática que partem de dados unitários a todo
conjunto de informação representado, conhecimentos
armazenados e disponibilizados nas diversas fontes de dados. 
Basicamente, boa parte da informação está armazenada em
dispositivos digitais, computadores, servidores, distribuídos em
redes diversas, controlados por sistemas computacionais,
conhecidos, principalmente como sistemas gerenciadores de
bancos de dados (SGBD).
Ao longo deste livro, voltado principalmente para cursos
técnicos, motivo pelo qual a linguagem buscará afastamento do
rigor acadêmico, será concentrado na manipulação de dados
através do SGBD MySQL. Partindo do concreto para o abstrato,
o objetivo aqui é através de exemplos simples e exercícios
práticos ajudar o estudante de informática ou computação a se
[ 8 ]
 Aprendendo Banco de Dados com MySQL, por Jorge Costa Leite Júnior
adentrar nessa área de conhecimento importantíssima no
contexto atual da sociedade.
[ 9 ]
 Aprendendo Banco de Dados com MySQL, por Jorge Costa Leite Júnior
Bancos de dados
Para começar precisamos entender o que é um dado. Dado é a
menor unidade de informação. Poderíamos dizer que é uma
forma atômica de informação. Por exemplo, numa carteira de
identidade temos um conjunto de dados diversos (data de
nascimento, nome, local de nascimento, data da emissão, etc.).
Cada uma dessas informações isoladamente, representam a
menor unidade de informação possível, e separadamente (e
desassociados) representam valores isolados.
Quando um conjunto de dados se associam com um propósito
como um registro geral expresso numa carteira de identidade,
temos informações sobre uma pessoa. Numa linguagem
simples, dados associados representam uma informação.
Uma pergunta que pode vir a mente é: “então o que é
Conhecimento?”. Essa questão pode ter várias respostas
filosóficas, mas aqui no nosso contexto, conhecimento é como
eu trabalho o conjunto de informações disponíveis para
solucionar uma situação-problema.
Os Bancos de dados ou Base de Dados (BD) são conjuntos de
dados (geralmente armazenados em dispositivos digitais), que
contém informações ou registros sobre coisas, pessoas,
lugares, situações. São organizados de tal forma a sentido ao
conjunto de dados correlacionados. Isso significa que um BD de
uma clínica é completamente diferente de um BD de uma
escola, já que o conjunto de dados e a forma como se
[ 10 ]
 Aprendendo Banco de Dados com MySQL, por Jorge Costa Leite Júnior
relacionam, e seu propósito são completamente distintos, pois
os dados ali representam uma realidade do dia a dia
completamente diferente entre uma escola e clínica. Deste
modo não se imagina um banco de dados de propósito geral.
Ainda que, bancos de dados diferentes possam se comunicar
por meio de redes de computadores e trocar dados e
informações entre si para propósitos além dos quais foram
projetados.
Vale ressaltar que todo BD é projetado (ou modelado) de modo
que com um conjunto mínimo de dados se possa dar conta de
se representar uma realidade. Talvez você lembre que nos
exemplos de física, por exemplo, você despreze o vento,
atritos, influência da temperatura e outras variáveis (ou dados)
para calcular a velocidade média de um corpo que se move ou
o tempo de queda de um objeto. Neste sentido, modelar uma
realidade significa selecionar um conjunto mínimo de dados ou
variáveis capazes de dar conta da solução de um problema.
A forma mais comum de um banco de dados ser representado
é na forma de tabelas. Provavelmente você já viu uma tabela
contendo um conjunto de informações como a tabela a seguir:
Tabela 1 – Dados de Pessoas
Nome Idade Sexo
Aline 23 Feminino
Flávia 40 Feminino
Paulo 18 Masculino
[ 11 ]
 Aprendendo Banco de Dados com MySQL, por Jorge Costa Leite Júnior
Observe que essa tabela contendo dados de pessoas (nome,
idade, sexo) é dividida em três colunas. Vários autores de livros
de bancos de dados chamam tais colunas de campo ou
atributo. Cada linha da tabela é chamada de registro, que é
onde de fato os dados estão guardados. Outro nome comum
para tabela é ENTIDADE.
Uma Entidade é uma representação de um conjunto de dados
(informações) sobre um determinado conceito de u sistema
modelado. No caso da tabela 1, acima, poderíamos chamar
essa Entidade de PESSOA, uma vez que seu objetivo (didático) é
representar um conjunto de informações de uma ou várias
pessoas. Toda entidade é constituída de atributos (ou variáveis)
que objetivam representar alguma informação unitária
pertinente a um determinado contexto ou realidade modelada.
Uma pergunta que pode surgir é: “basta ter uma tabela ou
planilha para termos um banco de dados?”
A resposta para esta pergunta não é tão simples, mas podemos
ter banco de dados com apenas uma tabela (ou entidade) ou
dezenas delas, dependendo do problema ou situação modelada
para o qual o banco de dados foi projetado. Mas sim, podemos
ter bancos de dados com várias tabelas que se relacionam
entre si com propósitos específicos. Na figura a seguir vamos
ver uma representação de um banco de dados com várias
tabelas.
[ 12 ]
 Aprendendo Banco de Dados com MySQL, por Jorge Costa Leite Júnior
Figura 1 – Representação de um modelo de dados com três tabelas.
Daqui em diante, vamos usar o termo tabela como sinônimo de
entidades para facilitar o entendimento dos exemplos a seguir.
Vamos tomar como sinônimos também coluna, campo e
atributo. Na figura 1, temos três tabelas: CLIENTES, FATURAS,
VENDEDORES. A tabela CLIENTES é composta pelos atributos:
idclientes, nome, endereço, cidade, CEP.
Percebam que nesta notação de modelo, temos uma chave ao
lado do atributo idclientes. Neste caso dizemos que este
atributo é um atributo-chave ou uma chave primária.
Geralmente, a chave primária é um atributo que nunca se
repete o valor (do dado) e serve para ser vinculado a outras
informações. No dia a dia, por exemplo o CPF pode ser
considerado um atributo-chave, uma vez que um carro
comprado é vinculado ao CPF do dono, casa, bens etc. Esse
atributo acaba atuando de duas maneiras: a primeira é uma
busca para não duplicidade de dados (duas pessoas não podem
ter o mesmo CPF). Mas por outro lado um mesmo CPF pode ter
vários bens, etc. Observem que na tabela FATURAS temos
também o atributo idclientes, que associa uma ou mais faturas
[ 13 ]
 Aprendendo Banco de Dados com MySQL, por JorgeCosta Leite Júnior
a um cliente. Além disso também temos o atributo
idvendedores que associa aquela fatura ao vendedor
responsável. Se observarmos a tabela VENDEDORES temos
uma chave primária (ou atributo-chave) chamado
idvendedores.
A aparente coincidência aqui é que as chaves primárias das
tabelas CLIENTES e VENDEDORES também estão presentes na
tabela FATURAS. Por associar clientes e vendedores a faturas,
tais chaves têm papel associativos, e como tem origem em
outras tabelas, tais atributos são chamados de chaves
estrangeiras.
Observem que ao lado de cada atributo temos um tipo de
dados definido para aquele atributo. Se você veio de alguma
linguagem de programação anterior, possivelmente já tenha
conhecido os tipos básicos de dados ou variáveis como: Integer,
Boolean, String, Char, Double, Float e outros. Nos BD existem
inúmeros tipos de dados dentre os quais podemos citar:
Tabela 2 – Tipos básicos de dados no MySQL.
Tipo O que representa
Int Números inteiros
Float Números decimais
Date Datas (formato ‘aaaa-mm-dd’)
Time Hora (formato ‘HH:MM:SS’)
Varchar(50) Tipo de texto com até 50 caracteres
TEXT Textos longos
YEAR Ano
[ 14 ]
 Aprendendo Banco de Dados com MySQL, por Jorge Costa Leite Júnior
Esses são apenas alguns tipos de dados possíveis. Ao longo
deste livro vamos apresentar tipos diferentes que podem ser
utilizados em diferentes cenários de dados.
Agora você pode estar se perguntando como eu uso isso tudo?
Bem, para acessar os dados de um banco de dados precisamos
usar um programa de computador (software) que gerencie e
manipule o acesso a tais dados. Esses programas são
conhecidos como Sistemas Gerenciadores de Bancos de Dados
– SGBD, cujos objetivos principais são:
1. Separar dados da aplicação cliente, evitando a mistura
de dados e programa, permitindo compartilhamento de
dados
2. Prover uma interface (gráfica normalmente) para que os
usuários possam incluir, alterar, remover ou consultar
dados já armazenados
3. Controlar o acesso aos dados, aumentando a segurança
4. Simplificar ao programador e usuário uma forma de
projetar e visualizar a estrutura de dados (modelo) para
o BD através de ferramentas de gestão, modelagem e
manipulação de dados.
No decorrer deste livro vamos adotar um SGBD para iniciar
nossos conhecimentos sobre bancos de dados e manipulação
de dados. Esse SGBD será o MySQL SERVER1, que é um
gerenciador de banco de dados que utiliza a linguagem SQL
(linguagem estruturada de consulta) para acessar e manipular
dados. É um dos mais populares SGBD do mundo, e tem como
características interessantes sua portabilidade (roda em vários
sistemas operacionais), compatível com várias linguagens de
[ 15 ]
 Aprendendo Banco de Dados com MySQL, por Jorge Costa Leite Júnior
programação, trabalha em rede, com excelente desempenho e
estabilidade a baixo custo computacional. Ainda é um software
livre, com curva de aprendizagem baixa, e facilidade no uso, e
grande documentação na internet. Além disso, os recursos do
MySQL o permitem suportar grandes quantidades de dados,
estando ele presente em grandes e sistemas complexos
diversos espalhados pelo mundo.
[ 16 ]
 Aprendendo Banco de Dados com MySQL, por Jorge Costa Leite Júnior
Um pouco sobre o uso do MySQL.
Instalação do MySQL 
Para instalação do MySQL é importante seguir as orientações
da documentação oficial e no link de download oficial1. É muito
importante ficar atento aos passos gerais da instalação. O guia
de instalação é bem interativo e é possível que no Windows
algumas bibliotecas sejam requeridas para o processo de
instalação ser bem-sucedido.
Um ALERTA IMPORTANTE é nunca esquecer de definir a senha
do super usuário (administrador do servidor) chamado root na
instalação do programa. Sendo esse o erro mais comum de
instalação. A Figura 2 mostra a tela crítica na instalação. Neste
momento se pode criar outros usuários (não administradores,
inclusive) para acessar recursos limitados do SGBD. Lembrando
que MySQL. ROOT PASSWORD e REPEAT PASSWORD devem ser
idênticas.
Para criar outros usuários basta clicar em ADD USER e uma
janela vai aparecer permitindo a criação desse novo usuário e
seu perfil de acesso, conforme a figura 3.
1Download do MySQL em https://www.mysql.com/downloads/
[ 17 ]
 Aprendendo Banco de Dados com MySQL, por Jorge Costa Leite Júnior
Figura 2 – Criação de senha para o administrador root
Figura 3 – Tela de criação de novos usuários
[ 18 ]
 Aprendendo Banco de Dados com MySQL, por Jorge Costa Leite Júnior
Caso seja um usuário inexperiente, pode na instalação definir
como um serviço, o MySQL. inicializar junto com o sistema
operacional. Lembrando apenas que será mais um programa
consumindo memória e processamento. Para marcar o MySQL
como um serviço basta marcar a opção CONFIGURE MySQL
Server as Windows Service e a opção Start the MySQL Server
at System Startup conforme figura 4.
Figura 4 – Configurando o MySQL na inicialização do Windows e como um
serviço.
Finalmente após o processo de instalação concluído é possível 
testar com o usuário root e a senha especificada se o servidor 
está instalado e configurado adequadamente, conforme a 
figura 5.
[ 19 ]
 Aprendendo Banco de Dados com MySQL, por Jorge Costa Leite Júnior
Figura 5 – Teste de conexão para servidor bem-sucedido
Uso do MySQL
Uma vez instalado e configurado o MySQL, vamos agora passar
utilizar seus recursos. No escopo desse livro vamos trabalhar a
manipulação de dados, portanto não vamos entrar nos
pormenores de modelagem de dados. Vamos focar na
linguagem estruturada de consulta – SQL. Para acessar a área
de acesso ao SQL vamos fazer o seguinte: Vamos buscar o
cliente (software de acesso ao servidor MySQL) chamado
MySQL Workbench. Ele pode ser acessado no menu iniciar
conforme figura 6:
[ 20 ]
 Aprendendo Banco de Dados com MySQL, por Jorge Costa Leite Júnior
Figura 6 – Acesso ao MySQL Workbench
Uma vez clicado o ícone vamos para a tela seguinte na qual 
faremos conexão com o servidor (Figura 7).
Figura 7 – Interface inicial do WORKBENCH
Agora se faz necessário abri uma conexão, bastando clicar na
conexão para o usuário root (conexão padrão), ou clicar no
[ 21 ]
 Aprendendo Banco de Dados com MySQL, por Jorge Costa Leite Júnior
ícone (+) para adicionar uma nova conexão com nome de
conexão (chamei de “conexao”) e usuário definidos como visto
na figura 8.
Figura 8 – Criação de conexão.
Vale ressaltar que é necessário informar a senha do usuário
usado na conexão. Feito isso a nova conexão está criada. Para
toda conexão ao servidor agora, basta informar a senha do
usuário a ser conectado, e uma vez autenticado (aprovado), a
tela com acesso ao SQL será aberta (figura 9).
[ 22 ]
 Aprendendo Banco de Dados com MySQL, por Jorge Costa Leite Júnior
Figura 9 – Ambiente para programação SQL
A figura 9 tem alguns detalhes importantes: A tela em branco
será o local onde os scripts serão executados. À esquerda
temos uma barra lateral contendo dois itens: SCHEMAS
(bancos de dados) e MANAGEMENT (manutenção do servidor).
Basta clicar em cada uma dessas palavras para alternar os
modos. Vamos concentrar nossos esforços nos bancos de
dados (SCHEMAS). Além disso, vamos entender a barra de
ferramentas (figura 10).
Figura 10 – Barra de Ferramentas
[ 23 ]
 Aprendendo Banco de Dados com MySQL, por Jorge Costa Leite Júnior
Vamos nos concentrar nos ícones e suas funções:
Ícone Função
Abre uma nova janela em branco para rodar scripts
(programação) SQL
Abre um arquivo salvo com um script gravado em arquivo e
carrega na janela de programação SQL
Função semelhante a anterior
Salva o script em arquivo com a extensão .sql
Servem para rodar scripts na janela de programação SQL. O
primeiro “raio” roda TUDO que está najanela. O segundo com o
símbolo de cursor, roda somente o trecho selecionado
Existem outros ícones e funções que não serão utilizados nos
próximos momentos, portanto só os exploraremos no
momento devido.
Primeiros Comandos
Vamos agora aprender a usar os primeiros comandos básicos 
do SQL. São simples mas importantes. O primeiro comando 
será o SHOW DATABASES; que mostra todos os bancos de 
dados daquele servidor.
[ 24 ]
 Aprendendo Banco de Dados com MySQL, por Jorge Costa Leite Júnior
Figura 11-Exibindo os bancos de dados daquele servidor
Para executar esse comando, lembrando que deve terminar
com; temos duas opções: usar o atalho Ctrl+ ENTER ou clicar no
ícone do Flash com o cursor significando que só executará
aquele conjunto de comandos selecionado.
Pronto, agora você já sabe como exibir os bancos de um
servidor. Para selecionar um banco a ser usado na
programação SQL, basta usar o comando:
use nomedobanco;
Isso significa que vou usar o banco de dados cujo nome é
“nomedobanco”. Para ilustrar isto vamos mostrar um exemplo:
[ 25 ]
 Aprendendo Banco de Dados com MySQL, por Jorge Costa Leite Júnior
Figura 12 – Usando o banco Sys
No comando acima, após usar o comando adequadamente,
entramos no banco “sys” e lá podemos operar com seus dados.
Aprendemos também que comentários de uma linha em SQL
basta usar o simbolo - - . Podemos usar também comentários
ao estilo do java.
-- isso é um comentário
/* isto também é um comentário */
Agora vamos saber quais são as tabelas do banco que estamos 
conectados. O Comando SHOW TABLES serve a esse propósito.
Figura 13 – Lista de tabelas do banco de dados SYS
[ 26 ]
 Aprendendo Banco de Dados com MySQL, por Jorge Costa Leite Júnior
Explorando um banco de dados real
Aprendemos, recentemente, a conectar a um servidor de
banco de dados, a listar os bancos com o comando SHOW
DATABASES; A usar um banco daquele servidor, e listar todas as
suas respectivas tabelas. Agora vamos ampliar um pouco mais
nosso conhecimento usando um banco real chamado
bancotimes2. O modelo de dados contendo tabelas do banco é
dado a seguir:
Figura 14 – Modelo do banco de dados
Nosso modelo é constituído por duas tabelas (TIMES,
JOGADORES) e sabemos que cada time pode ter vários
jogadores, por isto temos a chave estrangeira idtimes na tabela
JOGADORES, fazendo a associação dessas tabelas.
Uma vez que conhecemos o banco e suas tabelas vamos agora
instalar e configurar o banco no servidor. Após o download do
script e o mesmo salvo no seu sistema de arquivos
[ 27 ]
 Aprendendo Banco de Dados com MySQL, por Jorge Costa Leite Júnior
(bancotimes.sql), vamos abrir e rodar o script clicando na
pastinha azul (ícone que representa o carregamento de script
em tela).
Figura 15 – Seleção do arquivo a ser carregado
Uma vez selecionado o arquivo e clicando no botão abrir
teremos o seguinte: A tela de script carregada com um banco a
ser criado e alimentado por dados diversos para que possamos
operar os comandos básicos que aprenderemos a seguir.
[ 28 ]
 Aprendendo Banco de Dados com MySQL, por Jorge Costa Leite Júnior
Figura 16 – Script de criação do banco com suas tabelas e dados
Para executar o script basta clicar no botão em FLASH. Ele vai
rodar o script, criar o banco, tabelas e preencher com dados
fictícios para práticas a seguir.
Vamos agora usar o banco. Use bancotimes;
Vamos ver quais são suas tabelas? Show tables;
Figura 17 – Após o comando show tables podemos ver as tabelas para
aquele banco.
[ 29 ]
 Aprendendo Banco de Dados com MySQL, por Jorge Costa Leite Júnior
Recapitulamos dois comandos, agora vamos aprender um
comando novo. Imagine que você não visse o modelo com as
tabelas, e quisesse saber os atributos de uma tabela. Vamos ver
a tabela times, por exemplo.
Describe times; /* mostra os atributos da tabela times */
Figura 18 – Atributos da tabela Times
Como se vê na figura acima, são exibidos exatamente os
atributos exibidos no modelo da figura 14, agora com algumas
informações adicionais. Sabemos que o atributo idtimes tem
tamanho 10 e é positivo (unsigned). Além disso tem marcado
em KEY (chave) o valor PRI, ou seja, é a chave primária. A
coluna NULL pergunta se aquele atributo pode ficar sem
preenchimento (YES) ou não (NO). Essa informação será
relevante mais adiante.
Agora tente fazer o mesmo comando para a tabela jogadores.
Describe jogadores;
[ 30 ]
 Aprendendo Banco de Dados com MySQL, por Jorge Costa Leite Júnior
Depois nos conte o que percebeu.
A pergunta que nos vem agora é: “onde estão os dados?”
Agora que temos um banco de dados preenchido com dados
podemos aprender a brincar com alguns comandos. O primeiro
será selecionar dados.
O comando SELECT – Para selecionar dados
O primeiro comando a ser aprendido para selecionar dados é o 
SELECT. Vamos aprender sua notação básica:
Select * from times; -- seleciona todos os atributos e dados da 
tabela times
Vamos ao resultado:
Figura 19 – Resultado da consulta executada
[ 31 ]
 Aprendendo Banco de Dados com MySQL, por Jorge Costa Leite Júnior
Na terminologia, usar o comando SELECT é chamado de
“consultar” na tabela. O uso do * (asterisco) não é
recomendado para grandes quantidades de dados, portanto
deve ser evitado. Sendo assim, podemos selecionar apenas
alguns atributos a serem exibidos como a seguir:
Figura 20 – Selecionando alguns atributos apenas
Observe que o atributo idtimes não é exibido nessa coleção.
Uma pergunta a seguir seria, tem uma forma de filtrar os dados
que quero exibir? Por exemplo: Times que foram fundados
depois de 1900.Nossa pergunta poderia ser formulada assim:
“Mostre todos os times onde ano de fundação seja maior que
1900”
Sendo assim precisamos aprender uma palavra nova: WHERE 
(no bom português, significa “onde”). Traduzindo para nosso 
SQL teríamos:
[ 32 ]
 Aprendendo Banco de Dados com MySQL, por Jorge Costa Leite Júnior
Figura 21 – Uso da cláusula WHERE (onde) como filtro
Observe que o time Flamengo saiu da lista, uma vez que sua
fundação é anterior a 1900. Uma pergunta possível é se o
Flamengo deixou de existir no banco de dados. A resposta seria
não. O comando SELECT serve somente para exibir dados. Ele
não apaga dados.
Se minha questão fosse: “Mostre os times cuja fundação é
entre 1900 e 1920”. Agora temos um intervalo fechado para
situações assim podemos usar BETWEEN para intervalos.
Figura 22-Intervalo fechado usando BETWEEN
[ 33 ]
 Aprendendo Banco de Dados com MySQL, por Jorge Costa Leite Júnior
Observe que para o comando BETWEEN precisamos de um 
conectivo AND.
where anodefundacao between 1900 and 1920;
O comando acima numa tradução literal, significaria “onde ano 
de fundação está entre 1900 e (AND) 1920.
O comando BETWEEN é ótimo para intervalos fechados.
A cláusula WHERE permite operadores lógicos diversos ( = , !=, 
<>, >, < dentre outros).
Vamos agora selecionar alguns dados de jogadores.
Figura 23 – Alguns dados selecionados de jogadores
[ 34 ]
 Aprendendo Banco de Dados com MySQL, por Jorge Costa Leite Júnior
Agora que vimos dados dos jogadores, vamos fazer algumas 
perguntas:
1. Mostre jogadores que ganham mais de 3000 ou menos de 
2000.
Figura 24 – Uso do conectivo OU (OR) na cláusula WHERE
Observe que precisamos usar um conector “ou” para responder
a essa questão. A Cláusula WHERE suporta várias combinações.
2. Mostre os dados do jogador cujo nome seja “jorge”
Figura 25 – Cláusula WHERE com IGUALDADE
[ 35 ]
 Aprendendo Banco de Dados com MySQL, por Jorge Costa Leite Júnior
A consulta realizada acima foi uma busca exata pelo nome, por
isso usamos a igualdade. O comando WHERE permite várias
combinações.
Vamos aprender algumas coisas novas: Ordenação. 
Imagine que quero que a lista de jogadores seja por nome em
ordem alfabética.
Figura 26 – Lista de jogadoresordenadas por nome
[ 36 ]
 Aprendendo Banco de Dados com MySQL, por Jorge Costa Leite Júnior
Acabamos de aprender o comando ORDER BY, ou “ordernar
por”, usado para ordenações diversas. Caso queiramos a lista
na ordem decrescente (descendente) é só adicionar o sufixo
DESC.
Para exemplificar essa variação vamos mostrar a lista de
jogadores do maior para o menor salário.
Figura 27 – Lista de Jogadores ordenados pelo maior salário
Também é possível fazer uma série de ordenações combinadas.
Muito bom! Agora podemos responder algumas perguntas
básicas usando o que chamamos de funções de agregação:
[ 37 ]
 Aprendendo Banco de Dados com MySQL, por Jorge Costa Leite Júnior
a) Contagem de jogadores (total de jogadores)
Figura 28 – Total de jogares (contagem)
Agora para contar os jogadores usamos a função
COUNT(ATRIBUTO). Essa função requer um atributo como
parâmetro, podendo ser qualquer um da tabela. Para melhorar
a exibição de dados usamos um rótulo (aliás) quando usamos o
comando “as total”. Em outras palavras dissemos “pegue esse
resultado e dê um nome de total”. Poderia ser qualquer nome.
b) Maior salário de jogadores
Figura 29 – Maior salário de jogador
[ 38 ]
 Aprendendo Banco de Dados com MySQL, por Jorge Costa Leite Júnior
Observe que neste caso precisei especificar exatamente o
atributo que queria o maior valor ao usar MAX(salario). Para o
menor valor usamos a função MIN(salario). Lembrando que
podemos dar qualquer rótulo ou apelido para esse resultado.
c) Salário médio dos jogadores
Figura 30 – Salário médio dos jogadores com AVG (média em inglês)
Aprendemos até aqui as seguintes funções de agregação que 
resumiremos na tabela a seguir:
Função Significado
MAX(atributo) Valor máximo do atributo
MIN(atributo) Valor mínimo do atributo
AVG(atributo) Valor médio do atributo
Count(atributo) Contagem de linhas, independe de atributo
SUM(atributo) Soma todos os valores para aquele atributo
Distinct atributo Lista sem repetir valores para aquele atributo
Vamos agora somar os salários dos jogadores.
[ 39 ]
 Aprendendo Banco de Dados com MySQL, por Jorge Costa Leite Júnior
Figura 31 – Soma total dos salários dos jogadores
Finalmente vamos explorar a função DISTINCT que serve para
descartar valores repetidos. Vamos usar um exemplo simples:
Figura 32 - Lista com diferentes salários de jogadores
[ 40 ]
 Aprendendo Banco de Dados com MySQL, por Jorge Costa Leite Júnior
Esse exemplo pode parecer controverso, mas se observarmos,
temos 12 jogadores cadastrados com diferentes salários. Como
eu pedi para exibir diferentes salários DISTINCT SALARIO, o
número de resultados caiu, pois foram retirados os registros de
dados com repetições.
Sendo assim, apresentamos as principais funções de
agregações. Com tais funções combinadas com com as
cláusulas WHERE, ORDER BY e outros comandos apresentados
podem trazer soluções a vários problemas e questões.
Exercícios usando SELECT
Usando o modelo e banco de dados bancotimes responda a 
essas perguntas:
1. Mostre nome e ano de fundação dos times, ordenados pelo nome
2. Mostre o valor médio dos times
3. Mostre o nome, salario e data de nascimento de jogadores do mais 
velho para o mais novo
4. Mostre o nome e salário de jogadores que ganham mais de 2000.
5. Mostre o valor total dos times
6. Mostre o nome dos jogadores ordenados por nome decrescente
7. Mostre o valor mais baixo de um time
8. Mostre nome e data de nascimento para jogadores nascidos a 
partir do ano 2000
9. Mostre o total de jogadores que ganham menos de 3000
10. Mostre o maior valor de times
Esse capítulo foi só um aperitivo do comando SELECT, adiante
vamos apresentar mais recursos. Sigamos na leitura.
[ 41 ]
 Aprendendo Banco de Dados com MySQL, por Jorge Costa Leite Júnior
Como Modificar dados de um banco?
No capítulo anterior aprendemos um pouco sobre acessar
banco de dados e recuperar (consultar) dados. A pergunta que
nos vem a seguir é como podemos adicionar, modificar ou até
excluir dados de uma tabela?
Para dar continuidade a nosso processo de aprendizagem
vamos conhecer 3 novos comandos: INSERT, DELETE, UPDATE.
O Comando INSERT
O comando INSERT (inserir em português) é o comando básico
para inserir um registro (conjunto de dados) numa tabela. Ele
tem duas sintaxes.
Vamos a sintaxe mais básica:
Insert into TABELA (atributo1, atributo2, atributoN) values
(valor1,valor2,valor3);
No bom português o comando acima seria algo assim: 
“insira na tabela cujo nome é TABELA nos atributos
(atributo1,atributo2, atributoN) os valores
(valor1,valor2, valorN)”
Uma dica antes de inserir dados numa tabela é verificar quais
são seus atributos e restrições de dados. Sendo Assim,
precisamos revisitar o comando DESCRIBE NOMETABELA.
[ 42 ]
 Aprendendo Banco de Dados com MySQL, por Jorge Costa Leite Júnior
Cenário 1: Imagine que eu queria acrescentar um novo time,
mas não lembro bem os atributos da tabela. Podemos retomar
isto com o comando DESCRIBE TIMES;
Ao realizar este comando teremos o seguinte:
Figura 33 – Resultado do DESCRIBE TIMES
Um detalhe não tratado antes, que é importante mencionar
aqui é o fato do atributo idtimes ser AUTO_INCREMENT. Essa
informação é relevante, em especial pelo fato deste atributo
ser uma chave primária. Logo a cada novo time inserido,
incrementa-se em 1 o valor do atributo idtimes (do ultimo
inserido). Por que essa informação é importante? A resposta a
essa questão é que se o atributo for auto incremento não
precisamos passar valor. Exemplo de INSERT com
auto_increment:
insert into times (nome,valor,anodefundacao) values
(‘Santos’,4000000,1921);
[ 43 ]
 Aprendendo Banco de Dados com MySQL, por Jorge Costa Leite Júnior
Duas observações são importantes aqui: primeiro se observa
que o atributo-chave idtimes não passamos nem o atributo
nem o valor a ser preenchido. A segunda informação é que
todo atributo não numérico deve ser preenchido com aspas
simples, como é o caso do nome do time. Na tabela jogador por
exemplo a data (tipo DATE) é também preenchida entre aspas
simples. Caso a chave não fosse auto_increment, seria
obrigatório passar o atributo e valor para idtimes.
A segunda notação para este comando permite a inserção de
múltiplos registros (linhas) num só comando:
insert into times (nome,valor,anodefundacao) values
(‘Vasco’,5000000,1891),(‘Benfica’,400000,1910),(‘Barcelona’,
100000,1899);
Observe que agora passamos valores na mesma linha de
comandos para os times VASCO, BENFICA e BARCELONA. Como
posso ter certeza que meu comando funcionou? Primeiro,
considere que executei os comandos destacados. Segundo
vamos usar um SELECT para ver o resultado:
[ 44 ]
 Aprendendo Banco de Dados com MySQL, por Jorge Costa Leite Júnior
Como se pode observar na listagem acima, os 4 times foram
inseridos com sucesso em dois comandos diferentes. O
primeiro apenas inserindo o SANTOS, e os três demais na
segunda operação.
É importante notar que inseri valores para todos os atributos,
mas poderia evitar aqueles cujo o preenchimento não fosse
obrigatório, como por exemplo os atributos VALOR e
ANODEFUNDACAO.
Mas como eu posso inserir dados para um jogador? A ideia é
basicamente a mesma, apenas com um detalhe: temos uma
chave estrangeira na tabela jogadores. A chave é idtimes, ela
garante que eu não possa ter um jogador não associado a um
time.
Vimos que o maior idtimes existente é 8. Ou seja, se eu tentar
passar um valor não existente de idtimes na tabela TIMES, o
MySQL. bloqueará o INSERT dando mensagem de erro.
Vamos tentar provocar esse erro:
insert into jogadores (nome,salario,datanascimento,idtimes) values
(‘Captu’,10000,’1999-01-10’,18);
O último parâmetro desse comando é IDTIMES e estou
passando um valor 18. Já sabemos que não existe nenhum time
com esse ID. Logo teremos um erro aqui.
Outraobservação é o padrão de data no formato ‘AAAA-MM-
DD’, ou seja ano, mês, dia.
[ 45 ]
 Aprendendo Banco de Dados com MySQL, por Jorge Costa Leite Júnior
A mensagem de erro principal aqui é:
Error Code: 1452. Cannot add or update a child row: a foreign key constraint
fails (`bancotimes`.`jogadores`, CONSTRAINT `jogadores_ibfk_1` FOREIGN
KEY (`idtimes`) REFERENCES `times` (`idtimes`))
Em outras palavras, você está tentando inserir um jogador, cujo
valor de chave estrangeira se refere a um time que não existe.
Sendo assim, muito cuidado com tabelas que possuem chaves
estrangeiras.
O Comando DELETE
O comando delete tem como objetivo excluir uma linha
(registro) ou conjuntos de registro baseados em algum critério
(leia-se tudo que a cláusula WHERE permitir).
A experiência nos ensina, enquanto aprendizes que a melhor
regra de exclusão de dados é pela chave primária.
Por exemplo eu poderia apagar todos os jogadores que tem
salário abaixo de 2000, ou por um nome específico etc. Tais
exclusões são possíveis, mas é bom ser cuidadoso.
Vou explorar aqui os casos nos quais excluímos pela chave
primária. Sendo assim o comando DELETE fica assim:
delete from tabela where chaveprimaria=valor;
[ 46 ]
 Aprendendo Banco de Dados com MySQL, por Jorge Costa Leite Júnior
Por exemplo, quero excluir o time Barcelona, e já sei que o
valor da chave primária é 8, logo meu comando seria assim:
delete from times where idtimes = 8;
Essa exclusão ocorreria sem menor problema. Mas imagine
excluir o Bahia, teríamos um problema:
delete from times where nome=’bahia’; - - exclusão sem ser pela chave
Essa exclusão seria permitida, exceto pelo fato de termos 4
jogadores associados ao bahia. Logo teríamos o seguinte erro:
Error Code: 1451. Cannot delete or update a parent row: a foreign key
constraint fails (`bancotimes`.`jogadores`, CONSTRAINT `jogadores_ibfk_1`
FOREIGN KEY (`idtimes`) REFERENCES `times` (`idtimes`))
Em outras palavras, você não pode excluir um time que ainda
tem jogadores associados a ele por chave estrangeira. Acredite,
esse erro é comum, muitas vezes por displicência do
programador SQL.
Portanto, comando DELETE deve observar as associações entre
tabelas e critérios para se evitar danos a base de dados.
O Comando UPDATE
O comando UPDATE serve para atualizar dados de uma linha ou
registro (ou conjunto deles) baseados num critério. Aqui valem
todas as considerações feitas em relação ao DELETE. A sintaxe
básica do update é:
[ 47 ]
 Aprendendo Banco de Dados com MySQL, por Jorge Costa Leite Júnior
update nometabela set atributo1 = novovalor1, atributo2 =
novovalor2, atributon = novovalorn where atributo = valor;
A melhor tradução aqui seria: Atualize a tabela “nometabela”
modificando o atributo1 pelo novovalor1, o atributo2 pelo
novovalor2, o atributon pelo novovalorn onde o atributo =
valor.
Recomendo fortemente que o atributo da cláusula WHERE seja
a chave primária, repetindo o alerta relativo ao comando
delete. Vamos para alguns exemplos:
update times set nome= 'Novo Bahia', valor =10000000 
where idtimes = 1;
Esse comando vai alterar o nome do Bahia para Novo Bahia e
seu valor para 10000000. Observe que o update foi feito com o
critério da chave primária.
Figura 34 – Dados do Bahia atualizados
[ 48 ]
 Aprendendo Banco de Dados com MySQL, por Jorge Costa Leite Júnior
A despeito de tabelas com chaves estrangeiras, valem as mesmas
recomendações do comando DELETE. Lembrando que você não pode
atualizar uma chave estrangeira cujo valor não exista na tabela de origem
(time por exemplo) como chave primária.
Exercícios
1. Insira um novo time com dados a sua escolha
2. Insira um novo jogador no Flamengo
3. Insira um novo jogador no Vasco
4. Atualize o valor do Vasco para 100000
5. Atualize o nome atual do Bahia para EC Bahia
6. Remova o time inserido na questão 1
7. Remova o jogador inserido na questão 3
8. Remova o jogador KAKA
Exercícios de tradução
Traduza os comandos SQL a seguir:
1. delete from times where nome = ‘Vasco’
2. update jogadores set salario=10000 where idjogadores =3
3. Insert into jogadores (nome, salario,idtimes) values (‘Xuxa’, 4000,1)
4. insert into times (nome, anodefundacao) values (‘Olaria’, 40000)
5. select nome, salario from jogadores where salario > 2000
6. select nome, valor from time where anodefundacao < 1950
7. select nome,salario from jogadores where salario < 400000
8. select distinct nome from jogadores
9. select anodefundacao,nome from times order by nome
10. select max(salario) from jogadores
11. select count(nome) from times
12. select avg(salario) from jogadores where datanascimento > ‘2000-
01-10’
[ 49 ]
 Aprendendo Banco de Dados com MySQL, por Jorge Costa Leite Júnior
Criando nossos próprios bancos e tabelas
Aprendemos já a selecionar (consultar) dados, inserir, alterar e
modificar registros. A pergunta agora é como posso criar um
banco de dados, uma vez que um modelo me é apresentado
para meus projetos?
Retomando o modelo dados a seguir:
Figura 35 – Modelo do Banco VENDAS
O modelo acima vamos chamar de banco VENDAS é formado
por 3 tabelas. Uma vez que temos um modelo em mãos, temos
que definir a ordem de criação de tabelas. Essa ordem é
sempre feita prioritariamente com tabelas sem chaves
estrangeiras. Alguns autores chamam essas tabelas de
entidades fortes. Depois delas criadas, vamos criar as que
precisam de menos chaves estrangeiras. No modelo acima,
podemos criar a tabela CLIENTES e VENDEDORES (não
necessariamente nessa ordem) e depois FATURAS, pois essa
tem duas chaves estrangeiras que dependem dessas tabelas.
[ 50 ]
 Aprendendo Banco de Dados com MySQL, por Jorge Costa Leite Júnior
Vamos aprender a criar um banco de dados. Para criar um
banco de dados usamos o comando:
CREATE DATABASE NOMEDOBANCO;
Para usar o banco retomamos ao famoso USE NOMEDOBANCO;
Apenas para relembrar, para mostrar as tabelas do banco
usamos o famoso SHOW TABLES;
Vamos agora para o modelo acima, criar o banco e tabelas
respectivas:
Figura 36 – Criação e uso de banco VENDAS, Exibição de tabelas
Esse conjunto de comandos apenas criou no espaço em disco
(ou armazenamento) espaço e estruturas para receber futuras
tabelas que serão criadas. É um banco vazio sem tabelas.
CRIAÇÃO DE TABELAS
Para criar tabelas é necessário definir nome da tabela,
atributos, domínios e regras, chaves e informações adicionais.
Vou proceder a criação da tabela VENDEDORES.
[ 51 ]
 Aprendendo Banco de Dados com MySQL, por Jorge Costa Leite Júnior
Toda tabela criada tem a seguinte estrutura:
Create table NOME(
atributo1 tipo nulo ou não, se é autoincremento ou primária,
atributo2 tipo nulo ou não,
atributo3 tipo outras características
chave primária,
chave estrangeira);
Vamos agora criar a tabela vendedores:
Figura 37 – Criação da tabela Vendedores
A figura 37 mostra a aplicação da estrutura básica de criação de
tabelas, no caso específico da tabela VENDEDORES. Observe
que na linha 1, criamos e damos nome a tabela, na linha 2
criamos o atributo idvendedores que é do tipo inteiro positivo
(unsigned), sendo obrigatório (NOT NULL), e finalmente é um
auto incremento, pois será definido como chave primária na
linha 7. Na linha 2, temos o atributo nome (texto) do tipo
VARCHAR(50), o que permite 50 caracteres, sendo obrigatório
(NOT NULL). A Linha 4 tem o atributo datacontratacao do tipo
date, não obrigatório. O Atributo salario, do tipo float tem
valor DEFAULT = 1000, isso significa, que se nenhum valor for
passado, esse valor será assumido no atributo. Comissão
[ 52 ]
 Aprendendo Banco de Dados com MySQL, por Jorge Costa Leite Júnior
também é float mas não obrigatório. Finalmente definimos a
chave primária idvendedores.
Já a tabela Clientes segue o modelo da tabela cliente, apenas
com todos os atributos, exceto a chaveprimária como varchar.
Isso é proposital para ajustes futuros na base.
Figura 38 – Criação da tabela CLIENTES
Como dissemos, a ordem de criação das tabelas leva em
consideração que tabelas com menos chaves estrangeiras
devem ser criadas primeiro. Por isso criamos VENDEDORES e
CLIENTES, já que não possuíam chaves estrangeiras. Agora
procederemos a criação da tabela FATURAS.
A tabla FATURAS possui duas chaves estrangeiras idclientes e
idvendedores. Mesmo sendo chaves estrangeiras, precisam ser
criadas como atributos, antes de se fazer atribuição como
chaves estrangeiras. Vamos ao script:
[ 53 ]
 Aprendendo Banco de Dados com MySQL, por Jorge Costa Leite Júnior
Figura 39 – Criação da tabela Faturas
O que temos nesta tabela: chave primária idfaturas, o atributo
data do tipo date. Nas linhas 4 e 5 criamos os atributos
idclientes e idvendedores idênticos ao que temos nas tabelas
originais, excetuando-se o auto_increment. Essas linhas só
criam os atributos, mas eles ainda não são chaves. A Linha 6
atribui idfaturas como chave primária desta tabela. As chaves
estrangeiras (FOREIGN KEY) são definidas nas linhas 7 e 8. A
notação básica é dizer o nome do atributo na tabela atual que
será a chave estrangeira. No REFERENCES informar a tabela de
origem e entre parênteses, o nome do atributo na tabela de
origem. Bons modelos geralmente, mantém os nomes das
chaves estrangeiras idênticos aos da tabela de origem.
Finalmente, se dermos um SHOW TABLES, teremos as 3 tabelas
criadas.
Figura 40 – Lista de tabelas criadas
[ 54 ]
 Aprendendo Banco de Dados com MySQL, por Jorge Costa Leite Júnior
MODIFICAÇÃO DE ESTRUTURA DE TABELAS
Uma vez criadas nossas tabelas do modelo, agora
materializadas no projeto lógico, é possível que se busque
possíveis ajustes ou alterações nas mesmas.
A primeira delas é apagar a tabela. O comando é simples:
drop table nomedatabela;
Para evitar confusão com o comando delete, assuma que DROP
significa apague a estrutura da tabela.
Caso a tabela tenha dados, e se queira limpar os dados usamos
o truncate.
Truncate table nomedatabela;
Finalmente imaginemos que queremos alterar apenas parte da
estrutura de uma tabela. Essa alteração estrutural (ALTER) tem
4 possibilidades básicas:
1. Adicionar atributo – ADD
2. Remover atributo – DROP
3. Modificar atributo – MODIFY
4. Mudar nome do atributo – CHANGE
Vamos tomar a tabela CLIENTES como exemplo. Observe que
todos os atributos estão como varchar. Vamos fazer alguns
ajustes.
a) Ajuste 1: vamos adicionar o atributo telefone:
[ 55 ]
 Aprendendo Banco de Dados com MySQL, por Jorge Costa Leite Júnior
ALTER TABLE CLIENTES ADD TELEFONE Varchar(10);
Esse comando altera a estrutura da tabela cliente adicionando
o atributo TELEFONE que será do tipo varchar(10);
b) Ajuste 2: vamos remover o atributo CEP:
ALTER TABLE CLIENTES DROP CEP;
Esse comando altera a estrutura da tabela cliente removendo o
atributo CEP.
c) Ajuste 3: Vamos trocar o tipo do endereço pra TEXT
ALTER TABLE CLIENTES MODIFY ENDERECO TEXT;
O Modify basicamente altera o tipo de dados e domínio.
d) Ajuste 4: Vamos renomear o atributo cidade para municipio
ALTER TABLE CLIENTE CHANGE ENDERECO MUNICIPIO
VARCHAR(100);
Aqui, além de modificar o nome do atributo ENDERECO para
MUNICIPIO pudemos modificar o tipo para varchar(100).
Finalmente, gostaria de apresentar o tipo ENUM, que serve
para predefinir uma lista de valores a escolha do usuário para
um atributo. Vamos ao exemplo seguir:
sexo ENUM(‘m’,’f’); -- atributo sexo só pode ter os valores ‘m’ ou ‘f’
[ 56 ]
 Aprendendo Banco de Dados com MySQL, por Jorge Costa Leite Júnior
É importante mencionar que podemos criar atributos no
momento de criação de tabela com o CREATE TABLE ou através
do ALTER TABLE ADD
Então vamos agora adicionar um atributo sexo para clientes
usando o comando ENUM:
alter table clientes add sexo enum(‘m’,’f’);
Com a execução dos comandos acima, a tabela CLIENTES fica
da seguinte forma:
Figura 41-Tabela CLIENTES após a execução dos comandos ALTER TABLE
Figura 41 – Tabela Clientes após as modificações realizadas
Observe que as modificações nos atributos são bem diversas
das listadas na figura 38. Vale destacar que se a tabela estiver
preenchida com dados, pode haver perda de dados, problemas
de conversão de tipos e outros erros. Portanto é preciso
cautela ao usar ALTER TABLE e suas variantes com o banco de
dados em produção.
[ 57 ]
 Aprendendo Banco de Dados com MySQL, por Jorge Costa Leite Júnior
Exercícios de Fixação
1. Liste as tabelas
2. Descreva cada uma das tabelas
3. Adicione o atributo telefone para clientes
4. Modifique o atributo cep para varchar(10)
5. Adicione o atributo sexo para vendedores do tipo ENUM com os
valores ‘F’ ou ‘M’
6. Adicione o atributo hora na tabela fatura. O formato de hora é
‘HH:mm’
7. Remova o atributo inserido na questão anterior
8. Adicione o atributo valor do tipo Double na tabela faturas
9. Renomeie o atributo nome (tabela vendedor) para
“nomevendedor”
10. Modifique o endereço para varchar(200)
11. Adicione um atributo UF com dois caracteres na tabela clientes.
12. Adicione um atributo valor tipo Double na tabela faturas
13. Adicione o atributo CPF na tabela Faturas
14. Remova o atributo CPF da tabela Faturas
15. Altere a comissão na tabela VENDEDORES para Double
16. Modifique o atributo cep para varchar(10)
Parte 2 – Realize as operações a seguir:
1. Insira 4 clientes
2. Insira 3 vendedores
3. Exclua o último cliente inserido
4. Insira uma nova fatura com o primeiro vendedor inserido, e o
segundo cliente
5. Modifique os dados do segundo vendedor
6. Dê um aumento de 20% a todos os vendedores
7. Insira uma nova fatura com o segundo vendedor e o primeiro
cliente
8. Mostre os vendedores do sexo feminino
9. Mostre os valores das faturas do mais alto para o mais baixo
10. Mostre as cidades dos clientes em ordem alfabética
[ 58 ]
 Aprendendo Banco de Dados com MySQL, por Jorge Costa Leite Júnior
11. Mostre o valor total em faturas
12. Mostre o menor salário de vendedor
13. Mostre as faturas emitidas entre o ano de 2000 e 2010.
[ 59 ]
 Aprendendo Banco de Dados com MySQL, por Jorge Costa Leite Júnior
Ampliando nossos conhecimentos sobre o
Select, Delete, Insert e Update
Aprendemos já a selecionar (consultar) dados, inserir, alterar e
modificar registros. Aprendemos também a criar bancos e
tabelas, verificar sua estrutura e realizar consultas simples.
Vamos agora, exercitar nossos conhecimentos, revisitando os
comandos ora aprendidos e expandi-los com maior
complexidade.
Para ajudar em nossa tarefa, vamos trabalhar com o banco de
dados a seguir (CLINICA2020):
Figura 42 – Tabelas com seus respectivos atributos do banco CLINICA
Nesse banco temos dados de pacientes, médicos, funcionários
doenças, especialidades médicas, ambulatórios, consultas etc.
[ 60 ]
 Aprendendo Banco de Dados com MySQL, por Jorge Costa Leite Júnior
O primeiro passo para trabalhar com esse banco é executar seu
script disponível online2.
Figura 43 – Janela com o script a ser carregado e executado
Uma vez executado o script, o banco e tabelas serão criados
com todos os seus dados. Feito isso, vamos numa sequência de
comandos selecionar o banco e exibir as tabelas:
Figura 44 – Usando o banco e exibindo suas tabelas
2Script disponível em:
https://1drv.ms/u/s!AjrvH4IdOLnXgdMpKfzFIxAZyilIaA?e=78YZBf
[ 61 ]
 Aprendendo Banco de Dados com MySQL, por Jorge Costa Leite Júnior
Feito isto temos nosso banco criado e vamos examinar algumas
tabelas. Podemos dar um DESCRIBE em cada tabela ou usar um 
SELECT para vermos os dados. Vou mostrar dois exemplos a 
seguir:
Figura 45 – Descrição da estrutura da tabela PACIENTES
Figura 46 - Selecionando todos os dados da tabela PACIENTES para
visualização dos dados.
Novamente faço o alerta que o SELECT * não é recomendável 
para grandes conjuntos de dados.
Agorajá sabemos como ver estrutura e dados de uma tabela
podemos continuar nossa análise do banco CLINICA2020 e
[ 62 ]
 Aprendendo Banco de Dados com MySQL, por Jorge Costa Leite Júnior
aprender e ampliar nossos conhecimentos através de exemplos
novos e associando os conceitos aprendidos anteriormente.
Para isto, vamos fazer questionamentos ao banco e apresentar
respostas, por meio de PROBLEMAS:
PROBLEMA 1: Mostrar o nome, sexo e idade dos pacientes
com idade maior que 18 anos.
Figura 47 - Consulta e resultado
Observe que aplicamos o filtro WHERE IDADE > 18. Mas se 
quisermos apenas pacientes do sexo feminino? Basta adicionar 
um conector AND e uma nova condição sexo =’f’. Vejamos a 
seguir:
[ 63 ]
 Aprendendo Banco de Dados com MySQL, por Jorge Costa Leite Júnior
Figura 48 – Consulta modificada com a adição da condição do sexo feminino
Podemos combinar numa cláusula WHERE várias condições e 
atributos em consultas.
PROBLEMA 2: Mostrar o total de pessoas por sexo.
Para resolver essa questão precisamos entender que
poderíamos fazer duas contagens (usando Count). Seria um
para cada sexo:
select count(nome) from pacientes where sexo= ‘f’;
select count(nome) from pacientes where sexo= ‘m’;
O problema desta solução é que seriam consultas distintas com
resultados distintos. Mas imagine que fossem 3000 sexos
diferentes possíveis, você teria que fazer 3000 consultas para
atingir esse resultado. Sendo assim, deve haver algum
comando capaz de realizar agrupamentos. Esse comando é o
famoso GROUP BY. Vamos dar um exemplo de uso simples a
seguir:
Figura 49 – Uso do agrupamento por sexo
[ 64 ]
 Aprendendo Banco de Dados com MySQL, por Jorge Costa Leite Júnior
Observe que para fazer a contagem usamos o tradicional
count(nome) e demos o apelido de total (as total). No Select
também optamos a exibir o atributo sexo para visualizarmos
para que sexo aquela quantidade (total) está relacionada.
Finalmente, fazemos o agrupamento com o comando group by
sexo. Deste modo, especificamos por qual atributo é esse
agrupamento de dados. Em consultas com a cláusula WHERE, o
group by é sempre depois o filtro da cláusula WHERE. Caso haja
ordenações (order by),o group by é sempre antes da
ordenação. 
PROBLEMA 3: Mostrar a média salarial por sexo para os
funcionários que ganham acima de RS 1000.
Para resolver esse problema vamos trabalhar por similaridade
com a forma de resolução anterior. A função AVG(atributo) nos
fornece a média de um conjunto de valores pra aquele
atributo. Mas além disso queremos mostrar o sexo do
funcionário (agrupamento), desde que seu salário seja superior
à R$ 1000,00 (filtro). Sendo assim nossa resposta exige um
SELECT contendo função de agregação (AVG), filtro (WHERE) e
agrupamento (GROUP BY). Deste modo teríamos a seguinte
resposta:
Figura 50 –
Seleção com uso de agrupamento e filtro
[ 65 ]
 Aprendendo Banco de Dados com MySQL, por Jorge Costa Leite Júnior
Poderíamos também caso se fizesse necessário usar ordenação
(order by) para ordenar por algum atributo. Sendo assim,
ampliamos nossos conhecimentos do SELECT com boa parte de
suas nuanças, úteis em vários tipos de problemas.
PROBLEMA 4: Mostrar o total de consultas de um paciente
Para resolver esse problema precisamos entender primeiro,
que por uma questão de modelagem, se prefere guardar o
idpacientes na tabela CONSULTAS. O motivo para isso é para
que se evite o problema de inconsistência nos dados, além de
minimizar o uso recorrente do atributo nome na tabela
CONSULTAS, evitando que o usuário em processos de digitação
para um mesmo nome, digite (de maneira errada ou
despropositais) nome errado para um paciente já cadastrado.
Com o conhecimento anterior adquirido poderíamos pensar
então que a resposta seria algo do tipo:
select idpacientes, count(dia) as total from consultas group by
idpacientes;
[ 66 ]
 Aprendendo Banco de Dados com MySQL, por Jorge Costa Leite Júnior
Figura 51 – Total de consultas por paciente
Embora a resposta seja correta, temos um problema novo.
Quem é o paciente cujo idpacientes tem valor 1 ou 3 ou 8?
Uma resposta simples seria fazer a boa e velha consulta básica:
select nome, sexo, idpacientes from pacientes where idpacientes 
=1;
Agora temos uma reposta nova e um problema novo. Como
posso juntar a reposta para essas duas questões em uma única
consulta? Veremos no capítulo a seguir. Aguardem.
PROBLEMA 5: Mostrar os pacientes que tiveram consultas
Para resolver essa questão vamos voltar para a boa e velha
teoria de conjuntos. Já sabemos que o atributo idpacientes
está em dois conjuntos ou tabelas diferentes associadas. Nossa
pergunta, dentro dessa perspectiva se tornaria algo do tipo: 
“Existe idpacientes da tabela PACIENTES que também esteja na
tabela CONSULTAS?”
Para responder essa pergunta teríamos os seguintes conjuntos:
Conjunto A: select nome,sexo, idpacientes from pacientes;
Conjunto B: select idpacientes from consultas;
Então agora vamos fazer a pergunta se temos elementos do
conjunto A em B, usando o operador IN (está ou pertence).
Podemos também usar o operador de negação NOT para
[ 67 ]
 Aprendendo Banco de Dados com MySQL, por Jorge Costa Leite Júnior
verificar, por exemplo se esse elemento de A não está em B.
Para finalmente responder a pergunta inicial temos o seguinte:
Figura 52 – Operação de conjuntos (subconsultas)
Como se pode ver na figura acima, o filtro (cláusula WHERE)
serviu para filtrar pelo idpacientes (elemento associativo) para
verificar a pertinência (não) de um elemento de A (o primeiro
select) no subconjunto B (segunda consulta). Observe que a
subconsulta é dada dentro de parênteses.
Caso quiséssemos perguntar quais os pacientes que não tem
consulta, bastaríamos incluir o prefixo NOT antes do IN.
Ficando da seguinte forma.
Select nome,sexo, idpacientes from pacientes where idpacientes
not in (select idpacientes from consultas);
PROBLEMA 6: Mostrar os funcionários cuja idade é maior que
a idade média dos pacientes.
[ 68 ]
 Aprendendo Banco de Dados com MySQL, por Jorge Costa Leite Júnior
Aqui agora temos dois conjuntos: o primeiro é o de
funcionários e o segundo a média de idade de pacientes (esse
será um conjunto unitário).
Conjunto A: select nome, idade from funcionarios;
Conjunto B: select avg(idade) as media from pacientes;
Para realizar essa subconsulta, vamos usar o critério de que as
idades do conjunto A tem que ser maior que a média calculada
do conjunto B. Teríamos assim o seguinte:
Figura 53 – Subconsulta com comparador > (maior que) 
Por analogia poderíamos usar os operadores menor que, igual 
ou maior ou menor ou igual.
PROBLEMA 7: Mostrar os pacientes mais novos
Essa resposta pode parecer fácil, pois bastaríamos pegar a lista
de pacientes ordenadas por idade. Boa parte de nós
pensaríamos assim.
[ 69 ]
 Aprendendo Banco de Dados com MySQL, por Jorge Costa Leite Júnior
Select nome, idade from pacientes order by idade;
O problema para esta abordagem é que se houver um empate
de idades, a consulta anterior traz uma lista ordenada apenas
mostrando várias idades sem dizer exatamente quem tem a
menor idade. Usando subconsultas teríamos a seguinte
solução:
select nome,idade from pacientes where idade = (select min(idade)
as menor from pacientes);
Agora, finalmente, temos uma listagem na qual somente
teremos pacientes cuja idade seja exatamente a menor idade
registrada. Ou seja, os casos de empate de idade serão
exibidos.
Por analogia poderíamos responder, usando os operadores
lógicos adequados, as seguintes questões:
(a) Pacientes cuja idade seja maior que a média de idades
(b) Pacientes que tenham que não tenham a maior idade
(c) Funcionários que tem salários menores que a média
salarial de médicos
(d) Dentre outras.
PROBLEMA 8: Mostrar as consultasque ocorreram entre
janeiro e maio de 2016.
Como trabalhamos pouco com datas e horas vamos exercitar
essa habilidade. Vale relembrar que o tipo DATE é
representado no padrão ‘aaaa-mm-dd’ e o tipo TIME é
representado no padrão ‘HH:MM’. Sendo assim, podemos
[ 70 ]
 Aprendendo Banco de Dados com MySQL, por Jorge Costa Leite Júnior
representar o natal de um ano qualquer, poderíamos assim
representar ‘2010-12-25’, na ordem ANO, MÊS, DIA. Já o
horário de meio dia seria representado por ‘12:00’, hora e
minuto. Vale ressaltar que TIME pode representar também
segundo, ficando da seguinte forma ‘12:00:00’.
Uma vez detalhando esses tipos de dados a resposta a esta
consulta seria:
Figura 54 – Consulta com intervalo de datas
PROBLEMA 9: Mostrar as consultas que ocorreram entre
janeiro e maio de 2016 no turno vespertino.
Esse problema é uma ampliação do anterior, apenas
acrescentando o filtro para o turno vespertino. Vamos assumir
que o turno vespertino é das 14 às 18 h.
[ 71 ]
 Aprendendo Banco de Dados com MySQL, por Jorge Costa Leite Júnior
Figura 55 – Consulta com intervalo de datas e filtro de horários
Exercícios de Revisão
1. Mostre todos os médicos que ganham mais que 4000
2. Mostre os médicos com idades entre 20 e 35 anos
3. Mostre o total de funcionários por sexo
4. Mostre o total de funcionários por cidade
5. Mostre todas as consultas realizadas no ano de 2016
6. Mostre a capacidade total de cada ambulatório
7. Mostre o total de médicos por especialidade
8. Mostre os funcionários do sexo feminino que ganham menos de
3000
9. Mostre a média salarial por sexo
10. Mostre o nome das 5 pessoas mais novas
11. Mostre a média salarial por sexo
12. Mostre a idade média por sexo de cada cidade
13. Mostre o total de consultas por médico, realizadas no turno
matutino
14. Mostre a lista de cidades e o total de pessoas de cada sexo
15. Mostre os pacientes que não estão em nenhuma consulta
16. Mostre os nomes de médicos que tem consultas
17. Mostre o nome dos pacientes que tem idades acima da média das
idades
18. Mostre os dados dos médicos que ganham o menor salário
Junções de tabelas 
[ 72 ]
 Aprendendo Banco de Dados com MySQL, por Jorge Costa Leite Júnior
No MySQL temos três tipos básicos de junções de tabelas:
1. INNER JOIN
2. RIGHT JOIN
3. LEFT JOIN
Vamos começar pelo INNER JOIN, que equivale a uma
interseção de conjuntos. Isso significa que um elemento deverá
estar nos dois conjuntos de dados (tabelas ou resultados de
consultas). Se observarmos o modelo, temos o atributo
idpacientes nas tabelas PACIENTES e CONSULTAS. Como chave
primária na primeira tabela (vamos chamar de tabela1) e chave
estrangeira na segunda tabela (vamos chamar de tabela 2),
esse atributo serve como forma de associação entre esses
conjuntos de dados. Deste modo, precisamos para todo
processo de junção de tabelas seguir os seguintes passos:
Passos para junções de tabelas:
1. Identificar os atributos e as respectivas tabelas da 
junção (tabela1, tabela2, atributo1, atributo2)
2. Juntar as tabelas com as chaves do relacionamento. 
Exemplo: Tabela1.Chave1 = tabela2.chave1 
3. Aplicar critérios e filtros pela cláusula WHERE, se 
solicitado
4. Agrupamentos, se necessário (GROUP BY)
5. Ordenações, se necessário (ORDER BY)
É importante enfatizar que na junção de tabelas se faz
necessário para cada atributo usado colocar como prefixo o
nome da tabela a qual pertence, por exemplo:
(1) Pacientes.nome, Pacientes.sexo
(2) Medicos.nome, medicos.crm
[ 73 ]
 Aprendendo Banco de Dados com MySQL, por Jorge Costa Leite Júnior
(3) Doencas.iddoencas,doencas.descricao
(4) Consultas.dia, consultas.idmedico
(5) Dentre outros.
Vale ressaltar que o MySQL permite juntar até 16 tabelas numa
mesma instrução. Vamos proceder com exemplos crescentes
com duas ou várias tabelas.
Exemplo 1: Mostrar o nome dos pacientes e dia e hora de suas
consultas.
Para resolver essa questão vamos para cada passo. Os atributos
e tabelas envolvidos são: pacientes.nome, consultas.dia,
consultas.hora. Ressaltamos que as tabelas envolvidas são
CONSULTAS e PACIENTES. 
A primeira parte dessa consulta seria:
select pacientes.nome, consultas.dia, consultas.hora from
pacientes
Observem que a cláusula FROM TABELA é mantida, e
estabelecemos PACIENTES como a tabela1. Portanto a tabela2
da consulta será a tabela CONSULTAS.
O passo dois é aplicar a junção [INNER, LEFT, RIGHT] para
realizar a junção. No nosso caso será o INNER JOIN. Como dito
no passo 2 usando as chaves do relacionamento e as regras de
junção Tabela1.Chave1 = tabela2.chave1. Sendo assim nossa
consulta ampliada ficaria assim:
[ 74 ]
 Aprendendo Banco de Dados com MySQL, por Jorge Costa Leite Júnior
select pacientes.nome, consultas.dia, consultas.hora from
pacientes INNER JOIN consultas ON pacientes.idpacientes
=consultas.idpacientes;
Observe que a junção é sempre formada nos seguintes
detalhes:
pacientes INNER JOIN consultas ON
E finalmente na associação das chaves primárias e estrangeiras
das tabelas envolvidas: 
PACIENTES.idpacientes = CONSULTAS.idpacientes
Observe que a associação (ou relacionamento) das duas tabelas
é feito através da chave idpacientes Vale destacar que o sinal
de igualdade (=) determina que tabelas estão à esquerda (LEFT)
ou a direita (RIGHT) da igualdade, sendo determinantes nos
casos de uso, para utilização do LEFT JOIN ou RIGHT JOIN.
Voltando a nossa questão do exemplo 1, temos a seguinte
resposta para a questão:
[ 75 ]
 Aprendendo Banco de Dados com MySQL, por Jorge Costa Leite Júnior
Figura 56 – Junção de tabelas com INNER JOIN
Observem que os passos 3,4 e 5 não são usados uma vez que 
não tivemos filtros (WHERE), agrupamentos (GROUP BY), ou 
ordenações (ORDER BY), passos que são opcionais e depende 
de cada questão problema. Para ilustrar essa situação vamos 
ampliar a questão anterior.
Exemplo 2: Mostrar o nome dos pacientes e dia e hora de suas
consultas, desde que tenham acontecido pela manhã,
ordenadas por nome do paciente.
Agora para responder essa questão basta executarmos o passo
3 e 5, já que não precisamos por enquanto de agrupamento.
Vale lembrar que agora os atributos devem ser representados
sempre associados com sua tabela de origem como prefixo. Por
exemplo consultas.hora e pacientes.nome. Tendo em vista
essas observações importantes, que evitam problemas e erros,
a resposta para o questionamento do exemplo 2 seria dada a
seguir:
[ 76 ]
 Aprendendo Banco de Dados com MySQL, por Jorge Costa Leite Júnior
Figura 57 – Junção de tabelas com cláusula where e order by
Até agora não combinamos ainda o uso de agrupamento em 
junções, para isso vamos fornecer um exemplo novo.
Exemplo 3: Mostrar o nome e crm do médico, bem como o
total de consultas que ele realizou.
Nessa junção de tabelas haverá um agrupamento para a
contagem de consultas para médicos (usando a função
COUNT). As tabelas envolvidas são MEDICOS e CONSULTAS.
Sempre prefiro estabelecer como tabela do FROM a tabela que
tem a chave primária (MEDICOS). Vamos ao primeiro resultado:
Figura 58 – Junção de tabelas com função de agregação
[ 77 ]
 Aprendendo Banco de Dados com MySQL, por Jorge Costa Leite Júnior
Esse resultado acima pareceu um pouco estranho. Parece que
temos apenas um médico que concentrou todas as consultas. O
que deu errado? Justamente, esquecemos de realizar o
agrupamento (objetivo do exemplo). Para corrigirmos isto,
vamos agrupar pelo atributo idmedicos. Com a devida
correção, a resposta correta para o exemplo 3 é a seguinte:
Figura 59 – Consulta corrigida com o agrupamento pelo idmedicos
Agora temos a resposta correta para a pergunta dada. Apenas
temos um porém. Os médicos cadastrados sem nenhuma
consulta realizada não aparecerão nesta listagem. Isto ocorre
pelo fato do INNER JOIN trazersempre uma interseção de
conjuntos. Para contornar isto vamos usar o LEFT JOIN. Para
isto vamos variar o exemplo anterior.
Exemplo 4: Mostrar o nome e crm do médico, bem como o
total de consultas que ele realizou, ordenadas pelo total de
consultas.
[ 78 ]
 Aprendendo Banco de Dados com MySQL, por Jorge Costa Leite Júnior
Como comentamos, para trazermos todos os médicos, inclusive
aqueles sem consultas, precisamos priorizar a tabela médicos.
Isso é feito através do LEFT ou RIGHT JOIN que definem que
tabela terá todos os dados trazidos nos resultados, pra
somente depois realizar a junção. Já mencionamento que o
lado na igualdade nos critérios de junção Tabela1.Chave1 =
tabela2.chave1, determinam a tabela prioritária. Como quero
priorizar a tabela MEDICOS, que está a esquerda da igualdade
usaremos o LEFT JOIN. Sendo assim teríamos o seguinte
resultado:
Figura 60 – Consulta usando LEFT JOIN ordenada pelo total de consultas
Uma pergunta comum que os estudantes sempre fazem é: “o
que aconteceria se não houvesse consultas pra um médico?
Para ilustrar isto vamos fazer um exemplo simples.
Exemplo 5: Mostrar o nome e idmedicos dos médicos e caso
tenham consultas, dia e hora.
[ 79 ]
 Aprendendo Banco de Dados com MySQL, por Jorge Costa Leite Júnior
Figura 61
– Consulta usando LEFT JOIN com valores nulos (NULL)
Observe que demos ênfase nos médicos Ana Smith e Marcus, 
que tem os valores NULL (nulo) para dia e hora de consulta e 
para o atributo consultas.idmedicos. Isso indica que eles não 
realizaram consultas.
Se fizéssemos o questionamento, perguntando quais os
médicos que não realizaram consultas, usando o conceito de
subconsultas apresentados anteriormente teríamos o seguinte:
[ 80 ]
 Aprendendo Banco de Dados com MySQL, por Jorge Costa Leite Júnior
Figura 62 – Subconsultas buscando médicos sem consultas realizadas
Agora uma conclusão possível: O conjunto de dados de um
LEFT ou RIGHT JOIN é sempre maior ou igual ao conjunto de
dados do INNER JOIN. Isso Significa que o conjunto de dados de
um INNER JOIN está contido num LEFT ou INNER JOIN.
Apenas para ilustrar um exemplo usando RIGHT JOIN, vou
repetir a consulta do exemplo 5.
Figura 63 – Uso do RIGHT JOIN para o exemplo 5
Se você estiver fazendo esses exemplos no computador vai
perceber que o conjunto RIGHT JOIN e INNER JOIN são
[ 81 ]
 Aprendendo Banco de Dados com MySQL, por Jorge Costa Leite Júnior
equivalentes. Isso ocorre pois ao priorizar a tabela consultas (à
direita), apenas vamos listar consultas realizadas, as quais não
existem sem médicos. Para ilustrar isto, vou apenas mostra o
nome dos médicos nos três casos (sem repetição). Vou aplicar
um limitador para 5 registros, com o comando LIMIT 5;
Figura
64 – Uso do RIGHT JOIN priorizando consultas (tabela da direita)
Figura 65 – Uso do INNER JOIN para consultas
[ 82 ]
 Aprendendo Banco de Dados com MySQL, por Jorge Costa Leite Júnior
Observem que os resultados são idênticos para as consultas
realizadas tanto com INNER ou RIGHT JOIN, como já havíamos
explicado antes. Para ilustrar a diferença, mostramos a seguir a
versão LEFT JOIN, já discutida com o exemplo de subconsultas.
Observe que Ana Smith estava na lista de médicos sem
consulta realizada, como apresentado na figura 62.
Figura 66 – Uso do LEFT JOIN para consultas
Vamos agora juntar mais de 2 tabelas. Basta seguir os passos já
estabelecidos anteriormente.
Exemplo 6: Mostrar o nome do paciente e do médico, bem
como dia e hora das consultas realizadas.
Já havíamos realizado parte dessa consulta ao juntar a tabela
PACIENTES e CONSULTAS. Para dar resposta a este exemplo,
precisamos juntar a tabela MEDICOS.
[ 83 ]
 Aprendendo Banco de Dados com MySQL, por Jorge Costa Leite Júnior
Figura 67 – Junção de 3 tabelas com INNER JOIN
Observe no destaque da figura 67, que a junção adicional para
a tabela médicos é realizada através do comando inner join
medicos on consultas.idmedicos = medicos.idmedicos.
Sendo assim caso quiséssemos saber qual a especialidade do
médico, bastaria uma nova junção. Ou até mesmo o nome da
doença atendida, etc. Vale destacar que na exibição dos dados
aparece a coluna nome duas vezes. Vamos usar um rótulo (alias
ou apelido) para tais colunas. Veja a seguir:
Figura 68 – Uso de Alias ou rótulo para as colunas NOME
[ 84 ]
 Aprendendo Banco de Dados com MySQL, por Jorge Costa Leite Júnior
Exemplo 6: Mostrar o nome do paciente e do médico, bem
como dia e hora das consultas realizadas. Mostre também a
especialidade médica.
Figura 69 – Junção de 4 tabelas, exibindo a especialidade médica
Observe que foi adicionada a junção para a tabela
ESPECIALIDADES com o comando:
inner join especialidades 
on medicos.idespecialidades = especialidades.idespecialidades
Usando o mesmo princípio podemos juntar quantas tabelas
forem necessárias para responder a um questionamento a
nossa base de dados.
Diante do que aprendemos sobre junções de tabelas vamos
responder mais quatro questões de exemplo que possa
misturar boa parte dos conceitos ora aqui apresentados.
(Questão 1) Mostre os médicos com idade acima de 30 anos
que atenderam gripe 
[ 85 ]
 Aprendendo Banco de Dados com MySQL, por Jorge Costa Leite Júnior
Para resolver essa questão, precisamos ter em mente que
vamos exibir dados de médico e o nome de doença atendida,
que neste caso será gripe (filtro), desde que o médico tenha
mais de 30 anos (filtro). Apesar de exibirmos dados de apenas
duas tabelas, é necessariamente´obrigatório passar pela tabela
CONSULTAS, é por meio dela que se associam os dados de
doença e médico. Logo teremos três tabelas envolvidas
(MEDICOS, CONSULTAS, DOENCAS).
Vamos solucionar em duas fases essa questão: 
a) Junção das tabelas
Figura 70 – Junção de tabelas sem filtros (WHERE)
b) Aplicação de filtros de idade >30 e doenca = gripe
[ 86 ]
 Aprendendo Banco de Dados com MySQL, por Jorge Costa Leite Júnior
Figura 71 – Consulta completa com os filtros de doença e idade
(Questão 2) - Mostre a média salarial dos médicos por
especialidade, cuja idade seja maior que 30.
Para resolver essa questão vamos envolver agrupamento por
especialidade médica, o cálculo da media salarial pela função
AVG() e um filtro (WHERE) pra a idade.
Figura 72 – Resposta para a questão 2
(Questão 3) - Mostre o nome das doenças que comecem com
a letra G, e para aquelas que têm consultas, exiba os dias de
consultas ordenados.
Para resolver essa questão precisamos considerar que até
agora não trabalhamos com busca textual parcial. Para isso
vamos precisar apresentar o operador LIKE (em português
“parecido”). Além disso, é possível que algumas doenças
cadastradas podem ainda não ter consultas realizadas para sua
descrição. Sendo assim, usar INNER JOIN é inadequado. Só
usamos INNER JOIN (considerando que é uma interseção de
conjuntos) somente se sabemos que há consulta para aquela
doença. Vamos assim optar pelo uso do LEFT JOIN.
[ 87 ]
 Aprendendo Banco de Dados com MySQL, por Jorge Costa Leite Júnior
Vamos agora apresentar na forma de tabela alguns exemplos
de LIKE e do operador %:
Exemplo Significado
Nome LIKE ‘A%’ Atributo Nome comece com a letra A
Nome LIKE ‘%A’ Atributo Nome termine com a letra A
Nome LIKE ‘%PA%’ Atributo Nome o conjunto de caracteres PA
Para exemplificar o uso do LIKE, vamos pra uma consulta
simples. Exibir os nomes de médicos que começam com M.
Figura 73-Exemplo de uso do operador Like
Uma vez exemplificado o uso do operador LIKE, retomamos a
nossa questão. Lembrando que vamos usar o LEFT JOIN como
forma de junção de tabelas. É bom deixar claro que embora em
alguns exemplos, junções com RIGHT e LEFT JOIN possam
retornar valores NULL, isto não é uma regra.
Sendo assim, a resposta para a questão é dada a seguir:
[ 88 ]
 Aprendendo Banco de Dados com MySQL, por Jorge Costa LeiteJúnior
Figura 74– Resultado da junção usando LEFT JOIN e operador LIKE
(Questão 4) Mostre um ranking com as doenças com maior
número de atendimentos. 
Para resolver essa questão vamos aproveitar a junção da
questão anterior, lembrando que temos agora que contar
atendimentos em consultas por doença, lembrando da
possibilidade de algumas doenças sequer ter tido atendimentos
(evitamos o INNER JOIN). Além disso, como ranking precisamos
de ordenação, de modo geral, na ordem decrescente pelo total
de atendimentos. Não custa relembrar que contagem (COUNT)
é uma função de agregação, de modo que será exigido
agrupamento pelo nome (descrição) da doença. Essa é a forma
de agrupamento mais comum, mas sempre prefiro agrupar
pela chave primária, neste caso iddoencas. Já usamos
anteriormente o comando LIMIT 5, que limita o resultado da
consulta a 5 registros. Podemos especificar com esse comando
[ 89 ]
 Aprendendo Banco de Dados com MySQL, por Jorge Costa Leite Júnior
N registros a serem exibidos. Deste modo o resultado para a
questão dada se encontra na figura75.
Figura 75 – Ranking de atendimento por doenças com um limite de 5.
Exercícios para resolução
1) Mostre as especialidades e para aquelas que tem médico mostre
o nome dos médicos.
2) Mostre o nome do paciente e para aqueles que têm consultas
realizadas, mostre as datas em ordem decrescente.
3) Mostre os dados dos médicos e consultas realizadas, mostre o dia e
a hora da consulta.
4) Mostre o nome das doenças que comece com a letra A, e para
aquelas que têm consultas ordenados as por data.
5) Mostre o total de funcionários do sexo masculino e para aqueles
que possuem salário maior que 2 mil, mostre seu ambulatório.
6) Mostre as doenças que não possuem consultas agendadas
7) Mostre o nome dos pacientes e suas respectivas consultas, e para
aquelas que foram realizadas no turno da tarde, mostre o sexo do
paciente.
8) Mostre o nome do médico, o número do ambulatório e o dia e hora
de uma consulta.
9) Mostre o número do ambulatório que não possuem consultas
realizadas.
[ 90 ]
 Aprendendo Banco de Dados com MySQL, por Jorge Costa Leite Júnior
10) Mostre as consultas realizadas e para aquelas realizadas no turno
da manhã, o nome do médico para médicos que ganham mais de
3mil reais.
11) Mostre o nome do médico e para aqueles que possuem consultas
no período da tarde a data da consulta.
12) Mostre o nome e o crm do médico e o ambulatório que ele
pertence, que não realizou atendimento em consultas.
13) Mostre todos os ambulatórios e, para aqueles ambulatórios onde
médicos realizam atendimento, exibir também os seus códigos e
nomes.
14) Mostre todas as doenças e para aquelas possuem consultas
realizadas, exibir o nome dos pacientes do sexo masculino.
15) Mostre todos os médicos, para aqueles médicos com consultas
marcadas, exibir os crm e nomes dos seus pacientes e as datas das
consultas.
[ 91 ]
	Introdução
	Bancos de dados
	Um pouco sobre o uso do MySQL.
	Explorando um banco de dados real
	Como Modificar dados de um banco?
	Criando nossos próprios bancos e tabelas
	Ampliando nossos conhecimentos sobre o Select, Delete, Insert e Update
	Junções de tabelas

Continue navegando