Escolar Documentos
Profissional Documentos
Cultura Documentos
De uma forma geral, SQL utiliza os termos tabela, linha e coluna para relao, tupla e atributo, respectivamente.
1
Esquema e Catlogo
A SQL1 no contemplava o conceito de esquema de banco de dados relacional.
Todas as tabelas eram consideradas parte do mesmo esquema.
Esquema, incorporado SQL2, utilizado para agrupar tabelas e outros componentes que pertencem mesma aplicao de banco de dados.
Um esquema definido por um nome e inclui um identificador de autorizao para indicar o usurio que dono do esquema. CREATE SCHEMA Empresa AUTHORIZATION JSilva; Os elementos de um esquema incluem tabelas, restries, vises, domnios e outros componentes.
INT
NOT NULL
DEFAULT 1,
10
11
12
Neste caso, se j existirem tuplas na relao <R>, o novo atributo receber valores nulos para essas tuplas.
13
14
ALTER TABLE <R> ALTER <A> SET DEFAULT <V>: adiciona uma clusula de default, referente ao atributo <A> da relao existente <R>, com o valor <V>.
ALTER TABLE Empregado ALTER NumDepto SET DEFAULT 2;
ALTER TABLE <R> ADD CONSTRAINT <C>: adiciona a restrio <C> na relao existente <R>.
ALTER TABLE Empregado ADD CONSTRAINT FK_NumSup FOREIGN KEY (NumSupervisor) REFERENCES Empregado (NumEmpregado) ON DELETE SET NULL ON UPDATE CASCADE;
15
16
Esta consulta equivalente seguinte expresso em lgebra relacional: A1, A2, ...,An (cond (R1 R2 Rm) )
17
Operador LIKE
Na SQL, o operador de comparao LIKE permite condies de comparao em partes de uma cadeia de caracteres.
O caractere '%' substitui um nmero arbitrrio de caracteres. O caractere '_' substitui um nico caractere.
Para remover as tuplas duplicadas no resultado de uma consulta, deve-se usar a palavra-chave DISTINCT na clusula SELECT.
SELECT DISTINCT UltimoNome FROM Empregado;
Para especificar que as tuplas duplicadas no devem ser removidas, deve-se usar a palavra-chave ALL (default).
SELECT ALL UltimoNome FROM Empregado;
19
Operadores aritmticos
Outra caracterstica da SQL a permisso em se utilizar operadores aritmticos ('+', '-', '*', '/') nas consultas. Apresentar os salrios resultantes de um aumento de 10% a todos os empregados do projeto 'Produto Y' :
SELECT PrimeiroNome, UltimoNome, 1.1 * Salario FROM Empregado, Trabalha_em, Projeto WHERE (Empregado.NumEmpregado = Trabalha_em.NumEmpregado) AND (Projeto.NumProj = Trabalha_em.NumProj) AND (NomeProj = 'Produto Y');
Operador BETWEEN
Por meio do operador BETWEEN, possvel especificar um intervalo de valores para um atributo. Listar todos os empregados do departamento 5 cujo salrio esteja entre 5000 e 8000:
SELECT * FROM Empregado WHERE (Salrio BETWEEN 5000 AND 8000) AND NumDepto = 5;
21
22
Clusula ORDER BY
A SQL permite ordenar as tuplas no resultado de uma consulta pelos valores de um ou mais atributos, utilizando a clusula ORDER BY. Listar os nomes dos empregados, os nomes de seus departamentos e os nomes dos projetos nos quais eles esto trabalhando, ordenados por departamento e, dentro de cada departamento, ordenados alfabeticamente pelo empregado:
SELECT NomeDepto, PrimeiroNome, UltimoNome, NomeProj FROM Departamento, Empregado, Trabalha_em, Projeto WHERE (Empregado.NumDepto=Departamento.NumDepto) AND (Empregado.NumEmpregado=Trabalha_em.NumEmpregado) AND (Projeto.NumProj = Trabalha_em.NumProj) ORDER BY NomeDepto, PrimeiroNome;
23
Operaes de Conjunto
A SQL incorporou as seguintes operaes de conjunto da lgebra relacional:
unio (UNION); interseo (INTERSECT); diferena (EXCEPT).
24
Operaes de Conjunto
Listar os nmeros de projetos que envolvem um empregado cujo sobrenome seja 'Silva', como trabalhador ou como gerente de um departamento que controla o projeto:
SELECT DISTINCT NumProj FROM Projeto, Departamento, Empregado WHERE (Projeto.NumDepto=Departamento.NumDepto) AND (NumGerente=NumEmpregado) AND (UltimoNome= 'Silva') UNION SELECT DISTINCT NumProj FROM Trabalha_em, Empregado WHERE (Empregado.NumEmpregado=Trabalha_em.NumEmpregado) AND (UltimoNome= 'Silva');
25
26
Subconsultas
Uma subconsulta um bloco completo (SELECT ... FROM ... WHERE) que existe dentro da clusula WHERE de uma outra consulta, chamada consulta externa.
SELECT DISTINCT NumProj FROM Projeto WHERE NumProj IN ( SELECT NumProj FROM Projeto, Departamento, Empregado O operador IN funciona como WHERE (NumGerente=NumEmpregado) AND o operador '' da teoria de conjuntos: verifica se um valor (Projeto.NumDepto=Departamento.NumDepto) pertence a um conjunto. AND (UltimoNome= 'Silva')) OR NumProj IN ( SELECT T.NumProj FROM Trabalha_em AS T, Empregado AS E WHERE (E.NumEmpregado=T.NumEmpregado) AND (E.UltimoNome= 'Silva'));
28
27
Os operadores SOME e ALL precisam acompanhar algum operador lgico: =, <>, >, >=, <, <=. O operador '= SOME' equivalente ao operador IN.
Obter o nome dos empregados que possuem salrio maior que o salrio de algum empregado do depart. 'Pesquisa':
SELECT E.PrimeiroNome, E.UltimoNome FROM Empregado AS E WHERE E.Salario > SOME ( SELECT M.Salario FROM Empregado AS M, Departamento AS D WHERE (M.NumDepto=D.NumDepto) AND 30 (D.NomeDepto= 'Pesquisa'));
29
Subconsultas Correlacionadas
Sempre que uma condio na clusula WHERE de uma subconsulta faz referncia a algum atributo de uma relao declarada na consulta externa, diz-se que as duas consultas so correlacionadas.
Neste caso, a subconsulta avaliada uma vez para cada tupla (ou combinao de tuplas) da consulta externa.
Funo EXISTS
A funo EXISTS utilizada para verificar se o resultado de uma subconsulta correlacionada vazio ou no. Obter os nomes dos empregados que no possuem dependentes:
SELECT E.PrimeiroNome, E.UltimoNome FROM Empregado AS E WHERE NOT EXISTS (SELECT * FROM Dependente AS D WHERE E.NumEmpregado = D.NumEmpregado);
Obter o nome de cada empregado que possui um dependente com o mesmo primeiro nome do empregado.
SELECT E.PrimeiroNome, E.UltimoNome FROM Empregado AS E WHERE E.NumEmpregado IN (SELECT D.NumEmpregado FROM Dependente AS D WHERE E.PrimeiroNome = NomeDependente);
31
32
Funo EXISTS
Obter os nomes dos gerentes que possuem pelo menos um dependente:
SELECT E.PrimeiroNome, E.UltimoNome FROM Empregado AS E WHERE EXISTS (SELECT * FROM Dependente AS D WHERE E.NumEmpregado=D.NumEmpregado) AND EXISTS (SELECT * FROM Departamento WHERE E.NumEmpregado = NumGerente);
33
34
Valor NULL
SQL permite consultas que verificam se o valor de um atributo NULL; para isto, utiliza-se o operador IS ou IS NOT.
Obter os nomes dos empregados que no possuem supervisores:
SELECT PrimeiroNome, UltimoNome FROM Empregado WHERE NumSupervisor IS NULL;
O exemplo exemplificou uma juno externa esquerda (LEFT OUTER JOIN); mas existem tambm a juno externa direita (RIGHT OUTER JOIN) e a juno externa completa (FULL OUTER JOIN).
37
38
41
42
Para cada projeto onde trabalham mais de dois empregados, obter o nmero, o nome e a quantidade de empregados que trabalham no projeto:
SELECT P.NumProj, P.NomeProj, COUNT(*) FROM Projeto AS P, Trabalha_em AS T WHERE P.NumProj=T.NumProj GROUP BY P.NumProj, P.NomeProj HAVING COUNT(*) > 2;
43
44
Comando INSERT
Em sua forma mais simples, o comando INSERT utilizado para adicionar uma nica tupla a uma relao.
Deve-se especificar o nome da relao e uma lista de valores para a tupla. Os valores da tupla devem estar relacionados na mesma ordem em que foram definidos no CREATE TABLE.
INSERT INTO Empregado VALUES ('Rosana', 'P', 'Souza', '653298653', '1962-12-30', 'R.Alagoas, 1230', 'F', 3000, '987654321', 4);
Comando INSERT
Uma segunda forma permite especificar nomes explcitos de atributos que correspondem aos valores fornecidos no comando INSERT.
INSERT INTO Empregado(PrimeiroNome, UltimoNome, NumEmpregado, NumDepto) VALUES ('Rosana', 'Souza', '653298653', 4);
45
46
Comando INSERT
Uma variao do comando INSERT inclui mltiplas tuplas numa relao, conjuntamente com a criao da relao e a carga da mesma com o resultado de uma consulta.
CREATE TABLE Info_Deptos ( Nome_Depto VARCHAR(15), Num_de_Emps INTEGER, Total_Sal INTEGER ); INSERT INTO Info_Deptos SELECT NomeDepto, COUNT(*), SUM(Salario) FROM (Departamento JOIN Empregado ON Departamento.NumDepto=Empregado.NumDepto) GROUP BY NomeDepto;
47
Comando DELETE
O comando DELETE remove tuplas de uma relao. Possui a clusula WHERE para selecionar as tuplas a serem excludas.
Quando no especificada, todas as tuplas da relao determinada so excludas; entretanto, a tabela permanece no banco de dados como uma tabela vazia.
48
Comando DELETE
DELETE FROM Empregado WHERE UltimoNome = 'Silva'; DELETE FROM Empregado WHERE Salario < 800; DELETE FROM Empregado WHERE NumDepto IN (SELECT NumDepto FROM Departamento WHERE NomeDepto = 'Pesquisa'); DELETE FROM Empregado;
Comando UPDATE
O comando UPDATE utilizado para modificar valores de atributos de uma ou mais tuplas em uma nica relao.
Clusula WHERE para selecionar as tuplas a serem modificadas. Clusula SET para especificar os atributos a serem modificados e o seus novos valores. A modificao do valor de uma chave primria pode se propagar para chaves estrangeiras de outras relaes, de acordo com as restries de integridade referencial definidas.
Alterar a localizao e o nmero do departamento controlador do projeto nmero 10 para 'Anchieta' e 1, respectivamente:
UPDATE Projeto SET Localizao = 'Anchieta', NumDepto = 1 WHERE NumProj = 10;
49
50
Comando UPDATE
Diversas tuplas podem ser modificadas com um nico comando UPDATE. Aumentar em 10% os salrios de todos os empregados do Departamento 'Pesquisa':
UPDATE Empregado SET Salario = Salario * 1.1 WHERE NumDepto IN (SELECT NumDepto FROM Departamento WHERE NomeDepto='Pesquisa');
Vises em SQL
Uma viso em SQL uma relao nica que derivada de outras relaes ou de outras vises previamente definidas.
Uma viso no existe necessariamente na forma fsica: considerada uma relao virtual, limitando assim, as operaes de atualizao que podem ser aplicadas. No h limitao na consulta de uma viso.
51
Vises em SQL
CREATE VIEW V_Trabalha_em AS SELECT PrimeiroNome, UltimoNome, NomeProj, Horas FROM Empregado AS E, Projeto AS P, Trabalha_em AS T WHERE (E.NumEmpregado = T.NumEmpregado) AND (P.NumProj = T.NumProj); CREATE VIEW V_Info_Deptos (NomeDepto, QteEmps, TotalSal) AS SELECT NomeDepto, COUNT(*), SUM(Salario) FROM (Departamento JOIN Empregado ON Departamento.NumDepto=Empregado.NumDepto) GROUP BY NomeDepto;
Vises em SQL
Uma vez definida uma viso, pode-se realizar consultas utilizando a mesma. Obter o primeiro e o ltimo nome de todos os empregados que trabalham no projeto 'Projeto X':
SELECT PrimeiroNome, UltimoNome FROM V_Trabalha_em WHERE NomeProj = 'Projeto X';
Uma das principais vantagens de uma viso simplificar a especificao de certas consultas. As vises tambm so utilizadas como mecanismos de segurana e autorizao.
53
54
Vises em SQL
Uma viso est sempre atualizada, pois no efetua alguma ao no momento em que definida, e sim no momento em que se especifica uma consulta utilizando-a. Para remover uma viso, utiliza-se o comando DROP VIEW. DROP VIEW V_Trabalha_em;
Vises em SQL
Com relao atualizao de dados das relaes definidoras de uma viso, a partir da mesma, pode-se dizer que:
uma viso definida a partir de uma nica relao atualizvel se os atributos da viso contiverem a chave primria (ou possivelmente alguma outra chave candidata) de tal relao, pois isso mapeia cada tupla da viso para uma nica tupla da relao definidora; uma viso definida a partir de mltiplas relaes utilizando junes geralmente no atualizvel, pois a atualizao pela viso deve ser mapeada em diversas atualizaes nas relaes definidoras para fornecer o efeito desejado; uma viso definida com o uso de agrupamento e funes agregadas no atualizvel, pois alguns atributos no existem nas relaes definidoras.
56
55