Você está na página 1de 73

SQL

Linguagem SQL

Verso 1.4

Ana Paula Afonso/Ana Lucas/Paulo Batista/Wilson Lucas - 2007

SQL

SQL
Caractersticas actuais e Perspectivas
futuras

Caractersticas e Componentes
SQL na Manipulao de Dados
SQL na Definio da Base de Dados

Verso 1.4

Ana Paula Afonso/Ana Lucas/Paulo Batista/Wilson Lucas - 2007

SQL

Histri
a
1970: Codd define o Modelo Relacional
1974: IBM desenvolve o projecto SYSTEM/R com a linguagem SEQUEL
1979: lanado o primeiro SGBD comercial (ORACLE)
1981: lanado o SGBD INGRES
1983: IBM anuncia o DB2
1986, 1987: ratificada a norma SQL que fica conhecida como SQL-86 (ANSI
X3.135-1986 e ISO 9075:1987)
1989: ratificada a norma SQL-89 quer pela ANSI quer pela ISO
1992: ratificada a norma: SQL2
1999: ratificada a norma SQL1999, anteriormente conhecida como SQL3
2006: SQL:2006, define a forma como o SQL pode ser usado em conjuno com o
XML (ANSI/ISO/IEC 9075-14:2006 )
Verso 1.4

Ana Paula Afonso/Ana Lucas/Paulo Batista/Wilson Lucas - 2007

SQL

Structured Query Language, o que ?


SQL uma linguagem normalizada para definio,
acesso, manipulao e controlo de Bases de Dados
Relacionais
Na maioria dos SGBDR, esta linguagem pode ser
utilizada:

interactivamente
embutida em linguagens de programao

Verso 1.4

Ana Paula Afonso/Ana Lucas/Paulo Batista/Wilson Lucas - 2007

SQL

Esquema
Relacional

Empregado ( cod-emp, nome_emp, data_admisso, cod_cat, cod_dept,


cod_emp_chefe )
Departamento ( cod-dept, nome_dept, localizao)
Categoria ( cod-cat, designao, salario_base )

Verso 1.4

Ana Paula Afonso/Ana Lucas/Paulo Batista/Wilson Lucas - 2007

SQL

Base de Dados
Relacional
Categoria
cod_cat
1
2
3

Departamento
designao
CategoriaA
CategoriaB
CategoriaC
...

...

salario_base
300
250
160
...

cod_dept

nome_dept

localizao

Contabilidade Lisboa

Vendas

Investigao Coimbra

...

...

Porto
...

Empregado

Verso 1.4

cod_emp

nome_emp

data_admisso cod_cat cod_dept cod_emp_chefe

Antnio Abreu

13-Jan-75

Bernardo Bento 1-Dec-81

Carlos Castro

4-Jun-84

...

...

...

...

...

...

20

Manuel Matos

7-Feb-90

...

...

...

...

...

...

Ana Paula Afonso/Ana Lucas/Paulo Batista/Wilson Lucas - 2007

SQL

Comando SQL
Qual o salrio do empregado Antnio Abreu e o nome do departamento
a que pertence?

SELECT
SELECT nome_emp,
nome_emp,salario_base,
salario_base,nome_dept
nome_dept
FROM
FROM Empregado,
Empregado,Departamento,
Departamento,Categoria
Categoria
WHERE
WHERE nome_emp
nome_emp==Antnio
AntnioAbreu
Abreu
AND
AND Empregado.cod_cat
Empregado.cod_cat==Categoria.cod_cat
Categoria.cod_cat
AND
AND Departamento.cod_dept
Departamento.cod_dept==Empregado.
Empregado.cod_dept
cod_dept

Verso 1.4

Ana Paula Afonso/Ana Lucas/Paulo Batista/Wilson Lucas - 2007

SQL

Caracterstica
s
Linguagem no procedimental em que se especifica O QU e no
COMO
Existe uma clara abstraco perante a estrutura fsica dos dados, isto , no
necessrio especificar caminhos de acesso nem algoritmos de pesquisa
fsica

Operaes sobre estruturas lgicas


As operaes efectuam-se sobre conjuntos de dados (tabelas), no sendo
necessrio (nem possvel) manipular linha-a-linha

Verso 1.4

Ana Paula Afonso/Ana Lucas/Paulo Batista/Wilson Lucas - 2007

SQL

Componentes

DDL
DDL(Data
(DataDefinition
Definition Language)
Language)
DML
DML(Data
(DataManipulation
ManipulationLanguage)
Language)
TML
TML(Transaction
(TransactionManipulation
ManipulationLanguage)
Language)
DCL
DCL(Data
(DataControl
ControlLanguage)
Language)

Verso 1.4

Ana Paula Afonso/Ana Lucas/Paulo Batista/Wilson Lucas - 2007

SQL

SQL
Caractersticas actuais e Perspectivas
futuras
Caractersticas e Componentes
SQL na Manipulao de Dados

SQL na Definio da Base de Dados

Verso 1.4

Ana Paula Afonso/Ana Lucas/Paulo Batista/Wilson Lucas - 2007

SQL

SQL
Manipulao de Dados

Verso 1.4

SELECT

Acesso aos dados da B.D.

INSERT
UPDATE
DELETE

Manipulao dos
dados da B.D.

Ana Paula Afonso/Ana Lucas/Paulo Batista/Wilson Lucas - 2007

SQL

Clausula SELECT e FROM

SELECT

[ DISTINCT ] coluna, ... | *

FROM

tabela

O smbolo * utilizado quando se pretende seleccionar todos os atributos da


tabela especificada na clausula FROM
DISTINCT aplicado a todas as colunas especificadas na clausula SELECT e
elimina as repeties existentes

Verso 1.4

Ana Paula Afonso/Ana Lucas/Paulo Batista/Wilson Lucas - 2007

SQL

Projeco
Empregado
cod_emp

nome_emp

data_admisso cod_cat cod_dept cod_emp_chefe

Antnio Abreu

13-Jan-75

Bernardo Bento 1-Dec-81

Carlos Castro

4-Jun-84

...

...

...

...

...

...

20

Manuel Matos

7-Feb-90

...

...

...

...

...

...

Clausulas
Select
From

SELECT cod_emp, nome_emp


FROM

Verso 1.4

empregado

Ana Paula Afonso/Ana Lucas/Paulo Batista/Wilson Lucas - 2007

SQL

Restri
o
Categoria

cod_cat
1
2
3
...

designao
CategoriaA
CategoriaB
CategoriaC
...

salario_base
300
250
160
...

Clausula Where

SELECT *
FROM

categoria

WHERE salario_base > 200

Verso 1.4

Ana Paula Afonso/Ana Lucas/Paulo Batista/Wilson Lucas - 2007

SQL

Juno
Empregado
cod_emp

nome_emp

data_admisso cod_cat cod_dept cod_emp_chefe

Antnio Abreu

13-Jan-75

Bernardo Bento 1-Dec-81

Carlos Castro

4-Jun-84

...

...

...

...

...

...

20

Manuel Matos

7-Feb-90

...

...

...

...

...

...

A partir do produto cartesiano


selecciona-se somente as linhas que
satisfazem a condio
EMPREGADO.COD_DEPT= DEPTARTAMENTO.COD_DEPT

Verso 1.4

Departamento
cod_dept

nome_dept

localizao

Contabilidade Lisboa

Vendas

Investigao Coimbra

...

...

Porto
...

Ana Paula Afonso/Ana Lucas/Paulo Batista/Wilson Lucas - 2007

SQL

Juno
SELECT

nome_emp, empregado.cod_dept, nome_dept

FROM

empregado, departamento

WHERE

empregado.cod_dept = departamento.cod_dept

Caso o nome de uma coluna seja igual em vrias tabelas ento


a REGRA
Nome_Tabela.Nome_Coluna
em qualquer stio da clusula SELECT

Verso 1.4

Ana Paula Afonso/Ana Lucas/Paulo Batista/Wilson Lucas - 2007

SQL

Projeco, Restrio e Juno


Qual o nome dos empregados pertencentes ao departamento de Vendas

SELECT

empregado.cod_dept, nome_emp

FROM

empregado, departamento

WHERE

empregado.cod_dept = departamento.cod_dept

Projeco

AND
nome_dept = 'Vendas'

Restrio

Verso 1.4

Juno

Ana Paula Afonso/Ana Lucas/Paulo Batista/Wilson Lucas - 2007

SQL

Aliases de Tabelas
Correlation Name

SELECT

cod_emp, D.cod_dept, nome_dept

FROM

empregado E, departamento D

WHERE

E.cod_dept = D.cod_dept

Particularmente til quando se pretende usar a mesma tabela com significados diferentes
Pretende-se o nome de cada empregado e o nome do respectivo chefe
SELECT E.nome, CH.nome
FROM

empregado E, empregado CH

WHERE E.cod_emp_chefe = CH.cod_emp


Verso 1.4

Ana Paula Afonso/Ana Lucas/Paulo Batista/Wilson Lucas - 2007

SQL

Junes
Mltiplas
Categoria
cod_cat
1
2
3

Departamento
designao
CategoriaA
CategoriaB
CategoriaC
...

...

salario_base
300
250
160
...

cod_dept

nome_dept

localizao

Contabilidade Lisboa

Vendas

Investigao Coimbra

...

...

Porto
...

Empregado

Verso 1.4

cod_emp

nome_emp

data_admisso cod_cat cod_dept cod_emp_chefe

Antnio Abreu

13-Jan-75

Bernardo Bento 1-Dec-81

Carlos Castro

4-Jun-84

...

...

...

...

...

...

20

Manuel Matos

7-Feb-90

...

...

...

...

...

...

Ana Paula Afonso/Ana Lucas/Paulo Batista/Wilson Lucas - 2007

SQL

Junes
Mltiplas
Para cada categoria listar o nome dos empregados, salrio_base e repectivo departamento

SELECT

categoria.cod_cat, nome_emp, nome_dept, salario_base

FROM

empregado, departamento, categoria

WHERE

empregado.cod_dept = departamento.cod_dept

AND
empregado.cod_cat = categoria.cod_cat

Verso 1.4

Ana Paula Afonso/Ana Lucas/Paulo Batista/Wilson Lucas - 2007

SQL

Juno "Outer" (Outer Join)


Empregado
cod_emp

nome_emp

data_admisso cod_cat cod_dept cod_emp_chefe

Antnio Abreu

13-Jan-75

Bernardo Bento 1-Dec-81

Carlos Castro

4-Jun-84

Quais os departamentos e
respectivos empregados.
Nesta listagem devero aparecer
todos os departamentos, mesmo os
que no tm empregados.

Verso 1.4

Departamento
cod_dept

nome_dept

localizao

...

...

...

Marketing

Lisboa

Ana Paula Afonso/Ana Lucas/Paulo Batista/Wilson Lucas - 2007

SQL

Juno Outer Direita (Right Outer Join)

Verso 1.4

SELECT

nome_emp, empregado.cod_dept, nome_dept

FROM

empregado, right outer join departamento

ON

empregado.cod_dept = departamento.cod_dept
cod_emp

nome_emp

cod_dept

nome_dept

Antnio Abreu

Contabilidade

Bernardo Bento 2

Vendas

Carlos Castro

Investigao

Marketing

Ana Paula Afonso/Ana Lucas/Paulo Batista/Wilson Lucas - 2007

SQL

Unio
Suponha que tem as seguintes tabelas:
CLIENTE ( nome, morada )
FORNECEDOR ( nome, morada )
Pretende uma listagem com os nomes e moradas quer dos clientes, quer dos
fornecedores

SELECT

nome, morada

FROM

cliente

UNION

Verso 1.4

SELECT

nome, morada

FROM

fornecedor

Ana Paula Afonso/Ana Lucas/Paulo Batista/Wilson Lucas - 2007

SQL

Intersec
o
Suponha que com as tabelas anteriores
Pretende uma listagem com os nomes e moradas dos clientes que tambm so
fornecedores

SELECT

nome, morada

FROM

cliente

INTERSECT

Verso 1.4

SELECT

nome, morada

FROM

fornecedor

Ana Paula Afonso/Ana Lucas/Paulo Batista/Wilson Lucas - 2007

SQL

Diferena
Suponha que com as tabelas anteriores
Pretende uma listagem com os nomes e moradas dos clientes que no so fornecedores

SELECT

nome, morada

FROM

cliente

EXCEPT

Verso 1.4

SELECT

nome, morada

FROM

fornecedor

Ana Paula Afonso/Ana Lucas/Paulo Batista/Wilson Lucas - 2007

SQL

Clausula WHERE

SELECT

[ DISTINCT ] coluna, ...| *

FROM

tabela, [tabela,....]

WHERE

condio-de-pesquisa

Uma condio-de-pesquisa basicamente uma coleco de predicados,


combinados atravs dos operadores booleanos AND, OR, NOT e
parntesis.

Verso 1.4

Ana Paula Afonso/Ana Lucas/Paulo Batista/Wilson Lucas - 2007

SQL

Predicados

Um predicado pode ser:


- Um predicado de comparao (WHERE NOME_EMP = Manuel Silva)
- Um predicado de BETWEEN (WHERE COD_EMP BETWEEN 1 AND 5)
- Um predicado de LIKE (WHERE NOME_EMP LIKE ' M%')
- Um teste de valor nulo (WHERE COMISSO IS NULL)
- Um predicado de IN (WHERE COD_CAT IN (1,2))

Verso 1.4

Ana Paula Afonso/Ana Lucas/Paulo Batista/Wilson Lucas - 2007

SQL

Predicados
Os predicados podem ser utilizados num contexto esttico, sendo avaliados com
base em valores constantes.
Ex: WHERE COD_CAT IN (1,2)
Podem tambm ser avaliados com base em valores dinmicos, a retirar da base
de dados
Ex: WHERE COD_CAT IN
(SELECT COD_CAT FROM CATEGORIA)
SUBQUERY
Verso 1.4

Ana Paula Afonso/Ana Lucas/Paulo Batista/Wilson Lucas - 2007

SQL

Predicados utilizados em Subqueries


As subqueries so usadas em:

Predicados
Predicadosde
decomparao
comparao
Predicado
PredicadoIN
IN
Predicados
PredicadosALL
ALLou
ouANY
ANY
Predicado
PredicadoEXISTS
EXISTS

Verso 1.4

Ana Paula Afonso/Ana Lucas/Paulo Batista/Wilson Lucas - 2007

SQL

Subqueries
Qual o cdigo e nome dos empregados que trabalham no mesmo
departamento que o empregado 'Carlos Castro'?

Qual o departamento do
empregado 'Carlos
Castro'?

Verso 1.4

Qual o cdigo e nome dos


empregados do departamento
3
3

SELECT

cod_dept

SELECT cod_emp, nome_emp

FROM

empregado

FROM

WHERE

nome_emp = 'Carlos Castro'

WHERE cod_dept = 3

empregado

Ana Paula Afonso/Ana Lucas/Paulo Batista/Wilson Lucas - 2007

SQL

Subqueries
Integrao das duas Queries

SELECT cod_emp, nome_emp


FROM

empregado

WHERE cod_dept = ( SELECT cod_dept


FROM empregado
WHERE nome_emp = 'Carlos Castro')

Verso 1.4

Ana Paula Afonso/Ana Lucas/Paulo Batista/Wilson Lucas - 2007

SQL

Subqueries
Quais os nomes dos empregados que trabalham nos departamentos
de Lisboa

SELECT cod_emp, nome_emp


FROM

empregado

WHERE cod_dept IN ( SELECT cod_dept


FROM departamento
WHERE localizao = 'Lisboa'
)

Verso 1.4

Ana Paula Afonso/Ana Lucas/Paulo Batista/Wilson Lucas - 2007

SQL

Subqueries
Quais os empregados cujo salrio superior a todos os salrios dos empregados
do departamento 1

SELECT nome_emp
FROM empregado, categoria
WHERE empregado.cod_cat = categoria.cod_cat
AND
salrio_base > ALL
( SELECT salrio_base
FROM empregado, categoria
WHERE empregado.cod_cat = categoria.cod_cat
AND cod_dept = 1
)

Verso 1.4

Ana Paula Afonso/Ana Lucas/Paulo Batista/Wilson Lucas - 2007

SQL

Subqueries
Quais os empregados cujo salrio superior a algum dos salrios dos empregados
do departamento 1

SELECT nome_emp
FROM empregado, categoria
WHERE empregado.cod_cat = categoria.cod_cat
AND
salrio_base > ANY
( SELECT salrio_base
FROM empregado, categoria
WHERE empregado.cod_cat = categoria.cod_cat
AND cod_dept = 1
)

Verso 1.4

Ana Paula Afonso/Ana Lucas/Paulo Batista/Wilson Lucas - 2007

SQL

Operador EXISTS
Nome dos departamentos que tm empregados (pelo menos um)

SELECT nome_dept
FROM departamento
WHERE EXISTS
( SELECT *
FROM
empregado
WHERE departamento.cod_dept = empregado.cod_dept

A condio VERDADEIRA se o resultado da subquery no for vazio

Verso 1.4

Ana Paula Afonso/Ana Lucas/Paulo Batista/Wilson Lucas - 2007

SQL

Operador NOT EXISTS


Nome dos departamentos que no tm empregados

SELECT nome_dept
FROM departamento
WHERE NOT EXISTS
( SELECT *
FROM
empregado
WHERE departamento.cod_dept = empregado.cod_dept

A condio VERDADEIRA se o resultado da subquery for vazio

Verso 1.4

Ana Paula Afonso/Ana Lucas/Paulo Batista/Wilson Lucas - 2007

SQL

Diviso
( exemplo )
Nomes dos departamentos que tm empregados de todas as categorias?
Empregado
cod_emp

nome_emp

cod_cat cod_dept

Antnio Abreu

01

Categoria

Bernardo Bento 1

02

cod_cat

designao

salario_base

Carlos Castro

03

CategoriaA

300

Diogo Dado

02

CategoriaB

250

Ernesto Eco

02

CategoriaC

160

:
=
cod_dept
02

Verso 1.4

Ana Paula Afonso/Ana Lucas/Paulo Batista/Wilson Lucas - 2007

SQL

Divis
o
Nomes dos departamentos que tm empregados de todas as categorias?

Nome dos departamentos para os quais, qualquer que seja a categoria,


existe algum empregado desse departamento e dessa categoria

Nome dos departamentos: categoria categorias

empregado :
empregado.cod_dept = departamento.cod_dept

p(x)

and empregado.cod_cat = categoria.cod_cat


)

Verso 1.4

Ana Paula Afonso/Ana Lucas/Paulo Batista/Wilson Lucas - 2007

SQL

Sabendo que:

Divis
o
xx::p(x)
p(x)

xx::~p(x)
~p(x)

Nome dos departamentos: categoria categorias ~ p(x) )

Nome dos departamentos: categoria categorias


empregado :
empregado.cod_dept = departamento.cod_dept
and empregado.cod_cat = categoria.cod_cat

Verso 1.4

Ana Paula Afonso/Ana Lucas/Paulo Batista/Wilson Lucas - 2007

SQL

Divis
o
Comando SQL

SELECT
nome_dept
FROM departamento
WHERE
NOT EXISTS
( SELECT *
FROM categoria
WHERE NOT EXISTS
( SELECT *
FROM
empregado
WHERE empregado.cod_dept = departamento.cod_dept
and empregado.cod_cat = categoria.cod_cat ))

Verso 1.4

Ana Paula Afonso/Ana Lucas/Paulo Batista/Wilson Lucas - 2007

SQL

Clausula ORDER BY
AAclausula
clausulaORDER
ORDERBY
BYusada
usadapara
paraordenar
ordenaros
osdados
dadosreferentes
referentesaauma
umaou
ou
mais
colunas
mais colunas
aaltima
ltimaclausula
clausulaaaser
serespecificada
especificada

Verso 1.4

SELECT

[ DISTINCT ] coluna, ... | *

FROM

tabela

WHERE

condio

ORDER BY

coluna [ASC | DESC ], ...

Ana Paula Afonso/Ana Lucas/Paulo Batista/Wilson Lucas - 2007

SQL

Clausula ORDER BY

SELECT

FROM

empregado

ORDER BY

nome_emp

Por defeito, os dados so ordenados ascendentemente


Z
A
Caracter (Char)
Verso 1.4

Recentes

Menos Recentes

Numrico (Number)

Data (Date)

Ana Paula Afonso/Ana Lucas/Paulo Batista/Wilson Lucas - 2007

SQL

Funes Agregadoras
1
2
3
MIN = ---------->
4

Salrio_base
100
200
12,5
450

700

100

120

350

9
MAX = ---------->
10

890
400
SUM =

Verso 1.4

COUNT(*) = 10

AVG = SUM / COUNT

Ana Paula Afonso/Ana Lucas/Paulo Batista/Wilson Lucas - 2007

SQL

Funes Agregadoras

SELECT

MAX(salario_base)

SELECT

MIN(salario_base)

FROM

categoria

FROM

categoria

SELECT COUNT(*)
FROM

categoria

SELECT SUM(salario_base)

SELECT AVG(salario_base)

FROM

FROM

categoria, empregado

WHERE empregado.cod_cat = categoria.cod_cat

Verso 1.4

categoria, empregado

WHERE empregado.cod_cat = categoria.cod_cat

Ana Paula Afonso/Ana Lucas/Paulo Batista/Wilson Lucas - 2007

SQL

Funes Agregadoras
com Restries
SELECT

AVG(salario_base)

FROM

empregado, categoria

WHERE

cod_dept = 1
and
empregado.cod_cat = categoria.cod_cat

Mdia dos salrios dos empregados


do departamento cujo cdigo 1

Verso 1.4

Ana Paula Afonso/Ana Lucas/Paulo Batista/Wilson Lucas - 2007

SQL

Cod_dept Salrio_base

Verso 1.4

Agrupamento
s

120

250

150

300

250

100

150

230

SELECT

cod_dept, min(salario_base)

300

FROM

empregado, categoria

400

WHERE

empregado.cod_cat = categoria.cod_cat

200

160

Para cada departamento qual o


salrio minmo?

120

100

160

GROUP BY cod_dept

Ana Paula Afonso/Ana Lucas/Paulo Batista/Wilson Lucas - 2007

SQL

Agrupamentos
Mltiplos
Cod_dept Cod_cat Salrio_base
1
A
120
1
A
250

Verso 1.4

150

300

250

100

150

230

300

400

200

160

120

Para cada categoria de cada


departamento qual o salrio
minmo?

150
100
150
300

SELECT

cod_dept, cod_cat, min(salario_base)

FROM

empregado, categoria

WHERE

empregado.cod_cat = categoria.cod_cat

GROUP BY cod_dept, cod_cat

160
Ana Paula Afonso/Ana Lucas/Paulo Batista/Wilson Lucas - 2007

SQL

Agrupamentos
Mltiplos
SELECT

[ DISTINCT ] coluna, ... | *

FROM

tabela, ...

WHERE

condio

GROUP BY

coluna, ...

Qualquer coluna que no seja uma funo agregadora s


pode estar na clusula SELECT se estiver na clasula
GROUP BY
SELECT

COD_DEPT, min(salario_base)

FROM

empregado, categoria

WHERE

empregado.cod_cat = categoria.cod_cat

GROUP BY COD_DEPT

Verso 1.4

Ana Paula Afonso/Ana Lucas/Paulo Batista/Wilson Lucas - 2007

SQL

Restries sobre Grupos


Cod_dept Salrio_base

Verso 1.4

120

250

150

300

250

100

150

230

300

400

200

160

AVG = 214
120

Para cada departamento qual o salrio


mnimo.
Seleccionar apenas os departamentos
cujo salrio mdio seja superior a 200

AVG = 160
100
AVG = 265
160

SELECT

cod_dept, min(salario_base)

FROM

empregado, categoria

WHERE

empregado.cod_cat = categoria.cod_cat

GROUP BY cod_dept
HAVING

avg (salario_base) > 200

Ana Paula Afonso/Ana Lucas/Paulo Batista/Wilson Lucas - 2007

SQL

Clusula HAVING
SELECT

[ DISTINCT ] coluna, ... | *

FROM

tabela, ...

WHERE

condio

GROUP BY

coluna, ...

HAVING

condio

WHERE OU HAVING ?
A clusula WHERE nunca contm funes agregadoras
A clusula HAVING deve sempre conter funes agregadoras

Verso 1.4

Ana Paula Afonso/Ana Lucas/Paulo Batista/Wilson Lucas - 2007

SQL

Subqueries com
Funes Agregadoras
Qual o nome do empregado que tem o maior salrio

SELECT empregado.cod_emp, nome_emp


FROM

empregado, categoria

WHERE empregado.cod_cat = categoria.cod_cat and


salrio_base = ( SELECT max(salrio_base)
FROM categoria, empregado
WHERE empregado.cod_cat = categoria.cod_cat
)

Verso 1.4

Ana Paula Afonso/Ana Lucas/Paulo Batista/Wilson Lucas - 2007

SQL

Subqueries com Agrupamentos


Para cada departamento qual o empregado que tem o
maior salrio

SELECT cod_dept, cod_emp, nome_emp


FROM
empregado, categoria
WHERE empregado.cod_cat = categoria.cod_cat and
(cod_dept, sal rio_base) IN
( SELECT cod_dept, max(salrio_base)
FROM categoria, empregado
WHERE empregado.cod_cat = categoria.cod_cat
GROUP BY cod_dept
)

Verso 1.4

Ana Paula Afonso/Ana Lucas/Paulo Batista/Wilson Lucas - 2007

SQL

Comando SELECT

Verso 1.4

SELECT

[ DISTINCT ] coluna, ... | *

FROM

tabela, ...

WHERE

condio

GROUP BY

coluna, ...

HAVING

condio

ORDER BY

coluna [ASC | DESC ], ...

Ana Paula Afonso/Ana Lucas/Paulo Batista/Wilson Lucas - 2007

SQL

Manipulao da Base de
Dados
INSERES, ACTUALIZAES
e REMOES

INSERT INTO tabela_nome [ (coluna, coluna, ....)]


VALUES (valor, valor, ...) | comando SELECT
UPDATE tabela_nome SET lista_de_atribuies
[WHERE condio]
DELETE FROM tabela_nome
[WHERE condio]

Verso 1.4

Ana Paula Afonso/Ana Lucas/Paulo Batista/Wilson Lucas - 2007

SQL

Inser
t

INSERT INTO DEPARTAMENTO VALUES (4,'Marketing','Lisboa')

cod_dept

nome_dept

Contabilidade Lisboa

Contabilidade Lisboa

Vendas

Vendas

Investigao Coimbra

Investigao Coimbra

...

...

Marketing

Lisboa

...

...

...

cod_dept

nome_dept

localizao
Porto
...

localizao
Porto

Cpia
Cpiade
deValores
Valoresde
deoutras
outrasTabelas
Tabelas
INSERT INTO EMP_HIST
(cod_emp, nome_emp, data_admisso)
SELECT cod_emp, nome_emp, data_admisso
FROM empregado
WHERE data_admisso > '1-JAN-91'

Verso 1.4

Ana Paula Afonso/Ana Lucas/Paulo Batista/Wilson Lucas - 2007

SQL

Update e
Delete
Actualizar o cdigo do chefe do empregado Bernardo Bento
UPDATE empregado
SET

cod_emp_chefe=2

WHERE nome_emp = 'Bernardo


Bento'

Apagar todos os empregados que trabalham no departamento 2


DELETE FROM
empregado
WHERE cod_dept = 2
Verso 1.4

Ana Paula Afonso/Ana Lucas/Paulo Batista/Wilson Lucas - 2007

SQL

SQL
Caractersticas actuais e Perspectivas
Futuras
Caractersticas e Componentes
SQL na Manipulao de Dados
SQL na Definio da Base de Dados

Verso 1.4

Ana Paula Afonso/Ana Lucas/Paulo Batista/Wilson Lucas - 2007

SQL

SQL
Definio da Base de
Dados

Verso 1.4

CREATE
ALTER
DROP

Criao e modificao
das estruturas da B.D.

GRANT
REVOKE

Controle da segurana
da B.D.

Ana Paula Afonso/Ana Lucas/Paulo Batista/Wilson Lucas - 2007

SQL

Definio da Base de
Dados
CREATE TABLE nome_tabela
[ ( [ nome_coluna

tipo_dados

[restrio_coluna] ] |

[restrio_tabela],....) ] | [AS SELECT comando]


restrio_coluna
[ NULL | NOT NULL] | [ UNIQUE | PRIMARY KEY ] |
[ REFERENCES tabela (coluna) [ ON DELETE CASCADE] ] |
[ CHECK (condio) ]

restrio_tabela
CONSTRAINT nome_regra_tabela
[ [ UNIQUE | PRIMARY KEY ] (coluna,....) |
[ FOREIGN KEY (coluna,...) REFERENCES tabela (coluna,...)
CASCADE] ] |

[ ON DELETE

[ CHECK (condio) ]
Verso 1.4

Ana Paula Afonso/Ana Lucas/Paulo Batista/Wilson Lucas - 2007

SQL

Definio da Base de
Dados
(1) Definio de uma tabela com uma chave primria
CREATE TABLE departamento
( cod_dept

integer(4) PRIMARY KEY,

nome_dept

char(15)

NOT NULL,

data_adm

date

NOT NULL,

localizao

char(20) )

(2) Definio de uma tabela com uma chave primria composta


CREATE TABLE linha_enc
( n_enc
integer(4),
n_produto integer(4),
quantidade integer(3) NOT NULL,
CONSTRAINT chave_le PRIMARY KEY (n_enc, n_produto) )
Verso 1.4

Ana Paula Afonso/Ana Lucas/Paulo Batista/Wilson Lucas - 2007

SQL

Definio da Base de
Dados
(3) Definio de uma tabela com
uma chave estrangeira
CREATE TABLE empregado
( cod_emp

integer(4) PRIMARY KEY,

nome_emp char(15)
cod_dept

NOT NULL,

char(20) REFERENCES departamento(cod_dept) )

(4) Definio de uma tabela com uma chave estrangeira composta


CREATE TABLE faltas_material
( n_falta
integer(4),
data_falta
date,
n_enc
integer(4),
n_produto
integer(4),
CONSTRAINT chave_fme PRIMARY KEY (n_falta,data_falta),
CONSTRAINT falta_le FOREIGN KEY (n_enc, n_produto)
REFERENCES linha_enc(n_enc, n_produto) )
Verso 1.4

Ana Paula Afonso/Ana Lucas/Paulo Batista/Wilson Lucas - 2007

SQL

Definio da Base de
Dados
(5) Definio de uma tabela com uma regra de verificao
CREATE TABLE encomenda
( n_enc
integer(4) PRIMARY KEY,
data_enc
date
NOT NULL,
cod_cliente integer(4) REFERENCES cliente(cod_cliente),
data_entrega date CHECK (data_entrega > data_enc) )

(6) Definio de uma tabela com valores seleccionados de outra tabela


CREATE TABLE emp_dept1
AS SELECT cod_emp, nome_emp, data_adm
FROM empregado
WHERE cod_dept = 1
Verso 1.4

Ana Paula Afonso/Ana Lucas/Paulo Batista/Wilson Lucas - 2007

SQL

Tipos de Dados
STANDARD SQL2
INTEGER

-2147483648 to 2147483647

SMALLINT
Exactos

Aprox.

BIT

NUMERIC
DECIMAL

DATE

REAL

TIME

Sinnimos

DOUBLE
FLOAT

Verso 1.4

-32768 to 32767

CHAR
VARCHAR

AAAA-MMDD
HH:MM:SS

TIMESTAMP

YYYY-MM-DD
HH:MM:SS

Preciso simples

Ana Paula Afonso/Ana Lucas/Paulo Batista/Wilson Lucas - 2007

SQL

Alter Table
ALTER TABLE nome_tabela
ADD novas colunas | novas restries_coluna
ALTER TABLE nome_tabela
CHANGE definio das colunas
No se pode modificar uma coluna contendo
valores nulos para NOT NULL.

ALTER TABLE nome_tabela


DROP coluna | restrio_coluna

S se pode adicionar uma coluna NOT NULL a


uma tabela que no contenha nenhuma linha.
Soluo: Adicione como NULL, preencha-a
completamente e depois mude para NOT NULL
Pode-se decrementar o tamanho de uma coluna e o
tipo de dados, caso essa coluna contenha valores
nulos em todas as linhas.
Nota: Disponvel em quase todos os SGBDR existentes no mercado.

Verso 1.4

Ana Paula Afonso/Ana Lucas/Paulo Batista/Wilson Lucas - 2007

SQL

Alter Table

alter
altertable
tableempregado
empregado
ADD
ADD comisso
comisso integer(4)
integer(4) NOT
NOTNULL
NULL
alter
alter table
tabledepartamento
departamento
change
changecod_dept
cod_deptcod_dept
cod_deptinteger(15);
integer(15);
alter
altertable
tableempregado
empregado
DROP
DROP comisso
comisso
Verso 1.4

Ana Paula Afonso/Ana Lucas/Paulo Batista/Wilson Lucas - 2007

SQL

View
cod_emp

nome_emp

data_admisso cod_cat cod_dept cod_emp_chefe

Antnio Abreu

13-Jan-75

Bernardo Bento 1-Dec-81

Carlos Castro

4-Jun-84

...

...

...

...

...

...

20

Manuel Matos

7-Feb-90

...

...

...

...

...

...

No contm informao prpria


uma imagem de uma tabela atravs
No ocupam espao fsico e por isso
de uma "janela" a partir da qual se
so vulgarmente denominadas tabelas
pode visualizar e alterar os campos
virtuais
seleccionados
Assemelham-se a tabelas e
com algumas restries so
ViewTabela Temporria
tratadas como tal
Verso 1.4

Ana Paula Afonso/Ana Lucas/Paulo Batista/Wilson Lucas - 2007

SQL

Vantagens da Utilizao de Views


SEGURANA
Uma view permite restringir informao a certos grupos de
utilizadores
CONVENINCIA
muitas vezes possvel substituir uma consulta complexa
por uma view, que usada de uma forma mais simplista

Verso 1.4

Ana Paula Afonso/Ana Lucas/Paulo Batista/Wilson Lucas - 2007

SQL

Criao de Views

CREATE VIEW nome_view AS

CREATE VIEW emp AS

comando_select

SELECT cod_emp, nome_emp


FROM empregado

No comando select podem-se utilizar todas as clsulas excepto a clasula


Order By
Podem-se definir views custa de outras views
As alteraes na tabela original reflectem-se nas views dessa tabela

DROP
DROPVIEW
VIEWnome_view
nome_view
Verso 1.4

Ana Paula Afonso/Ana Lucas/Paulo Batista/Wilson Lucas - 2007

SQL

Criao e Eliminao de
Utilizadores
CREATE USER user [IDENTIFIED BY [PASSWORD] 'password']
[, user [IDENTIFIED BY [PASSWORD] 'password']] ...

DROP USER user [, user] ...

Verso 1.4

Ana Paula Afonso/Ana Lucas/Paulo Batista/Wilson Lucas - 2007

SQL

Privilgio
s
DE ESTRUTURA

o utilizador pode criar, alterar ou remover um


objecto (ex. tabela)
DE CONTEDO

o utilizador pode inserir, alterar, remover ou aceder


ao contedo de uma tabela
Estes privilgios so concedidos por utilizadores que possuem pelo
menos os privilgios que esto a conceder.

Verso 1.4

Ana Paula Afonso/Ana Lucas/Paulo Batista/Wilson Lucas - 2007

SQL

Privilgio
s
GRANT
comando para conceder privilgios;
pode ser dada ao concedido a possibilidade de tambm usar "grant's"
(WITH GRANT OPTION)
REVOKE
comando para remover privilgios
EXEMPLO: Conceder privilgios de acesso a informao:
grant SELECT
on EMPREGADO
to USER_A,USER_B
Verso 1.4

Ana Paula Afonso/Ana Lucas/Paulo Batista/Wilson Lucas - 2007

SQL

Privilgio
s
EXEMPLO: Conceder privilgios de estrutura:

grant CREATE
on testes
to USER_C, USER_D
EXEMPLO: Conceder todos os privilgios de estrutura excepto
GRANT OPTION
grant ALL
on testes
to USER_E, USER_F

Verso 1.4

Ana Paula Afonso/Ana Lucas/Paulo Batista/Wilson Lucas - 2007

SQL

Transaces
TRANSACO

Unidade de trabalho, que para ser realizada pode necessitar


de vrias operaes.
Uma transaco comea com BEGIN.
Exemplo: transferir 2000 da Conta Ordem para a Poupana - necessrio
debitar da conta ordem e creditar na Poupana

Todas as operaes da transaco devem ser:

EFECTIVADAS
utilizando o comando COMMIT

ANULADAS
utilizando o comando ROLLBACK

Verso 1.4

Ana Paula Afonso/Ana Lucas/Paulo Batista/Wilson Lucas - 2007