DDL - Introdução
Sumário (4ª aula) DDL (Data Definition Language) Creates Alters Drops Index Unique Keys e Foreign Keys
DDL Data Definition Language ou Data Description Language (DDL) É uma linguagem para definir estruturas de dados. O termo DDL foi introduzido devido ao modelo de banco de dados Codasyl. Mais tarde, o termo DDL foi usado para referenciar um subconjunto SQL. Atualmente, é utilizada no senso geral para referir-se a qualquer linguagem formal para descrever dados ou estruturas de informação Ex: XML schemas.
Create Table Utilizado para criar novas tabelas no banco de dados CREATE [TEMPORARY] TABLE [IF NOT EXISTS] nome_da_tabela ( lista_de_colunas ) engine=engine; Letrinhas miúdas: O que está entre [ ] é opcional no comando.
Exemplo I CREATE TABLE employees ( id INTEGER PRIMARY KEY, first_name CHAR(50) NULL, last_name CHAR(75) NOT NULL, dateofbirth DATE NULL );
Exemplo II
InnoDB x MyISAM MyISAM oferece velocidade. InnoDB oferece confiabilidade. MyISAM não oferece suporte a transações nem constraints de chaves estrangeiras. O mais importante é considerar quais as necessidades específicas para cada tabela.
InnoDB x MyISAM Se existem muitas modificações nos dados (INSERT, UPDATE e DELETE), InnoDB trabalha mais rápido porque ele usa row locking em vez de table locking (MyISAM). Entretanto, se a tabela é utilizada principalmente para SELECTs, uma tabela MyISAM terá um desempenho mais rápido. Se você necessita restrições (contraints) para chaves estrangeiras, a saída é usar InnoDB. Entretanto, se você necessita utilizar índices fulltext, a saída é utilizar MyISAM. Com replicação, é possível tirar vantagens de ambos mecânismos de armazenamento em uma determinada tabela. Por exemplo, tabela mestre como InnoDB (INSERTs, UPDATEs and DELETEs), enquanto a tabela escrava como MyISAM (SELECTs).
Exemplo III
Alter Table ALTER TABLE possibilita a alteração da estrutura de uma tabela já criada. Por exemplo: Adição/remoção de colunas Criação/remoção de índices Modificação do tipo de colunas existentes Renomear colunas/tabela Mudar os comentários de uma tabela Mudar o tipo de uma tabela Etc... Exemplos ALTER TABLE sink ADD bubbles INTEGER; ALTER TABLE sink DROP COLUMN bubbles;
Alter
Deletando Tabelas Para deletar uma tabela do banco de dados, usa-se o comando DROP TABLE. DROP [TEMPORARY] TABLE [IF EXISTS] table_name [, table_name,...] A palavra TEMPORARY é utilizada para deletar tabelas temporárias. MySQL permite deletar várias tabelas de uma vez.
Truncate Em alguns casos, pode ser necessário deletar todos os dados de uma tabela, e resetar as colunas auto increment. O MySQL provê o comando TRUNCATE para essa função. Uso: TRUNCATE TABLE table_name;
Índices São utilizados para encontrar linhas com valores especificados em uma determinada coluna de forma rápida. MySQL pode determinar a posição da busca baseado no índice, evitando a necessidade de verificar todos as linhas da tabela. Se a tabela tem 1.000 linhas, a busca com índices será pelo menos 100 vezes mais rápida do que a busca sequencial. Sem índices, MySQL deve iniciar a procura pela primeira linha e ler a tabela inteira para encontrar as linhas relevantes. Maior a tabela, maior será o custo (tempo). Entretanto, se é necessário o acesso a maioria das silnhas, o modo mais eficiente é o de leitura sequential, pois este minimiza acessos ao disco.
Índices II Podem ser incluídos juntamente com o CREATE TABLE ou após a tabela ser sido criada. CREATE [UNIQUE FULLTEXT] INDEX nome_indice ON nome_tabela (index_col_name [(tam)],...) Exemplo de criação de índice em uma tabela já existente (customer): CREATE INDEX part_of_name ON customer (name(10));
Exemplo Índice
UNIQUE KEYS (Chaves Únicas) Identificador único para uma única linha de uma tabela Não pode ser repetido, mas podem ser NULL PRIMARY KEY Geralmente usa-se AUTO INCREMENT Não pode ser NULL UNIQUE
Exemplo CREATE TABLE nome_tabela ( ) id_col INT, col2 CHARACTER VARYING(20), key_col SMALLINT,... CONSTRAINT key_unique UNIQUE(key_col),...
FOREIGN KEY Chave estrangeira Chaves estrangeiras são utilizadas para a representação de relacionamentos. InnoDB suporta constraints de chaves estrangeiras. Síntaxe para definição de constraints:
Exemplo I CREATE TABLE parent ( id INT NOT NULL, PRIMARY KEY (id) ) ENGINE=INNODB; CREATE TABLE child ( id INT, parent_id INT, INDEX par_ind (parent_id), FOREIGN KEY (parent_id) REFERENCES parent(id) ON DELETE CASCADE ) ENGINE=INNODB;
Exemplo 2 CREATE TABLE parent ( id INT NOT NULL, PRIMARY KEY (id) ) ENGINE=INNODB; CREATE TABLE child ( id INT, parent_id INT, INDEX par_ind (parent_id), FOREIGN KEY (parent_id) REFERENCES parent(id) ON DELETE CASCADE ) ENGINE=INNODB;
Exercício Para relembrar Cria uma tabela Pessoa com quatro colunas CPF (PK), Nome, Idade, Sexo Adiciona um novo campo sobrenome, com o tipo inteiro Mude o tipo do campo sobrenome para VARCHAR(45) (Dica: Alter + Alter column) Delete um campo da tabela (Dica: Alter + Drop Column)
DML Data Manipulation Language
Para ler... http://pt.wikipedia.org/wiki/sql
Inserção de Dados Em SQL, A inserção de dados em uma tabela é feita através do comando INSERT. Duas formas: INSERT INTO nome_tabela VALUES (valor1, valor2, valor3,...) INSERT INTO nome_tabelas (coluna1, coluna2, coluna3) VALUES (valor1, valor, valor3,...) Utilizado para inserir dados apenas em algumas colunas
SELECT Utilizado para selecionar registros do BD. Os resultados do select são armazenados em uma tabela denominada result-set ou conjunto-resultado.
Sintaxe do comando SELECT
SELECT Exemplos Para selecionar todos os campos de uma determinada tabela: SELECT * FROM tabela Pode-se limitar as colunas a serem buscadas de uma tabela: SELECT campo1, campo2, campo3 FROM tabela
SELECT Exemplos Para evitar registros duplicados, utiliza-se: SELECT DISTINCT coluna1, coluna2 FROM tabela
Exercício Inserir dois registros idênticos em uma tabela Agora fazer a seleção dos dados de três maneiras diferentes: Utilizar SELECT Utilizar SELECT DISTINCT Utilizar SELECT DISTINCTROW
SELECT combinado com WHERE Utiliza-se a cláusula WHERE para especificar uma condição a ser satisfeita na seleção. Exemplos de sentenças: Selecione todos as linhas de uma tabela Pessoa onde a idade é igual a 20. Selecione todas as linhas de uma tabela Futebol onde o nome_do_time é igual a Brasil
Exemplos SELECT + WHERE SELECT nome_coluna(s) FROM tabela WHERE nome_coluna operador valor. SELECT * FROM pessoa WHERE idade = 20 Atenção Para valores textuais: WHERE nome = Nome Para valores numéricos: WHERE valor = Valor
Operadores para cláusula WHERE Operador Descrição = Igual <> Diferente > Maior < Menor >= Maior ou igual <= Menor ou igual BETWEEN Dentro de uma faixa específica LIKE Procura por um padrão IN Dentro de uns determinados valores
Exemplos operadores (WHERE) SELECT * FROM Persons WHERE LastName IN ('Hansen','Pettersen') SELECT * FROM Pessoas WHERE Idade BETWEEN 5 AND 20
Exercícios Faça um comando select utilizando cada um dos operadores especificados abaixo: WHERE a = b WHERE a <> b WHERE a > b WHERE a < b WHERE a BETWEEN x AND y WHERE a LIKE %TEXTO% WHERE a IN ( nome1, nome2 )
Até aqui
Renomeação de colunas Do inglês, Column aliasing Utilizado para renomear uma coluna de uma tabela Apenas na consulta corrente E no conjunto resultante Ex.: SELECT nome, sobrenome AS s FROM pessoas WHERE s= silva ;
UPDATE Utilizado para atualizar registros do BD
UPDATE Modificadores: LOW_PRIORITY atrasa a atualização de um registro até que nenhum cliente esteja lendo a tabela. IGNORE A instrução não será abortada mesmo que aconteçam erros (Ex. Chave duplicada)
Exemplo UPDATE filmes SET ano = 2006; CUIDADO!!! Todos os registros serão atualizados. UPDATE filmes SET ano = 2006 WHERE id_filme = 2; Atualiza apenas o registro onde o id_filme é igual a 2. UPDATE dados_pessoais SET idade=idade+1; CUIDADO!!! Incrementa em 1 o valor de idade já armazenado. UPDATE dados_pessoais SET idade=idade*2, idade=idade+1; Comandos SQL são analisados da esquerda para direita. Portanto dobra a idade, e então incrementa 1.
DELETE Utilizado para excluir registros do BD
DELETE (Cont.) Modificadores: LOW_PRIORITY atrasa a exclusão dos registro até que nenhum cliente esteja lendo a tabela. IGNORE A instrução não será abortada mesmo que aconteçam erros CUIDADO!!! Erros são retornados como warnings. DELETE QUICK Não reorganiza índices da tabela. Ou seja, alguns índices serão desperdiçados, gastando espaço. Opção para evitar esta situação: DELETE QUICK OPTIMIZE TABLE
Exemplo DELETE FROM filmes WHERE ano < 2006; CUIDADO!!! Deleta todos os registros da tabela filmes. DELETE FROM filmes WHERE ano < 2006; Deleta todos os registros onde o ano do filme é menor que 2006.
Funções agregadas AVG Retorna a média de valores COUNT Conta a ocorrência de registros dada uma condição MAX Retorna o valor máximo MIN Retorna o valor mínimo
Exemplos SELECT AVG(idade) FROM pessoas; Retorna a média de idades de pessoas. SELECT MAX(idade) FROM pessoas; Retorna a maior idade entre todas pessoas. SELECT MIN(idade) FROM pessoas; Retorna a menor idade entre todas pessoas. SELECT SUM(idade) FROM pessoas; Retorna a soma de todas as idades.
Função GROUP BY Utilizado para agrupar um conjunto de registros baseado em uma dada coluna. Ex.: Controle de vendas por vendedor em uma loja: SELECT nome_vendedor, SUM(valor) AS total_vendas FROM vendas GROUP BY nome_vendedor; WITH ROLLUP SELECT nome_vendedor, SUM(valor) AS total_vendas FROM vendas GROUP BY nome_vendedor;
Função ORDER BY Utilizado para ordenar o conjunto resultante (result set) Ex. (Mais novos vem primeiro) SELECT * FROM pessoas ORDER BY idade; Ex. (Mais velhos vem primeiro) SELECT * FROM pessoas ORDER BY idade DESC;
LIMIT Utilizado para limitar o número de linhas a ser exibido no conjunto resultante. Ex.: Supondo uma tabela de ranking que contém o nome do jogador e o número de vitórias. A posição no ranking é dada pelo número de vitórias. SELECT nome, vitorias FROM ranking ORDER BY vitorias DESC, nome LIMIT 4;
LIMIT (Cont.) E caso na última linha existissem dois jogadores com o mesmo número de vitórias? Deve-se fazer o seguinte procedimento: Descobrir o número de vitórias da última colocação a ser listada. SELECT vitorias FROM ranking ORDER BY vitorias DESC, nome LIMIT 3,1; Fazer um SELECT com a clásula WHERE vitorias >= numero_vitorias_ultimo_listado SELECT nome, vitorias FROM ranking WHERE vitorias >= 18 ORDER BY vitorias DESC, nome;
Utilizando mais de uma tabela
Introdução Qualquer aplicação de complexidade moderada, provavelmente necessitará utilizar múltiplas tabelas. Algumas consultas não podem ser efetuadas utilizando apenas uma tabela. O verdadeiro poder de um banco de dados relacional aparece quando informações entre tabelas são relacionadas.
Problema: Você deseja escrever uma consulta que usa informações de mais de uma tabela. Solução: Utilizar um join Uma consulta que se refere a múltiplas tarefas e informa ao MySQL para consultar estas.
Join Idéia básica Combinar linhas de uma tabela com linhas de outra(s) tabela(s). Full join Produz todas as possíveis combinações de linhas Ex.: Uma operação de join entre uma tabela de 200 linhas e outra de 100 linhas, resulta em 100 * 200 = 20000 linhas.
Exemplo Camisas Gravatas Calças SELECT * FROM camisas, gravatas, calcas;
Como restringir o número de combinações? Uso cláusula WHERE LIMIT SELECT * FROM camisa, gravata, calca WHERE camisa.cor = Branca ; SELECT * FROM camisa, gravata, calca LIMIT 4;
Join Para o MySQL mostrar várias combinações de items, pode-se escrever uma consulta (query) que execute um full join SELECT * FROM camisas, gravatas * significa: Para uma tabela: Todas as colunas Para várias tabelas: Todas as colunas de todas as tabelas nomeadas
Alternativas ao * Pode-se especificar nome_tabela.* Caso o nome da coluna seja único entre todas as tabelas, pode-se emiter o nome da tabela. Ex.: Queries equivalentes
Join É possível realizar um join entre tabelas de: Mesmo banco de dados Diferentes banco de dados Diferentes banco de dados e servidores
Combinações de roupas Exemplo para gerar uma combinação randomica de roupas: ORDER BY RAND() LIMIT 1
Problema Você deseja utilizar linhas de uma tabela para localizar linhas de outra tabela. Solução Utilizar um join com a cláusula WHERE
Exemplo Duas tabelas Artistas Quadros Para listar os quadros de cada artista SELECT * FROM artistas, quadros WHERE artistas.a_id = quadros.a_id; Para listar apenas os quadros de Van Gogh SELECT * FROM artistas, quadros WHERE artistas.a_id = quadros.a_id AND artistas.nome = Van Gogh ;
Exemplo Como contar a quantidade de quadros que cada artista possui? SELECT artistas.nome COUNT(*) AS numero de quadros FROM artistas, quadros WHERE artistas.a_id = quadros.a_id GROUP BY artistas.nome;
Exemplo Para cada artista, contar a quantidade de quadros que cada artista possui, o valor total pago pelos quadros, e a média de preço dos quadros? SELECT artistas.nome COUNT(*) AS numero de quadros, SUM(quadros.preco) AS preco total dos quadros, AVG(quadros.preco) AS media de preco FROM artistas, quadros WHERE artistas.a_id = quadros.a_id GROUP BY artistas.nome;
Como fazer para encontrar linhas em uma tabela que não tem correspondentes em outra? Ex.: Considere uma situação onde existem duas tabelas Consumidores potencias Compras de consumidores Como descobrir quais consumidores potenciais ainda não realizaram compras??
Como fazer para encontrar linhas em uma tabela que não tem correspondentes em outra? Ex.: Considere uma situação onde existem duas tabelas Consumidores potencias Compras de consumidores Como descobrir quais consumidores potenciais ainda não realizaram compras??
LEFT JOIN Artistas sem quadros não são listados SELECT * FROM artistas, quadros WHERE artistas.a_id = quadros.a_id; SELECT * FROM artistas INNER JOIN quadros ON artistas.a_id = quadros.a_id; Artistas sem quadros são listados SELECT * FROM artistas LEFT JOIN quadros ON artistas.a_id = quadros.a_id;
Algo mais complexo: SELECT artistas.name, IF(COUNT(quadros.a_id)>0, sim','nao') AS na coletanea' FROM artistas LEFT JOIN quadros ON artistas.a_id = quadros.a_id GROUP BY artistas.name;
Dicas: LEFT JOIN é útil para encontrar valores que não tem correspondentes em outra tabela. Pode ser útil para produzir um relatório que inclui todos os itens em uma lista, mesmo aqueles que contém uma quantidade zero. Comum para caracterizar o relacionamento entre uma tabela mestre e uma tabela de detalhes. Com LEFT JOIN pode-se produzir um total de vendas por consumidor, que inclua até aqueles consumidores que não realizaram nenhuma compra. Outra aplicação: Realizar verificação de consistência quando se recebe dois arquivos de dados que são supostamente relacionados, e precisa-se determinar se isto é verdadeiro Por exemplo verificar a integridade de relacionamentos.
RIGHT JOIN Similar ao LEFT JOIN Produz uma combinação da tabela direita com a tabela esquerda. Mesmo EFEITO: SELECT * FROM artistas LEFT JOIN quadros ON artistas.a_id = quadros.a_id; SELECT * FROM artistas RIGHT JOIN quadros ON artistas.a_id = quadros.a_id;
Exercícios 1) Crie as tabelas Artistas (a_id, nome) Quadros (a_id, p_id, titulo, estado, preco) 2) Faça um full join entre estas tabelas 3) Produza um relatório de todos os quadros dizendo qual é o seu respectivo autor (artista). Artistas sem quadros não devem ser listados.
Exercícios II 4) Produza um relatório de todos os quadros dizendo qual é o seu respectivo autor (artista). Artistas sem quadros devem ser listados. 5) Produza uma query que informe o total de quadros produzidos por cada artista. 6) Produza uma query que informe o total de quadros produzidos por cada artista, e o total de quadros.
Exercícios III 7) Produza uma query que informe a média de preços dos quadros por artista. 8) Produza uma query que informe o estado que possui a maior quantidade de quadros. 9) Produza uma query que informe o estado que possui a soma de quadros mais valiosa.
UNION