Sie sind auf Seite 1von 23

Introduo

Mestrado Prossional
Banco de Dados
SQL
Fernando Fonseca

SQL - Structured Query Language


Linguagem de Consulta Estruturada
Apesar do QUERY no nome, no apenas
de consulta, permitindo definio (DDL) e
manipulao (DML) de dados
Fundamentada no modelo relacional (lgebra
relacional)
Cada implementao de SQL pode possuir
algumas adaptaes para resolver certas
particularidades do SGBD alvo

CIn.ufpe.br

CIn.ufpe.br
2

Enfoques de SQL

SQL - Origem/Histrico
Primeira verso: SEQUEL, definida por
Chamberlain em 1974 na IBM
Em 1975 foi implementado o primeiro prottipo
Revisada e ampliada entre 1976 e 1977 e teve
seu nome alterado para SQL por razes jurdicas
Em 1982, o American National Standard Institute
tornou SQL padro oficial de linguagem em
ambiente relacional
Utilizada tanto de forma interativa como includa
em linguagens hospedeiras
CIn.ufpe.br
3

Usos de SQL

SQL - Vantagens
Independncia de fabricante
Portabilidade entre sistemas
Reduo de custos com treinamento
Comandos em ingls
Consulta interativa
Mltiplas vises de dados
Manipulao dinmica dos dados

DDL
Criar (CREATE)
Destruir (DROP)
Modificar (ALTER)

Implementao
Ambiente

SQL
Segurana
Controle
Administrao

Linguagem interativa de consulta (ad-hoc): usurios


podem definir consultas independente de programas
Linguagem de programao para acesso a banco de
dados: comandos SQL embutidos em programas de
aplicao
Linguagem de administrao de dados: o DBA pode
utilizar SQL para realizar suas tarefas
Linguagem cliente/servidor: os programas clientes usam
comandos SQL para se comunicarem e compartilharem
dados com o servidor
Linguagem para banco de dados distribudos: auxilia na
distribuio de dados por vrios ns e na comunicao
de dados com outros sistemas
Caminho de acesso a outros bancos de dados em
diferentes mquinas: auxilia na converso entre
CIn.ufpe.br
diferentes produtos em diferentes mquinas
4

DML
Consultar (SELECT)
Inserir (INSERT)
Remover (DELETE)
Atualizar (UPDATE)
CIn.ufpe.br
5

CIn.ufpe.br
6

Esquema Relacional dos Exemplos

SQL - Desvantagens

Empregado (Cad, Nome, Sexo, Salario, Num_Dep, Cad_Spv)


Num_Dep referencia Departamento (Numero),
Cad_Spv referencia Empregado(Cad)

A padronizao inibe a criatividade


Est longe de ser uma linguagem relacional ideal
Algumas crticas
falta de ortogonalidade nas expresses
discordncia com as linguagens hospedeiras
no d suporte a alguns aspectos do modelo
relacional

Departamento (Numero, Nome, Cad_Ger, Data_Ini)


Cad_Ger referencia Empregado(Cad)
Locais (Num_dep, Nome_Loc)
Num_Dep referencia Departamento (Numero)
Projeto (Numero, Nome, Num_Dep, Local)
Num_Dep referencia Departamento (Numero)
Trabalha_em (Cad_Emp, Num_Pro, Horas)
Cad_Emp referencia Empregado(Cad),
Num_Pro referencia Projeto (Numero)

CIn.ufpe.br

Dependente (Cad_emp, Nome, Data_nasc, Grau_P)


Cad_emp referencia Empregado(Cad)

CIn.ufpe.br

Criao de Tabelas

Comandos SQL (Padro ANSI)

Definio de nova tabela CREATE TABLE

CREATE TABLE <nome da tabela>


(<descrio dos atributos>
<descrio das chaves>
<descrio das restries);

Criao, alterao e destruio de tabelas


Insero, modificao e remoo de dados
Extrao de dados de uma tabela (Consultas)
Definio de vises
Definio de privilgios de acesso

Descrio dos atributos <nome> <tipo>


Tipos de dados (Oracle): varchar2, char,
nvarchar2, nchar, number, number(n),
number(m,n), binary_integer, binary_float,
binary_double, date, timestamp, blob, clob, nclob

CIn.ufpe.br

CIn.ufpe.br

Criao de Tabelas

10

Criao de Tabelas
Chave primria por auto-numerao (Cont.)
No Oracle
Define-se uma seqncia e esta ser
utilizada para gerar as chaves primrias

Descrio das Chaves


A chave primria deve ser declarada como

CONSTRAINT nometabela_pkey
PRIMARY KEY (<atributos>)
Chave primria definida por auto-numerao
Chave inteira cujo valor atribudo pelo
sistema, sendo incrementado de 1 a
cada insero de uma nova tupla

CIn.ufpe.br

CREATE SEQUENCE <nome_seq>


INCREMENT BY 1 START WITH 1;
O tipo do atributo que ser a chave
primria deve ser INTEGER
CIn.ufpe.br

11

Criao de Tabelas

Criao de Tabelas

Chave primria por auto-numerao


No Oracle (Cont.)
Ao inserir dados na tabela, deve-se
solicitar a criao do valor ao sistema no
atributo chave com o comando
<nome_seq>.NEXTVAL
Lista das chaves estrangeiras na forma

Descrio de Restries
Salrio no pode ser inferior ao mnimo

CONSTRAINT nometabela_check
CHECK (salario >= 788.00)
Cada valor do atributo nico na relao,

mesmo no sendo o atributo chave primria

CONSTRAINT nometabela_fkey
FOREIGN KEY (<atributo>)
REFERENCES <outra_tabela> (<chave primria>)

CONSTRAINT nometabela_const
UNIQUE (nome)

CIn.ufpe.br

CIn.ufpe.br
14

Criao de Tabelas

Criao de Tabelas
Exemplo 1 (Cont.)

Exemplo 1: A entidade Departamento,


considerando
Chave primria com auto numerao

CREATE TABLE Departamento


(Numero integer,
Nome varchar2(15),
Cad_Ger integer,
Data_Ini date,
CONSTRAINT Departamento_pkey
PRIMARY KEY (Numero));

Departamento (Numero, Nome, Cad_Ger, Data_Ini)


Cad_Ger referencia Empregado(Cad)

CREATE SEQUENCE Dep


INCREMENT BY 1 START WITH 1;

CIn.ufpe.br

A chave estrangeira de Empregado (Cad_Ger) s


pode ser criada depois que a relao Empregado
for criada. Para tanto, posteriormente, altera-se a
denio da relao Departamento.

15

CIn.ufpe.br
16

Criao de Tabelas

Criao de Tabelas

Exemplo 2 (Cont.)

Exemplo 2: A entidade Empregado, considerando


O atributo Sexo deve ter os valores 'M' ou 'F'
O atributo Salario deve respeitar o mnimo
nacional

CREATE TABLE Empregado


(Cad integer,
Nome varchar2 (20),
Sexo char,
Salario number (10,2),
Num_Dep integer,
Cad_Spv integer,
CONSTRAINT empregado_pkey PRIMARY KEY (Cad),
CONSTRAINT empregado_fkey1 FOREIGN KEY
(Num_Dep) REFERENCES Departamento (Numero),
CONSTRAINT empregado_fkey2 FOREIGN KEY
(Cad_Spv)
REFERENCES Empregado (Cad),
CONSTRAINT Empregado_checkSal CHECK (salario >= 788.00),
CONSTRAINT Empregado_checkSex CHECK (sexo = 'M' OR
sexo = 'F') );

Empregado (Cad, Nome, Sexo, Salario, Num_Dep, Cad_Supv)


Num_Dep referencia Departamento (Numero),
Cad_Supv referencia Empregado(Cad)

CIn.ufpe.br

CIn.ufpe.br

17

18

Criao de Tabelas

Criao de Tabelas

Exemplo 3 (Considerando que a relao Projeto j foi


criada)
Trabalha_em_ (Cad_Emp, Num_Pro, Horas)
Cad_Emp referencia Empregado(Cad),
Num_Pro referencia Projeto (Numero)

Criao de ndices em uma tabela existente


CREATE INDEX
So estruturas que permitem agilizar a busca e
ordenao de dados em tabelas

CREATE TABLE Trabalha_em


(Cad_emp integer,
Num_Proj integer,
Horas number (3,1) ,
CONSTRAINT trabalha _em_pkey
PRIMARY KEY (Cad_emp, Num_proj),
CONSTRAINT trabalha _em_fkey1
FOREIGN KEY (Cad_Emp) REFERENCES Empregado
(Cad),
CONSTRAINT trabalha _em_fkey2
FOREIGN KEY (Num_Proj )REFERENCES Projeto
CIn.ufpe.br
(Numero));

CREATE [UNIQUE] INDEX <nome> ON


<tabela> (<atributo1>[, <atributo2>]);

Exemplo 3: Criar um ndice sobre o atributo


salario de Empregado

CREATE INDEX indice_sal ON


Empregado (salario);
usado automaScamente pelo sistema
nas consultas realizadas por salario

CIn.ufpe.br

19

Alterao de Tabelas

Alterao de Tabelas
Alterar definies de tabelas existentes ALTER
TABLE
Permite inserir/eliminar/modificar elementos da
definio de uma tabela

Exemplo 4: Acrescentar o atributo Diploma na


tabela Empregado

ALTER TABLE EMPREGADO


ADD (Diploma varchar2(20));

ALTER TABLE <ao>;

Exemplo 5: Remover o atributo Diploma da tabela


Empregado

Anloga ao Create /
Drop

ALTER TABLE EMPREGADO DROP (Diploma);


CIn.ufpe.br

CIn.ufpe.br

21

22

Remoo de Tabelas

Alterao de Tabelas

Exemplos 6: Acrescentar chave estrangeira de


Empregado como gerente na tabela
Departamento

Eliminar uma tabela que foi previamente criada


DROP TABLE

DROP TABLE <tabela>;


Exemplo 7: Remover a tabela Trabalha_em

ALTER TABLE DEPARTAMENTO


ADD ( CONSTRAINT Departamento_fkey
FOREIGN KEY (Cad_Ger) REFERENCES Empregado
(Cad));

DROP TABLE Trabalha_em;

Necessrio para a segunda relao,


sempre que duas relaes tm chave
estrangeira uma da outra.
CIn.ufpe.br
23

Observaes
Os dados so tambm excludos
No caso do Oracle,
para preservar as
definies da relao (s os dados so
eliminados) utilizar em vez de DROP

TRUNCATE TABLE Trabalha_em;

CIn.ufpe.br
24

Extrao de Dados de uma Tabela


(Consulta)
Empregado

Extrao de Dados de uma Tabela


(Consulta)
Consultar dados em uma tabela SELECT
Selecionando atributos (Projeo)

Cad

Nome

Sexo

Salario

Num_Dep

Cad_Spv

Jos

5000.00

Maria

8000.00

NULL

Joo

3000.00

SELECT <lista de atributos> FROM <tabela>;


SELECT Nome, Salario FROM Empregado;
Exemplo 8: Listar nome e salrio de todos os

empregados
CIn.ufpe.br

Nome

Salario

Jos

5000.00

Maria

8000.00

Joo

3000.00

CIn.ufpe.br

25

26

Extrao de Dados de uma Tabela


(Consulta)

Extrao de Dados de uma Tabela


(Consulta)
Selecionando todos os atributos

SELECT * FROM Empregado;

SELECT * FROM <tabela>;


Exemplo 9: Selecionar todos os atributos dos
empregados
Empregado
Cad

Nome

Sexo

Salario

Num_Dep

Cad_Spv

Jos

5000.00

Maria

8000.00

NULL

Joo

3000.00

Cad

Nome

Sexo

Salario

Num_Dep

Cad_Spv

Jos

5000.00

Maria

8000.00

NULL

Joo

3000.00

Observao
Deve ser usado com cautela pois pode
comprometer o desempenho do sistema
CIn.ufpe.br

CIn.ufpe.br

27

28

Extrao de Dados de uma Tabela


(Consulta)

Extrao de Dados de uma Tabela


(Consulta)

Selecionando tuplas da tabela clusula


WHERE

Exemplo 10: Listar todos os dados dos


empregados do departamento 1
Empregado

SELECT <lista de atributos> FROM <tabela>


WHERE <condio>;
Onde <condio>

<nome atributo> <operador> <valor>

Cad

Nome

Sexo

Salario

Num_Dep

Cad_Spv

Jos

5000.00

Maria

8000.00

NULL

Joo

3000.00

SELECT * FROM Empregado WHERE Num_Dep = 1;

Uma constante,
varivel ou
consulta aninhada

CIn.ufpe.br
29

Cad

Nome

Sexo

Salario

Num_Dep

Cad_Spv

Jos

5000.00

Joo

3000.00

CIn.ufpe.br
30

Extrao de Dados de uma Tabela


(Consulta)

Extrao de Dados de uma Tabela


(Consulta)

Exemplo 11: Listar nome e sexo dos empregados


do departamento 11 com salrio > R$ 4.000,00

Consulta para o usurio fornecer valores para o


SELECT s na hora da execuo
Colocar parmetro na forma &<varivel>

Empregado
Cad

Nome

Sexo

Salario

Num_Dep

Cad_Spv

Jos

5000.00

Maria

8000.00

NULL

Joo

3000.00

SELECT <lista de atributos> FROM <tabela>


WHERE <atributo> = &<varivel>;

SELECT Nome, Sexo FROM Empregado


WHERE Num_Dep = 1 AND Salario > 4000.00;
Nome

Sexo

Jos

CIn.ufpe.br

CIn.ufpe.br

31

32

Extrao de Dados de uma Tabela


(Consulta)

Extrao de Dados de uma Tabela


(Consulta)

Exemplo 12: Listar nome e salrio dos


empregados do departamento com um dado
cdigo

Para utilizar, aps digitar o comando acima, o


sistema apresenta a mensagem

Empregado
Cad

Nome

Sexo

Salario

Num_Dep

Cad_Spv

Jos

5000.00

Maria

8000.00

NULL

Joo

3000.00

Informe o valor para cod_dep:

Caso o usurio digitasse 1

SELECT Nome, Salario FROM Empregado


WHERE Num_Dep = &cod_dep;

Nome

Salario

Jos

5000.00

Joo

3000.00

CIn.ufpe.br

CIn.ufpe.br

33

34

Operadores SQL

Empregado

BETWEEN e NOT BETWEEN: substituem o uso


dos operadores <= e >=

... WHERE <nome atributo> BETWEEN


<valor1> AND <valor2>;

Operadores SQL

Cad

Nome

Sexo

Salario

Num_Dep

Cad_Spv

Jos

5000.00

Maria

8000.00

NULL

Joo

3000.00

SELECT Nome FROM Empregado


WHERE Salario BETWEEN 4000 AND 10000;

Exemplo 13: Listar os nomes dos empregados

com salrio entre R$ 4.000,00 e R$ 10.000,00

Nome
Jos
CIn.ufpe.br
35

Maria

CIn.ufpe.br
36

Operadores SQL

Operadores SQL

LIKE e NOT LIKE (Cont.)

LIKE e NOT LIKE: s se aplicam sobre atributos do


tipo char
Operam como = e < >, respectivamente
O uso do smbolo % permite que a posio na
cadeia de caracteres seja substituda por
qualquer cadeia de caracteres
O uso do smbolo _ permite que a posio na
cadeia de caracteres seja substituda por
qualquer caractere

...WHERE <nome atributo> LIKE <valor1>;

Exemplo 14: Listar os nomes dos empregados


que iniciam com Jo

Empregado
Cad

Nome

Sexo

Salario

Num_Dep

Cad_Spv

Jos

5000.00

Maria

8000.00

NULL

Joo

3000.00

CIn.ufpe.br

CIn.ufpe.br

37

38

Operadores SQL

Operadores SQL

SELECT Nome FROM Empregado


WHERE Nome LIKE 'Jo%';

IN e NOT IN: procuram dados que esto ou no


contidos em um dado conjunto de valores

... WHERE <nome atributo> IN <valores>;


Nome

Exemplo 15: Listar o nome e data de nascimento

Jos

dos dependentes com grau de parentesco 'M' ou


'P'
Considerando criada a tabela Dependente

Joo

Dependente

CIn.ufpe.br

CIn.ufpe.br

39

40

Operadores SQL

Operadores SQL

Cad_emp

Nome

Data_nasc

Grau_P

Bruno

01/02/2000

Gina

05/10/2002

Telma

04/03/2010

IS NULL e IS NOT NULL: identificam se o atributo


tem valor nulo (no informado) ou no

... WHERE <nome atributo> IS NULL;


Exemplo 16: Listar nmero e nome dos projetos

que no tenham local definido


Projeto

SELECT Nome, Data_Nasc FROM Dependente


WHERE Grau_P IN ('M', 'P');
Nome

Data_nasc

Bruno

01/02/2000

Gina

05/10/2002

Numero

Nome

Num_Dep

Local

Desenvolvimento

Recife

Anlise

Olinda

Testes

NULL

CIn.ufpe.br

CIn.ufpe.br

41

42

Operadores SQL

Ordenando os Dados Selecionados


Clusula ORDER BY

SELECT Numero, Nome FROM Projeto


WHERE Local IS NULL;

Numero

Nome

Testes

SELECT <lista atributos> FROM <tabela>


[WHERE <condio>]
ORDER BY <Nome atributo> {ASC | DESC};

Crescente (default)

CIn.ufpe.br

CIn.ufpe.br

43

44

Ordenando os Dados Selecionados

Ordenando os Dados Selecionados


Exemplo 17: Listar todos os dados dos
empregados ordenados ascendentemente por
nome

SELECT * FROM Empregado ORDER BY Nome;

Empregado
Cad

Nome

Sexo

Salario

Num_Dep

Cad_Spv

Jos

5000.00

Maria

8000.00

NULL

Joo

3000.00

Cad

Nome

Sexo

Salario

Num_Dep

Cad_Spv

Joo

3000.00

Jos

5000.00

Maria

8000.00

NULL

CIn.ufpe.br

CIn.ufpe.br

45

46

Ordenando os Dados Selecionados

Ordenando os Dados Selecionados

Exemplo 18: Listar todos os dados dos

empregados ordenados descendentemente por


salrio

SELECT * FROM Empregado ORDER BY


Salario DESC;

Empregado
Cad

Nome

Sexo

Salario

Num_Dep

Cad_Spv

Jos

5000.00

Maria

8000.00

NULL

Joo

3000.00

Cad

Nome

Sexo

Salario

Num_Dep

Cad_Spv

Maria

8000.00

NULL

Jos

5000.00

Joo

3000.00

CIn.ufpe.br

CIn.ufpe.br

47

48

Realizando Clculo com


Informao Selecionada

Realizando Clculo com


Informao Selecionada

Pode-se criar um campo para a resposta da consulta,


que no pertena tabela, a partir de clculos sobre
atributos da tabela
Uso de operadores aritmticos

Exemplo 19: Mostrar nome e o novo salrio dos


empregados, calculado com base no reajuste de
60% para os que ganham abaixo de R$ 4.000,00
Empregado
Cad

Nome

Sexo

Salario

Num_Dep

Cad_Spv

Jos

5000.00

Maria

8000.00

NULL

Joo

3000.00

CIn.ufpe.br

CIn.ufpe.br

49

50

Realizando Clculo com


Informao Selecionada

Funes Agregadas
Utilizao de funes sobre conjuntos
Disparadas a partir do SELECT

Renomear atributo
para sada do dado
SELECT Nome, (Salario * 1.60) AS Novo_salario
FROM Empregado WHERE Salario < 4000.00;

Nome

Novo_Salario

Joo

4800.00
CIn.ufpe.br

CIn.ufpe.br

51

52

Funes Agregadas

Funes Agregadas

Exemplo 20: Mostrar o valor do maior salrio dos


empregados e o nome do empregado que o
recebe

A soluo buscar o nome e o salrio do


empregado que tem o maior salrio

Consulta aninhada

Empregado
Cad

Nome

Sexo

Salario

Num_Dep

Cad_Spv

Jos

5000.00

Maria

8000.00

NULL

Joo

3000.00

SELECT Nome, Salario FROM Empregado


WHERE Salario IN ( SELECT MAX (Salario)
FROM EMPREGADO );
Nome

Salario

Maria

8000.00

CIn.ufpe.br

CIn.ufpe.br

53

54

Funes Agregadas

Funes Agregadas

Exemplo 22: Quantos empregados ganham mais


de R$4.000,00?

Exemplo 21: Mostrar qual o salrio mdio dos


empregados
Empregado

Empregado

Cad

Nome

Sexo

Salario

Num_Dep

Cad_Spv

Cad

Nome

Sexo

Salario

Num_Dep

Cad_Spv

Jos

5000.00

Jos

5000.00

Maria

8000.00

NULL

Maria

8000.00

NULL

Joo

3000.00

Joo

3000.00

SELECT COUNT (*) FROM Empregado


WHERE Salario > 4000.00;

SELECT AVG (Salario) FROM Empregado;


AVG(Salario)

Count(*)

5333.33

CIn.ufpe.br
55

Clusula DISTINCT

CIn.ufpe.br
56

Clusula DISTINCT

Elimina tuplas duplicadas do resultado de uma


consulta
Exemplo 23: Quais os diferentes cdigos
dos supervisores dos empregados?

SELECT DISTINCT Cad_spv


FROM Empregado;

Empregado
Cad

Nome

Sexo

Salario

Num_Dep

Cad_Spv

Jos

5000.00

Cad_Spv

Maria

800.00

NULL

Joo

3000.00

CIn.ufpe.br

CIn.ufpe.br

57

58

Clusula GROUP BY

Clusula GROUP BY
Organiza a seleo de dados em grupos
Exemplo 24: Listar os quantitativos de
empregados de cada sexo

Exceo: Funes agregadas


Todos os atributos do GROUP BY
devem aparecer no SELECT

Empregado
Cad

Nome

Sexo

Salario

Num_Dep

Cad_Spv

Jos

5000.00

Maria

8000.00

NULL

Joo

3000.00

SELECT Sexo, Count(*) FROM Empregado


GROUP BY Sexo;
Sexo

Count(*)

CIn.ufpe.br

CIn.ufpe.br

59

60

10

Clusula HAVING

Clusula HAVING
Empregado

Agrupando Informaes de forma condicional


Vem depois do GROUP BY e antes do ORDER
BY
Exemplo 25: Listar o nmero total de
empregados que recebem salrios superiores a
R$1.000,00 em cada departamento com mais
de 1 empregado

Cad

Nome

Sexo

Salario

Num_Dep

Cad_Spv

Jos

5000.00

Maria

8000.00

NULL

Joo

3000.00

SELECT Num_Dep, COUNT (*) FROM Empregado


WHERE Salario > 1000 GROUP BY Num_Dep
HAVING COUNT(*) > 1;

CIn.ufpe.br

Num_Dep

Count(*)

CIn.ufpe.br

61

62

Consultando Dados de Vrias Tabelas


- Juno

Uso de Alias
Para substituir nomes de tabelas em comandos
SQL
So definidos na clusula FROM

Juno de Tabelas (JOIN)


Citar as tabelas envolvidas na clusula FROM
Qualificadores de nomes - utilizados para evitar
ambigidades
Referenciar os nomes de Empregado e de
Departamento

SELECT A.nome FROM Departamento A


WHERE A.Numero = 15;

Empregado.Nome
Departamento.Nome

Alias

Melhor ainda usar alias


CIn.ufpe.br

CIn.ufpe.br

63

64

Juno de Tabelas

Juno de Tabelas

Exemplo 26: Listar o nome de cada empregado e


o nome do departamento no qual est alocado

SELECT E.Nome, D.Nome


FROM Empregado E, Departamento D
WHERE E.Num_Dep = D.Numero;

Empregado
Cad

Nome

Sexo

Salario

Num_Dep

Cad_Spv

Jos

5000.00

Maria

8000.00

NULL

Joo

3000.00

Departamento
Numero

Nome

Cad_Ger

Data_Ini

E.NOME

D.NOME

RH

12/03/2010

Jos

RH

Contabilidade

15/01/2009

Joo

RH

Maria

Contabilidade

CIn.ufpe.br

CIn.ufpe.br

65

66

11

Juno de Tabelas

Juno de Tabelas
Exemplo 27: Listar os nomes dos departamentos
que tm projetos

SELECT D.Nome
FROM Departamento D, Projeto P
WHERE P.Num_Dep = D.Numero;

Departamento
Numero

Nome

Cad_Ger

Data_Ini

RH

12/03/2010

Contabilidade

15/01/2009

Projeto
Numero

Nome

Num_Dep

Local

Desenvolvimento

Recife

Anlise

Olinda

Testes

NULL

Nome
RH

CIn.ufpe.br

CIn.ufpe.br

67

68

Juno de Tabelas

Juno de Tabelas

Departamento

Pode-se utilizar as clusulas (NOT) LIKE, (NOT) IN,


IS (NOT) NULL misturadas aos operadores AND,
OR e NOT nas equaes de juno ( clusula
WHERE )
Exemplo 28: Listar os nomes dos departamentos
que tm projetos com nmero (identificao)
inferior a 3 e esto localizados em Olinda ou
Recife, ordenados por nome de departamento

Numero

Nome

Cad_Ger

Data_Ini

RH

12/03/2010

Contabilidade

15/01/2009

Projeto
Numero

Nome

Num_Dep

Local

Desenvolvimento

Recife

Anlise

Olinda

Testes

NULL

CIn.ufpe.br

CIn.ufpe.br

69

70

Juno de Tabelas

Juno de Tabelas

SELECT D.Nome
FROM Departamento D, Projeto P
WHERE P.Local IN ('Olinda', 'Recife')
AND P.Numero < 3
AND P.Num_Dep = D.Numero
ORDER BY D.Nome;

Classificando uma Juno


Exemplo 29: Para cada departamento, liste o
nome do departamento, e para cada um deles,
listar o nmero, o nome e o salrio de seus
empregados, ordenando a resposta em ordem
decrescente de salrio e em ordem alfabtica

Nome
RH
CIn.ufpe.br

CIn.ufpe.br

71

72

12

Juno de Tabelas

Juno de Tabelas
Departamento
Numero

Nome

Cad_Ger

Data_Ini

RH

12/03/2010

Contabilidade

15/01/2009

SELECT D.Nome, E.Cad, E.Nome, E.Salario


FROM Departamento D, Empregado E
WHERE D.Numero = E.Num_Dep
ORDER BY E.Salario DESC, D.Nome;

Empregado
Cad

Nome

Sexo

Salario

Num_Dep

Cad_Spv

Jos

5000.00

Maria

8000.00

NULL

Joo

3000.00

D.NOME

E.SALARIO

RH

1 Jos

5000.00

RH

3 Joo

3000.00

Contabilidade

2 Maria

8000.00
CIn.ufpe.br

73

74

Juno de Tabelas

Empregado

Agrupando considerando mais de um atributo em


uma Juno
Exemplo 30: Encontre o total de projetos de
cada empregado por departamento,
informando o cdigo do departamento e o
cadastro desse empregado

Cad

Nome

Sexo

Salario

Num_Dep

Cad_Spv

Jos

5000.00

Maria

8000.00

NULL

Joo

3000.00

Trabalha_em
Cad_Emp

Num_Proj

Horas

20

24

44

15

15

14

CIn.ufpe.br

CIn.ufpe.br

75

76

Juno de Tabelas

Juno de Tabelas

SELECT E.Num_Dep, E.Cad, COUNT(*) AS Total


FROM Trabalha_em T, Empregado E
WHERE E.Cad = T.Cad_Emp
GROUP BY E.Num_Dep, E.Cad
ORDER BY E.Num_Dep, E.Cad;
E.CAD

E.NOME

CIn.ufpe.br

Juno de Tabelas

E.NUM_DEP

E.CAD

Juntando mais de duas tabelas


Exemplo 31: Listar o nome dos empregados
juntamente com o nome do departamento no
qual esto alocados e que trabalhem mais de
20 horas em algum projeto

TOTAL

1
CIn.ufpe.br

CIn.ufpe.br

77

78

13

Juno de Tabelas

Juno de Tabelas

Empregado
Cad

Nome

Sexo

Salario

Num_Dep

Cad_Spv

Jos

5000.00

Maria

8000.00

NULL

Joo

3000.00

SELECT E.Nome, D.Nome


FROM Empregado E, Departamento D,
Trabalha_em T
WHERE T.Horas > 20
AND T.Cad_Emp = E.Cad
AND E.Num_Dep = D.Numero;

Trabalha_em
Cad_Emp

Num_Proj

Horas

20

24

Departamento

44

Numero

Nome

Cad_Ger

Data_Ini

15

RH

12/03/2010

15

Contabilidade

15/01/2009

14

E.NOME

D.NOME

Jos

RH

Maria

Contabilidade

CIn.ufpe.br

CIn.ufpe.br

79

80

Juno de Tabelas

Juno de Tabelas
Outer join
Retorna todas as tuplas de uma tabela
e
somente as tuplas de uma tabela secundria
onde os campos de juno so iguais
( condio de juno encontrada)
Para todas as tuplas de uma das tabelas que
no tenham tuplas correspondentes na outra,
pela condio de juno, retornado null para
todos os campos da lista do select que sejam
colunas da outra tabela

Inner join (s vezes chamada de "juno simples")


uma juno de duas ou mais tabelas que
retorna somente as tuplas que satisfazem
condio de juno
Equivalente juno natural

CIn.ufpe.br

CIn.ufpe.br

81

82

Juno de Tabelas

Juno de Tabelas

Outer join (Cont.)


Para escrever uma consulta que executa um
outer join das tabelas A e B e retorna todas as
tuplas de A alm das tuplas comuns, utilizar

Outer join (Cont.)


Exemplo 32: Listar os nomes de todos os
departamentos da companhia e os nomes e
locais dos projetos de que so responsveis

SELECT <atributos>
FROM <tabela A> LEFT [OUTER] JOIN <tabela B>
ON <condio de juno>;
CIn.ufpe.br

CIn.ufpe.br

83

84

14

Juno de Tabelas

Juno de Tabelas
Departamento
Numero

Nome

Cad_Ger

Data_Ini

RH

12/03/2010

Contabilidade

15/01/2009

SELECT D.Nome, P.Nome, P.Local


FROM Departamento D LEFT OUTER JOIN
Projeto P
ON D.Numero = P.Num_Dep;

Projeto
Numero

Nome

Num_Dep

Local

Desenvolvimento

Recife

Anlise

Olinda

Testes

NULL

D.NOME

P.NOME

P.LOCAL

RH

Desenvolvimento

Recife

RH

Anlise

Olinda

RH

Testes

Contabilidade

CIn.ufpe.br

CIn.ufpe.br

85

86

Juno de Tabelas

Juno de Tabelas
Outer join (Cont.)

Outer join (Cont.)

Exemplo 33: Listar os nomes dos


departamentos da companhia com os nomes
e locais dos projetos de que so responsveis
e os nomes dos demais projetos

Para escrever uma consulta que executa uma


outer join das tabelas A e B e retorna todas as
tuplas de B alm das tuplas comuns, utilizar

SELECT <atributos>
FROM <tabela A> RIGHT [OUTER] JOIN <tabela B>
ON <condio de juno>;

CIn.ufpe.br

CIn.ufpe.br

87

88

Juno de Tabelas

Juno de Tabelas
Departamento
Numero

Nome

Cad_Ger

Data_Ini

RH

12/03/2010

Contabilidade

15/01/2009

SELECT D.Nome, P.Nome, P.Local


FROM Departamento D RIGHT OUTER JOIN
Projeto P
ON D.Numero = P.Num_Dep;

Projeto
Numero

Nome

Num_Dep

Local

Desenvolvimento

Recife

Anlise

Olinda

Testes

NULL

CIn.ufpe.br
89

D.NOME

P.NOME

P.LOCAL

RH

Desenvolvimento

Recife

RH

Anlise

Olinda

RH

Testes

CIn.ufpe.br
90

15

Juno de Tabelas

Juno de Tabelas
Outer join (Cont.)

Outer join (Cont.)

Exemplo 34: Listar os nomes de todos os


departamentos da companhia, os nomes e
locais dos projetos de que sejam responsveis
e os nomes dos demais projetos

Para escrever uma consulta que executa uma


outer join e retorna todas as tuplas de A e B,
estendidas com nulls se elas no satisfizerem
condio de juno, utilizar

SELECT <atributos>
FROM <tabela A> FULL [OUTER] JOIN <tabela B>
ON <condio de juno>;
CIn.ufpe.br

CIn.ufpe.br

91

92

Juno de Tabelas

Juno de Tabelas

Departamento
Numero

Nome

Cad_Ger

Data_Ini

RH

12/03/2010

Contabilidade

15/01/2009

SELECT D.Nome, P.Nome, P.Local


FROM Departamento D FULL OUTER JOIN
Projeto P
ON D.Numero = P.Num_Dep;

Projeto
Numero

Nome

Num_Dep

Local

Desenvolvimento

Recife

Anlise

Olinda

Testes

NULL

D.NOME

P.NOME

P.LOCAL

RH

Desenvolvimento

Recife

RH

Anlise

Olinda

RH

Testes

Contabilidade
CIn.ufpe.br

CIn.ufpe.br

93

94

Consultas Encadeadas (Aninhadas)

Consultas Encadeadas (Aninhadas)

O resultado de uma consulta utilizado por outra


consulta, de forma encadeada e no mesmo
comando SQL
O resultado do comando SELECT mais interno
(subselect) usado por outro SELECT mais externo
para obter o resultado final
O SELECT mais interno (subconsulta ou consulta
aninhada) pode ser usado apenas nas clusulas
WHERE e HAVING do comando mais externo ou
em clculos

Subconsultas devem ser escritas entre ( e )


Existem 3 tipos de subconsultas
ESCALAR Retornam um nico valor
NICA LINHA Retornam vrias colunas, mas
apenas uma nica linha obtida
TABELA Retornam uma ou mais colunas e
mltiplas linhas

CIn.ufpe.br

CIn.ufpe.br

95

96

16

Consultas Encadeadas (Aninhadas)

Consultas Encadeadas (Aninhadas)

Empregado

Usando uma subconsulta com operador de


igualdade
Exemplo 35: Listar cadastro, nome e salario
dos empregados que trabalham no
departamento de Contabilidade

2 Maria

Sexo

Salario

Num_Dep

Cad_Spv

Jos

5000.00

Maria

8000.00

NULL

Joo

3000.00

Numero

Nome

Cad_Ger

Data_Ini

RH

12/03/2010

Contabilidade

15/01/2009

CIn.ufpe.br

CIn.ufpe.br

97

98

Consultas Encadeadas (Aninhadas)


Usando uma subconsulta com funo agregada
Exemplo 36: Listar os empregados cujos
salrios so maiores do que o salrio mdio da
empresa, mostrando a diferena para o salrio
mdio

SELECT Cad, Nome, Salario


FROM Empregado
Subconsulta escalar
WHERE Num_Dep =
(SELECT Numero
FROM Departamento
WHERE Nome = 'Contabilidade' );
E.NOME

Nome

Departamento

Consultas Encadeadas (Aninhadas)

E.CAD

Cad

Empregado

E.SALARIO

Cad

Nome

Sexo

Salario

Num_Dep

Cad_Spv

Jos

5000.00

Maria

8000.00

NULL

Joo

3000.00

8000.00
CIn.ufpe.br

CIn.ufpe.br

99

100

Consultas Encadeadas (Aninhadas)

Consultas Encadeadas (Aninhadas)


Mais de um nvel de aninhamento
Exemplo 37: Listar os dados pessoais dos
dependentes dos funcionrios que trabalham
no departamento RH

SELECT Cad, Nome, Salario


(SELECT AVG (Salario) FROM Empregado)
AS DifSal
FROM Empregado
WHERE Salario > ( SELECT AVG ( Salario)
FROM Empregado );

Dependente
Cad_Emp

Nome

Data_Nasc

Grau_P

Jonas

12/05/2000

Pai

Beatriz 05/06/2002

Pai

Clara

Pai

13/02/2001

Departamento
Numero Nome

Cad_Ger

Data_Ini

RH

12/03/2010

Contabilidade

15/01/2009

Empregado
E.CAD

E.NOME
2 Maria

DifSal

2666.67

Cad

Nome

Sexo

Salario

Num_Dep

Cad_Spv

Jos

5000.00

Maria

8000.00

NULL

Joo

3000.00

CIn.ufpe.br

CIn.ufpe.br

101

102

17

Consultas Encadeadas (Aninhadas)


SELECT Nome, Data_nasc, Grau_P
FROM Dependente WHERE Cad IN
( SELECT Cad FROM Empregado
WHERE Num_Dep =
( SELECT Numero
FROM Departamento
WHERE Nome = ' RH' ) );
Nome

Data_Nasc

Grau_P

Jonas

12/05/2000

Pai

Beatriz

05/06/2002

Pai

Clara

13/02/2001

Pai

Clusulas ANY/SOME
So usadas com subconsultas que produzem
uma nica coluna de nmeros
Exemplo 38: Listar os empregados cujos
salrios so maiores do que o salrio de pelo
menos um funcionrio do departamento 1
Empregado
Cad

Nome

Sexo

Salario

Num_Dep

Cad_Spv

Jos

5000.00

Maria

8000.00

NULL

Joo

3000.00

CIn.ufpe.br

CIn.ufpe.br

103

104

Clusulas ANY/SOME

Clusula ALL

SELECT Cad, Nome, Sexo, Salario


FROM Empregado
WHERE Salario >
SOME ( SELECT Salario FROM Empregado
WHERE Num_Dep = 1) ;

utilizado com subconsultas que produzem uma


nica coluna de nmeros
Exemplo 39: Listar cad, nome, sexo e salrio
dos empregados cujos salrios so maiores do
que o salrio de cada funcionrio do
departamento 1
Empregado
Cad

Nome

Sexo

Salario

Num_Dep

Cad_Spv

CAD

NOME

SEXO

SALARIO

Jos

5000.00

Maria

8000.00

NULL

Jos

5000.00

Joo

3000.00

Maria

8000.00
CIn.ufpe.br

CIn.ufpe.br

105

106

Clusula ALL

Clusulas EXISTS e NOT EXISTS

SELECT Cad, Nome, Sexo, Salario


FROM Empregado
WHERE Salario < ALL ( SELECT Salario
FROM Empregado
WHERE Num_Dep = 1) ;

CAD

NOME

SEXO

SALARIO

Maria

8000.00

Foram projetadas para uso apenas com


subconsultas
EXISTS
Retorna TRUE existe pelo menos uma linha
produzida pela subconsulta
Retorna FALSE a subconsulta produz uma
tabela resultante vazia

CIn.ufpe.br

CIn.ufpe.br

107

108

18

Clusulas EXISTS e NOT EXISTS

Clusulas EXISTS e NOT EXISTS

SELECT Cad, Nome, Sexo, Salario


FROM Empregado E WHERE EXISTS
( SELECT D.Numero FROM Departamento D
WHERE E.Num_Dep = D.Numero AND
D.Nome = 'RH') ;

Exemplo 40: Liste todos os empregados


que trabalham no departamento de RH
Empregado
Cad

Nome

Sexo

Salario

Num_Dep

Cad_Spv

Jos

5000.00

Maria

8000.00

NULL

Joo

3000.00

Departamento
Numero

Nome

Cad_Ger

Data_Ini

RH

12/03/2010

Contabilidade

15/01/2009

CAD

NOME

SEXO

SALARIO

Jos

5000.00

Joo

3000.00

CIn.ufpe.br

CIn.ufpe.br

109

110

Regras Genricas de Subconsultas

Regras Genricas de Subconsultas

A clusula ORDER BY no pode ser usada em


uma subconsulta
A lista de atributos especificados no SELECT de
uma subconsulta deve conter um nico
elemento (exceto para EXISTS)
Nomes de atributos especificados na
subconsulta esto associados s tabelas
listadas na clusula FROM da mesma
possvel referir-se a uma tabela da clusula
FROM da consulta mais externa utilizando
qualificadores de atributos

Quando a subconsulta um dos operandos


envolvidos em uma comparao, ela deve
aparecer no lado direito da comparao

CIn.ufpe.br

CIn.ufpe.br

111

112

Operaes de Conjunto

Operaes de Conjunto

Projeto

UNION
Linhas duplicadas so removidas da tabela
resultante
Exemplo 41: Construa uma lista de todos os
locais onde existe um departamento ou um
projeto

Numero

Nome

Num_Dep

Local

Desenvolvimento

Recife

Anlise

Olinda

Testes

NULL

Locais
Num_Dep

Nome_Loc

Camaragibe

Jaboato

Olinda

CIn.ufpe.br

CIn.ufpe.br

113

114

19

Operaes de Conjunto

Operaes de Conjunto
INTERSECT
Exemplo 42: Construa uma lista de todos os
locais onde existem ambos um departamento e
um projeto

( SELECT Local FROM Projeto


WHERE Local IS NOT NULL )
UNION
( SELECT Local FROM Locais ) ;

Projeto

Local
Recife
Olinda
Camaragibe

Numero

Nome

Num_Dep

Local

Desenvolvimento

Recife

Anlise

Olinda

Testes

NULL

Locais

Jaboato

CIn.ufpe.br

Num_Dep

Nome_Loc

Camaragibe

Jaboato

Olinda

CIn.ufpe.br

115

116

Operaes de Conjunto

Operaes de Conjunto

MINUS
Exemplo 43: Construa uma lista de todos os
locais onde existe um departamento mas
nenhum projeto

( SELECT Local FROM Projeto )


INTERSECT
( SELECT Local FROM Locais ) ;

Locais
Local
Olinda

Num_Dep

Nome_Loc

Camaragibe

Jaboato

Olinda

Projeto

CIn.ufpe.br

Numero

Nome

Num_Dep

Local

Desenvolvimento

Recife

Anlise

Olinda

Testes

NULL

CIn.ufpe.br

117

Operaes de Conjunto

118

Insero de Dados em Tabelas


Adicionar uma ou vrias tuplas tabela
INSERT

( SELECT Nome_Loc FROM Locais )


MINUS
( SELECT Local FROM Projeto );

INSERT INTO <tabela> (<lista de atributos>)


VALUES (<valores>);
Uma Linha
Caso sejam fornecidos valores para todos os
atributos, na ordem em que foram definidos,
no necessrio fornecer (<lista de

Nome_Loc
Camaragibe
Jaboato

atributos>)

INSERT INTO <tabela> VALUES (<valores>);


CIn.ufpe.br

CIn.ufpe.br

119

120

20

Insero de Dados em Tabelas

Insero de Dados em Tabelas

Exemplo 44: Inserir dados de um novo empregado

INSERT INTO Empregado(Cad, Nome, Sexo,


Salario, Num_Dep, Cad_Supv)
VALUES (4, 'Clara', 'F', 7000.00, 1, 2);

Empregado
Cad

Nome

Sexo

Salario

Num_Dep

Cad_Spv

Jos

5000.00

Maria

8000.00

NULL

Joo

3000.00

Empregado
Cad

Nome

Sexo

Salario

Num_Dep

Cad_Spv

Jos

5000.00

Maria

8000.00

NULL

Joo

3000.00

Clara

7000.00

CIn.ufpe.br

CIn.ufpe.br

121

122

Insero de Dados em Tabelas

Insero de Dados em Tabelas

Inserir dados recuperados de uma tabela em


outra tabela uso do SELECT

Empregado

INSERT INTO <tabela> (<lista de atributos>)


SELECT <lista de atributos> FROM <tabela>
WHERE <condio>;
Vrias Linhas
As duas <lista de atributos> devem ser unio compakveis

Exemplo 45: Armazenar na tabela Depto_Info


(Nome_Depto, Num_Emp, Total_Sal) para cada
departamento com mais de 1 empregado, o nome
do departamento, o nmero de empregados e a
soma dos salrios pagos
CIn.ufpe.br

Cad

Nome

Sexo

Salario

Num_Dep

Cad_Spv

Jos

5000.00

Maria

8000.00

NULL

Joo

3000.00

Clara

7000.00

Departamento

Depto_Info
Nome_Depto

...

Numero

Nome

Cad_Ger

Data_Ini

...

...

RH

12/03/2010

...

....

Contabilidade

15/01/2009

CIn.ufpe.br

123

Insero de Dados em Tabelas

124

Atualizao de Dados em Tabelas


Com base em critrios especificados, alterar
valores de campos de uma tabela UPDATE

INSERT INTO Depto_info (nome_depto,


num_emp, total_sal)
SELECT D.nome, COUNT(*), SUM (E.salario)
FROM Departamento D, Empregado E
WHERE D.numero = E.Num_Dep
GROUP BY D.nome HAVING COUNT (*) > 1;

UPDATE <nome tabela>


SET <nome atributo> = <valor>
WHERE <condio>;
Exemplo 46: Atualizar salrio do empregado 2

para R$9500,00
Depto_Info
Nome_Depto
RH

Num_Emp

Total_Sal
3

15000.00
CIn.ufpe.br

CIn.ufpe.br

125

126

21

Atualizao de Dados em Tabelas

Remoo de Tuplas de Tabela

Empregado
Cad

Nome

Sexo

Salario

Num_Dep

Cad_Spv

Jos

5000.00

Maria

8000.00

NULL

Joo

3000.00

Clara

7000.00

Excluso de dados de uma tabela DELETE

DELETE FROM <tabela> WHERE <condio>;

UPDATE Empregado SET Salario = 9500.00


WHERE Cad = 2;

Exemplo 47: Remover todos os empregados

com salrio inferior a R$ 5000,00


Empregado

Empregado
Cad

Nome

Sexo

Salario

Num_Dep

Cad_Spv

Jos

5000.00

Maria

9500.00

NULL

Joo

3000.00

Clara

7000.00

CIn.ufpe.br

Cad

Nome

Sexo

Salario

Num_Dep

Cad_Spv

Jos

5000.00

Maria

9500.00

NULL

Joo

3000.00

Clara

7000.00

CIn.ufpe.br

127

Remoo de Tuplas de Tabela

Uklizando Vises (VIEWS)


So tabelas virtuais que no ocupam espao
fsico no BD para os dados
Operaes
Criao e utilizao
Insero e modificao (semntica depende da
definio/natureza da viso)

DELETE FROM Empregado


WHERE Salario < 5000.00;

Empregado
Cad

Nome

Sexo

Salario

Num_Dep

Cad_Spv

Jos

5000.00

Maria

9500.00

NULL

Clara

7000.00

CREATE VIEW <nome da view>


(<lista de atributos>) AS SELECT...;
CIn.ufpe.br

CIn.ufpe.br

129

130

Uklizando Vises (VIEWS)

Uklizando Vises (VIEWS)


Exemplo 48: Criar uma viso dos empregados
do departamento 1 que tenham mais de 20
horas de trabalho em algum projeto
Empregado
Cad

Nome

Sexo

Salario

Num_Dep

Cad_Spv

Jos

5000.00

Maria

9500.00

NULL

Clara

7000.00

Trabalha_em
Cad_Emp

Num_Proj

Horas

20

24

44

34

128

CREATE VIEW Dep_1 AS


SELECT E.Nome, T.Num_Proj
FROM Empregado E, Trabalha_em T
WHERE T.Horas > 20
AND T.Cad_Emp = E.Cad
AND E.Num_Dep = 1;

CIn.ufpe.br

CIn.ufpe.br

131

132

22

Uklizando Vises (VIEWS)

Garankndo Privilgios de Acesso

Para testar, consultar a VIEW

Comando GRANT

GRANT <privilgios> ON <nome tabela/view>


TO <usurio>;
SELECT * FROM Dep_1 ;

Onde
<privilgios>: SELECT, INSERT, DELETE,
UPDATE, ALL PRIVILEGES e
<usurio>: usurio cadastrado, PUBLIC

Dep_1
Nome

Num_Proj

Jos

Clara

Todos os usurios
cadastrados no BD CIn.ufpe.br

CIn.ufpe.br
133

Garankndo Privilgios de Acesso


Exemplo 49: Conceder a permisso de
consulta sobre a tabela EMPREGADO
usuria acs

134

Removendo Privilgios de Acesso


Comando REVOKE

REVOKE <privilgios> ON <nome tabela/view>


FROM <usurio>;
Exemplo 50:

Remover a permisso de
consulta tabela Projeto, dada aos demais
usurios do banco

GRANT SELECT ON Empregado TO acs;

REVOKE SELECT ON Projeto FROM PUBLIC;


CIn.ufpe.br

CIn.ufpe.br

135

136

23

Das könnte Ihnen auch gefallen