Sie sind auf Seite 1von 29

SQL (Tpicos) 1

SQL (Tpicos)
Structured Query Language

ISI Introduo aos Sistemas de
Informao
SQL (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 na
base de dados
SQL (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
SQL (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

SQL (Tpicos) 5
Comando CREATE
A sintaxe do geral do CREATE, para este caso:

CREATE TABLE <nome tabela>
( {<nome coluna> <tipo>
[DEFAULT <valor | funo | NULL>]
[<restrio de coluna>]
}+
[restrio de tabela]
)

<restrio de coluna> restrio a aplicar a uma coluna
<restrio de tabela> aplica-se a mais de uma coluna

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}}]

SQL (Tpicos) 7
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 | expresso, coluna = valor |
expresso, ...
[WHERE <condio>]

DELETE (remove linhas de uma tabela)
DELETE FROM <nome da tabela> [WHERE <condio>]

SQL (Tpicos) 8
Comando SELECT
A sintaxe geral de uma interrogao SQL a seguinte:

SELECT [DISTINCT] <colunas> | *
FROM <tabelas>
[WHERE <condio>]

DISTINCT indica que se quer remover os duplicados no resultado
final

O smbolo * utilizado quando se pretendem seleccionar todos os
atributos das tabelas especificadas na clusula FROM

SQL (Tpicos) 9
Juno Interna e Externa
INNER JOIN = JOIN

OUTER JOIN

LEFT OUTER JOIN
RIGHT OUTER JOIN
FULL OUTER JOIN
SQL (Tpicos) 10
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 (Tpicos) 11
OUTER JOIN
Ex:
Quais os cdigos de todos os
fornecedores e todos os produtos, por
eles fornecidos ou no.

SELECT Material.* , Fornece.codFornecedor
FROM Material FULL OUTER JOIN Fornece
ON (Fornece.codigoMaterial=Material.codigoMaterial)

SQL (Tpicos) 12
Funes de Agregao
Existem um conjunto de funes que efectuam
operaes sobre conjunto de linhas

COUNT conta o nmero de linhas
SUM efectua o somatrio de valores
AVG encontra a mdia de valores
MAX determina o maior valor
MIN determina o menor valor

Ex.: SELECT COUNT(codEmpregado) FROM Empregado


SQL (Tpicos) 13
Group By
A clusula GROUP BY tem a forma:
GROUP BY <lista colunas>
Onde <lista de colunas> uma lista de colunas separadas por
vrgula, sobre as quais ser feito o agrupamento

Ex:
SELECT codigo, MAX(ordenado)
FROM DEPARTAMENTO
GROUP BY codigo


SQL (Tpicos) 14
Having
A clusula WHERE verificada para cada linha da
tabela, ficando essa linha no resultado final se verificar a
condio

Por vezes, apenas se querem obter resultados sobre
grupos quando estes verificam uma determinada
condio;

Com a clusula WHERE no se consegue isso!!!

A clusula HAVING verificada para o conjunto de
linhas; s os grupos que verificarem a condio so
considerados


SQL (Tpicos) 15
Having (exemplo)
Quais os cdigos dos departamentos e o maior dos
salrios, onde a mdia seja maior que 1000?

SELECT codDepartamento , MAX(Ordenado)
FROM FUNCIONARIO
GROUP BY codDepartamento
HAVING 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

SQL (Tpicos) 16
ORDER BY
Por vezes deseja-se que o resultado de uma
interrogao venha ordenado por um determinado
critrio

Essa ordenao feita utilizando a clusula ORDER BY

A clusula ORDER BY tem a forma:

ORDER BY <coluna | nmero da coluna [ASC|DESC] >

SQL (Tpicos) 17
ORDER BY
Ex:
Qual o nome e o departamento dos
funcionrios existentes, ordenados
alfabeticamente?

SELECT nome, codDepartamento
FROM FUNCIONARIO
ORDER BY nome ASC

SQL (Tpicos) 18
GROUP BY, HAVING e ORDER BY

A sintaxe do SELECT, com a incluso das
clusulas GROUP BY, HAVING e ORDER BY:

SELECT [DISTINCT] <colunas> | *
FROM <lista tabelas>
[WHERE <condio>]
[GROUP BY <lista colunas> ]
[HAVING <condio>]
[ORDER BY <coluna | nmero da Coluna [ASC|DESC] > ]

SQL (Tpicos) 19
GROUP BY, HAVING e ORDER BY

Ex:
Quais os cdigos dos departamentos e o maior
dos salrios, onde a mdia seja maior que
1000, ordenados por ordem decrescente de
salrios?

SELECT codDepartamento, MAX(Ordenado)
FROM FUNCIONARIO
GROUP BY codDepartamento
HAVING AVG(ordenado)>1000
ORDER BY 2 DESC

SQL (Tpicos) 20
Sub-Interrogaes e Predicados

Consideremos:

CATEGORIA( codCat, nome, salarioBase )
DEPARTAMENTO( codDep, nome, localizacao )
EMPREGADO( codEmp, nome, salarioEfectivo, codCat, codDep )

SQL (Tpicos) 21
Sub-Interrogao
Ex:
Qual o nome dos empregados que trabalham no mesmo
departamento que o(s) empregado(s) com nome Joo
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=Joo Maria

Existe no entanto outra soluo possvel:
Separar a interrogao em duas partes!!!


SQL (Tpicos) 22
Utilizando o predicado IN
SELECT DISTINCT E1.nome
FROM EMPREGADO AS E1
WHERE E1.nome <> Joo Maria'
AND E1.codDep IN ( SELECT DISTINCT E2.codDep
FROM EMPREGADO AS E2
WHERE E2.nome = Joo Maria')

Foi utilizada uma sub interrogao (SELECT interior) para
responder questo.

Ateno: o resultado da sub-interrogao pode corresponder a mais
do que um cdigo de departamento.

Foi utilizado o predicado IN

SQL (Tpicos) 23
Utilizando a comparao =
Ex:
Qual o cdigo e nome dos empregados que trabalham
no mesmo departamento que o empregado com cdigo
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 )

Ateno : o resultado da sub-interrogao corresponde apenas a 1 cdigo

SQL (Tpicos) 24
Utilizando o predicado ALL
Ex:
Quais os empregados cujo salrio base superior ou
igual a todos os salrios 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 (Tpicos) 25
Utilizando o predicado ANY
Ex:
Quais os empregados cujo salrio base superior a
algum dos salrios 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 (Tpicos) 26
Utilizando o predicado EXISTS
Ex:
Cdigo e nome dos departamentos que tm
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)

Ateno: sub-interrogao correlacionada!!!
A condio verdadeira se o
resultado da sub-interrogao
for no vazio!!!!
SQL (Tpicos) 27
Utilizando o predicado EXISTS
Ex:
Cdigo e nome dos departamentos que no tm
empregados (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 o
resultado da sub-interrogao
for vazio!!!!
SQL (Tpicos) 28
A Diviso utilizando o EXISTS
Ex:
Quais os departamentos que tm empregados de todas as
categorias?

Outra forma de colocar a questo:

Quais os departamentos para os quais no existe nenhuma
categoria da qual no existem empregados nesse departamento.

o mesmo que dizer que:

Se existir uma categoria da qual determinado departamento no
tem empregados, ento no queremos esse departamento.
SQL (Tpicos) 29
A diviso
Ex:
Quais os departamentos que tm 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 ))

Das könnte Ihnen auch gefallen