SQL-99: Esquema de BD EMPRESA SQL-99: Instâncias do esquema EMPRESA 1
Consultas externa, aninhada e correlacionada para cada tupla da consulta externa, a consulta aninhada devolve o atributo solicitado Em geral uma consulta aninhada e que usa os operadores de comparação = ou IN poderá sempre ser expressa como um bloco único de consulta c) SELECT E.PNOME, E.UNOME FROM EMPREGADO AS E WHERE E.SSN IN (SELECT ESSN FROM DEPENDENTE WHERE E.PNOME=NOME_DEPENDENTE AND E.SEXO=SEXO); c) SELECT E.PNOME, E.UNOME FROM EMPREGADO AS E, DEPENDENTE AS D WHERE E.SSN = D.ESSN AND E.SEXO=D.SEXO AND E.PNOME=P.NOME_DEPENDENTE; A função EXISTS é usada para verificar se o resultado de uma consulta aninhada correlacionada é vazio (não contém nenhuma tupla) ou não em geral, EXISTS (Q) devolve true se existir ao menos uma tupla no resultado da consulta aninhada Q, caso contrário, devolverá false NOT EXISTS (Q) devolverá true se não existir nenhuma tupla no resultado da consulta aninhada Q, caso contrário, devolverá false opção para a consulta anterior usando EXISTS 1) SELECT E.PNOME, E.UNOME FROM EMPREGADO AS E WHERE EXISTS (SELECT * FROM DEPENDENTE WHERE E.SSN = ESSN AND E.SEXO=SEXO AND E.PNOME=NOME_DEPEDENTE); para cada tupla EMPREGADO, a consulta aninhada avalia devolvendo todas as tuplas de DEPENDENTE com o mesmo número de seguro social, sexo e nome da tupla EMPREGADO 2
Relacione os nomes dos gerentes que possuam ao menos um dependente 2) SELECT PNOME, UNOME FROM EMPREGADO WHERE EXISTS (SELECT * FROM DEPENDENTE WHERE SSN = ESSN AND EXISTS (SELECT * FROM DEPARTAMENTO WHERE SSN=GERSSN); tem-se duas consultas aninhadas e correlacionadas a primeira seleciona todas as tuplas de DEPENDENTE relacionadas a EMPREGADO e a segunda seleciona todas as tuplas de DEPARTAMENTO gerenciadas por um EMPREGADO se ao menos uma da primeira e uma da segunda existirem, seleciona-se a tupla de EMPREGADO É possível usar um conjunto de valores explícitos na cláusula WHERE em vez de consultas aninhadas esse conjunto é colocado entre parênteses recupere os números dos seguros sociais de todos os empregados que trabalham nos projetos 1, 2 ou 3: 3) SELECT DISTINCT ESSN FROM TRABALHA_EM WHERE PNO IN (1, 2, 3); O conceito de junção de tabelas foi incorporado para que os usuários pudessem especificar uma tabela que fosse resultado da aplicação da operação de junção na cláusula FROM de uma consulta (por exemplo, junção natural) recupere o nome e o endereço de todos os empregados que trabalham no departamento Pesquisa : 4) SELECT PNOME, UNOME ENDERECO FROM (EMPREGADO JOIN DEPARTAMENTO ON DNO=DNUMERO) WHERE DNOME= Pesquisa ; 3
Há diversas funções pré-construídas para diversas aplicações em BD: COUNT, SUM, MAX, MIN, AVG COUNT: devolve o número de tuplas ou valores especificado em uma consulta SUM, MAX, MIN, AVG: são aplicadas em um conjunto de valores e devolvem, respectivamente, a soma, o valor máximo, o valor mínimo e a média desses valores MAX e MIN podem ser usadas com atributos que não tenham domínios numéricos desde que esses domínios tenham uma ordenação total entre eles encontre a soma dos salários, o maior salário, o menor salário e a média salarial de todos os empregados 5) SELECT SUM (SALARIO), MAX (SALARIO), MIN (SALARIO, AVG (SALARIO) FROM EMPREGADO; COUNT (*) o * se refere às linhas, logo count(*) devolverá o número de linhas Recupere o número total de empregados da empresa 6) SELECT COUNT (*) FROM EMPREGADO; Recupere o número de empregados do departamento Pesquisa 7) SELECT COUNT (*) FROM EMPREGADO, DEPARTAMENTO WHERE DNO=DNUMERO AND DNOME= Pesquisa ; COUNT para contar o número de valores em uma coluna em vez de tuplas Conte o número dos diferentes valores de salário contidos no BD 8) SELECT COUNT (DISTINCT SALARIO) FROM EMPREGADO; 4
Para COUNT (SALARIO), os valores repetidos não serão eliminados tuplas com null não são contabilizadas Os valores NULL são descartados quando se aplicam as funções agregadas em um atributo em particular Pode-se especificar uma consulta aninhada correlacionada com funções agregadas Recupere os nomes de todos os empregados que têm dois ou mais dependentes 9) SELECT PNOME, UNOME FROM EMPREGADO WHERE (SELECT COUNT(*) FROM DEPENDENTE WHERE SSN=ESSN) >= 2; a tupla aninhada correlacionada conta o número de dependentes que cada um dos empregados tem; se esse número for maior ou igual a dois, a tupla desse empregado será selecionada Cláusula GROUP BY em alguns casos, precisa-se aplicar as funções agregadas para alguns subgrupos de tuplas e não para a totalidade das tuplas em conjunto exemplo: quando precisa-se encontrar a média de salário dos empregados de cada departamento ou dos empregados que trabalham em cada projeto na cláusula SELECT aparece o(s) atributo(s) de agrupamento e as funções que serão aplicadas em cada grupo de atributos, quando for o caso para cada departamento, recupere seu número, o número de empregados que nele trabalham e a média de seus salários Q24) SELECT DNO, COUNT (*), AVG (SALARIO) FROM EMPREGADO GROUP BY DNO; se houver NULL no atributo de agrupamento, um grupo separado será criado para as tuplas com valores NULL nesse atributo 5
Cláusula HAVING proporciona a aplicação de uma condição para o grupo de tuplas associado a cada valor dos atributos de agrupamento para cada projeto em que trabalhem mais de dois empregados, recupere o número do projeto, seu nome e o número de empregados Q26) SELECT PNUMERO, PJNOME, COUNT (*) FROM PROJETO, TRABALHA_EM WHERE PNUMERO=PNO GROUP BY PNUMERO HAVING COUNT(*) > 2; a cláusula WHERE limita as tuplas e a cláusula HAVING escolhe grupos 6
INSERT (inserção), DELETE (exclusão) e UPDATE (atualização) INSERT usado para adicionar uma única tupla em uma relação estabelece-se o nome da relação e uma lista de valores para a tupla devem ser relacionados na mesma ordem em que foram especificados os atributos no comando CREATE TABLE para se adicionar uma nova tupla à relação EMPREGADO: INSERT INTO EMPREGADO VALUES ( Richard, K, Marini, 653298653, 1962-12-30, 98 Oak Forest, Katy, TX, M, 37000, 987654321, 4); INSERT outra forma do comando INSERT: INSERT INTO EMPREGADO (PNOME, UNOME, DNO, SSN) VALUES ( Richard, Marini, 4, 653298653 ); os atributos que não foram especificados serão registrados com seus valores DEFAULT ou NULL os comandos são rejeitados se o SGBD implementa a integridade referencial e a integridade de entidade: INSERT INTO EMPREGADO (PNOME, UNOME, DNO, SSN) VALUES ( Robert, Hatcher, 2, 980760540 ); não existe DEPARTAMENTO com DNUMERO=2 INSERT INTO EMPREGADO (PNOME, UNOME, DNO) VALUES ( Richard, Hatcher, 5); o valor do SSN não foi informado e ele foi declarado como NOT NULL 7
DELETE remove tuplas de uma relação DELETE FROM EMPREGADO; as tuplas serão removidas de uma única tabela de cada vez, entretanto, as remoções podem propagar-se nas tuplas de outras relações, se forem definidas ações engatilhadas se foi incluída a cláusula WHERE, serão selecionadas as tuplas que serão deletadas DELETE FROM EMPREGADO WHERE UNOME= Brown ; DELETE FROM EMPREGADO WHERE DNO IN (SELECT DNUMERO FROM DEPARTAMENTO WHERE DNOME= Pesquisa ); UPDATE modifica os valores dos atributos de uma ou mais tuplas a cláusula WHERE seleciona as tuplas de uma única relação que serão modificadas, entretanto, uma atualização no valor da chave primária pode propagar-se para os valores das chaves estrangeiras, nas tuplas de outras relações, se essa ação engatilhada for especificada uma cláusula adicional SET, dentro do comando UPDATE, especifica os atributos que serão modificados e seus novos valores UPDATE PROJETO SET PLOCALIZACAO= Bellaire, DNUM = 5 WHERE PNUMERO=10; altera a localização e o número do departamento do projeto de número 10 8
UPDATE dar um aumento de salário de 10% a todos os empregados do departamento Pesquisa UPDATE EMPREGADO SET SALARIO=SALARIO*1.1 WHERE DNO IN (SELECT DNUMERO FROM DEPARTAMENTO WHERE DNOME= Pesquisa ); Próximo capítulo: mais SQL... asserções e visões... 9