Escolar Documentos
Profissional Documentos
Cultura Documentos
P842s SQL para o banco de dados MySQL / Portal Educação. - Campo Grande:
Portal Educação, 2012.
89p. : il.
Inclui bibliografia
ISBN 978-85-8241-563-4
CDD 005.74
SUMÁRIO
REFERÊNCIAS ...................................................................................................................................83
1 CONCEITOS DE BANCOS DE DADOS RELACIONAIS
4
Bancos de dados são entidades computacionais responsáveis por armazenar
informações para que elas não se percam com o tempo ou quando o computador é desligado.
Esses dados são armazenados num disco rígido, normalmente com uma alta capacidade para
que não existam problemas de falta de espaço.
Dessa forma, toda aplicação que de alguma forma precise manter algum tipo de
informação armazenada através do tempo e não possa fazer por meio de arquivos textos (por
uma série de limitações de crescimento, segurança e consistência) deve ter uma conexão com
banco de dados para que esse armazenamento, bem como a consulta aos dados, possa ocorrer.
Uma transação é uma unidade que preserva consistência. Requeremos, portanto, que
qualquer escalonamento produzido ao se processar um conjunto de transações
concorrentemente seja computacionalmente equivalente a um escalonamento produzindo e
executando essas transações serialmente em alguma ordem.
3 BANCOS DE DADOS RELACIONAIS
Um banco de dados relacional possui como entidade central tabelas, onde as colunas
armazenam os tipos de dados e as linhas um caso específico de dados, sendo chamada de tupla
ou registro. Também é importante o conceito de chave, que identifica unicamente um registro.
O modelo relacional é uma teoria matemática desenvolvida por Edgar Frank Codd para
descrever como as bases de dados devem funcionar. Embora esta teoria seja a base para o
software de bases de dados relacionais, poucos sistemas de gestão de bases de dados seguem
o modelo de forma restrita, e todos têm funcionalidades que violam a teoria, desta forma
variando a complexidade e o poder. A discussão se esses bancos de dados merecem ser
chamados de relacional ficou esgotada com o tempo, com a evolução dos bancos existentes.
Existem muitos bancos de dados sendo utilizados atualmente, porém, segundo uma
visão de mercado, eles podem ser divididos em dois grandes grupos:
Dentre os bancos de dados comerciais, três possuem um destaque maior devido a sua
relevância: o Oracle, que é um dos mais famosos do mundo, sendo indicado principalmente para
aplicações médias e grandes, onde a possibilidade de crescimento é muito importante; o
Microsoft SQLServer, que vêm ganhando importância; e o DB2 da IBM, que começa a ganhar
destaque.
Nos bancos de dados de distribuição livre se destacam o MySQL, uma das primeiras
iniciativas na área, que possui um grande alcance no mercado e vem evoluindo a cada ano, e o
PostGreSQL, que pode ser utilizado desde aplicações pequenas até médias, com uma série de
recursos que permite um crescimento razoável para soluções que a adotam.
4 OBJETO DO MATERIAL: MYSQL
O MySQL foi criado na Suécia por dois suecos e um finlandês, que têm trabalhado
juntos desde a década de 1980. Hoje seu desenvolvimento e manutenção empregam
aproximadamente 70 profissionais no mundo inteiro, e mais de mil contribuem testando o
software, integrando-o a outros produtos, e escrevendo a respeito dele.
Existem diversas formas de se trabalhar com os bancos de dados atuais, no que toca o
acesso às suas funcionalidades, iniciando desde interfaces texto, próximas dos terminais 10
existentes nos primeiros micros (e que ainda são tão poderosas e presentes em sistemas Linux),
passando por interfaces cliente, onde é necessário instalar algum tipo de cliente localmente
(como por exemplo, o Squirrel) ou ainda ferramentas de acesso remoto baseadas na web, cujo
maior expoente para o MySQL é o chamado phpMyAdmin.
Para os interessados em trabalhar com o banco MySQL e que não estão interessados
em perder muito tempo instalando os componentes individualmente, recomenda-se escolher um
dos instaladores para que ele forneça a infra-estrutura mínima. Ao final deste módulo seguem
alguns links para que as ferramentas possam ser baixadas e instaladas. Neste documento, será
utilizada a versão disponível pelo XAMPP, mas qualquer outra distribuição pode ser utilizada.
Numa instalação padrão, deve-se acessar o ambiente através do seguinte endereço:
http://localhost/phpmyadmin/
Uma vez selecionada alguma instância de banco de dados, todas as tabelas existentes
dentro dele serão listados no menu da esquerda. Escolher outro valor implica em atualizar o
valor, trocando as tabelas exibidas naquele momento. A parte da direita, por sua vez, é alterada
trazendo mais informações de cada tabela e operações gerais que podem ser feitas sobre os
dados de cada tabela. Dentre as possibilidades, vale destacar os diversos comandos que podem
ser realizados sobre as estruturas, como remoção e alteração, comandos esses que só vêm
servir de intermediários para os reais comandos, que continuam sendo escritos em SQL
(maiores informações a seguir).
13
Neste ponto já deve estar claro que a unidade básica de qualquer banco de dados
relacional é a tabela, sendo que o conjunto de tabelas (com suas definições de colunas e
chaves) define o chamado modelo relacional, que traz o mapeamento das diversas entidades do
sistema para um plano estrutural, permitindo que as informações possam ser guardadas em
forma tabular e recuperadas através de linguagens próprias para isso, como o próprio SQL que
será visto no próximo tópico.
14
No resultado, além do comando executado, é mostrada uma lista (ou tabela) com todos
os dados encontrados na busca, caso isso se aplique numa consulta. Esses dados são
mostrados de forma paginada, de tal forma que a navegação seja facilitada. Pode-se realizar
operações nos dados, como uma eventual consulta adicional ou mesmo a sua remoção, de
forma mais segura e controlada, se comparada com outras possibilidades, como a remoção
direta feita através de um comando Delete (que será visto em instantes).
16
Caso um erro no comando seja encontrado, será mostrada uma tela como a de cima,
indicando o erro e a provável linha em que o comando falhou. Além dos tradicionais erros de
sintaxe (palavras reservadas escritas erradas ou fora do lugar), os erros podem ser ocasionados
pela inexistência de uma coluna ou a utilização errada de um determinado label para consulta
naquele momento. Ao clicar no item Voltar, pode-se corrigir a consulta e executar novamente.
Um erro muito mais difícil de encontrar e também corrigir, é aquele relacionado ao desempenho
de uma consulta, pois operações no banco de dados são sempre caras de desempenho por
fazerem acesso ao disco.
6 O QUE É SQL
Ela possui uma sintaxe padrão que é implementada pela maioria dos bancos de dados,
porém cada banco de dados a aumenta da maneira que lhe é mais interessante ou que forneça
um maior número de recursos para os usuários, o que leva à situação de não ser tão fácil mudar
de um banco de dados para outro (portabilidade), principalmente por causa de detalhes ou
funções pré-definidas.
Vale destacar ainda que todas essas operações que foram descritas como sendo
realizadas de dentro de uma aplicação, podem ser realizadas diretamente de um terminal que
forneça acesso ao banco de dados. No nosso exemplo, esses comandos serão executados a
partir do phpMyAdmin, que fará as vezes de aplicação, servindo como “casca” para acesso ao
banco de dados desejado.
19
No segundo caso, de dentro de algum banco de dados já criado e que se tem acesso,
o seguinte comando deveria ser escrito:
Vale destacar ainda que a sintaxe do SQL não faz diferenciação entre maiúsculas e
minúsculas, sendo o seu uso indiscriminado.
Tipos de dados
A SQL padrão possui um grupo de dados básico e cada banco de dados implementa
uma série de variações delas, para permitir uma maior flexibilidade para o usuário. Tomando
novamente como exemplo o caso do PostGreSQL, os tipos de dados existentes mais comuns
são:
Tipo de Dado Descrição
TIME Hora
Nascimento DATE, 21
Altura REAL,
Filhos INTEGER,
Neste exemplo, é criada uma tabela que representa uma pessoa, com alguns atributos
que fazem referência aos dados de uma pessoa. O item de chave primária será explicado
abaixo, mas indica que o atributo não poderá ser repetido em nenhum outro registro desta
tabela, caso contrário um erro será devolvido e por fim, o modificador NOT NULL, indica que
esses campos são de preenchimento obrigatório.
Ao se executar esse comando, uma tabela sem dados com essa definição é criada e
está pronta para receber dados, ou seja, pronta para inserir novas pessoas no cadastro.
Definindo campos
Para cada atributo (que no modelo relaciona, chama-se coluna) que deverá existir
numa tabela, deve-se dar um nome, um tipo e opcionalmente um modificador, como por
exemplo, que esse atributo criado não possa ser vazio quando for inserido algum dado. Não é
interessante que esses campos tenham um nome muito grande, pois dificulta a sua posterior
utilização.
Chave primária
No exemplo, foi criada uma tabela para armazenar informações de produtos, cujo
campo chave é do tipo inteiro, não pode armazenar valores vazios e possui um valor interno que
permite ir incrementando o valor do próximo registro baseado no último que já foi colocado.
23
Chave estrangeira
Muitas vezes desejamos dividir os dados de uma tabela em várias outras para que não
aconteça a duplicação de dados no sistema, e uma maneira de se fazer isso é utilizando chaves
estrangeiras. Por exemplo, imagine que uma pessoa possa ter de um a três números de
telefone, mas só gostaríamos de colocar um atributo telefone na tabela principal, pessoa.
Uma solução para este caso é manter a tabela pessoa como ela está e criar uma nova
tabela, chamada telefones, como segue:
25
A inserção de dados numa tabela é uma das operações mais simples e importantes
que podem ser realizadas utilizando a SQL. É através dela que uma tabela pode ser populada
com novas informações para posterior acesso através de relatórios. Em geral, essas
informações serão preenchidas a partir de um formulário disponível ao usuário através de
alguma aplicação.
Uma vez que o usuário tenha digitado os dados nos respectivos campos, um botão de
confirmação é disparado, e os dados ali digitados devem ser traduzidos em código SQL antes de
serem enviados ao banco de dados para interpretação e execução. Uma vez que o comando
tenha sido executado com sucesso, uma nova linha na tabela estará inserida.
Alguns pontos merecem destaque neste comando: deve-se declarar qual a tabela em
que estão sendo inseridos os dados, bem como a ordem em que os atributos serão colocados (a
parte dos atributos é opcional, mas se não for colocada a ordem dos dados deve seguir a ordem
dos campos na tabela). Em seguida vêm os dados propriamente ditos, sendo que caracteres
devem vir entre aspas, o formato de data é Ano-Mês-Dia e o valor decimal utiliza ponto e não
vírgula. Além disso, todos os valores são separados por vírgula.
Nesse exemplo, o nome das colunas está explícito, o que permitiria que a ordem em
que os dados são inseridos fosse alterada conforme o desejo ou necessidade. Assim, eventuais
campos cujo preenchimento não é obrigatório poderiam ser omitidos ou ainda os valores padrão
poderiam ser adotados, como é o caso dos campos chave-primária com auto-incremento, que
quando omitidos pegam o último valor inserido acrescido de um.
Ainda em relação aos campos de auto-incremento (normalmente utilizados como
chave-primária), eles devem ser definidos diretamente na definição da tabela, indicando qual a
coluna que deverá ter esse tipo de comportamento:
No exemplo, foi criada uma tabela chamada produto, cujo campo chave-primária é o id,
do tipo inteiro, que não aceita valores NULL (chaves-primárias, por definição, não podem ter
valores vazios) e mais o modificador auto_increment, que indica que essa coluna poderá ser
incrementada automaticamente. Na prática, não será inserido qualquer valor nessa coluna,
fazendo com que o valor seja inserido conforme o último que já o fora.
27
Os valores podem ser inseridos diretamente nos respectivos campos e depois, ao final,
apertado o botão executar. Esse botão irá montar os dados conforme os comandos
demonstrados anteriormente e em seguida executar o comando no Sistema Gerenciador de
Banco de Dados. Existe ainda a opção de retornar para inserir um novo registro ou retornar para
a tela de entrada, para que uma nova opção possa ser feita. Essa possibilidade é especialmente
importante, pois dá uma visão gráfica dos comandos e evita que erros e inconsistências sejam
inseridos em alguma tabela.
7.2 Atualizando dados de uma tabela
Existem situações em que é desejado que um registro já inserido seja atualizado, com
alguns de seus valores modificados. Para esta situação existe o operador UPDATE, que atualiza 28
um determinado registro ou grupo de registros de uma tabela. É importante ressaltar que esta
operação irá atuar em todos os registros caso nenhuma restrição usando WHERE seja definida.
Assim, se quisermos modificar o número de filhos de todas as pessoas para 1, escreveríamos:
Neste exemplo, apenas um registro será modificado, pois estamos utilizando uma
chave-primária para restringir os registros que serão modificados. Maiores informações de como
montar uma cláusula WHERE serão dadas em breve, quando a parte de SELECT for discutida,
uma vez que o comportamento é mesmo em todos esses casos.
Pode-se atualizar mais de uma coluna por vez dentro do mesmo UPDATE, bastando
para isso separar as colunas com os novos valores usando vírgula (atenção para não confundir
com o uso do operador lógico AND que será discutido durante a parte do SELECT).
Por fim, pode-se montar o comando tomando como base os valores originais da
coluna, como no exemplo acima, em que o novo valor da coluna filhos foi definido tendo como
base o valor antigo e somado de 1.
Em geral, sempre que algum registro é modificado, ele é colocado no final da tabela,
mas não se pode usar esse comportamento como garantia de que o registro estará lá. Para
forçar e ter certeza de onde os dados serão colocados deve-se usar uma cláusula ORDER BY
(explicadas em detalhes em seguida) para indicar qual a ordem dos dados de saída. Outro ponto
de destaque está que apenas uma tabela por vez pode ter os seus dados alterados, não sendo
possível juntar as alterações de duas ou mais tabelas num mesmo comando.
Os dados serão mostrados numa tabela (que é a representação mais natural desse
conjunto de dados) com todas as colunas que a compõe e com algumas colunas adicionais no
início delas, indicando operações que podem ser realizadas com os registros. Para alterar uma
única linha, clica-se no ícone de um lápis, o que leva à seguinte página.
Repare que agora os campos estão todos preenchidos, com os valores originais já
existentes em cada coluna da tabela. Ao clicar em executar um comando UPDATE é montado e
executado no sistema, atualizando a informação. De novo, essa é apenas uma facilidade no
manuseio dos comandos. Durante a implementação desse código em aplicações, é necessário o
conhecimento desses comandos para que eles possam ser inseridos corretamente no código e
possam se comportar da maneira desejada.
Nesse caso, apenas o registro que tenha como CPF o valor especificado seria
removido da tabela. Operações desse tipo, baseadas em chave-primária, são muito mais
seguras, pois garantem que zero ou no máximo um registro será removido (pela própria
definição de chave-primária, que só permite a existência de uma por tabela), limitando eventuais
erros de digitação. Essa outra consulta poderia ser utilizada para remover determinados registros
da tabela telefones:
Como na tabela de telefones podem existir mais de um telefone para o mesmo CPF,
vários registros podem ser removidos com o mesmo comando. Um item importante para
ressaltar com esse comando é a importância de manter a consistência dos dados, ou seja, não
podem ser mantidos numa tabela dados de chave-estrangeira se os dados da chave-primária
correspondente na tabela inicial tenham sido removidos, causando um erro na consulta.
Idealmente, deve-se primeiro remover os dados das tabelas filhas para só depois remover os
dados da tabela onde a chave-primária foi definida.
Outro ponto importante seria adotar o conceito de transação, quer dizer, todos os
comandos de remoção deveriam ser executados com sucesso para que a operação resultasse
em sucesso, mas se ao menos um dos comandos desse erro, todo o processo seria abortado e
o estado original dos dados deveria ser remontado, mantendo assim a sua consistência. 33
Maiores informações de como montar uma cláusula WHERE serão dadas em breve,
quando a parte de SELECT for discutida, uma vez que o comportamento é mesmo em todos
esses casos. Outro ponto de destaque está que apenas uma tabela por vez pode ter os seus
dados removidos, não sendo possível juntar as remoções de duas ou mais tabelas num mesmo
comando.
Com a interface do phpMyAdmin, pode-se da mesma forma usá-la para rodar algum
tipo de comando que faz a remoção dos dados. A próxima tela exemplifica o acesso ao
comando.
34
35
Cada comando existente para uma das linhas é traduzido para um código SQL de
remoção equivalente e uma pergunta, se o usuário realmente efetivar a operação e remover
todos os registros mencionados. Ao apertar o botão com o valor de Sim, todos os registros são
removidos da tabela.
Caso o desejo seja de remover todos os dados de uma tabela (para limpá-la e permitir
que o sistema seja reiniciado), pode-se usar um comando alternativo ao DELETE (que quando
não possui parâmetros remove todos os dados).
TRUNCATE pessoa
O comando TRUNCATE remove todos os dados da tabela, só que ele faz isso
apagando a tabela e recriando-a em seguida, o que torna o processo mais rápido (o que é
sensível em tabelas com uma grande quantidade de registros). O comando terá um
37
comportamento especial quando a tabela contiver chaves estrangeiras, necessitando que a
estrutura de remoção em cascata tenha sido usada, garantindo que as tabelas que forneceram
chaves a ela também sejam removidas. Caso isso não seja o real, a operação é cancelada com
erro (o equivalente ao encontrado com o comando DELETE (na prática, o TRUNCATE é um
DELETE mais eficiente e que não suporta restrições na remoção, apagando todos os dados).
8 USO DE ÍNDICES
Todos os tipos de bancos de dados podem ter seu desempenho melhorado pelo uso
de índices. O tipo mais comum de índice é uma lista ordenada dos valores de uma coluna de 38
uma tabela, contendo ponteiros para as linhas associadas a cada valor. Um índice permite que o
conjunto das linhas de uma tabela que satisfazem determinado critério seja localizado
rapidamente.
Os índices são utilizados para encontrar registros com um valor específico de uma
coluna rapidamente. Sem um índice o MySQL tem de iniciar com o primeiro registro e depois ler
através de toda a tabela até que ele encontre os registros relevantes. Quanto maior a tabela,
maior será o custo. Se a tabela possui um índice para as colunas em questão, o MySQL pode
rapidamente obter uma posição para procurar no meio do arquivo de dados sem ter que varrer
todos os registros. Se uma tabela possui 1000 registros, isto é pelo menos 100 vezes mais
rápido do que ler todos os registros seqüencialmente. Note que se você precisar acessar quase
todos os 1000 registros seria mais rápido acessá-los seqüencialmente porque evitaria acessos
ao disco.
40
ALTER TABLE teste ADD INDEX teste_index (help_category_id)
O comando acima é o gerado a partir das informações inseridas dentro dos campos do
formulário auxiliar, indicando que a tabela teste foi modificada para suportar agora um novo
índice, chamado teste_index, e que deve atuar sobre o campo help_category_id.
9 BUSCANDO DADOS
41
SELECT
FROM
pessoa
Neste exemplo, todos os registros já inseridos na tabela pessoa são retornados para
uma variável, dependendo do programa ou então exibidos na tela, caso esteja sendo utilizado
algum ambiente de acesso aos dados diretamente.
Esse tipo de consulta é muito simples, pois não limita quais dados serão retornados, o
que pode, para casos em que a tabela possua muitos registros, retornar uma quantidade de
dados impossível de ser tratada pelo programa que executou a consulta.
SELECT 42
nome,
idade
FROM
pessoa
pessoa.*
FROM
pessoa;
43
Ou ainda:
SELECT
pessoa.cpf,
pessoa.nome,
pessoa.nascimento,
pessoa.altura,
pessoa.filhos
FROM
pessoa;
SELECT 44
p.cpf,
p.nome,
p.nascimento,
p.altura,
p.filhos
FROM
pessoa p;
Devido a otimizações e cachês que o sistema gerenciador de banco de dados faz nas
consultas, deve-se padronizar qual padrão de escrita utilizar, pois dois comandos que produzam
o mesmo resultado podem ser entendidos como diferentes e ocuparem mais região de memória
que o necessário. Dessa forma, os sistemas devem adotar um padrão de escrita (prefixando com
o nome da tabela ou um mesmo apelido) para garantir que eles fiquem armazenados como um
único e igual comando.
9.3 A cláusula WHERE
Em conjunto com o operador SELECT, pode ser utilizada a palavra WHERE, que
permite fazer uma restrição dos registros a serem retornados pela consulta. Após o WHERE, 45
podem ser colocadas várias condições que serão operadas sobre os registros, só retornando os
dados que realmente satisfarão essas condições. Por exemplo, retornar todas as pessoas com
altura maior que 1,60m:
SELECT
FROM
pessoa
WHERE
SELECT
pessoa.nome
FROM
pessoa
WHERE
pessoa.filhos = 3
Sendo que o resultado conterá apenas o nome das pessoas que obedeçam ao critério
de igualdade desejado. O comando acima pode ser reescrito da seguinte forma, adotando a 46
nomenclatura de apelidos:
SELECT
p.nome
FROM
pessoa p
WHERE
p.filhos = 3
Nesse comando, e somente nele, a tabela pessoa vai utilizar o nome temporário “p”
para referenciar a tabela em questão para retornar suas respectivas colunas, seja para indicar
dados de quais colunas retornar, seja para utilizar nas restrições da parte WHERE, simplificando
um pouco a escrita do comando (o que pode ser útil em comandos complexos).
SELECT
47
nome,
idade
FROM
pessoa
WHERE
O primeiro ponto é que sempre que for feita uma busca de cadeias de caracteres em
alguma coluna do banco, o termo buscado deve vir entre aspas simples. O segundo ponto é que
ao utilizar o operador LIKE, busca-se algum termo dentre os valores da coluna nome da tabela
pessoa que tenham a cadeia TES, em qualquer ponto da busca. Ela pode ser modificada para
algo como:
SELECT
nome,
idade
FROM
pessoa
WHERE
nome LIKE 'TES%'
No exemplo acima, apenas o termos que começarem por TES é que serão retornados
corretamente pela consulta. Dessa forma, o caractere especial % pode ser utilizado na tentativa
de se casar qualquer conjunto de caracteres, em diversas posições, dentro de uma coluna.
48
Vale lembrar que tudo que foi mostrado relacionado à cláusula WHERE para o
SELECT vale também para os comandos já vistos de atualização (UPDATE) e remoção
(DELETE), fazendo com que os comandos não atuem em todos os registros da tabela, mas
somente naqueles em que a condição é satisfeita, limitando o conjunto de dados impactados.
Junto com a cláusula WHERE podem vir um número qualquer de condições para se
satisfazer a consulta dos registros, sendo que essas condições devem vir separadas por
operadores lógicos. Assim, para retornar algum registro, ambos os lados da expressão (expr1
AND expr2) devem ser satisfeitos, ao passo que apenas um dos lados da expressão (expr1 OR
expr2) precisa. Juntando os exemplos acima, teríamos algo como:
SELECT
FROM
pessoa
WHERE
(altura > 1.60)
AND (filhos = 3)
AND: E lógico. Avalia as condições e devolve um valor verdadeiro caso ambos sejam
corretos, sendo muito utilizado em conjuntos de condições de uma cláusula WHERE.
SELECT
nome,
idade
FROM
pessoa
WHERE
idade >10
No exemplo, apenas registros que tenham o valor da coluna idade entre 10 e 20 serão
retornados.
SELECT
nome,
idade
FROM
pessoa
WHERE 50
idade = 10
OR idade = 20
NOT: Negação lógica. Para valores que retornariam verdade, retorna falso e para
aqueles que seriam falsos, retornaria verdade.
Esses operadores estabelecem algum tipo de relação de grandeza entre duas partes,
normalmente uma coluna e um valor passado como parâmetro ou em algumas situações entre
duas colunas do banco de dados. Segue um resumo dos principais:
Operador Descrição
< Menor que
Porém, é preciso fazer o caminho inverso, ou seja, dadas duas tabelas, de alguma
forma pegar seus dados e montar um relacionamento que faça sentido naquele contexto. Como
exemplo, podemos tomar a tabela de pessoas e de telefones mencionadas acima. Caso
queiramos pegar todos os telefones de uma determinada pessoa como deveríamos proceder?
Simplesmente fazendo uma consulta à tabela de telefone não seria muito útil, pois ao
invés de termos os nomes das pessoas, teríamos apenas seus números de CPF, que de modo
geral são ruins para os seres humanos identificarem-se uns aos outros. O ideal seria colocar o
nome da pessoa ao lado do respectivo número de telefone, mas o problema reside no fato dos
nomes estarem em outra tabela.
O jeito mais simples de fazer isso é utilizar o chamado “produto cartesiano”, que
consiste em pegar cada um dos registros de uma tabela e relacionar com cada uma das linhas
da outra tabela. Vale destacar ainda que o resultado de uma junção seja a união de todos os
atributos das tabelas em questão. A sintaxe é muito simples e seria:
SELECT
FROM
SELECT
FROM 53
pessoa,
telefones
Em ambos os casos o resultado produzido será o mesmo, porém não muito útil nem
com um sentido muito claro. Pois, se numa tabela tivermos quatro registros e na outra oito, o
resultado produzido será de 32 registros (uma multiplicação simples), mas alguns telefones
estarão associados a pessoas erradas. Nesse ponto que entra a utilização do conceito de
chaves. Um exemplo modificado seria:
SELECT
FROM
pessoa,
telefones
WHERE
pessoa.cpf = telefones.cpf
Não é obrigatório fazer as comparações utilizando apenas as chaves das tabelas, mas
é onde o processo ganha mais força e fica evidente o modelo relacional. Existem operações em
que se pode relacionar tabelas em que existam chaves válidas em apenas umas das tabelas,
retornando os dados da outra tabela como valores vazios ou simplesmente substituindo por
outras informações de maior interesse. Um cuidado que se deve ter, de qualquer forma, é o de
garantir a consistência das chaves, que pode ser comprometida quando algum registro é inserido
sem que todos os pontos necessários o sejam, ou quando alguma remoção ou alteração mexeu
em apenas alguns pontos e não em todos os necessários.
11 USANDO A INTERFACE GRÁFICA PARA RODAR COMANDOS SELECT
Como já visto anteriormente, ao clicar na aba SQL depois de escolher qualquer tabela,
é possível executar o comando desejado no campo mostrado (seja ele um SELECT ou qualquer
outro comando SQL válido). Na parte mais à direita, existe um assistente que serve como
indicador de quais colunas existem na tabela, e podem ser incluídos na busca. Ao clicar em
Executar, o resultado da operação é mostrado na próxima página, da mesma forma que foi
exibida na parte referente à exibição dos dados existentes na tabela.
56
Pode-se inclusive, com esses dados, realizar outras operações sobre a tabela, como a
remoção de algum registro, a alteração e remoção de um registro (caso não envolva outras
tabelas) e a ordenação dos dados segundo qualquer coluna, bastando para isso clicar no título
da coluna desejada (o comando SELECT vai ser atualizado para contemplar o novo modificador,
que será um ORDER BY), que será visto em seguida e serve para ordenar os dados retornados
de uma consulta.
Essa é a interface básica para busca de dados, mas caso seja necessário, pode-se
utilizar uma tela ainda mais avançada e detalhada para incluir informações de busca numa
tabela específica, acessando o item Procurar através da aba que fica na parte superior da tela.
Ao clicar nesse item, chega-se à seguinte configuração de tela, que possui o mesmo padrão
visto anteriormente:
57
58
12 ORDENANDO O RESULTADO DE UMA CONSULTA
Usa-se o operador ORDER BY para ordenar os registros selecionados com uma ordem
específica. Devem ser informadas as colunas que serão utilizadas na ordenação. Podem ser 59
informadas diversas colunas, sendo que caso ocorra empate entre os valores da próxima coluna,
a próxima será utilizada para desempatar.
SELECT
nome,
idade
FROM
pessoa
ORDER BY
nome
Pode-se, opcionalmente, incluir o termo DESC ao lado de alguma coluna, para que o
resultado seja invertido (de ordem crescente, passa-se para ordem decrescente).
SELECT
nome,
idade
FROM
pessoa
ORDER BY 60
nome,
idade DESC
COUNT(1),
idade
FROM
pessoa 61
GROUP BY
idade
SELECT
COUNT(1) AS quantidade,
idade AS idade_pessoas
FROM
pessoa
GROUP BY 62
idade
Nesse exemplo, a primeira coluna, que representa a contagem dos dados, será
chamada no resultado exibido por quantidade e a coluna idade foi trocada para exibir o título de
idade_pessoas, tudo isso ao utilizar o operador AS.
Utiliza-se o operador DISTINCT para selecionar dados sem repetição. Ao aplicar esse
modificar a coluna, os valores retornados para ela deverão aparecer uma única vez, descartando
eventuais repetições, mas caso o modificador seja aplicado a um conjunto de valores, apenas a
junção de todos os valores sendo iguais é que tornarão a linha não exibível para a busca.
SELECT
63
AVG (nota)
FROM
aluno
WHERE
codigo = 10
A função AVG, acima, é utilizada para calcular a média dos valores de uma
determinada coluna. No exemplo acima, todas as notas do aluno cujo código seja 10 serão
somadas e divididas pelo número e notas retornadas na busca.
SELECT
COUNT(1)
FROM
aluno
WHERE
código = 10
A função COUNT () retorna o número de registros encontrados dentro de um SELECT.
No exemplo acima, serão contadas o número de notas existentes para o aluno de código 10 e
mostradas na tela.
SELECT
64
SUM(nota)
FROM
aluno
WHERE
código = 10
SELECT
MAX(nota)
FROM
aluno
A função MAX () retorna o maior valor de uma determinada coluna. Acima, o valor da
maior nota será retornado.
SELECT
MIN(nota)
FROM
aluno
65
A função MIN () retorna o menor valor de uma determinada coluna. Acima, o valor da
menor nota será retornado.
13 TÓPICOS SELECIONADOS, VIEWS E TRIGGERS
66
VIEWS (ou visões em uma tradução livre) pode ser entendida como uma tabela virtual,
composta pelo resultado de uma consulta a outras tabelas ou mesmo outras VIEWS. Ao
contrário das tabelas normais, uma visão não faz parte fisicamente do banco, existindo apenas
dinamicamente a partir das demais tabelas. Alterações dos dados nas tabelas refletem as
alterações também na visão.
CREATE VIEW
67
pessoa_maioridade AS
SELECT
nome
FROM
pessoa
WHERE
idade > 18
68
13.1.2 Como utilizar um view
A utilização de uma view segue o mesmo padrão que a busca de dados em tabelas
físicas já existentes:
SELECT
FROM
pessoa_maioridade
O SELECT acima retornaria todos os registros da visão, mas somente aqueles que
fizessem sentido com a consulta que trouxe os dados originais da tabela pessoa. Lembrando
que essa visão poderia ser utilizada como parte integrante de uma nova consulta mais complexa.
Uma restrição no que toca a construção de visões é que a elas não se pode associar
qualquer tipo de trigger, uma vez que as triggers só podem atuar sobre operações em tabelas
que existam fisicamente, e não estruturas dinâmicas.
13.2 O que é e para que serve um trigger
Suporte a triggers foi incluído com a versão MySQL 5.0.2. Uma trigger é um objeto de
base que é associado com uma tabela e é ativado quando um evento especial acontece numa 69
tabela. Por exemplo, sempre que um INSERT for realizado numa determinada base, pode-se
desejar criar outro registro numa outra tabela.
Triggers são ativadas por comandos SQL. Elas não são ativadas por mudanças em
tabelas feitas por APIs que não transmitem comandos SQL ao servidor de banco, como
chamadas diretas a partir de métodos escritos em JAVA.
O comando acima cria uma nova trigger, ficando amarrada à tabela pessoa, devendo
fazer referência a uma tabela permanente (que não é removida ao final de uma operação ou
mesmo uma VIEW). Deve-se dar um nome à estrutura criada, bem como o momento em que a
ação é executada (no exemplo, sempre antes que um novo registro for inserido na tabela
pessoa). Sempre que essa condição for satisfeita, para cada linha existente na tabela pessoa, a
coluna id da tabela será alterada para o seu valor original e mais o valor novo do registro sendo
inserido.
Uma aplicação clássica para o uso de triggers é a criação e uso de logs sempre que
alguma operação crítica for realizada, pois garante que toda e qualquer modificação seja
efetuada. Um cuidado que se deve ter é não onerar demais a tabela com muitas triggers,
especialmente em tabelas cuja quantidade de dados seja muito grande, pois o tempo para 70
realizar todas as operações pode tornar o processo como um todo muito lento, deixando o banco
de dados lento, e conseqüentemente a aplicação que a olha, tornando a aplicação mais lenta.
Detalhando um pouco mais a criação das triggers, a parte inicial é sempre a mesma:
CREATE TRIGGER nome_trigger. O próximo ponto é indicar em que momento o código será
realizado, se antes ou depois que uma determinada ação na tabela será realizada, sendo que as
opções possíveis são BEFORE ou AFTER, quer dizer, o código associado será executado antes
ou depois que a operação de teste for realizada. As ações que disparam a trigger podem ser:
INSERT, UPDATE ou DELETE.
O próximo ponto é identificar qual o código amarrado à trigger que será executando
quando a condição correspondente for satisfeita, sendo que para cada linha já existente na
tabela, o código associado será executado e é por conta disso que para tabelas muito grandes,
essa operação pode ser demorada. Em algumas triggers, não se deseja executar uma operação
para cada registro, mas tão somente inserir uma nova linha em outra tabela (o exemplo de logar
informações, novamente).
Para diferenciar a nova linha sendo inserida e as linhas antigas de cada iteração,
usam-se os identificadores especiais NEW (para a nova linha) e OLD para cada linha já existente
na tabela numa dada iteração. Por representarem uma tupla, pode-se usar o operador ponto
para em seguida acessar qualquer coluna da tabela.
Para remover uma trigger, pode-se usar o comando DROP, da mesma forma que se
remove outras estruturas do banco:
71
Acima, os dados sendo exibidos diretamente na tela. Além dos comentários (colocados
depois dos dois traços), segue-se a definição da tabela com eventuais modificações de valores
padrão e os comandos de inserção com os valores que já existiam ali anteriormente e que
poderão ser recuperados ao recriar o banco como um todo. Ao escolher a opção de inserção
completa, todas as colunas são colocadas explicitamente no comando.
74
75
Nessa tela deve-se informar qual o arquivo de backup deve ser utilizado para recuperar
as configurações de uma base. Um item que merece destaque é o que permite oferecer
compatibilidade de uma importação com outros bancos de dados, quer dizer, pode-se importar
bases cujo dump fora feito originalmente em outro tipo de bancos de dados e agora trazido para
um banco do tipo MySQL.
De forma alternativa, pode-se, ao invés de importar todas as estruturas de uma vez só,
utilizar as interfaces anteriores para executar apenas trechos de código para criar tabelas e
inserir registros nelas. Vale lembrar que se pode executar vários comandos de uma vez só,
desde que eles sejam separados por ponto-e-vírgula, como no exemplo abaixo:
77
78
A aba privilégios leva a todos os usuários configurados para acessar essa instância de
banco de dados.
79
Por conta disso, devem ser criados outros usuários com acesso mais restrito e
específico para acessar a base, para fazer apenas operações bem definidas, como consultar ou
inserir dados. O cadastro de um novo usuário é feito ao se clicar no item “Abrir nova janela do
phpMyAdmin”, o que leva à seguinte janela:
80
Na parte de cima são listadas as configurações do usuário, como seu nome de usuário,
servidor em que ele pode se conectar e senha de acesso. Mais abaixo (na próxima figura é
mostrado em detalhes) deve-se indicar todas as permissões que este usuário possua:
81
Dados: Quais operações o usuário pode fazer nos dados, sendo as principais
relacionadas aos comandos vistos anteriormente (INSERT, UPDATE, DELETE e
SELECT);
Estrutura: Indica quais operações nas estruturas podem ser realizadas, como alterações,
criações e remoções;
83
http://www.conceptia.com.br
http://www.imaster.com.br
Site com diversas colunas nas mais variadas tecnologias de informação. Destaque especial para
a coluna sobre PHP, pois mostra diversos exemplos de aplicação e casos reais de programação
em PHP, além de falar de diversas nuances da linguagem, explicando como tirar o máximo
proveito do recurso.
http://www.apache.org
Local onde grandes projetos de software livre estão hospedados e podem ser obtidos por
download sem nenhum tipo de custo. Apenas para citar alguns dos projetos existentes: o
Servidor Web Apache, o Servidor de Aplicação Java Tomcat e o Ambiente de Desenvolvimento
de JSP, Struts.
http://www.mysql.com/
Um dos bancos de dados livres mais famosos e utilizados no mundo, sendo normalmente
utilizado em conjunto com o PHP para o desenvolvimento de soluções completas para pequenos
e médios sistemas. Está atualmente em sua versão 5.0 e pode ser obtido gratuitamente do site.
A maior diferença em relação ao PostGreSQL está no tamanho das bases de dados que cada
um suporta, sendo o PostGreSQL ainda mais robusto para sistemas críticos e de maior tamanho.
http://www.phpmyadmin.net/home_page/index.php
Site do projeto phpmyadmin, onde se pode obter maiores informações do projeto, bem como
fazer o download de versões mais recentes do projeto.
84
http://www.w3schools.com/sql/default.asp
Tutorial em inglês simples, completo e didático sobre a linguagem de acesso ao banco de dados
SQL. Traz muitos exemplos e casos de estudo com exemplos de tabelas e consultas.
http://www.criarweb.com/sql/
Tutorial em português sobre SQL, sendo bem completo e separado por artigos, o que permite
uma leitura não linear, mas focada em itens de maior interesse por parte dos interessados.
http://www.conceptia.com.br
http://pt.wikipedia.org/wiki/Banco_de_dados
Site introdutório que traz várias informações teóricas e de base para interessados em começar a
trabalhar com os fundamentos da tecnologia.
http://www.easyphp.org/
Um dos mais famosos instaladores para o pacote de desenvolvimento web usando PHP, MySQL
e Apache. Permite com poucos passos instalar e colocar para executar um ambiente de
desenvolvimento. Não recomendado para ambientes de produção.
http://www.apachefriends.org/en/xampp.html
Outro dos mais famosos instaladores para o pacote de desenvolvimento web usando PHP,
85
MySQL e Apache. Permite com poucos passos instalar e colocar para executar um ambiente de
desenvolvimento. Este pacote vem com uma série de projetos livres e componentes que podem
facilitar em muito o trabalho de se desenvolver uma aplicação. Não recomendado para
ambientes de produção.
http://www.imaster.com.br
Site com diversas colunas nas mais variadas tecnologias de informação. Destaque especial para
a coluna sobre bancos de dados, pois mostra diversos exemplos de aplicação e casos reais de
programação e integração com aplicações que utilizando bancos de dados, além de falar de
diversas nuances da linguagem, explica como tirar o máximo proveito do recurso.
http://www.mysql.com/
Banco de dados objeto deste trabalho e o qual foi baseado todos os pontos específicos do
material. Muito utilizado em diversos tipos de projetos, sendo o preferido na maioria dos projetos
livres. Muito fácil de instalar e manter e a cada nova versão possui um incremento em suas
funcionalidades. Nasceu como software livre, mas cresceu e foi adquirido pela Sun, que
atualmente o mantém.
http://www.oracle.com/global/br/index.html
O banco de dados mais famoso do momento. Recomendado para aplicações médias e grandes,
onde o suporte e manutenção, bem como a necessidade de escalabilidade, são fundamentais
para o processo. Possui custos altos de licença, mas permite a instalação para estudo.
http://www.postgresql.org/
Banco de dados livre, usado cada vez mais em aplicações críticas e onde o desempenho ou o
86
tamanho da aplicação pode aumentar, mas onde existam limitações de custo (para a
implantação de uma solução Oracle, por exemplo), ao mesmo tempo em que possui uma
infinidade de recursos avançados e de administração. Recentemente lançou uma versão nativa
para uso no ambiente Microsoft Windows.
http://www.conceptia.com.br
http://pt.wikipedia.org/wiki/Banco_de_dados
Site introdutório que traz várias informações teóricas e de base para interessados em começar a
trabalhar com os fundamentos da tecnologia.
http://www.imaster.com.br
Site com diversas colunas nas mais variadas tecnologias de informação. Destaque especial para
a coluna sobre bancos de dados, pois mostra diversos exemplos de aplicação e casos reais de
programação e integração com aplicações que utilizando bancos de dados, além de falar de
diversas nuances da linguagem, explicando como tirar o máximo proveito do recurso.
http://www.mysql.com/
Banco de dados objeto deste trabalho e o qual foi baseado todos os pontos específicos do
material. Muito utilizado em diversos tipos de projetos, sendo o preferido na maioria dos projetos
livres. Muito fácil de instalar e manter e a cada nova versão possui um incremento em suas
funcionalidades. Nasceu como software livre, mas cresceu e foi adquirido pela Sun, que
atualmente o mantém.
Destaque para o uso de índices, a razão de usá-los e como criá-los usando o banco de dados
87
MySQL.
http://www.conceptia.com.br
http://www.php.net
http://www.imaster.com.br
Site com diversas colunas nas mais variadas tecnologias de informação. Destaque especial para
a coluna sobre PHP, pois mostra diversos exemplos de aplicação e casos reais de programação
em PHP, além de falar de diversas nuances da linguagem, explicando como tirar o máximo
proveito do recurso.
http://www.apache.org
Local onde grandes projetos de software livre estão hospedados e podem ser obtidos por
download sem nenhum tipo de custo. Apenas para citar alguns dos projetos existentes: o
Servidor Web Apache, o Servidor de Aplicação Java Tomcat e o Ambiente de Desenvolvimento
de JSP, Struts.
http://www.postgresql.org/
88
Um dos bancos de dados livres mais famosos e utilizados no mundo. Possui como característica
marcante ser objeto-relacional, quer dizer, pode tanto trabalhar na perspectiva dos bancos de
dados relacionais (com tabelas na sua estrutura básica), bem como com objetos, trazendo uma
série de benefícios da orientação a objetos. Está atualmente em sua versão 8.3 e pode ser
obtido gratuitamente do site.
http://www.mysql.com/
Um dos bancos de dados livres mais famosos e utilizados no mundo, sendo normalmente
utilizado em conjunto com o PHP para o desenvolvimento de soluções completas para pequenos
e médios sistemas. Está atualmente em sua versão 5.0 e pode ser obtido gratuitamente do site.
A maior diferença em relação ao PostGreSQL está no tamanho das bases de dados que cada
um suporta, sendo o PostGreSQL ainda mais robusto para sistemas críticos e de maior tamanho.