Escolar Documentos
Profissional Documentos
Cultura Documentos
Introdução
Instalando MySql
Primeiros passos com MySql
Lista de contatos
Populando uma tabela
Pesquisando uma tabela
Controle de vendas
Atualizando e apagando registros
Índices
Junções
Clínica Odontológica
Melhorando consultas - agrupando e mais
Visões
Mais funções
Transações
Normalização
Introdução
Ao final do livro, o leitor deverá ser capaz de criar uma nova base de
dados, manipulá-la (inserir, apagar e modificar dados) e fazer consultar à
mesma, utilizando a linguagem SQL.
Instalando MySql
Neste livro, usaremos a versão 5.6 do MySql, que pode ser baixada
gratuitamente no site mysql.com.
Será preciso fazer login com uma conta do site da Oracle e, caso
você não possua uma, poderá criá-la ao escolher fazer download.
Uma lista de contatos nada mais é que uma tabela, que guarda um
conjunto de informações relacionadas de alguma forma entre si.
'28/02' é um dado.
Para eliminar uma base de dados, será preciso ter privilégio global
DROP.
Caso você não saiba qual a base de dados em uso, pode usar o
comando SELECT database():
Numa lista física cada nome fica limitado pelo espaço que temos no
papel, mas numa base de dados, teoricamente, não há limites para este
campo.
Mais tarde, veremos como tratar este tipo de situação; por hora,
imaginemos que ao se preencher o nome (ou qualquer outro campo) se
utilizará apenas dados aceitáveis.
Passemos a telefone.
Existem muitas razões para essa escolha, que ficarão claras mais
adiante, por hora vamos aceitar o fato que telefone é do tipo caracter e
que tem um tamanho 11, ou seja podemos colocar 11 caracteres nesse
campo.
O leitor mais atento pode pensar que não haverá espaço para o
código internacional, o que impede adicionar um contato de outro país, o
que poderia ser desejável.
Este campo indica qual o grau de relação que temos com o contato.
O comando que cria uma tabela, na sua forma mais simples, tem a
seguinte sintaxe:
Para facilitar nosso trabalho, uma vez que vamos fazer muitas
referências a essa tabela, iremos chamá-la simplesmente lista.
Existe outro tipo que pode ser utilizado para dados do tipo caracter,
chamado CHAR(<tamanho>).
Para ter certeza que a tabela foi criada, você pode usar o comando
SHOW TABLES, que irá mostrar todas as tabelas existentes na base de
dados em uso.
Usando DESCRIBE
Se você quiser ver a estrutura de uma tabela, pode usar o
comando que descreve sua estrutura: DESCRIBE <nome da tabela>.
O campo key indica se o campo é uma chave, o que será visto mais
tarde.
Lista(nome:string(50),telefone:string(11),nascimento:date,email
:string(60),relacionamento:string(1),sexo:string(1))
Como este é o tipo padrão para novas bases criadas na versão 5.6
(e posteriores), não nos preocupamos em especificar este parâmetro ao
criar a tabela.
Nossa tabela lista está vazia, ou seja, não possui nenhum registro,
uma vez que não inserimos nenhuma informação na mesma.
Veja que o MySql nos informa que 1 registro (row) foi inserido.
Aqui, a ordem dos campos deve ser a mesma que utilizamos no
momento em que definimos nossa tabela.
A ordem dos nomes dos campos deve ser igual à ordem dos valores
em VALUES, mas não precisa respeitar a ordem dada na criação da
tabela.
Você não pode, em nenhum caso, inserir um novo registro omitindo
o valor de um campo que foi marcado como NOT NULL, ou receberá uma
mensagem de erro.
Isto porque nome foi definido como NOT NULL e nós não
estabelecemos um valor padrão (default) para o mesmo.
Ao abrir o arquivo, você notará que campos com valores nulos são
representados por \N.
MID retorna uma string contida dentro de outra string, seu primeiro
argumento é a string de origem, o segundo é a posição do primeiro
caracter dentro dessa string e o terceiro o número de caracteres a ser
retornado.
A função RIGHT retorna os últimos n caracteres de uma string.
= igualdade
<> desigualdade
> maior que
>= maior ou igual
< menor que
<= menor ou igual
BETWEEN compara faixa de valores
IN compara com uma lista de valores
LIKE compara com um padrão
AND, && operação E lógica
OR, || operação OU lógica
& E binário
| OU binário
IS NULL compara com nulo
IS NOT NULL compara com 'não nulo'
Isto porque, uma vez que cpf identifica unicamente cada registro na
tabela Cliente, não pode ter valores nulos, caso contrário poderíamos ter
dois clientes com o mesmo valor (nulo) na chave primária e, assim, não
poderíamos identificá-los unicamente por meio desta chave.
Definimos todos os campos como NOT NULL, uma vez que a chave
primária não pode ser nula e também não faz sentido ter um produto sem
descrição, quantidade ou preço.
Podemos, portanto, ter valores entre 00,00 até 99,99, o que nos
parece adequado no momento.
Os tipos inteiros podem ser definidos com ou sem sinal, sendo por
padrão com sinal e, se quisermos sem sinal (só números maiores ou
iguais a zero) devemos colocar o modificador UNSIGNED após o tipo
escolhido.
Uma vez que nossa chave primária é constituída por vários campos,
poderíamos considerar dar um nome à mesma, para facilitar a referência
futura à chave.
Observe que preço, que foi definido como DECIMAL(4,2), pode ter
no máximo duas casas decimais, mas pode ser inserido como um número
sem casas decimais (devemos sempre respeitar o limite de algarismos,
neste caso 4 no total e 2 após a vírgula) e que usamos ponto como
separador da pate inteira e decimal (em vez da vírgula).
Criando instâncias de relacionamentos
Em nossa tabela isto não seria possível porque tanto cliente quanto
produto fazem parte da chave primária de Compra e não são permitidos
valores nulos dentro de uma chave primária.
Como os nomes dos campos nas tabelas são diferentes entre si,
esta notação mais completa não seria necessária ( poderíamos, por
exemplo, ter escrito cpf=cliente), mas seu uso é sempre recomendado
para evitar ambiguidade, deixando a leitura do comando SQL mais clara.
Uma vez que definimos alias para o nome de uma tabela, devemos
sempre usar este alias ao se referir à tabela (naquele comando em que o
alias foi definido).
Você pode ver a ordem natural com que os registros foram inseridos
numa tabela simplesmente usando um comando SELECT sem especificar
uma ordem (ORDER BY).
Apagando com DELETE
Tome muito cuidado para não usar este comando sem a cláusula
WHERE, caso contrário todos os registros da sua tabela serão apagados.
Você poderia pensar, por que não criar um índice para todas as
colunas da tabela?
Claro que esta situação não existiria se, ao criarmos a tabela Lista,
tivéssemos especificado que relacionamento é uma chave estrangeira que
referencia código em Relacionamento, como fizemos quando criamos a
base de dados Loja.
Este tipo é uma união entre uma junção LEFT e uma RIGHT.
ATENÇÃO: O comando SELECT, como já visto, é usado para consultar uma base de dados,
o que também é chamado fazer uma query ou uma pesquisa na base.
Como temos uma tabela em nosso exemplo cujo nome é Consulta e também vários campos
chamados consulta fazendo referência a esta tabela, neste capítulo e seguintes, ao falarmos
do comando SELECT, utilizaremos o termo pesquisa ou query, de modo a evitar confusão.
Observe que, no campo id, colocamos null para indicar que não
iremos preencher este campo, que é de incremento automático.
Na linha 4, entretanto, colocamos o valor 10 para este campo,
indicamos que desejamos que este seja o valor utilizado ao inserir o
registro.
Este valor foi usado na própria linha, como valor a ser utilizado pelo
campo tipo daquele registro sendo inserido e também foi utilizado na linha
seguinte para inserir outro registro (do mesmo tipo de serviço).
Veja que podemos usar tais funções sem usar uma cláusula
GROUP BY, nesse caso temos o resultado para todos os registros da
tabela, como fizemos, em exemplos anteriores, ao usar COUNT para
contar o número de registros em uma tabela.
HAVING
Você viu que podemos ter um SELECT dentro de outro, seja na lista
de campos a serem retornados, numa cláusula WHERE, enfim,
basicamente em qualquer parte da pesquisa.
Existem ainda dois outros operadores - ANY e ALL - que podem ser
usados com pesquisas aninhadas.
Em ambos, testamos uma expressão contra todos os registros
retornados por uma pesquisa.
Por exemplo:
Imagine que vamos criar uma base de dados com os dados dos
funcionários de uma empresa.
Para isso, criamos visões de uma tabela, que são como tabelas
virtuais, pois não existem fisicamente, mas podem ser consultadas como
se fossem tabelas.
Uma tabela está na NF2 quando, além de estar na NF1, não possui
dependências parciais.