Você está na página 1de 52

lgebra e SQL

Pedro Nogueira Ramos


(Pedro.Ramos@iscte.pt)
DCTI / ISCTE

Pedro Ramos,

lgebra

SQL ndice

lgebra Relacional
(Codd, 1972)
No Modelo relacional a informao representada atravs de
relaes (ou tabelas). A lgebra Relacional um conjunto de
operaes formais que operam sobre relaes. No essencial a
lgebra relacional corresponde lgebra de conjuntos, ou seja,
definida com base nos operadores de Interseco, Produto
Cartesiano e Unio.

Pedro Ramos,

lgebra

SQL ndice

lgebra Relacional

Tipos de Operaes
Todas as operaes produzem como resultado outras relaes.
Tipos de operaes:
Binrias (operam sobre conjuntos)
Unio
Produto Cartesiano (e Join)
Unrias (operam apenas sobre um conjunto)
Projeco
Seleco
Relaes compatveis mesmo grau (nmero de atributos) e
atributos idnticos (i.e., tipos de dados compatveis).
Pedro Ramos,

lgebra

SQL ndice

lgebra Relacional

Unio
Apenas pode ser efectuada entre relaes compatveis.
R S = {t: t R ou t S}, em que t representa um tuplo (linha)
A

As linhas duplicadas apenas so seleccionadas caso se indique


explicitamente para no as retirar (UNION ALL)
Pedro Ramos,

lgebra

SQL ndice

lgebra Relacional

Produto Cartesiano
R X S = {t1.t2: t1 R e t2 S}
Cliente
Nmero

Nome

CodPostal

001

Joo

1500

013

Ana

2100

056

Lus

NULL

Localidade

X=

Nmero

Nome

Cliente.
CodPostal

Localidade.
CodPostal

Localidade

001

Joo

1500

1500

Lisboa

001

Joo

1500

2100

Porto

001

Joo

1500

3999

vora

013

Ana

2100

1500

Lisboa

013

Ana

2100

2100

Porto

CodPostal

Localidade

013

Ana

2100

3999

vora

1500

Lisboa

056

Lus

NULL

1500

Lisboa

2100

Porto

056

Lus

NULL

2100

Porto

3999

vora

056

Lus

NULL

3999

vora

nicas linhas coerentes: Join


Pedro Ramos,

lgebra

SQL ndice

lgebra Relacional

Join
INNER JOIN: Produto Cartesiano, em que apenas so seleccionados
tuplos nos quais os valores dos atributos comuns so idnticos.
Normalmente o atributo comum no repetido.

OUTER LEFT JOIN: resultado do NATURAL JOIN unio com os tuplos


da relao esquerda que no cruzaram (no existe nenhum tuplo na
relao direita que tenha o mesmo valor no atributo comum) com a
relao direita.

OUTER RIGHT JOIN: resultado NATURAL JOIN unio com os tuplos


da relao direita que no cruzaram com a relao esquerda.

Pedro Ramos,

lgebra

SQL ndice

lgebra Relacional

Exemplos de Join
Cliente
Nmero

Nome

CodPostal

001

Joo

1500

013

Ana

2100

056

Lus

NULL

X
Localidade
CodPostal

Nmero

Nome

CodPostal

Localidade

001

Joo

1500

Lisboa

Natural Join

013

Ana

2100

Porto

(Inner Join)

Nmero

Nome

CodPostal

Localidade

001

Joo

1500

Lisboa

013

Ana

2100

Porto

056

Lus

NULL

NULL

Nmero

Nome

CodPostal

Localidade

001

Joo

1500

Lisboa

013

Ana

2100

Porto

NULL

NULL

3999

vora

Outer Left Join

Localidade

1500

Lisboa

2100

Porto

3999

vora

Pedro Ramos,

Outer Right Join

lgebra

SQL ndice

lgebra Relacional

Projeco
Ai, Aj, , Am (R) ={< t(Ai), t(Aj), , t(Am) >: t R} em que
R(A1, A2, , An) a relao projectada;
Ai, Aj, , Am so atributos da projeco;
i, j, , m so inteiros compreendidos no intervalo 1 n .

(A) R

R
A

Pedro Ramos,

As linhas duplicadas apenas so


removidas caso se indique
explicitamente (DISTINCT)

lgebra

SQL ndice

lgebra Relacional

Seleco
F (R) ={t: t R e t satisfaz F} em que
em que F uma frmula envolvendo atributos e operadores lgicos (devolvem verdade ou
falso) como operandos.

(A=a) R

R
A

Pedro Ramos,

lgebra

SQL ndice

lgebra Relacional

Exemplos de Interrogaes
1 Listar o nome e nacionalidade dos autores de nacionalidade
Portuguesa e Brasileira
nome, nacionalidade (nacionalidade =Portuguesa or nacionalidade =Brasileira
(Autor))

2 Listar os ttulos dos livros do Gabriel Garcia Marquez


titulo (nome Like Gabriel* ((Autor X Autoria) X Livro))

3 Listar o nome dos autores, indicando os ttulos dos seus livros


a) nome, titulo ((Autor X Autoria) X Livro)
incorrecto, no selecciona os autores sem livros
b) nome, titulo (Autor X OUTER LEFT JOIN (Autoria X Livro)

Pedro Ramos,

lgebra

SQL ndice

SQL - ndice
Domnios e Tipos de Dados
Tabelas
ndices
DML (Data Manipulation Language)
Prepared Statements
Stored Procedures
Triggers

SELECT
Clusula SELECT
Clusula FROM
Joins
Clusula WHERE
Clusulas GROUP BY, HAVING
e funes de agregao
UNION
UPDATE
DELETE
INSERT
Optimizao de Querys
Views

Pedro Ramos,

lgebra

SQL ndice

Linguagem SQL
Norma ANSI criada em 1986 (revista em 1989 e 1992).
A linguagem SQL tem duas vertentes: DDL (Data Definition
Language) e DML (Data Manipulation Language). Na vertente
DDL o SQL possui um conjunto de comandos para criao e
alterao de tabelas, chaves estrangeiras, regras de integridade
referencial e views. A vertente DML uma implementao da
lgebra Relacional, e.g., permite efectuar interrogaes a uma
base de dados, bem como alterar, anular ou inserir registos em
tabelas.
Ao longo do texto ser apresentado o SQL do Adaptive Server
Anywhere 6.0 da Sybase.
Pedro Ramos,

lgebra

SQL ndice

SQL

Domnios e Tipos de Dados (DDL)


Em SQL possvel especificar o domnio (tipo de dados) de um
atributo. Atravs da clusula DOMAIN possvel definir um
domnio genrico ao qual podem ser atribudos vrios atributos. O
seguinte comando define o domnio morada:
CREATE Datatype dm_morada VARCHAR(100);
Alguns Tipos de Dados
Texto
Char [(n)] (equivalente a Varchar (n))
Long Varchar - infinitos caracteres
Text eq. a Long Varchar mas admite NULL
Boleano
Bit [0, 1]
Date
Time
TimeStamp (data e hora)

Pedro Ramos,

Nmero
Tinyint [0 255]
Smallint [-+ 32,767] ou
UNSIGNED [0 - 65535]
Integer [-+ 2,147,483,6479]
Double [ grande]
Decimal (inteiros[, decimais])

lgebra

SQL ndice

SQL

Tabelas (DDL) (I)


Comando para criar uma tabela:
CREATE TABLE nome databela ( definio das colunas,
restries de integridade)
CREATE Datatype dm_morada VARCHAR(100);

CREATE TABLE Cliente (


cod_cliente

INTEGER NOT NULL,

bi

INTEGER NOT NULL,

nome

VARCHAR(100),

morada

dm_morada,

CONSTRAINT

prim_key PRIMARY KEY (cod_cliente),

CONSTRAINT

cand_key UNIQUE (bi));

Pedro Ramos,

Chave alternativa
lgebra

SQL ndice

SQL

Tabelas (II)
CREATE TABLE Factura (
num_factura

INTEGER

NOT NULL,

data

DATE

NOT NULL,

valor

DECIMAL(10,2)

NOT NULL,

cod_cliente

INTEGER

NOT NULL,

CONSTRAINT

prim_key PRIMARY KEY (num_factura),

CONSTRAINT

for_key_cliente

Chave
Estrangeira

FOREIGN KEY (cod_cliente)


REFERENCES Cliente (cod_cliente)
ON UPDATE

CASCADE

ON DELETE RESTRICT);

Valor por omisso

CREATE TABLE Produto (


cod_produto

INTEGER

NOT NULL,

tipo

CHAR(2)

Designao

VARCHAR(100),

CONSTRAINT

DEFAULT 'MP CHECK (tipo IN ('MP','PA')) NOT NULL,

prim_key

Pedro Ramos,

PRIMARY KEY (cod_produto));

Restries
lgebra

SQL ndice

SQL

Tabelas (III)
CREATE TABLE Item (
num_factura

INTEGER NOT NULL,

num_item

INTEGER CHECK (num_item between 1 and 10) NOT NULL,

quantidade

INTEGER

valor

DECIMAL (4,2)

NOT NULL,

cod_produto

INTEGER

NOT NULL,

CONSTRAINT

prim_key PRIMARY KEY (num_factura, num_item),

CONSTRAINT

for_key_factura

CHECK (quantidade > 0) NOT NULL,

Restries

FOREIGN KEY (num_factura)


REFERENCES Factura (num_factura)
ON UPDATE CASCADE
ON DELETE CASCADE,
CONSTRAINT

for_key_produto

FOREIGN KEY (cod_produto)


REFERENCES Produto (cod_produto)
ON UPDATE

CASCADE

ON DELETE RESTRICT);

Pedro Ramos,

lgebra

SQL ndice

SQL

Tabelas (IV)
Comando para alterar uma tabela:
ALTER TABLE nome databela
alteraes
ALTER TABLE cliente
ADD COLUMN telefone VARCHAR (10)
DROP COLUMN bi;

Comando para alterar uma tabela:


DROP TABLE nome databela
Nota: conveniente ter um ficheiro com a definio completa da base de dados. Esse
ficheiro pode ser executado sempre que seja necessrio reconstruir a base de dados. O uso
sistemtico dos comandos ALTER e DROP TABLE pode dificultar a reconstruo da base
de dados.

Pedro Ramos,

lgebra

SQL ndice

SQL

ndices
Comando para criar um ndice tabela:
CREATE [UNIQUE] INDEX nome ndice ON nome tabela
(nome coluna [ASC | DESC])
create unique index Index_Key on Medicamentos_Receita (
Codigo ASC,
ID_Receita ASC
);

Pedro Ramos,

lgebra

SQL ndice

SQL

DML Linguagem para Manipulao de Dados


SELECT
Clusula SELECT
Clusula FROM
Joins
Clusula WHERE
Clusulas GROUP BY, HAVING
e funes de agregao
UNION
UPDATE
DELETE
INSERT
Optimizao de Querys
Views

Pedro Ramos,

lgebra

SQL ndice

SQL

Comando SELECT
Um comando SQL tpico para seleco de linhas obedece seguinte
estrutura (em que a clusula SELECT corresponde projeco, a
clusula FROM ao produto cartesiano e a clusula WHERE
seleco):
SELECT campos a seleccionar
FROM tabelas onde constam os campos indicados em Select
WHERE expresso lgica que indica quais as linhas que pretendemos
seleccionar
ORDER BY campo pelo qual a listagem vir ordenada;
SELECT Nome, Morada
FROM Cliente
WHERE Cod_Postal = 1300
ORDER BY Nome;

Pedro Ramos,

Lista o nome e morada de uma


tabela de clientes, mas apenas os
clientes cujo cdigo postal seja
1300 (ordenado por nome)
lgebra

SQL ndice

SQL

Nota
importante notar que qualquer comando SELECT devolve uma
tabela (um conjunto de colunas e linhas).
Sempre que, no contexto da sintaxe da linguagem SQL for referida
uma tabela, ela deve ser interpretada no sentido mais lato: uma
tabela original (definida no esquema relacional) ou o resultado de
um comando SELECT.

Pedro Ramos,

lgebra

SQL ndice

SQL

SELECT Clusula SELECT (I)


Qualquer expresso sintacticamente vlida pode ser argumento da
clusula SELECT. Por exemplo, os dois seguintes comandos so
vlidos:
SELECT Produto, Quantidade * Preo FROM Item; (devolve duas colunas
em que a segunda corresponde ao produto das colunas quantidade e preo);
SELECT teste FROM Item; (se a tabela item tiver 20 linhas, o comando devolve
20 vezes a palavra teste).

Podem ser atribudos aliases (sinnimos) s colunas. Por exemplo o


comando anterior poderia ser escrito da seguinte forma (permite dar
um nome Total - segunda coluna devolvida):
SELECT Produto, Quantidade * Preo AS Total FROM Item;

Pedro Ramos,

lgebra

SQL ndice

SQL

SELECT Clusula SELECT (II)


Caso pretendamos visualizar todos os campos de uma tabela, como
alternativa a enumera-los todos, pode-se usar a constante *:
SELECT * FROM Item;

Caso pretendamos eliminar duplicados na listagem obtida, utiliza-se


a clusula DISTINCT (elimina linhas duplicadas)
SELECT DISTINCT CodPostal FROM Aluno;
existentes)

(devolve

os cdigos postais

Caso se pretenda listar dois atributos com o mesmo nome


(correspondentes a duas tabelas referidas na clusula FROM)
necessrio preceder o nome do campo pelo nome da tabela de onde
ele originrio.

Pedro Ramos,

lgebra

SQL ndice

SQL

SELECT Clusula SELECT (III)


Caso pretendamos apenas visualizar algumas linhas de uma tabela:
SELECT FIRST * FROM Item;
SELECT TOP 3 * FROM Item;

Caso pretendamos armazenar o resultado em variveis (apenas


quando o comando apenas devolve uma linha)
SELECT Max(Quantidade) INTO Maximo FROM ITEM;

A clusula INTO apenas se justifica quando o SQL utilizado dentro de outra


linguagem de programao (Java, C, Visual Basic, etc.) ou em Stored Procedures
(ver mais adiante). Na clusula INTO podem-se referir vrias variveis (o mesmo
nmero das expresses da clusula SELECT).

Pedro Ramos,

lgebra

SQL ndice

SQL

SELECT Clusula FROM (I)


Na clusula FROM indicam-se os nomes das tabelas envolvidas na
interrogao, separadas por vrgulas. Quando existe mais que uma
tabela o SQL executa automaticamente um produto cartesiano entre
as tabelas. Por exemplo, o seguinte comando executa um produto
cartesiano entre as tabelas Cliente e Localidade, devolvendo todos
os campos (das duas tabelas):
SELECT * FROM Cliente, Localidade;

Caso queiramos obter um JOIN necessrio explicitar a forma como


o pretendemos obter, por exemplo:
SELECT * FROM Cliente INNER JOIN

Localidade;

SELECT * FROM Cliente LEFT OUTER JOIN Localidade;

Pedro Ramos,

lgebra

SQL ndice

SQL

SELECT Clusula FROM (II)


semelhana dos sinnimos dos atributos, possvel atribuir
aliases s tabelas (os sinnimos nas tabelas so relevantes nas
subquerys, analisadas mais adiante):
Select * From Cliente AS Cliente_Empresa;

Existe uma tabela de sistema que apenas contm uma linha


denominada DUMMY. Ela pode ser utilizada quando pretendemos
listar uma expresso que no obtida a partir de nenhuma tabela.
SELECT COS(1) FROM DUMMY;
Devolve o cosseno de 1

Pedro Ramos,

lgebra

SQL ndice

SQL

SELECT JOINS (I)


Tipos de JOINS
Key Join

SELECT * FROM Cliente KEY JOIN Localidade;

Critrio: chave estrangeira. Apenas funciona se existir uma (e apenas uma)


chave estrangeira a ligar as duas tabelas.

Natural Join

SELECT * FROM Cliente NATURAL JOIN Localidade;

Critrio: atributos com o mesmo nome. Apenas funciona se existir pelo menos
um atributo com o mesmo nome e tipo de dados compatveis.

Join com Comparaes


SELECT * FROM Cliente JOIN Localidade
ON Cliente.Cod_Postal = Localidade.Cod_Postal;

Critrio: indicado explicitamente no comando atravs do ON. o mais flexvel.

Pedro Ramos,

lgebra

SQL ndice

SQL

SELECT JOINS (II)


INNER, LEFT OUTER e RIGHT OUTER JOIN
Podem ser utilizados nos Key, Natural e ON Join. Quando nada
indicado efectuado um INNER Join.
SELECT * FROM Cliente NATURAL INNER JOIN Localidade;
SELECT * FROM Cliente NATURAL LEFT OUTER JOIN Localidade;
SELECT * FROM Cliente KEY RIGHT OUTER JOIN Localidade;
SELECT * FROM Cliente LEFT OUTER JOIN Localidade
ON Cliente.Cod_Postal = Localidade.Cod_Postal;

Pedro Ramos,

lgebra

SQL ndice

SQL

SELECT Clusula WHERE (I)


Na clusula WHERE pode constar qualquer expresso lgica. A
expresso avaliada linha a linha, isto , para cada linha o SQL
avalia o valor da expresso e, caso seja verdadeira, devolve a linha.
SELECT * FROM Cliente Where CodPostal > 1000
AND CodPostal < 2000;
SELECT * FROM Cliente Where (CodPostal > 1000
AND CodPostal < 2000) OR CodPostal = 3000;
Select * FROM CodPostal WHERE 1 = 1; (devolve todos os registos)

Pedro Ramos,

lgebra

SQL ndice

SQL

SELECT Clusula WHERE (II)


Os principais operadores utilizados na clusula WHERE so: =, <, >, >=, <=, <>,
AND, OR, NOT, IN, LIKE, BETWEEN e ISNULL. O operador IN verdadeiro
quando um elemento faz parte de um conjunto. O operador permite a utilizao de
wildcards. O operador ISNULL permite lidar com valores NULL. Alguns
exemplos:
SELECT * FROM CLIENTE WHERE CodPostal BETWEEN 1000,2000;
SELECT * FROM CLIENTE WHERE Nome LIKE Joo% (todos os clientes
comeados por Joo)
SELECT * FROM Cliente WHERE Nacionalidade IN (Portugal,
Brasil); (todos os clientes portugueses ou brasileiros)
SELECT * FROM Cliente WHERE Nacionalidade NOT IN (Portugal,
Brasil); (todos os clientes excepto os portugueses e brasileiros)
SELECT * FROM Cliente WHERE Nacionalidade IS NOT NULL; (todos os
clientes com nacionalidade conhecida)

Pedro Ramos,

lgebra

SQL ndice

SQL

SELECT Clusula WHERE (III)


A clusula WHERE pode ser utilizada para produzir joins. Os dois seguintes
comandos produzem o mesmo resultado (o 1 mais eficiente devido s
optimizaes do SGBD).
SELECT * FROM Cliente INNER JOIN Localidade
ON Cliente.Cod_Postal = Localidade.Cod_Postal;
SELECT * FROM Cliente, Localidade
WHERE Cliente.Cod_Postal = Localidade.Cod_Postal;

Os seguinte comando produz um INNER JOIN apesar de estar indicado um LEFT


JOIN (primeiro efectuado o LEFT JOIN, mas posteriormente o SGBD apenas
considera as linhas em que existe igualdade entre as chaves).
SELECT * FROM Cliente NATURAL LEFT OUTER JOIN Localidade
WHERE Cliente.Cod_Postal = Localidade.Cod_Postal;

Pedro Ramos,

lgebra

SQL ndice

SQL

SELECT Clusulas GROUP BY e HAVING e


Funes de Agregao (I)
Recorrendo apenas s clusulas anteriores no possvel, por
exemplo, efectuar certas operaes estatsticas (somatrios, mdias,
etc.). Tal acontece porque as operaes de agregao (que envolvem
vrios registos) no poderem ser calculadas linha a linha. Por
exemplo, o comando para listar os cdigos postais associados a mais
do que dois clientes no pode ser efectuado tal como de seguida se
apresenta:
SELECT CodPostal FROM Cliente WHERE COUNT(CodPostal) > 2

O comando incorrecto porque a clusula WHERE testada linha a


linha e, numa linha no possvel obter o total de cdigos postais.

Pedro Ramos,

lgebra

SQL ndice

SQL

SELECT Clusulas GROUP BY e HAVING e


Funes de Agregao (II)
As clusulas GROUP BY e HAVING permitem manipular valores
agregados. A clusula GROUP BY permite a definio de grupos. A
clusula HAVING equivalente clusula WHERE s que o seu
argumento so expresses lgicas relativas aos agrupamentos
criados pela clusula GROUP BY. O exemplo anterior encontra-se
bem formulado com o seguinte comando:
SELECT CodPostal FROM Cliente
GROUP BY CodPostal HAVING COUNT(CodPostal) > 2;

A clusula GROUP BY agrupa os clientes por cdigo postal e a


clusula HAVING selecciona os grupos cujo nmero de elementos
superior a dois.
Pedro Ramos,

lgebra

SQL ndice

SQL

SELECT Clusulas GROUP BY e HAVING e


Funes de Agregao (III)
O seguinte comando lista, para cada cdigo postal, o nmero de clientes que a ele
esto associados (desde que exista mais do que um cliente):
SELECT CodPostal, COUNT(CodPostal) FROM Cliente GROUP BY
CodPostal HAVING COUNT(CodPostal) > 1;
CodPostal = 1500 (Total:2)

Cliente
Nmero

Nome

CodPostal

001

Joo

1500

013

Ana

2100

056

Luis

1500

001

Paula

2100

011

Nuno

1300

Pedro Ramos,

Nmero

Nome

CodPostal

Nova tabela temporria

001

Joo

1500

CodPostal

COUNT(CodPostal)

056

Luis

1500

1500

2100

1300

CodPostal = 2100 (Total:2)


Nmero

Nome

CodPostal

013

Ana

2100

001

Paula

2100

Resultado Final
CodPostal

COUNT(CodPostal)

CodPostal = 1300 (Total:1)

1500

Nmero

Nome

CodPostal

2100

011

Nuno

1300
lgebra

SQL ndice

SQL

SELECT Clusulas GROUP BY e HAVING e


Funes de Agregao (IV)
Sempre que existe uma funo de agregao na clusula SELECT, todos os
restantes atributos da clusula tm que estar includos na clusula GROUP BY. O
comando que de seguida se apresenta retorna o maior bilhete de identidade
existente:
SELECT MAX(Bi) FROM Cliente;

Caso pretendssemos visualizar o nome desse cliente, no poderamos


simplesmente acrescentar o atributo nome clusula SELECT. Pela regra
anteriormente referida, teramos que considerar a clusula GROUP BY:
SELECT MAX(Bi), NOME FROM Cliente GROUP BY Nome;

No entanto, o resultado do comando seria a listagem de todos os nomes com a


indicao do BI associado a cada nome. Mais adiante (Subquerys IV) apresentase a resoluo desta interrogao.

Pedro Ramos,

lgebra

SQL ndice

SQL

SELECT Clusulas GROUP BY e HAVING e


Funes de Agregao (V)
Para alm das funes COUNT e MAX, existem outras, tais como SUM, AVG e
MIN.
Apenas a funo COUNT no necessita de argumento: o primeiro comando
retorna o total de registos de clientes enquanto o segundo devolve o total de
clientes com o cdigo postal conhecido:
SELECT COUNT(*) FROM Cliente;
SELECT COUNT(CodPostal) FROM Cliente;

Note-se que o segundo comando equivalente ao seguinte:


SELECT COUNT(*) FROM Cliente WHERE CodPostal IS NOT NULL;

Pedro Ramos,

lgebra

SQL ndice

SQL

SELECT Subquerys (I)


Uma subquery um comando SELECT dentro de um comando
SELECT. Muitas interrogaes apenas podem ser resolvidas atravs
de subquerys. Um comando SELECT normalmente liga-se a outro
atravs da clusula WHERE.
Os operadores IN e EXISTS so normalmente utilizadas nas
subquerys.
Operador IN devolve verdade quando um elemento pertence a um
conjunto.
Operador EXISTS devolve verdade caso a subquery retorne pelo
menos uma linha.

Pedro Ramos,

lgebra

SQL ndice

SQL

SELECT Subquerys (II)


Os dois comandos abaixo apresentados (equivalentes) devolvem os
nomes que esto associados a pelo menos duas pessoas (dois BIs)
(sem a clusula DISTINCT o comando retornaria os nomes
duplicados; os sinnimos das tabelas so necessrios para evitar
ambiguidades na condio WHERE da subquery):
SELECT DISTINCT(Nome) FROM Cliente as Cliente1
WHERE NOME IN
(SELECT NOME FROM Cliente as Cliente2 WHERE
Cliente1.bi <> Cliente2.bi);
SELECT DISTINCT(Nome) FROM Cliente as Cliente1
WHERE EXISTS
(SELECT * FROM Cliente as Cliente2 WHERE
Cliente1.bi <> Cliente2.bi AND
Cliente1.Nome = Cliente2.Nome);

Pedro Ramos,

lgebra

SQL ndice

SQL

SELECT Subquerys (III)


Os operadores ALL (todos) e ANY (pelo menos um) tambm so
frequentes nas subquerys. O comando para retornar o maior bilhete
de identidade (e nome associado) existente :
SELECT Nome, BI FROM Cliente
WHERE BI >= ALL
(SELECT BI FROM Cliente);

Caso pretendssemos um bilhete de identidade que no fosse o


menor, o comando seria:
SELECT Nome, BI FROM Cliente
WHERE BI > ANY
(SELECT BI FROM Cliente);

Pedro Ramos,

lgebra

SQL ndice

SQL

SELECT Subquerys (IV)


As subquerys tambm podem ser colocadas nas clusula SELECT e
FROM.
O seguinte exemplo devolve, para cada cliente, o total de facturas
associadas:
SELECT Nome, (SELECT COUNT(*) FROM Factura
WHERE Factura.BI = Cliente.BI)
FROM Cliente;

O seguinte exemplo devolve, para cada cliente, o total de facturas


associadas:
SELECT DISTINCT Nome
FROM (Select * From Cliente) as Cliente;

Pedro Ramos,

lgebra

SQL ndice

SQL

Comando UNION
A unio de comandos SELECT efectuada atravs do operador
UNION.
O seguinte comando devolve os nomes dos clientes e fornecedores:
SELECT Nome FROM Cliente
UNION
SELECT Nome FROM Fornecedor;

Caso no pretendamos eliminar nomes duplicados o comando ser:


SELECT Nome FROM Cliente
UNION ALL
SELECT Nome FROM Fornecedor;

Pedro Ramos,

lgebra

SQL ndice

SQL

Comando UPDATE
Um comando UPDATE para alterao de linhas obedece seguinte
estrutura:
UPDATE tabela a alterar
SET coluna a alterar = expresso
WHERE expresso lgica que indica quais as linhas que
pretendemos alterar
O seguinte comando transforma os cdigos postais 1200 em 1500:
UPDATE Cliente SET CodPostal = 1500
WHERE CodPostal = 1200;

Pedro Ramos,

lgebra

SQL ndice

SQL

Comando DELETE
Um comando DELETE para anulao de linhas obedece seguinte
estrutura:
DELETE FROM tabela a anular
WHERE expresso lgica que indica quais as linhas que
pretendemos alterar
O seguinte comando apaga os cdigos postais 1200
DELETE FROM Cliente
WHERE CodPostal = 1200;

Pedro Ramos,

lgebra

SQL ndice

SQL

Comando INSERT
Atravs do comando INSERT podem-se inserir uma linha ou vrias
linhas em simultneo. Para inserir uma linha um comando INSERT
obedece seguinte estrutura:
INSERT INTO tabela a inserir (colunas onde vo ser inseridos os valores)
VALUES (valores a inserir)

Para inserir um conjunto de linhas, um comando INSERT obedece


seguinte estrutura:
INSERT INTO tabela a inserir (colunas onde vo ser inseridos os valores)
SELECT valores a inserir
FROM ...
INSERT INTO Produto (cod_produto, tipo) VALUES (123456, MP);
INSERT INTO Produto (cod_produto, tipo)
SELECT cod_materia, MP FROM Materia_Prima;

Pedro Ramos,

lgebra

SQL ndice

SQL

Optimizaes de Querys (I)


Na maioria dos SGBDs a optimizao de querys feita
automaticamente pelo planeador do SGBD. Ele, com base em
estimativas de tempos e com base no histrico das transaces,
decide qual a melhor estratgia a adoptar para executar uma query.
Exemplos
select PLAN('SELECT Titulo FROM Pub');
Scan pub sequentially

ndice apenas em ISBN e Data

select PLAN('SELECT ISBN FROM Pub');


Scan pub sequentially
select PLAN('SELECT ISBN FROM Pub Order By ISBN');
Scan pub using index ndx_id
select PLAN('SELECT * FROM Pub Where Data = 1900 );
Scan pub using index ndx_data

No vale a pena
usar o ndice

select PLAN('SELECT * FROM Pub Where Data = 1900 or Data = 2000);


Scan pub sequentially

Pedro Ramos,

lgebra

SQL ndice

SQL

Optimizaes de Querys (II)


select PLAN('SELECT Nome, Localidade FROM Cliente KEY JOIN Localidade');
Scan Localidade sequentially
Scan Cliente using foreign key FK_Localidade
select PLAN('SELECT Nome, Localidade FROM Localidade KEY JOIN Cliente);
Scan Localidade sequentially
Scan Cliente using foreign key FK_Localidade

select PLAN(
'SELECT Nome FROM Cliente as
SELECT * From Cliente as CL2
Cl2.Bi<>Cl1.BI)');
Scan Cliente AS CL1
Scan Cliente AS CL2

sequentially
sequentially

select PLAN(
'SELECT Nome FROM Cliente as
SELECT CL2.Nome From Cliente
Scan Cliente AS CL1
Scan Cliente AS CL2

CL1 Where Cl1.NOME NOT IN (


as CL2 Where Cl2.Bi<>Cl1.BI)');
sequentially
sequentially

CL1 Where NOT EXISTS (


Where CL2.Nome = CL1.Nome AND

Diferentes comandos produzem o mesmo plano

Pedro Ramos,

lgebra

SQL ndice

SQL

Views
As Views no so mais do que comandos SELECT armazenados.
So por vezes denominadas tabelas temporrias. Note-se que o
resultado de uma execuo de uma view (os registos que ela
devolve) depende dos registos armazenados no momento nas tabelas
de suporte view. As views podem ser utilizadas dentro de
comandos SELECT.
CREATE VIEW Clientes_Lisboa (BI, Nome)
AS Select BI, Nome FROM Cliente KEY JOIN Localidade
Where Localidade = 'Lisboa'
WITH CHECK OPTION;
Select Nome From Clientes_Lisboa;

As views no podem conter a clusula ORDER BY e apenas permitem a


insero, remoo e alterao de registos caso no contenham as clusulas
GROUP BY e UNION. A clusula CHECK OPTION rejeita alteraes e
inseres na view que no obedeam ao critrio da clusula SELECT que a
define.

Pedro Ramos,

lgebra

SQL ndice

SQL

Prepare Statement
O comando Prepare Statement permite optimizar acessos base de
dados que so efectuados mltiplas vezes em uma transaco.
Quando um comando SQL enviado ao SGBD, este, para alm de
ter o interpretar (parsing), tem de gerar um plano para a sua
realizao. O comando Prepare Statement evita que essas duas
tarefas sejam executadas mais do que uma vez.
A comando apenas se justifica quando o SQL utilizado dentro de outra
linguagem de programao (Java, C, Visual Basic, etc.) ou em Stored Procedures
(ver mais adiante).
Exemplo (simplificado, mais adiante apresenta-se um exemplo completo em JAVA)
PREPARE calc_factura("Update Factura Set Valor = ? Where Num_Factura = ? ;");
calc_factura.setDouble(1, totalFactura);
calc_factura.setInt(2, lastFactura);
Passagem de parmetros
calc_factura.executeSQL()

Execuo

Pedro Ramos,

lgebra

SQL ndice

SQL

Stored Procedures
Os Stored Procedures (SP) so procedimentos SQL compilados e
armazenados junto da base de dados. Trata-se da forma mais
eficiente de executar comandos SQL. Para alm dos comandos SQL
possvel utilizar as habituais primitivas de controlo (If, While), os
habituais operadores lgicos e variveis. Trata-se no entanto de uma
linguagem simples que no substitui as linguagens procedimentais
(C, Java, etc.).
possvel passar parmetros para um SP, assim como um SP
retornar valores (nomeadamente o resultado de comandos SELECT).
Os SP podem ser chamados dentro de um comando SELECT ou a
partir de uma linguagem procedimental (atravs da primitiva
CALL).

Pedro Ramos,

lgebra

SQL ndice

SQL

Stored Procedures - Exemplos


create procedure dba.newPubdelay()
begin
declare i integer;
declare lastISBN integer;
select max(ISBN) into lastISBN from Pub;
Se aps este SP for executado um
set i=1;
outro idntico sem o ciclo (simula
while i < 100000 loop
uma pausa) ocorre uma situao de
set i=i+1
dead lock.
end loop;
insert into pub(isbn) values(lastISBN+1);
commit work
end
create procedure dba.getPubAno(in Par_Ano integer)
result(ISBN integer,Titulo long varchar)
begin
select ISBN,Titulo from Pub where DAta = Par_Ano
end
O comando CALL getPubAno(2000); retorna as publicaes de 2000

Pedro Ramos,

lgebra

SQL ndice

SQL

Triggers (I)
Os triggers so procedimentos armazenados junto da base de dados que so
associados a eventos que ocorrem nas tabelas. Atravs dos triggers o motor de
base de dados reage automaticamente quando esses eventos (alteraes dos dados
nas tabelas) ocorrem. A forma como reagem definida pelo procedimento
associado ao trigger (um trigger apenas pode estar associado a um evento de uma
tabela). Os eventos aos quais podem se associar os triggers: Insert, Update, Delete
e Update Of (para cada um deles necessrio discriminar se o evento ocorre antes
ou depois da operao terminar).
Os eventos Insert, Update e Delete ocorrem ao nvel do registo completo,
enquanto que o evento Update Of ocorre ao nvel de um campo da tabela (
necessrio indicar qual o atributo no momento da definio do trigger).
Os triggers podem ainda ser row-level ou statement-level. Os triggers row-level
ocorrem aps cada linha da tabela ser alterada (anulada ou inserida). Os triggers
statement-level ocorrem aps uma operao sobre a tabela ser concluda (por
exemplo, aps um conjunto de registos ser inserido).

Pedro Ramos,

lgebra

SQL ndice

SQL

Triggers (II)
O procedimento associado ao trigger obedece no essencial mesma
sintaxe que os SP.
Exemplo: trigger (row-level) que activado sempre que se insere
uma matria prima na tabela de produtos (insere um registo na tabela
de matrias primas):
create trigger "dba".MateriaPrima after insert
referencing new as new_produto
for each row
when(new_produto.Tipo='MP')
begin
insert into MateriaPrima(cod_produto)
values(new_produto.cod_produto)
end

Pedro Ramos,

on Produto

lgebra

SQL ndice

Você também pode gostar