06 LabMM4 - Bases de dados
Upcoming SlideShare
Loading in...5
×
 

06 LabMM4 - Bases de dados

on

  • 947 views

SQL

SQL

Statistics

Views

Total Views
947
Views on SlideShare
947
Embed Views
0

Actions

Likes
0
Downloads
109
Comments
0

0 Embeds 0

No embeds

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

CC Attribution-NonCommercial-ShareAlike LicenseCC Attribution-NonCommercial-ShareAlike LicenseCC Attribution-NonCommercial-ShareAlike License

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

06 LabMM4 - Bases de dados 06 LabMM4 - Bases de dados Presentation Transcript

  • Bases de dados: SQLSELECT, INNER JOINS e OUTER JOINSCarlos SantosLabMM 4 - NTC - DeCA - UAAula 06, 07-03-2012
  • Estratégia para a introdução de dados numa BDPara 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 Clientes Encomendas idCliente nomeCliente nrEncomenda dataEncomenda Clientes_idCliente 1 João 1 2010-­‐02-­‐23 1 2 Maria 2 2010-­‐04-­‐11 2 3 Manuel 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 View slide
  • Exemplos de SQL com INSERTINSERT • 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); View slide
  • SQL: SELECTVamos considerar como exemplo o exercício de gestão dos CDs. A basede 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 ... WHEREPara selecionar um determinado conjunto de registos utiliza-se a cláusulaWHERE • SELECT nome_colunas FROM nome_tabela WHERE 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 ... LIKEWildcards 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.amigos WHERE nome="pedro" OR email LIKE "r%";
  • SQL: SELECT ... ORDER BY ...Os resultados finais podem ser ordenados pelos valores de uma ou maiscolunas • SELECT nome_colunas FROM nome_tabela ORDER 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 deresultados • SELECT nome_colunas FROM nome_tabela LIMIT 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 umaquery são suportados pelas relações (JOINS) existentes entre elas. • exemplo: “listar todos os empréstimos indicando o nome do amigo” amigos empresLmos id_amigo nome telefone id_empresLmo data_empresLmo data_devolucao id_amigo 1 José  Mourinho 916545955 1 2010-­‐02-­‐23 2010-­‐02-­‐25 1 2 Jorge  Jesus 234545955 2 2010-­‐04-­‐11 2010-­‐04-­‐18 3 Domingos  Paciência 234897897 3 2010-­‐03-­‐13 2010-­‐03-­‐19 1 4 Vítor  Pereira 923435566 4 2010-­‐05-­‐21 2010-­‐05-­‐23 4 5 André  Villas-­‐Boas 934975766 5 2010-­‐06-­‐25 2010-­‐06-­‐29
  • Joins amigos empresLmos id_amigo nome telefone id_empresLmo data_empresLmo data_devolucao id_amigo 1 José  Mourinho 916545955 1 2010-­‐02-­‐23 2010-­‐02-­‐25 1 2 Jorge  Jesus 234545955 2 2010-­‐04-­‐11 2010-­‐04-­‐18 3 Domingos  Paciência 234897897 3 2010-­‐03-­‐13 2010-­‐03-­‐19 1 4 Vítor  Pereira 923435566 4 2010-­‐05-­‐21 2010-­‐05-­‐23 4 5 André  Villas-­‐Boas 934975766 5 2010-­‐06-­‐25 2010-­‐06-­‐29 amigos  sem   amigos  com emprésLmos   emprésLmos emprésLmos sem  amigos registos registos não  relacionados registos não  relacionados relacionados
  • INNER JOIN (standard/exclusivo/natural)Num join natural, um INNER JOIN, os dados resultantes de uma query sãoapenas aqueles que podem ser relacionados entre as duas tabelas. • SELECT nome_coluna(s) FROM nome_tabela1 INNER JOIN nome_tabela2 ON 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 JOINExemplo: Selecionar todos os Amigos com Empréstimos • SELECT MeusCDs.amigos.nome, MeusCDs.emprestimos.id_emprestimo FROM MeusCDs.amigos INNER JOIN MeusCDs.emprestimos ON MeusCDs.amigos.id_amigo = MeusCDs.emprestimos.id_amigo; • SELECT amigos.nome, emprestimos.id_emprestimo FROM amigos INNER JOIN emprestimos ON amigos.id_amigo = emprestimos.id_amigo;
  • INNER JOINExemplo: Selecionar todos os Amigos com Empréstimos • SELECT MeusCDs.amigos.nome, MeusCDs.emprestimos.id_emprestimo FROM MeusCDs.amigos INNER JOIN MeusCDs.emprestimos ON MeusCDs.amigos.id_amigo = MeusCDs.emprestimos.id_amigo;
  • OUTER JOIN (inclusivos)Os OUTER JOINS permitem obter os registos relacionados e os nãorelacionados. Podem ser do tipo LEFT ou RIGHT, de acordo com o sentidodo 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 JOINExemplo: Seleccionar todos os amigos com empréstimos e todos osamigos sem empréstimos • SELECT MeusCDs.amigos.nome, MeusCDs.emprestimos.id_emprestimo FROM MeusCDs.amigos LEFT JOIN MeusCDs.emprestimos ON MeusCDs.amigos.id_amigo = MeusCDs.emprestimos.id_amigo;
  • JOINS: exemplo 2Considere-se um stand automóvel onde cada vendedor é responsável pelavenda de vários automóveis. No entanto, num dado momento, poderãoexistir: vendedores sem automóveis atribuídos e automóveis semvendedor atribuído.
  • JOINS: exemplo 2Selecionar todos os vendedores com carros atribuídos • SELECT stand.vendedores.Nome, stand.automoveis.Marca, stand.automoveis.Modelo FROM stand.vendedores INNER JOIN stand.automoveis ON stand.vendedores.idVENDEDORES = stand.automoveis.VENDEDORES_idVENDEDORES
  • JOINS: exemplo 2Selecionar todos os vendedores com e sem carros atribuídos • SELECT stand.vendedores.Nome, stand.automoveis.Marca, stand.automoveis.Modelo FROM stand.vendedores LEFT JOIN stand.automoveis ON stand.vendedores.idVENDEDORES = stand.automoveis.VENDEDORES_idVENDEDORES
  • JOINS: exemplo 2Na tabela automóveis foram adicionados 2 novos registos (2 novosautomóveis) aos quais ainda não foi atribuído um vendedor.Selecionar todos os vendedores com carros atribuídos e os carros semvendedor atribuído • SELECT stand.vendedores.Nome, stand.automoveis.Marca, stand.automoveis.Modelo FROM stand.vendedores RIGHT JOIN stand.automoveis ON stand.vendedores.idVENDEDORES = stand.automoveis.VENDEDORES_idVENDEDORES
  • JOINS: FULL JOIN no MySQLSelecionar todos os vendedores com carros atribuídos e sem carrosatribuídos e todos os carros atribuídos e carros sem vendedor atribuído • SELECT stand.vendedores.Nome, stand.automoveis.Marca, stand.automoveis.Modelo FROM stand.vendedores LEFT JOIN stand.automoveis ON stand.vendedores.idVENDEDORES = stand.automoveis.VENDEDORES_idVENDEDORES UNION SELECT stand.vendedores.Nome, stand.automoveis.Marca, stand.automoveis.Modelo FROM stand.vendedores RIGHT JOIN stand.automoveis ON stand.vendedores.idVENDEDORES = stand.automoveis.VENDEDORES_idVENDEDORES
  • JOINS: FULL JOIN no MySQLSelecionar todos os vendedores com carros atribuídos e sem carrosatribuídos e todos os carros atribuídos e carros sem vendedor atribuído