SQL-99: Definição de esquema, restrições básicas e consultas A linguagem SQL é uma das maiores razões para o sucesso dos BD relacionais no mundo comercial Este capítulo apresenta as principais funcionalidades do padrão SQL para os SGBD s relacionais comerciais A linguagem SQL inclui as funcionalidades da álgebra relacional que tem base no cálculo relacional de tuplas, porém mais amigável O nome SQL (Structure Query Language) é Linguagem Estruturada de Consulta, originalmente chamada de SEQUEL (Structure English Query Language) SQL-99: Introdução Projetada e implementada na IBM Research como uma interface para um sistema experimental de BD relacional Versões padrão (esforço da ANSI/ISO) SQL1 ou SQL-86 SQL2 ou SQL-92 (revisada e expandida) SQL3 ou SQL-99 (linguagem padrão atual) Linguagem SQL é abrangente possui comandos para definição de dados, consultas e atualizações (tem ambas a DDL e a DML) possui regras para embutir comandos SQL em linguagens de programação genéricas: Java, Cobol ou C/C++ 1
SQL-99: Introdução SQL-99 especificação de núcleo (core) obrigatoriedade de implementação por todos os SGBD s relacionais compatíveis com o padrão pacotes opcionais (packages) podem ser adquiridos independentemente para aplicações específicas (datamining, datawarehousing) Apresentação da linguagem comandos da DDL da SQL para criação de esquemas e tabelas visão geral dos tipos de dados básicos na SQL especificação das restrições básicas (integridade de chave e referencial) comandos para modificação de esquemas, tabelas e restrições especificação de consultas básicas e complexas comandos para inserção, exclusão e atualização de dados SQL-99: Esquema SQL usa tabela, linha e coluna X relação, tupla e atributo Principal comando SQL para definição de dados CREATE: cria esquemas tabelas, domínios e restrições Esquema SQL identificado por um nome e possui identificação de autorização agrupa tabelas, restrições, visões (views), domínios e outros construtores que pertencem à mesma aplicação de um BD nem todos os usuários estão autorizados a criar esquemas e outros elementos este privilégio deve ser concedido previamente 2
SQL-99: Esquema e tabelas Criação do esquema EMPRESA pertencente ao usuário JSMITH CREATE SCHEMA EMPRESA AUTHORIZATION JSMITH Criação de tabelas CREATE TABLE dando-lhe um nome, especificando seus atributos com domínios e restrições iniciais (como NOT NULL, não pode ser vazio) as restrições de chave, a integridade de entidade e a integridade referencial podem ser especificadas dentro do comando CREATE TABLE ou poderão ser adicionadas depois com o comando ALTER TABLE SQL-99: Esquema e tabelas CREATE TABLE o comando deve ser executado dentro do ambiente de esquema criado alternativamente pode-se anexar o nome do esquema ao nome da tabela separados por um ponto CREATE TABLE EMPRESA.EMPREGADO ou CREATE TABLE EMPREGADO as tabelas declaradas pelo comando CREATE TABLE são reais e básicas, ou seja, são realmente criadas e armazenadas como um arquivo pelo SGBD, diferentemente das relações virtuais, criadas pelo CREATE VIEW que pode ou não corresponder a um arquivo físico 3
SQL-99: Tipos de dados de atributos e domínios Numéricos inteiros de vários tamanhos: INT, SMALLINT números de ponto flutuante (real): FLOAT, DOUBLE PRECISION números formatados: DECIMAL(i,j), DEC(i,j) ou NUMERIC(i,j) i é a precisão (número total de dígitos) j é a escala (número de dígitos depois do ponto decimal) o default para a escala é zero Cadeia de caracteres tamanho fixo: CHAR(n) tamanho variável: VARCHAR(n) case sensitive (distinção entre maiúsculas e minúsculas) SQL-99: Tipos de dados de atributos e domínios Bit-string cadeia de bits tamanho fixo: BIT(n) tamanho variável: BITVARYING(n) bit-strings literais são colocados entre apóstrofos, mas precedidos por B, B 101 Booleano true, false e unknown (null) Data e time tipo de dado Date contém 10 posições no formato: YYYY-MM-DD tipo de dado Time contém 8 posições no formato: HH:MM:SS a comparação < pode ser usada para datas e horários 4
SQL-99: Tipos de dados de atributos e domínios Timestamp engloba os campos Date e Time Interval um valor que pode ser utilizado para incrementar ou decrementar um valor absoluto de data, hora ou timestamp são qualificados para serem intervalos year/month ou day/time O tipo de dado de cada atributo pode ser especificado diretamente na criação dos atributos da tabela ou pode-se declarar o domínio para especificar um atributo com o comando CREATE DOMAIN TIPO_SSN AS CHAR(9); SQL-99: Tabelas e atributos 5
SQL-99: Tabelas e atributos SQL-99: Restrições básicas Restrição NOT NULL é especificada quando o NULL não for permitido para um dado atributo está sempre implícita para os atributos que são designados como chaves primárias É possível definir um valor default por meio da adição da cláusula DEFAULT<valor> na definição de um atributo DNO INT NOT NULL DEFAULT 1, GERSSN CHAR (9) NOT NULL DEFAULT 888665555, Pode-se limitar os valores do atributo usando CHECK seguido da definição do domínio DNUMERO INT NOT NULL CHECK (DNUMERO > 0 AND DNUMERO < 21), 6
SQL-99: Restrições básicas Pode-se usar a cláusula CHECK em conjunto com o comando CREATE DOMAIN CREATE DOMAIN D_NUM AS INTEGER CHECK (D_NUM > 0 AND D_NUM < 21); o domínio criado é para todo atributo que se refere ao número do departamento (tabelas DEPARTAMENTO, PROJETO, EMPREGADO) A cláusula PRIMARY KEY especifica um ou mais atributos que definem a chave primária da tabela se o atributo for único, a cláusula pode seguir o atributo diretamente DNUMERO INT PRIMARY KEY; A cláusula UNIQUE define as chaves alternativas (secundárias) (vide figura) A integridade referencial é especificada pela cláusula FOREIGN KEY (chave estrangeira) (vide figura) SQL-99: Restrições básicas Uma integridade referencial pode ser violada quando as tuplas são inseridas ou deletadas ou quando os valores dos atributos referentes à chave estrangeira forem modificados a ação padrão da SQL é rejeitar a operação de atualização que iria causar a violação o projetista do BD pode especificar uma ação alternativa: ações referenciais engatilhadas: SET NULL, CASCADE e SET DEFAULT a ser escolhida com ON DELETE ou ON UPDATE SET NULL ON DELETE (na exclusão, marcar nulo) se uma tupla referenciada for deletada, o valor será marcado com null em todas as tuplas que fizerem referência ao atributo que foi excluído CASCADE ON UPDATE (na atualização, propagar) se um valor referenciado for atualizado, o novo valor atualizado é propagado (cascated) para as tuplas que fizerem referência ao atributo atualizado 7
ações referenciais engatilhadas SQL-99: Restrições básicas SET DEFAULT receberá o valor definido como default CASCADE é apropriado para as tabelas geradas de relacionamentos M:N, tabelas que representam atributos multivalorados e tabelas que representam entidades fracas uma restrição pode ser nomeada (e deve ser único) após a palavra CONSTRAINT usado para identificar uma restrição em particular, para ser eliminada ou redefinida é possível adicionar a cláusula CHECK, no final da declaração CREATE TABLE para ter certeza de que um atributo obedeça a um determinado domínio CHECK (DEP_CRIA_DATA < GERDATAINICIO); SQL-99: Restrições básicas 8
SQL-99: Comandos para alterações de esquemas Comandos para evolução de um esquema adição ou eliminação de tabelas, atributos e restrições Comando DROP: eliminar DROP SCHEMA EMPRESA CASCADE; CASCADE elimina todas as tabelas, domínios, etc RESTRICT elimina somente se não contiver nenhum elemento DROP TABLE DEPENDENTE CASCADE; se não desejarmos mais manter dados dos dependentes se for escolhida a opção RESTRICT, a tabela será eliminada somente se não for referência para outras tabelas ou visões com CASCADE todas as restrições e visões que fizer referência são eliminadas do esquema SQL-99: Comandos para alterações de esquemas Comando ALTER: alterar ações de alteração possíveis (em tabelas) adicionar ou eliminar uma coluna alterar a definição de uma coluna adicionar ou eliminar restrições para adicionar um atributo novo ALTER TABLE EMPRESA.EMPREGADO ADD FUNCAO VARCHAR(12); o novo atributo conterá null para as tuplas já existentes na tabela para remoção de um atributo já existente ALTER TABLE EMPRESA.EMPREGADO DROP ENDERECO CASCADE; CASCADE: todas as restrições e visões que fizerem referência serão eliminadas RESTRICT: o comando será bem sucedido somente se nenhuma visão ou restrição fizer referência a este atributo 9
SQL-99: Comandos para alterações de esquemas Comando ALTER: alterar para alterar uma definição de atributo eliminando uma cláusula default existente ou definindo uma nova cláusula default ALTER TABLE EMPRESA.EMPREGADO ALTER GERSSN DROP DEFAULT; ALTER TABLE EMPRESA.EMPREGADO ALTER GERSSN SET DEFAULT 333445555 ; para modificar restrições, é preciso eliminar a antiga e adicionar a nova: para eliminar a restrição, ela precisa ter recebido um nome quando foi especificada ALTER TABLE EMPRESA.EMPREGADO DROP CONSTRAINT EMPSUPERFK CASCADE; para redefinir uma restrição basta usar a palavra-chave ADD no comando ALTER TABLE seguida da nova restrição Comando básico para recuperação de informações de um BD: SELECT diversas opções e variações do comando formato básico: SELECT-FROM-WHERE SELECT <lista de atributos> FROM <lista de tabelas> WHERE <condição>; <lista de atributos> lista dos nomes dos atributos cujos valores serão recuperados pela consulta <lista de tabelas> lista dos nomes das tabelas necessárias para o processamento da consulta <condição> expressão condicional que identifica as tuplas que serão recuperadas pela consulta 10
a) Recupere o aniversário e o endereço do(s) empregado(s) cujo nome seja John B. Smith SELECT DATANASC, ENDERECO FROM EMPREGADO WHERE PNOME = John AND MINICIAL = B AND UNOME = Smith ; 11
b) Recupere o nome e o endereço de todos os empregados que trabalham no departamento Pesquisa SELECT PNOME, UNOME, ENDERECO FROM EMPREGADO, DEPARTAMENTO WHERE DNOME = Pesquisa AND DNUMERO = DNO; c) Para cada projeto localizado em Stafford, relacione o número do projeto, o número do departamento responsável e o último nome do gerente do departamento, seu endereço e sua data de aniversário SELECT PNUMERO, DNUM, UNOME, ENDERECO, DATANASC FROM PROJETO, DEPARTAMENTO, EMPREGADO WHERE DNUM=DNUMERO AND GERSSN=SSN AND PLOCALIZACAO= Stafford ; 12
SQL-99: Esquema de BD EMPRESA SQL-99: Instâncias do esquema EMPRESA 13
Nomes de atributos ambíguos em SQL, um mesmo nome pode ser usado para dois (ou mais) atributos desde que esses atributos estejam em tabelas diferentes se uma consulta se refere a dois ou mais atributos como o mesmo nome, é preciso qualificar o nome do atributo com o nome da tabela fazendo a prefixação do nome da tabela ao nome do atributo, separados por um ponto consulta b) anterior: Se o atributo NOME estivesse presente nas tabelas PROJETO e EMPREGADO Se o atributo NUMERO estivesse presente nas tabelas EMPREGADO e DEPARTAMENTO SELECT PROJETO.NOME, EMPREGADO.NOME, ENDERECO FROM EMPREGADO, DEPARTAMENTO WHERE DEPARTAMENTO.NOME = Pesquisa AND DEPARTAMENTO.NUMERO = EMPREGADO.NUMERO; A ambigüidade também pode ser originada no caso de consultas que se referem duas vezes à mesma relação: d) para cada empregado recupere o primeiro e o último nome do empregado e o primeiro e o último nome de seu superior imediato SELECT E.PNOME, E.UNOME, S.PNOME, S.UNOME FROM EMPREGADO AS E, EMPREGADO AS S WHERE E.SUPERSSN=S.SSN; Pode-se declarar nomes alternativos E e S, chamados aliases (ou pseudônimos) para a tabela EMPREGADO (na cláusula FROM) EMPREGADO E EMPREGADO S É possível usar pseudônimos para os atributos da tabela por intermédio de aliases: EMPREGADO AS E (PN, MI, UN, SSN, DT, END, SEX, SAL, SSSN, DNO) 14
A ausência da cláusula WHERE indica que não há nenhuma condição para seleção todas as linhas da tabela especificada na cláusula FROM estão qualificadas e serão selecionadas na consulta se houver mais de uma tabela na cláusula FROM, será obtido o produto cartesiano dessas tabelas e) selecione os SSN s de todos os empregados SELECT SSN FROM EMPREGADO; f) selecione todas as combinações dos SSN s (de EMPREGADO) e dos DNOME s de DEPARTAMENTO (E X D = 24 linhas) SELECT SSN, DNOME FROM EMPREGADO, DEPARTAMENTO; 15
O * significa selecionar todos os atributos g) recupere todos os valores dos atributos de EMPREGADO que trabalham no DEPARTAMENTO de número 5 SELECT * FROM EMPREGADO WHERE DNO = 5; h) recupere para todo EMPREGADO do departamento Pesquisa, todos os atributos do EMPREGADO e todos os atributos do DEPARTAMENTO SELECT * FROM EMPREGADO, DEPARTAMENTO WHERE DNOME = Pesquisa AND DNO=DNUMERO; i) especifique o produto cartesiano das tabelas EMPREGADO e DEPARTAMENTO SELECT * FROM EMPREGADO, DEPARTAMENTO; Se deseja-se eliminar as repetições de resultado de uma consulta SQL, precisa-se usar a palavra-chave DISTINCT na cláusula SELECT somente as tuplas diferentes aparecem no resultado SELECT DISTINCT, elimina repetições SELECT ALL = SELECT, não elimina repetições a) recupere o salário de todos os empregados SELECT ALL SALARIO FROM EMPREGADO; b) recupere todos os diferentes valores de salários SELECT DISTINCT SALARIO FROM EMPREGADO; 16
Para se aplicar as operações de união (UNION), de diferença (EXCEPT) e de interseção (INTERSECT) às tabelas, é necessário que as duas tabelas, nas quais a operação será aplicada, tenham os mesmos atributos e que eles apareçam na mesma ordem Uso da operação UNION j) liste todos os números de projetos nos quais esteja envolvido algum empregado cujo nome seja Smith, como empregado ou como gerente do departamento que controla o projeto 17
(SELECT DISTINCT PNUMERO (1) FROM PROJETO, DEPARTAMENTO, EMPREGADO WHERE DNUM= DNUMERO AND GERSSN=SSN AND UNOME = Smith ) UNION (SELECT DISTINCT PNUMERO (2) FROM PROJETO, TRABALHA_EM, EMPREGADO WHERE PNUMERO=PNO AND ESSN=SSN AND UNOME = Smith ); A consulta (1) recupera os projetos que envolvem um Smith como gerente do departamento que controla o projeto, enquanto a segunda (2) recupera os projetos que envolvem um Smith como um empregado que nele trabalhe A linguagem SQL possui operações cujos resultados serão multiconjuntos (ou seja, repetições não são eliminadas): UNION ALL, EXCEPT ALL, INTERSECT ALL quando se aplicam essas operações, cada tupla sendo repetida ou não, é considerada uma tupla diferente: a) duas tabelas R(A) e S(A) b) R(A) UNION ALL S(A) c) R(A) EXCEPT ALL S(A) d) R(A) INTERSECT S(A) 18
LIKE: usado para comparações de padrões de cadeias % substitui um arbitrário entre zero ou mais caracteres underscore(_) substitui um único caractere k) recupere todos os empregados cujos endereços sejam em Houston, Texas SELECT PNOME, UNOME FROM EMPREGADO WHERE ENDERECO LIKE %Houston,TX% ; l) recupere todos os empregados que nasceram durante a década de 50 SELECT PNOME, UNOME FROM EMPREGADO WHERE DATANASC LIKE 5 _ ; Se um sinal _ ou % for necessário como um caractere literal em uma cadeia, ele deve ser precedido por um caractere de escape, o qual é especificado depois do string usando-se a palavra-chave ESCAPE AB\_CD\%EF ESCAPE \ representa a cadeia literal AB_CD%EF qualquer caractere que não seja usado na cadeia pode ser escolhido para o caractere de escape Aspas simples ( ) em geral são usadas no começo e no fim de cadeias se forem necessárias aspas simples elas serão representadas por aspas duplas ( ) Uso de funções e operadores aritméticos podem ser aplicados com atributos de domínios numéricos 19
m) Mostre o resultado dos salários caso fosse dado a todos os empregados que trabalham no projeto ProductX, um aumento de 10% SELECT PNOME, UNOME, 1.1*SALARIO AS AUMENTO_SAL FROM EMPREGADO, TRABALHA_EM, PROJETO WHERE SSN=ESSN AND PNO=PNUMERO AND PNOME= ProdutoX ; observe que trocou-se o nome do atributo no resultado da consulta usando AS na cláusula SELECT Existem os operadores de incremento (+) e de decremento(-) de datas, de horários ou de timestamp para um intervalo um intervalo é o resultado da diferença entre 2 datas, 2 horários ou 2 timestamps n) Recupere todos os empregados do departamento 5 que ganham entre 30 mil e 40 mil dólares SELECT * FROM EMPREGADO WHERE (SALARIO BETWEEN 30000 AND 40000) AND DNO=5; A condição acima é equivalente à condição ((SALARIO >= 30000) AND (SALARIO <= 40000)) A linguagem SQL permite que o usuário ordene as tuplas do resultado de uma consulta pelos valores de um ou mais atributos, usando-se a cláusula ORDER BY a ordenação default é ascendente pode-se especificar a palavra-chave DESC se quiser ordem descendente ASC pode ser também usada para explicitar a ordenação ascendente 20
n) Recupere a lista dos empregados e os respectivos projetos nos quais trabalham, ordenada por departamento, e, dentro de cada departamento, por ordem alfabética do último nome e, depois, pelo primeiro nome do empregado SELECT DNOME, UNOME, PNOME, PJNOME FROM DEPARTAMENTO, EMPREGADO, TRABALHA_EM, PROJETO WHERE DNUMERO=DNO AND SSN=ESSN AND PNO=PNUMERO ORDER BY DNOME, UNOME, PNOME; Se quiser DNOME em ordem descendente e UNOME e PNOME em ordem ascendente, a cláusula ORDER BY pode ser escrita: ORDER BY DNOME DESC, UNOME ASC, PNOME ASC; SQL-99: Consultas complexas A linguagem SQL não faz distinção entre os diferentes significados de NULL: desconhecido, indisponível ou não aplicável ao atributo quando ele é comparado em uma operação, o resultado é considerado UNKNOWN (desconhecido, pode ser tanto true quanto false) A linguagem SQL usa três valores lógicos: true (verdadeiro), false (falso) e unknown (desconhecido) tabelas verdade do AND, OR e NOT: AND T F U OR T F U NOT T T F U T T T T T F F F F F F T F U F T U U F U U T U U U U 21
SQL-99: Consultas complexas A SQL permite consultas que chequem se o valor de um atributo é NULL usa IS (é) ou IS NOT(não é), em vez de = ou <> d) recupere os nomes de todos os empregados que não tem supervisor SELECT PNOME, UNOME FROM EMPREGADO WHERE SUPERSSN IS NULL; O operador de comparação IN compara um valor v com um conjunto de valores V e evolui para verdadeiro, true, se for um dos elementos de V consulta j): (SELECT DISTINCT PNUMERO FROM PROJETO, DEPARTAMENTO, EMPREGADO; WHERE DNUM= DNUMERO AND GERSSN=SSN AND UNOME = Smith ) UNION (SELECT DISTINCT PNUMERO FROM PROJETO, TRABALHA_EM, EMPREGADO; WHERE PNUMERO=PNO AND ESSN=SSN AND UNOME = Smith ); SQL-99: Consultas complexas Consulta aninhada: a 1ª. consulta seleciona os números de projetos que tiverem um Smith como supervisor, enquanto a 2ª. seleciona os números de projetos que tiverem um empregado Smith envolvido SELECT DISTINCT PNUMERO FROM PROJETO WHERE PNUMERO IN (SELECT PNUMERO FROM PROJETO, DEPARTAMENTO, EMPREGADO WHERE DNUM=DNUMERO AND GERSSN=SSN AND UNOME = Smith ) OR PNUMERO IN (SELECT PNO FROM TRABALHA_EM, EMPREGADO WHERE ESSN=SSN AND UNOME = Smith ); 22
SQL-99: Consultas complexas o) Selecione o número do seguro social de todos os empregados que trabalham com a mesma combinação (projeto, horas) em algum projeto em que o empregado John Smith (ESSN = 123456789 ) trabalhe SELECT DISTINCT ESSN FROM TRABALHA_EM WHERE (PNO, HORAS) IN (SELECT PNO, HORAS FROM TRABALHA_EM WHERE ESSN= 123456789 ); Além do operador IN, existem os operadores ANY ou SOME, equivalentes ao IN que devolvem true se o valor v for igual a algum valor do conjunto V Outros operadores podem ser combinados com ANY (ou SOME), incluindo >, >=, <, <= e <> A palavra ALL pode ser combinada com cada um desses operadores (v > ALL V): devolve true se o valor v for maior que todos os valores de V SQL-99: Consultas complexas p) Recupere os nomes dos empregados cujos salários são maiores que os salários de todos os empregados do departamento 5 SELECT UNOME, PNOME FROM EMPREGADO WHERE SALARIO > ALL (SELECT SALARIO FROM EMPREGADO WHERE DNO=5); Qualificação de atributos para evitar ambigüidades c) recupere o nome de cada um dos empregados que tenham um dependente cujo primeiro nome e sexo sejam o mesmo do empregado em questão 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); 23
SQL-99: Esquema de BD EMPRESA SQL-99: Instâncias do esquema EMPRESA 24
SQL-99: Consultas complexas 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; SQL-99: Consultas complexas 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 25
SQL-99: Consultas complexas 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 SQL-99: Consultas complexas É 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 ; 26
SQL-99: Consultas complexas 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; SQL-99: Consultas complexas 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; 27
SQL-99: Consultas complexas 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 SQL-99: Consultas complexas 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 28
SQL-99: Consultas complexas Cláusula HAVING SQL-99: Consultas complexas 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 29
SQL-99: Comandos de modificação 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); SQL-99: Comandos de modificação 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 30
SQL-99: Comandos de modificação 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 ); SQL-99: Comandos de modificação 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 31
SQL-99: Comandos de modificação 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 ); SQL: Visões Visão é uma tabela única derivada de uma outra tabela Considerada como uma tabela virtual Um meio para a especificação de uma tabela que precise ser consultada freqüentemente, embora ela não exista fisicamente Comando: CREATE VIEW A visão recebe um nome, uma lista de nomes de atributos e uma consulta para especificar o conteúdo dessa visão Se nenhum dos atributos da visão for resultado de uma função ou de uma operação aritmética, não é necessário especificar os nomes dos atributos para a visão; eles recebem os mesmos nomes que os atributos definidos para as tabelas 32
SQL: Visões As visões V1 e V2 criam tabelas virtuais cujos esquemas estão ilustrados a seguir: SQL: Visões Pode-se especificar as consultas SQL em uma visão do mesmo modo que se especifica consultas sobre tabelas básicas Para recuperar o último e o primeiro nome de todos os empregados que trabalham no ProjetoX, pode se utilizar a visão TRABALHA_EM1 e formular a consulta SELECT PNOME, UNOME FROM TRABALHA_EM1 WHERE PJNOME= ProjetoX ; Uma das principais vantagens das visões é simplificar a especificação de certas consultas 33
SQL: Visões Supõe se que uma visão esteja sempre atualizada, se as tuplas das tabelas básicas sobre as quais a visão foi construída são modificadas, a visão deverá, automaticamente, refletir essas alterações A visão não é realizada no instante da sua definição, mas quando especifica-se uma consulta sobre ela Para dispensar uma visão criada usa-se o comando DROP VIEW DROP VIEW TRABALHA_EM1; SQL: Visões Considere a seguinte visão, DEPT_RESUMO, definida para o BD EMPRESA CREATE VIEW DEPT_RESUMO (D, C, TOTAL_S, MEDIA_S) AS SELECT DNO, COUNT(*), SUM(SALARIO), AVG(SALARIO) FROM EMPREGADO GROUP BY DNO; Estabeleça quais dentre as seguintes consultas seriam permitidas para a visão criada acima: a) SELECT * FROM DEPT_RESUMO; b) SELECT D,C FROM DEPT_RESUMO WHERE TOTAL_S > 100000; c) SELECT D, C, MIN(TOTAL_S) FROM DEPT_RESUMO; d) SELECT D, MEDIA_S FROM DEPT_RESUMO WHERE C > (SELECT C FROM DEPT_RESUMO WHERE D=4); 34