8/8/2019 SQL - Tpicos
1/29
ISI - Sem. Vero 05/06 ISEL-DEETC-SSIC - Lara SantosSQL (Tpicos) 1
SQL (Tpicos)SQL (Tpicos)Structured Query LanguageStructured Query Language
ISI Introduo aos Sistemas deInformao
Semestre de Vero 2005/2006
ISEL-DEETC-SSIC
Lara Santos
http://www.deetc.isel.ipl.pt/sinfoconhecimento/isi/
8/8/2019 SQL - Tpicos
2/29
ISI - Sem. Vero 05/06 ISEL-DEETC-SSIC - Lara SantosSQL (Tpicos) 2
SQL: componentes
SQL / DDL (Data Definition Language)
Permite definir os Esquemas de Relao Permite definir os atributos dos Esquemas de Relao
Permite definir restries (chaves primrias, estrangeiras,etc.)
SQL / DML (Data Manipulation Language)
Permite aceder informao armazenada na base de dados Permite inserir, eliminar e alterar a informao presenta nabase de dados
8/8/2019 SQL - Tpicos
3/29
ISI - Sem. Vero 05/06 ISEL-DEETC-SSIC - Lara SantosSQL (Tpicos) 3
Comandos Principais Definio de Dados
CREATE Criar estruturas de dados(tabelas, vistas,ndices)
ALTER Alterar estruturas de dados
DROP Remover estruturas de dados
Interrogao
SELECT
Manipulao de Dados INSERT Inserir novos registos UPDATE Alterar registos existentes DELETE Apagar registos
SQL / DDL
SQL / DML
8/8/2019 SQL - Tpicos
4/29
ISI - Sem. Vero 05/06 ISEL-DEETC-SSIC - Lara SantosSQL (Tpicos) 4
Comandos Principais
Controlo de Transaes COMMIT SAVEPOINT
ROLLBACK
Segurana GRANT Usado para atribuir direitos de acesso
DENY Usado para negar direitos de acesso REVOKE Usado para anular ordem direitos de
acesso
8/8/2019 SQL - Tpicos
5/29
ISI - Sem. Vero 05/06 ISEL-DEETC-SSIC - Lara SantosSQL (Tpicos) 5
Comando CREATE
A sintaxe do geral do CREATE, para este caso:
CREATE TABLE
( {
[DEFAULT ]
[]
}+
[restrio de tabela]
)
restrio a aplicar a uma coluna aplica-se a mais de uma coluna
8/8/2019 SQL - Tpicos
6/29
ISI - Sem. Vero 05/06 ISEL-DEETC-SSIC - Lara Santos SQL (Tpicos) 6
Sintaxe das restries:
[CONSTRAINT nome_restrio]
[{PRIMARY KEY | UNIQUE]} ( coluna, )] |
[FOREIGN KEY ( coluna, ) {REFERENCES tabela [( coluna, )]|
[CHECK( condio )]
[ON DELETE {NO ACTION | CASCADE | SET DEFAULT | SET NULL}] |
[ON UPDATE {NO ACTION | CASCADE | SET DEFAULT | SET NULL}}]
8/8/2019 SQL - Tpicos
7/29
ISI - Sem. Vero 05/06 ISEL-DEETC-SSIC - Lara Santos SQL (Tpicos) 7
INSERTE, UPDATE e DELETE
INSERT (insere linhas numa tabela)INSERT INTO [(coluna1, coluna2, ...)]
VALUES (valor1, valor2, ...) |
UPDATE (actualiza linhas de uma tabela)UPDATE
SET coluna = valor | expresso, coluna = valor |expresso, ...
[WHERE ]
DELETE (remove linhas de uma tabela)DELETE FROM [WHERE ]
8/8/2019 SQL - Tpicos
8/29
ISI - Sem. Vero 05/06 ISEL-DEETC-SSIC - Lara Santos SQL (Tpicos) 8
Comando SELECT
A sintaxe geral de uma interrogao SQL a seguinte:
SELECT [DISTINCT] | *
FROM[WHERE ]
DISTINCT indica que se quer remover os duplicados no resultadofinal
O smbolo * utilizado quando se pretendem seleccionar todos osatributos das tabelas especificadas na clusula FROM
8/8/2019 SQL - Tpicos
9/29
ISI - Sem. Vero 05/06 ISEL-DEETC-SSIC - Lara Santos SQL (Tpicos) 9
Juno Interna e Externa
INNER JOIN = JOIN
OUTER JOIN
LEFT OUTER JOIN
RIGHT OUTER JOIN FULL OUTER JOIN
8/8/2019 SQL - Tpicos
10/29
ISI - Sem. Vero 05/06 ISEL-DEETC-SSIC - Lara Santos SQL (Tpicos) 10
INNER JOINEx: Seja
Material(codigoMaterial ,nome)Fornecedor(codigoFornecedor, nome)Fornece(codigoFornecedor, codigoMaterial)
Qual o nome do fornecedor e os nomes dos materiais por elefornecido?
SELECT Fornecedor.nome,Material.nomeFROM FornecedorINNER JOIN ForneceON (Fornecedor.codigoFornecedor = Fornece. codigoFornecedor)INNER JOIN MaterialON (Fornece.codigoMaterial=Material.codigoMaterial)
8/8/2019 SQL - Tpicos
11/29
8/8/2019 SQL - Tpicos
12/29
ISI - Sem. Vero 05/06 ISEL-DEETC-SSIC - Lara Santos SQL (Tpicos) 12
Funes de Agregao
Existem um conjunto de funes que efectuamoperaes sobre conjunto de linhas
COUNT conta o nmero de linhas SUM efectua o somatrio de valoresAVG encontra a mdia de valores MAX determina o maior valor MIN determina o menor valor
Ex.: SELECT COUNT(codEmpregado) FROM Empregado
8/8/2019 SQL - Tpicos
13/29
ISI - Sem. Vero 05/06 ISEL-DEETC-SSIC - Lara Santos SQL (Tpicos) 13
Group By
A clusula GROUP BY tem a forma:GROUP BY
Onde uma lista de colunas separadas porvrgula, sobre as quais ser feito o agrupamento
Ex:
SELECT codigo, MAX(ordenado)
FROM DEPARTAMENTO
GROUP BY codigo
8/8/2019 SQL - Tpicos
14/29
ISI - Sem. Vero 05/06 ISEL-DEETC-SSIC - Lara Santos SQL (Tpicos) 14
Having
A clusula WHERE verificada para cada linha databela, ficando essa linha no resultado final se verificar acondio
Por vezes, apenas se querem obter resultados sobregrupos quando estes verificam uma determinadacondio;
Com a clusula WHERE no se consegue isso!!!
A clusula HAVING verificada para o conjunto delinhas; s os grupos que verificarem a condio soconsiderados
8/8/2019 SQL - Tpicos
15/29
ISI - Sem. Vero 05/06 ISEL-DEETC-SSIC - Lara Santos SQL (Tpicos) 15
Having (exemplo)
Quais os cdigos dos departamentos e o maior dossalrios, onde a mdia seja maior que 1000?
SELECT codDepartamento , MAX(Ordenado)FROM FUNCIONARIOGROUP BY codDepartamentoHAVING AVG(ordenado)>1000
Uma diferena entre as clusulas HAVING e WHERE:
A clusula HAVING deve sempre conter funes de agregao A clusula WHERE nunca contm funes de agregao
8/8/2019 SQL - Tpicos
16/29
8/8/2019 SQL - Tpicos
17/29
ISI - Sem. Vero 05/06 ISEL-DEETC-SSIC - Lara Santos SQL (Tpicos) 17
ORDER BY
Ex:
Qual o nome e o departamento dos
funcionrios existentes, ordenadosalfabeticamente?
SELECT nome, codDepartamento
FROM FUNCIONARIO
ORDER BY nome ASC
8/8/2019 SQL - Tpicos
18/29
ISI - Sem. Vero 05/06 ISEL-DEETC-SSIC - Lara Santos SQL (Tpicos) 18
GROUP BY, HAVING e ORDER BY
A sintaxe do SELECT, com a incluso dasclusulas GROUP BY, HAVING e ORDER BY:
SELECT [DISTINCT] | *
FROM
[WHERE ]
[GROUP BY ]
[HAVING ]
[ORDER BY ]
8/8/2019 SQL - Tpicos
19/29
ISI - Sem. Vero 05/06 ISEL-DEETC-SSIC - Lara Santos SQL (Tpicos) 19
GROUP BY, HAVING e ORDER BY
Ex:Quais os cdigos dos departamentos e o maiordos salrios, onde a mdia seja maior que1000, ordenados por ordem decrescente desalrios?
SELECT codDepartamento, MAX(Ordenado)FROM FUNCIONARIO
GROUP BY codDepartamentoHAVINGAVG(ordenado)>1000ORDER BY 2 DESC
8/8/2019 SQL - Tpicos
20/29
ISI - Sem. Vero 05/06 ISEL-DEETC-SSIC - Lara Santos SQL (Tpicos) 20
Sub-Interrogaes e Predicados
Consideremos:
CATEGORIA( codCat, nome, salarioBase )
DEPARTAMENTO( codDep, nome, localizacao )
EMPREGADO( codEmp, nome, salarioEfectivo, codCat, codDep )
8/8/2019 SQL - Tpicos
21/29
ISI - Sem. Vero 05/06 ISEL-DEETC-SSIC - Lara Santos SQL (Tpicos) 21
Sub-Interrogao
Ex:Qual o nome dos empregados que trabalham no mesmodepartamento que o(s) empregado(s) com nome JooMaria' ?
SELECT nomeFROM EMPREGADO as EP1 INNER JOIN EMPREGADO as EP2ON(EP1.codDep=EP2.codDep)
WHERE EP1.nomeEP2.nome AND EP1.nome=Joo Maria
Existe no entanto outra soluo possvel:Separar a interrogao em duas partes!!!
8/8/2019 SQL - Tpicos
22/29
ISI - Sem. Vero 05/06 ISEL-DEETC-SSIC - Lara Santos SQL (Tpicos) 22
Utilizando o predicado IN
SELECT DISTINCT E1.nomeFROM EMPREGADO AS E1WHERE E1.nome Joo Maria'
AND E1.codDep IN ( SELECT DISTINCT E2.codDepFROM EMPREGADO AS E2WHERE E2.nome = Joo Maria')
Foi utilizada uma sub interrogao (SELECT interior) pararesponder questo.
Ateno: o resultado da sub-interrogao pode corresponder a maisdo que um cdigo de departamento.
Foi utilizado o predicado IN
8/8/2019 SQL - Tpicos
23/29
ISI - Sem. Vero 05/06 ISEL-DEETC-SSIC - Lara Santos SQL (Tpicos) 23
Utilizando a comparao =
Ex:
Qual o cdigo e nome dos empregados que trabalhamno mesmo departamento que o empregado com cdigo
4 ?SELECT E1.codEmp, E1.nomeFROM EMPREGADO AS E1
WHERE E1.codEmp 4
AND E1.codDep = ( SELECT E2.codDep
FROM EMPREGADO AS E2WHERE E2.codEmp = 4 )
Ateno : o resultado da sub-interrogao corresponde apenas a 1 cdigo
8/8/2019 SQL - Tpicos
24/29
ISI - Sem. Vero 05/06 ISEL-DEETC-SSIC - Lara Santos SQL (Tpicos) 24
Utilizando o predicadoALL
Ex:Quais os empregados cujo salrio base superior ouigual a todos os salrios base dos empregados dodepartamento 2?
SELECT E1.codEmp, E1.nomeFROM EMPREGADO AS E1 INNER JOIN CATEGORIA AS C1ON (E1.codCat = C1.codCat)WHERE
C1.salarioBase >= ALL ( SELECT C2.salarioBaseFROM EMPREGADO AS E2, CATEGORIA AS C2WHERE E2.codCat = C2.codCat
AND E2.codDep = 2 )
8/8/2019 SQL - Tpicos
25/29
ISI - Sem. Vero 05/06 ISEL-DEETC-SSIC - Lara Santos SQL (Tpicos) 25
Utilizando o predicadoANY
Ex:Quais os empregados cujo salrio base superior aalgum dos salrios base dos empregados dodepartamento 2?
SELECT E1.codEmp, E1.nomeFROM EMPREGADO AS E1 INNER JOIN CATEGORIA AS C1ON (E1.codCat = C1.codCat)WHERE
C1.salarioBase > ANY ( SELECT C2.salarioBaseFROM EMPREGADO AS E2, CATEGORIA AS C2WHERE E2.codCat = C2.codCat
AND E2.codDep = 2 )
8/8/2019 SQL - Tpicos
26/29
ISI - Sem. Vero 05/06 ISEL-DEETC-SSIC - Lara Santos SQL (Tpicos) 26
Utilizando o predicado EXISTS
Ex:Cdigo e nome dos departamentos que tmempregados (i.e. onde existe pelo menos umempregado)?
SELECT D1.codDep, D1.nomeFROM DEPARTAMENTO AS D1WHERE EXISTS ( SELECT *
FROM EMPREGADO AS E1
WHERE E1.codDep =D1.codDep)
Ateno: sub-interrogao correlacionada!!!
A condio verdadeira se oresultado da sub-interrogaoforno vazio!!!!
8/8/2019 SQL - Tpicos
27/29
ISI - Sem. Vero 05/06 ISEL-DEETC-SSIC - Lara Santos SQL (Tpicos) 27
Utilizando o predicado EXISTS
Ex:
Cdigo e nome dos departamentos que no tmempregados (i.e. onde no 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)
Ateno: sub-interrogao correlacionada!!!
A condio verdadeira se oresultado da sub-interrogaoforvazio!!!!
8/8/2019 SQL - Tpicos
28/29
ISI - Sem. Vero 05/06 ISEL-DEETC-SSIC - Lara Santos SQL (Tpicos) 28
A Diviso utilizando o EXISTS
Ex:Quais os departamentos que tm empregados de todas ascategorias?
Outra forma de colocar a questo:
Quais os departamentos para os quais no existe nenhumacategoria da qual no existem empregados nesse departamento.
o mesmo que dizer que:
Se existir uma categoria da qual determinado departamento notem empregados, ento no queremos esse departamento.
8/8/2019 SQL - Tpicos
29/29
ISI - Sem. Vero 05/06 ISEL-DEETC-SSIC - Lara Santos SQL (Tpicos) 29
A divisoEx:
Quais os departamentos que tm empregados de todasas categorias?
SELECT D1.codDep, D1.nomeFROM DEPARTAMENTO AS D1WHERE NOT EXISTS
(SELECT *FROM CATEGORIA AS C1WHERE NOT EXISTS
( SELECT *FROM EMPREGADO AS E1
WHERE E1.codDep =D1.codDepAND E1.codCat =C1.codCat ))
Top Related