06 labmm4 - bases de dados

26
Bases de dados: SQL SELECT, INNER JOINS e OUTER JOINS Carlos Santos LabMM 4 - NTC - DeCA - UA Aula 06, 07-03-2012

Upload: carlos-santos

Post on 08-Jul-2015

750 views

Category:

Education


2 download

DESCRIPTION

SQL

TRANSCRIPT

Page 1: 06 LabMM4 - Bases de dados

Bases de dados: SQLSELECT, INNER JOINS e OUTER JOINS

Carlos SantosLabMM 4 - NTC - DeCA - UAAula 06, 07-03-2012

Page 2: 06 LabMM4 - Bases de dados

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

Page 3: 06 LabMM4 - Bases de dados

E para apagar dados e tabelas?

Inverter a ordem anterior!

• apagar primeiro os dados e as tabelas que tenham FK

Page 4: 06 LabMM4 - Bases de dados

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');

Page 5: 06 LabMM4 - Bases de dados

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”

Page 6: 06 LabMM4 - Bases de dados

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

Page 7: 06 LabMM4 - Bases de dados

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’

Page 8: 06 LabMM4 - Bases de dados

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%”;

Page 9: 06 LabMM4 - Bases de dados

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%";

Page 10: 06 LabMM4 - Bases de dados

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

Page 11: 06 LabMM4 - Bases de dados

SQL: SELECT ... ORDER BY ...

• SELECT * FROM MeusCDs.amigos ORDER BY nome;

• SELECT * FROM MeusCDs.amigos ORDER BY nome DESC;

Page 12: 06 LabMM4 - Bases de dados

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!

Page 13: 06 LabMM4 - Bases de dados

SQL: SELECT ... LIMIT ...

• SELECT * FROM MeusCDs.amigos LIMIT 1,2;

• SELECT * FROM MeusCDs.amigos LIMIT 3,100;

Page 14: 06 LabMM4 - Bases de dados

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

Page 15: 06 LabMM4 - Bases de dados

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

Page 16: 06 LabMM4 - Bases de dados

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

Page 17: 06 LabMM4 - Bases de dados

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;

Page 18: 06 LabMM4 - Bases de dados

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;

Page 19: 06 LabMM4 - Bases de dados

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)

Page 20: 06 LabMM4 - Bases de dados

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;

Page 21: 06 LabMM4 - Bases de dados

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.

Page 22: 06 LabMM4 - Bases de dados

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

Page 23: 06 LabMM4 - Bases de dados

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

Page 24: 06 LabMM4 - Bases de dados

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

Page 25: 06 LabMM4 - Bases de dados

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

Page 26: 06 LabMM4 - Bases de dados

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