06 labmm4 - bases de dados
DESCRIPTION
SQLTRANSCRIPT
Bases de dados: SQLSELECT, INNER JOINS e OUTER JOINS
Carlos SantosLabMM 4 - NTC - DeCA - UAAula 06, 07-03-2012
Estratégia para a introdução de dados numa BD
Para não violar a integridade referencial da BD
• Só podemos introduzir valores nas FK que já existam nas PK com que as primeiras estão relacionadas:• preencher primeiro as tabelas que não tenham FK• preencher depois as tabelas com FK, desde que as PK dessas relações
já tenham valores
ClientesClientesidCliente nomeCliente
1 João
2 Maria
3 Manuel
Encomendas
nrEncomenda dataEncomenda Clientes_idCliente
1 2010-‐02-‐23 1
2 2010-‐04-‐11 2
3 2010-‐03-‐13 2
4 2010-‐05-‐21
5 2010-‐06-‐25 5
E para apagar dados e tabelas?
Inverter a ordem anterior!
• apagar primeiro os dados e as tabelas que tenham FK
Exemplos de SQL com INSERT
INSERT
• INSERT INTO table_name VALUES (value1, value2, value3,...) -> se não existir uma PK com auto incremento
• INSERT INTO decoracao.Vendedores (NomeVend, ApelidoVend) VALUES ('Manuel','Vieira');
SQL: SELECT
Vamos considerar como exemplo o exercício de gestão dos CDs. A base de dados designa-se “MeusCDs” e existe uma tabela com os “Amigos”
• SELECT * FROM MeusCDs.Amigos;“Devolve todos os campos de todos os registos existentes na tabela Amigos da BD MeusCDs”
• SELECT nome, email FROM MeusCDs.amigos;“Devolve os campos nome e email de todos os registos existentes na tabela Amigos da BD MeusCDs”
SQL: SELECT ... WHERE
Para selecionar um determinado conjunto de registos utiliza-se a cláusula WHERE
• SELECT nome_colunasFROM nome_tabelaWHERE nome_coluna operador valor;
A ter em atenção:
• a coluna da condição não tem que estar na lista de nome_colunas• um valor do tipo string é escrito como “valor” ou ‘valor’• os operadores possíveis de utilizar são: =, <>, >, <, >=, <=, BETWEEN,
LIKE e IN• o operador LIKE só deve ser utilizado para pesquisas em campos do tipo
string
SQL: SELECT ... WHERE
• SELECT * FROM MeusCDs.amigos WHERE nome = ”Rui”;
• SELECT * FROM MeusCDs.amigos WHERE nome > ‘Carlos’;
• SELECT * FROM MeusCDs.amigos WHERE nome > Carlos;“Unknown column ‘Carlos’ in ‘WHERE clause’
SQL: SELECT ... WHERE ... LIKE
Wildcards em SQL com operador LIKE
• “_” -> pode ser substituído por qualquer caracter (mas apenas 1)• “%” -> pode ser substituído por 0 ou mais caracteres
• SELECT * FROM MeusCDs.amigos WHERE nome LIKE ”R%”;
• SELECT * FROM MeusCDs.amigos WHERE nome LIKE ”r%”;
SQL: SELECT ... WHERE ...
• SELECT * FROM MeusCDs.amigos WHERE nome LIKE ”%o%”;
As condições também podem incluir os operadores lógicos: AND e OR
• SELECT * FROM MeusCDs.amigosWHERE nome="pedro" OR email LIKE "r%";
SQL: SELECT ... ORDER BY ...
Os resultados finais podem ser ordenados pelos valores de uma ou mais colunas
• SELECT nome_colunasFROM nome_tabelaORDER BY nome_coluna(s) [ASC|DESC]
A ter em atenção:
• a coluna que tem mais prioridade é a que aparece primeiro na lista de colunas
• por defeito, a ordenação é ascendente
SQL: SELECT ... ORDER BY ...
• SELECT * FROM MeusCDs.amigos ORDER BY nome;
• SELECT * FROM MeusCDs.amigos ORDER BY nome DESC;
SQL: SELECT ... LIMIT ...
Os resultados finais podem ser limitados a uma determinada gama de resultados
• SELECT nome_colunasFROM nome_tabelaLIMIT X,Y;
A ter em atenção:
• X é o índice do primeiro elemento do resultado global que queremos obter• Y é o número de resultados• mecanismo muito útil para criar mecanismos de paginação de resultados!
SQL: SELECT ... LIMIT ...
• SELECT * FROM MeusCDs.amigos LIMIT 1,2;
• SELECT * FROM MeusCDs.amigos LIMIT 3,100;
E como obter dados resultantes de várias tabelas?
Os processos de combinar dados de várias tabelas no âmbito de uma query são suportados pelas relações (JOINS) existentes entre elas.
• exemplo: “listar todos os empréstimos indicando o nome do amigo”
empresLmosempresLmos
id_empresLmo data_empresLmo data_devolucao id_amigo
1 2010-‐02-‐23 2010-‐02-‐25 1
2 2010-‐04-‐11 2010-‐04-‐18
3 2010-‐03-‐13 2010-‐03-‐19 1
4 2010-‐05-‐21 2010-‐05-‐23 4
5 2010-‐06-‐25 2010-‐06-‐29
amigos
id_amigo nome telefone
1 José Mourinho 916545955
2 Jorge Jesus 234545955
3 Domingos Paciência 234897897
4 Vítor Pereira 923435566
5 André Villas-‐Boas 934975766
Joins
empresLmosempresLmos
id_empresLmo data_empresLmo data_devolucao id_amigo
1 2010-‐02-‐23 2010-‐02-‐25 1
2 2010-‐04-‐11 2010-‐04-‐18
3 2010-‐03-‐13 2010-‐03-‐19 1
4 2010-‐05-‐21 2010-‐05-‐23 4
5 2010-‐06-‐25 2010-‐06-‐29
amigos
id_amigo nome telefone
1 José Mourinho 916545955
2 Jorge Jesus 234545955
3 Domingos Paciência 234897897
4 Vítor Pereira 923435566
5 André Villas-‐Boas 934975766
amigos sem emprésLmos
emprésLmos sem amigos
amigos comemprésLmos
registosrelacionados
registosnão relacionados
registosnão relacionados
INNER JOIN (standard/exclusivo/natural)
Num join natural, um INNER JOIN, os dados resultantes de uma query são apenas aqueles que podem ser relacionados entre as duas tabelas.
• SELECT nome_coluna(s)FROM nome_tabela1INNER JOIN nome_tabela2ON nome_tabela1.nome_coluna=nome_tabela2.nome_coluna;
A ter em atenção:
• os campos mencionados na condição do join são a PK e FK que estabelecem a relação entre as duas tabelas
• os dados da tabela “nome_tabela1” que não estão relacionados com dados da tabela “nome_tabela2” não são retornados na query
• o inverso da última afirmação também é verdade
INNER JOIN
Exemplo: Selecionar todos os Amigos com Empréstimos
• SELECT MeusCDs.amigos.nome, MeusCDs.emprestimos.id_emprestimoFROM MeusCDs.amigosINNER JOIN MeusCDs.emprestimosON MeusCDs.amigos.id_amigo = MeusCDs.emprestimos.id_amigo;
• SELECT amigos.nome, emprestimos.id_emprestimoFROM amigosINNER JOIN emprestimosON amigos.id_amigo = emprestimos.id_amigo;
INNER JOIN
Exemplo: Selecionar todos os Amigos com Empréstimos
• SELECT MeusCDs.amigos.nome, MeusCDs.emprestimos.id_emprestimoFROM MeusCDs.amigosINNER JOIN MeusCDs.emprestimosON MeusCDs.amigos.id_amigo = MeusCDs.emprestimos.id_amigo;
OUTER JOIN (inclusivos)
Os OUTER JOINS permitem obter os registos relacionados e os não relacionados. Podem ser do tipo LEFT ou RIGHT, de acordo com o sentido do JOIN.
• LEFT JOIN Mostra todos os registos relacionados (Amigos com Empréstimos)+Registos não relacionados da tabela esquerda (tabela de partida): amigos (Amigos sem Empréstimos)
• RIGHT JOIN Mostra todos os registos relacionados (Amigos com Empréstimos)+Registos não relacionados da tabela direita (tabela de chegada): emprestimos (Empréstimos sem Amigos)
LEFT OUTER JOIN
Exemplo: Seleccionar todos os amigos com empréstimos e todos os amigos sem empréstimos
• SELECT MeusCDs.amigos.nome, MeusCDs.emprestimos.id_emprestimoFROM MeusCDs.amigosLEFT JOIN MeusCDs.emprestimosON MeusCDs.amigos.id_amigo = MeusCDs.emprestimos.id_amigo;
JOINS: exemplo 2
Considere-se um stand automóvel onde cada vendedor é responsável pela venda de vários automóveis. No entanto, num dado momento, poderão existir: vendedores sem automóveis atribuídos e automóveis sem vendedor atribuído.
JOINS: exemplo 2
Selecionar todos os vendedores com carros atribuídos
• SELECT stand.vendedores.Nome, stand.automoveis.Marca,stand.automoveis.ModeloFROM stand.vendedoresINNER JOIN stand.automoveisON stand.vendedores.idVENDEDORES = stand.automoveis.VENDEDORES_idVENDEDORES
JOINS: exemplo 2
Selecionar todos os vendedores com e sem carros atribuídos
• SELECT stand.vendedores.Nome, stand.automoveis.Marca,stand.automoveis.ModeloFROM stand.vendedoresLEFT JOIN stand.automoveisON stand.vendedores.idVENDEDORES = stand.automoveis.VENDEDORES_idVENDEDORES
JOINS: exemplo 2
Na tabela automóveis foram adicionados 2 novos registos (2 novos automóveis) aos quais ainda não foi atribuído um vendedor.Selecionar todos os vendedores com carros atribuídos e os carros sem vendedor atribuído
• SELECT stand.vendedores.Nome, stand.automoveis.Marca,stand.automoveis.ModeloFROM stand.vendedoresRIGHT JOIN stand.automoveisON stand.vendedores.idVENDEDORES = stand.automoveis.VENDEDORES_idVENDEDORES
JOINS: FULL JOIN no MySQL
Selecionar todos os vendedores com carros atribuídos e sem carros atribuídos e todos os carros atribuídos e carros sem vendedor atribuído
• SELECT stand.vendedores.Nome, stand.automoveis.Marca,stand.automoveis.ModeloFROM stand.vendedoresLEFT JOIN stand.automoveisON stand.vendedores.idVENDEDORES = stand.automoveis.VENDEDORES_idVENDEDORESUNIONSELECT stand.vendedores.Nome, stand.automoveis.Marca,stand.automoveis.ModeloFROM stand.vendedoresRIGHT JOIN stand.automoveisON stand.vendedores.idVENDEDORES = stand.automoveis.VENDEDORES_idVENDEDORES
JOINS: FULL JOIN no MySQL
Selecionar todos os vendedores com carros atribuídos e sem carros atribuídos e todos os carros atribuídos e carros sem vendedor atribuído