Você está na página 1de 5

SQL DML CONSULTAS ENVOLVENDO MAIS DE UMA TABELA

Uma consulta envolvendo informaes de mais de uma tabela podem ser realizadas por encadeamento ou juno(join) . 1. Consultas Encadeadas - SubConsultas Consultas encadeadas, tambm referenciadas como subconsultas, permitem que uma consulta seja feita sobre o resultado de uma outra consulta. Deve-se empregar esta tcnica quando se deseja informaes de uma tabela porm, a condio deve ser expressa com campos de outra tabela. Nesta situao o gerenciador de consultas do SGBD executa primeiro as consultas internas e os resultados so comparados segundo o operador de elo entre as consultas. Os predicados de elos entre consultas so: "=", "IN", "EXISTS', ANY( ou SOME) e os operadores relacionais ("<", "<=" ,">" e ">=") Sintaxes possveis: SELECT colunai, , colunan FROM tabela1 WHERE colunak = (SELECT colunaj FROM tabela2 WHERE condies) SELECT colunai, , colunan FROM tabela1 WHERE colunak IN (SELECT colunaj FROM tabela2 WHERE condies) SELECT colunai, , colunan FROM tabela(s) WHERE colunak ANY (SELECT colunaj FROM tabela2 WHERE condies) SELECT colunai, , colunan FROM tabela1 WHERE colunak OPERADOR RELACIONAL ALL (SELECT colunaj FROM tabela2 WHERE condies) Operadores relacionais de comparao: >, >=, < e <= SELECT colunai, , colunan FROM tabela1 WHERE EXISTS (SELECT * FROM tabela2 WHERE coluna <operador> tabela1.colunai)

Nota de Aula Prof. Sidney Vieira

= Verifica se o valor do campo que precede o predicado exatamente o igual ao valor retornado na subconsulta IN Verifica se o valor do campo que precede o predicado faz parte do subconjunto de valores retornados na subconsulta ANY Verifica se o campo que precede o predicado igual a algum valor retornado na subconsulta EXISTS Verifica se um valor existe um retorno no nulo da subconsulta(*). Neste caso o sql exibir as linhas da tabela tabela1 que atendem a restrio da subconsulta. A negao do predicado clusula definida por NOT EXISTS.

Exemplos: ---------------------------------------------------------------------------------------------------------------------Considere as relaes(tabelas) para os exemplos a seguir:


DEPARTAMENTO
COD NOME ORCAMENTO MATR ======== ================ =================== ================

1 2 3

desenvolvimento rede manutencao

100000.00 200000.00 80000.00

2 7 5

FUNCIONARIO
MATR NOME SALARIO ADMISSAO SEXO DEP_COD MATR_SUPERVISOR

======================================================================================================

1 2 3 4 5 6 7

ze ana pedro eva ivo sid ines

1000.00 1500.00 1000.00 2000.00 1800.00 900.00 1500.00

09-DEC-2000 10-NOV-2001 21-JAN-2001 03-DEC-2002 10-OCT-2002 22-FEB-2002 01-NOV-2003

M F M F M M F

1 1 2 1 3 2 2

NULL 1 6 1 NULL NULL 5

| Obs: o campo matr em DEPARTAMENTO tem a funo de guardar a matricula do chefe do departamento o campo DEP_COD em funcionrio tem a funo de guardar o departamento de alocao do funcionrio. o campo MATR_SUPERVISOR em funcionrio tem a funo de guardar a matricula do supervisor do funcionrio os nomes dos funcionrios so nicos ou seja no existe dois funcionrios com o mesmo nome ------------------------------------------------------------------------------------------------------------------------

Exemplo1: Obter o nome dos funcionrios que esto alocados em departamentos com oramentos inferiores a R$ 90.000,00

Nota de Aula Prof. Sidney Vieira

SELECT nome FROM funcionario WHERE dep_cod IN (SELECT cod FROM departamento WHERE orcamento < 90000) Exemplo2: Obter o nome do departamento cujo chefe a funcionria de nome ines SELECT nome FROM departamento WHERE matr = (SELECT matr FROM funcionario WHERE nome = 'ines') Este exemplo emprega o predicado = pois no existe, conforme descrito anteriormente, dois funcionrios com o mesmo nome. Caso existisse deveramos empregar o predicado IN Exemplo3 : obter a matricula e nome dos funcionrios que so supervisionados pelo funcionrio de nome ze SELECT matr, nome FROM funcionario WHERE matr_supervisor = (SELECT matr FROM funcionario WHERE nome = ze) Neste exemplo admitido que s existe um funcionario Exemplo4: Obter os nomes e salrios dos funcionrios que possuam o maior valor salario SELECT nome, salario FROM funcionario WHERE salario IN (SELECT MAX(salario) FROM funcionario) OU SELECT nome, salario FROM funcionario WHERE salario >= (SELECT MAX(salario) FROM funcionario) OU SELECT nome, salario FROM funcionario WHERE salario = (SELECT MAX(salario) FROM funcionario) OBS: S se emprega o predicado "=" quando a consulta interna retorna ZERO ou 1 e somente 1 resultado. Exemplo5: Obter os nomes e salrios dos funcionrios que ganham mais do que qualquer funcionrio do departamento de codigo 1 SELECT nome, salario FROM funcionario WHERE salario > ALL (SELECT salario FROM funcionario WHERE dep_cod = 1)

Nota de Aula Prof. Sidney Vieira

Exemplo6: Obter os nomes dos funcionrios que so chefes de departamentos SELECT nome FROM funcionario WHERE EXISTS (SELECT * FROM departamento WHERE matr = funcionario.matr) Exemplo7: Obter os nomes dos funcionrios que no so chefes de departamentos SELECT nome FROM funcionario WHERE NOT EXISTS (SELECT * FROM departamento WHERE matr = funcionario.matr) Apelidando tabelas possivel determinar alias para as tabelas em uma consulta. Para isto basta colocar o apelido a ser usado aps o nome da tabela na clusula From SELECT apelido1.campo1_tab1, apelido1.campon_tab1 , ... apelido2. campok_tab2 FROM tab1 apelido1, tab2 apelido2 WHERE apelido1. campoj_tab1 = apelido2. campol_tab2 AND apelido2. campot_tab2 = x AND apelido1.campom_tab1 = y Exemplo: SELECT f.nome, f.salario, d.nome FROM funcionario f, departamento d WHERE f.cod = d.cod AND d.nome = rede AND f.sexo = F Consultas com Join Usada quando se deseja informaes de mais de uma tabela. Sintaxe: SELECT tabela1.colunai, , tabela2.colunan FROM tabelas1 JOIN tabela2 ON tabela1.colunaj, = tabela2.colunak [WHERE condio(es)] OBS: nem todos os SGBD aceitam o termo JOIN neste caso deves-se empregar a sintaxe abaixo Que o mesmo que: SELECT tabela1.colunai, , tabela2.colunan FROM tabelas1, tabela2 WHERE tabela1.colunaj, = tabela2.colunak

Nota de Aula Prof. Sidney Vieira

[AND condio(es)] Exemplos: Obter o nome e salario dos funcionarios com o nome dos respectivos departamentos onde esto alocados SELECT funcionario.nome, funcionario.salario, departmento.nome FROM funcionario JOIN departamento ON funcionario.dep_cod = departamento.cod Obter os dados do departamento de rede com os dados de seu respectivo chefe SELECT * FROM funcionario JOIN departamento ON funcionario.matr = departamento.matr WHERE departamento.nome = rede Que o mesmo que: SELECT * FROM funcionario, departamento WHERE funcionario.matr = departamento.matr AND departamento.nome = rede Obter o nome e orcamento do departamento de redes com o nome e salario dos seus respectivos funcionarios do sexo feminino SELECT departamento.nome, departamento.orcamento, funcionario.nome, funcionario.salario, FROM funcionario, departamento WHERE funcionario.dep_cod = departamento.cod AND departamento.nome = rede AND funcionario.sexo = F Que o mesmo que: SELECT d.nome, d.orcamento, f.nome, f.salario, FROM funcionario f, departamento d WHERE f.dep_cod = d.cod AND d.nome = rede AND f.sexo = F

Nota de Aula Prof. Sidney Vieira

Você também pode gostar