SQL (Tópicos) Structured Query Language ISI Introdução aos Sistemas de Informação SQL (Tópicos) 1
SQL: componentes SQL / DDL (Data Definition Language) Permite definir os Esquemas de Relação Permite definir os atributos dos Esquemas de Relação Permite definir restrições (chaves primárias, estrangeiras, etc.) SQL / DML (Data Manipulation Language) Permite aceder à informação armazenada na base de dados Permite inserir, eliminar e alterar a informação presenta na base de dados SQL (Tópicos) 2
Comandos Principais Definição de Dados CREATE Criar estruturas de dados (tabelas, vistas,índices) ALTER Alterar estruturas de dados DROP Remover estruturas de dados SQL / DDL Interrogação SELECT Manipulação de Dados INSERT Inserir novos registos UPDATE Alterar registos existentes DELETE Apagar registos SQL / DML SQL (Tópicos) 3
Comandos Principais Controlo de Transações COMMIT SAVEPOINT ROLLBACK Segurança GRANT Usado para atribuir direitos de acesso DENY Usado para negar direitos de acesso REVOKE Usado para anular ordem direitos de acesso SQL (Tópicos) 4
Comando CREATE A sintaxe do geral do CREATE, para este caso: CREATE TABLE <nome tabela> ( {<nome coluna> <tipo> [DEFAULT <valor função NULL>] [<restrição de coluna>] }+ [restrição de tabela] ) <restrição de coluna> restrição a aplicar a uma coluna <restrição de tabela> aplica-se a mais de uma coluna SQL (Tópicos) 5
Sintaxe das restrições: [CONSTRAINT nome_restrição] [{PRIMARY KEY UNIQUE]} ( coluna, )] [FOREIGN KEY ( coluna, ) {REFERENCES tabela [( coluna, )] [CHECK ( condição )] [ON DELETE {NO ACTION CASCADE SET DEFAULT SET NULL}] [ON UPDATE {NO ACTION CASCADE SET DEFAULT SET NULL}}] SQL (Tópicos) 6
INSERT, UPDATE e DELETE INSERT (insere linhas numa tabela) INSERT INTO <nome da tabela> [(coluna1, coluna2,...)] VALUES (valor1, valor2,...) <comando SELECT> UPDATE (actualiza linhas de uma tabela) UPDATE <nome da tabela> SET coluna = valor expressão, coluna = valor expressão,... [WHERE <condição>] DELETE (remove linhas de uma tabela) DELETE FROM <nome da tabela> [WHERE <condição>] SQL (Tópicos) 7
Comando SELECT A sintaxe geral de uma interrogação SQL é a seguinte: SELECT [DISTINCT] <colunas> * FROM <tabelas> [WHERE <condição>] DISTINCT indica que se quer remover os duplicados no resultado final O símbolo * é utilizado quando se pretendem seleccionar todos os atributos das tabelas especificadas na cláusula FROM SQL (Tópicos) 8
Junção Interna e Externa INNER JOIN = JOIN OUTER JOIN LEFT OUTER JOIN RIGHT OUTER JOIN FULL OUTER JOIN SQL (Tópicos) 9
INNER JOIN Ex: Seja Material(codigoMaterial,nome) Fornecedor(codigoFornecedor, nome) Fornece(codigoFornecedor, codigomaterial) Qual o nome do fornecedor e os nomes dos materiais por ele fornecido? SELECT Fornecedor.nome,Material.nome FROM Fornecedor INNER JOIN Fornece ON (Fornecedor.codigoFornecedor = Fornece. codigofornecedor) INNER JOIN Material ON (Fornece.codigoMaterial=Material.codigoMaterial) SQL (Tópicos) 10
OUTER JOIN Ex: Quais os códigos de todos os fornecedores e todos os produtos, por eles fornecidos ou não. SELECT Material.*, Fornece.codFornecedor FROM Material FULL OUTER JOIN Fornece ON (Fornece.codigoMaterial=Material.codigoMaterial) SQL (Tópicos) 11
Funções de Agregação Existem um conjunto de funções que efectuam operações sobre conjunto de linhas COUNT conta o número de linhas SUM efectua o somatório de valores AVG encontra a média de valores MAX determina o maior valor MIN determina o menor valor Ex.: SELECT COUNT(codEmpregado) FROM Empregado SQL (Tópicos) 12
Group By A cláusula GROUP BY tem a forma: GROUP BY <lista colunas> Onde <lista de colunas> é uma lista de colunas separadas por vírgula, sobre as quais será feito o agrupamento Ex: SELECT codigo, MAX(ordenado) FROM DEPARTAMENTO GROUP BY codigo SQL (Tópicos) 13
Having A cláusula WHERE é verificada para cada linha da tabela, ficando essa linha no resultado final se verificar a condição Por vezes, apenas se querem obter resultados sobre grupos quando estes verificam uma determinada condição; Com a cláusula WHERE não se consegue isso!!! A cláusula HAVING é verificada para o conjunto de linhas; só os grupos que verificarem a condição são considerados SQL (Tópicos) 14
Having (exemplo) Quais os códigos dos departamentos e o maior dos salários, onde a média seja maior que 1000? SELECT coddepartamento, MAX(Ordenado) FROM FUNCIONARIO GROUP BY coddepartamento HAVING AVG(ordenado)>1000 Uma diferença entre as cláusulas HAVING e WHERE: A cláusula HAVING deve sempre conter funções de agregação A cláusula WHERE nunca contém funções de agregação SQL (Tópicos) 15
ORDER BY Por vezes deseja-se que o resultado de uma interrogação venha ordenado por um determinado critério Essa ordenação é feita utilizando a cláusula ORDER BY A cláusula ORDER BY tem a forma: ORDER BY <coluna número da coluna [ASC DESC] > SQL (Tópicos) 16
ORDER BY Ex: Qual o nome e o departamento dos funcionários existentes, ordenados alfabeticamente? SELECT nome, coddepartamento FROM FUNCIONARIO ORDER BY nome ASC SQL (Tópicos) 17
GROUP BY, HAVING e ORDER BY A sintaxe do SELECT, com a inclusão das cláusulas GROUP BY, HAVING e ORDER BY: SELECT [DISTINCT] <colunas> * FROM <lista tabelas> [WHERE <condição>] [GROUP BY <lista colunas> ] [HAVING <condição>] [ORDER BY <coluna número da Coluna [ASC DESC] > ] SQL (Tópicos) 18
GROUP BY, HAVING e ORDER BY Ex: Quais os códigos dos departamentos e o maior dos salários, onde a média seja maior que 1000, ordenados por ordem decrescente de salários? SELECT coddepartamento, MAX(Ordenado) FROM FUNCIONARIO GROUP BY coddepartamento HAVING AVG(ordenado)>1000 ORDER BY 2 DESC SQL (Tópicos) 19
Sub-Interrogações e Predicados Consideremos: CATEGORIA( codcat, nome, salariobase ) DEPARTAMENTO( coddep, nome, localizacao ) EMPREGADO( codemp, nome, salarioefectivo, codcat, coddep ) SQL (Tópicos) 20
Sub-Interrogação Ex: Qual o nome dos empregados que trabalham no mesmo departamento que o(s) empregado(s) com nome João Maria'? SELECT nome FROM EMPREGADO as EP1 INNER JOIN EMPREGADO as EP2 ON(EP1.codDep=EP2.codDep) WHERE EP1.nome<>EP2.nome AND EP1.nome= João Maria Existe no entanto outra solução possível: Separar a interrogação em duas partes!!! SQL (Tópicos) 21
Utilizando o predicado IN SELECT DISTINCT E1.nome FROM EMPREGADO AS E1 WHERE E1.nome <> João Maria' AND E1.codDep IN ( SELECT DISTINCT E2.codDep FROM EMPREGADO AS E2 WHERE E2.nome = João Maria') Foi utilizada uma sub interrogação (SELECT interior) para responder à questão. Atenção: o resultado da sub-interrogação pode corresponder a mais do que um código de departamento. Foi utilizado o predicado IN SQL (Tópicos) 22
Utilizando a comparação = Ex: Qual o código e nome dos empregados que trabalham no mesmo departamento que o empregado com código 4? SELECT E1.codEmp, E1.nome FROM EMPREGADO AS E1 WHERE E1.codEmp <> 4 AND E1.codDep = ( SELECT E2.codDep FROM EMPREGADO AS E2 WHERE E2.codEmp = 4 ) Atenção : o resultado da sub-interrogação corresponde apenas a 1 código SQL (Tópicos) 23
Utilizando o predicado ALL Ex: Quais os empregados cujo salário base é superior ou igual a todos os salários base dos empregados do departamento 2? SELECT E1.codEmp, E1.nome FROM EMPREGADO AS E1 INNER JOIN CATEGORIA AS C1 ON (E1.codCat = C1.codCat) WHERE C1.salarioBase > = ALL ( SELECT C2.salarioBase FROM EMPREGADO AS E2, CATEGORIA AS C2 WHERE E2.codCat = C2.codCat AND E2.codDep = 2 ) SQL (Tópicos) 24
Utilizando o predicado ANY Ex: Quais os empregados cujo salário base é superior a algum dos salários base dos empregados do departamento 2? SELECT E1.codEmp, E1.nome FROM EMPREGADO AS E1 INNER JOIN CATEGORIA AS C1 ON (E1.codCat = C1.codCat) WHERE C1.salarioBase > ANY ( SELECT C2.salarioBase FROM EMPREGADO AS E2, CATEGORIA AS C2 WHERE E2.codCat = C2.codCat AND E2.codDep = 2 ) SQL (Tópicos) 25
Utilizando o predicado EXISTS Ex: Código e nome dos departamentos que têm empregados (i.e. onde existe pelo menos um empregado)? SELECT D1.codDep, D1.nome FROM DEPARTAMENTO AS D1 WHERE EXISTS ( SELECT * FROM EMPREGADO AS E1 WHERE E1.codDep =D1.codDep) Atenção: sub-interrogação correlacionada!!! A condição é verdadeira se o resultado da sub-interrogação for não vazio!!!! SQL (Tópicos) 26
Utilizando o predicado EXISTS Ex: Código e nome dos departamentos que não têm empregados (i.e. onde não existe qualquer empregado)? SELECT D1.codDep, D1.nome FROM DEPARTAMENTO AS D1 WHERE NOT EXISTS ( SELECT * FROM EMPREGADO AS E1 WHERE E1.codDep =D1.codDep) A condição é verdadeira se o resultado da sub-interrogação for vazio!!!! Atenção: sub-interrogação correlacionada!!! SQL (Tópicos) 27
A Divisão utilizando o EXISTS Ex: Quais os departamentos que têm empregados de todas as categorias? Outra forma de colocar a questão: Quais os departamentos para os quais não existe nenhuma categoria da qual não existem empregados nesse departamento. É o mesmo que dizer que: Se existir uma categoria da qual determinado departamento não tem empregados, então não queremos esse departamento. SQL (Tópicos) 28
A divisão Ex: Quais os departamentos que têm empregados de todas as categorias? SELECT D1.codDep, D1.nome FROM DEPARTAMENTO AS D1 WHERE NOT EXISTS (SELECT * FROM CATEGORIA AS C1 WHERE NOT EXISTS ( SELECT * FROM EMPREGADO AS E1 WHERE E1.codDep =D1.codDep AND E1.codCat = C1.codCat )) SQL (Tópicos) 29