Anda di halaman 1dari 42

Banco de Dados I

Linguagem SQL Linguagem SQL


Professor Luciano Calderoni
Histrico
Structured Query Language (SQL)
Foi desenvolvido pela IBM em meados dos anos
70 como uma linguagem de manipulao de dados
(DML - Data Manipulation Language) para suas
primeiras tentativas de desenvolvimento de bancos
2
primeiras tentativas de desenvolvimento de bancos
de dados relacionais.
O SQL tornou-se de fato o padro depois de
1986, quando o American National Standards
Institute (ANSI), a organizao responsvel pelos
padres industriais nos Estados Unidos, endossou o
SQL como linguagem padro para os bancos de
dados relacionais.
O que SQL
O SGBD (Sistema Gerenciador de Banco de
Dados) necessita de uma linguagem que
permita aos usurios acesso aos dados.
SQL (Structured Query Language) a
3
SQL (Structured Query Language) a
linguagem de consulta adotada pela maioria
dos SGBDs relacionais.
Caractersticas SQL
Linguagem English-like
Processa conjunto de registros (tabelas) ao invs
de registros individuais
Padronizada
Fornece comandos para uma srie de tarefas,
4
Fornece comandos para uma srie de tarefas,
como:
Recuperao de dados;
Incluso, atualizao e excluso de registros;
Criar, modificar e excluir objetos do banco;
Etc.
Comando SQL
Comandos DDL (Data Definition Language)
Usados para construir e modificar estruturas de
tabelas e outros objetos no BD.
Tm efeito imediato.
5
Comandos DML(Data Manipulation Language)
Usados para trabalhar com os dados nas tabelas.
Seu efeito depende do gerenciamento da transao
que executou o comando, que poder ser efetivado ou
desfeito.
Comandos DDL
Os principais comandos DDL so:
CREATE: usado para criao de tabelas e outros
objetos no Banco de Dados.
ALTER: usado para alterar a estrutura das tabelas e
outros objetos no Banco de Dados.
6
outros objetos no Banco de Dados.
DROP: usado para excluir tabelas e outros objetos do
Banco de Dados.
ATENO: os comando ALTER e DROP no
produzem alterao e excluso de dados, mas sim
alterao e excluso de estruturas inteiras!
Comandos DML
Os principais comandos DML so:
INSERT: usado incluir dados nas tabelas do Banco de
Dados.
UPDATE: usado para alterar os dados armanzenados
nas tabelas do Banco de Dados.
7
nas tabelas do Banco de Dados.
DELETE: usado para excluir os dados das do Banco
de Dados.
SELECT: usando para selecionar / consultar dados
das tabelas do Banco de Dados.
ATENO: No confundir ALTER com UPDATE nem
DROP com DELETE!
Exemplo
EMPREGADO
CODIGO:NUMBERNOTNULL
CODIGO_SUPERVISOR:NUMBERNULL(FK)
NOME:VARCHAR2(128)NOTNULL
SEXO:VARCHAR2(1)NOTNULL
SALARIO:NUMBERNOTNULL
DATA_NASCIMENTO:DATENOTNULL
CODIGO_DEPARTAMENTO:NUMBERNOTNULL(FK)
DEPENDENTES
CODIGO_EMPREGADO:NUMBERNOTNULL(FK)
CODIGO_DEPENDENTE:NUMBERNOTNULL
NOME:VARCHAR2(128)NOTNULL
DATA_NASCIMENTO:DATENOTNULL
GRAU_PARENTESCO:VARCHAR2(20)NOTNULL
8
DEPARTAMENTO
CODIGO:NUMBERNOTNULL
NOME:VARCHAR2(128)NOTNULL
DATA_INICIO:DATENOTNULL
CODIGO_GERENTE:NUMBERNULL(FK)
PROJETO
NUMERO:NUMBERNOTNULL
NOME:VARCHAR2(128)NOTNULL
CODIGO_DEPARTAMENTO:NUMBERNOTNULL(FK)
TRABALHA_EM
CODIGO_EMPREGADO:NUMBERNOTNULL(FK)
NUMERO_PROJETO:NUMBERNOTNULL(FK)
HORAS:NUMBERNOTNULL
Criando Tabelas
CREATE TABLE <nome da tabela>
(<descrio dos atributos>
<descrio das chaves>
<descrio das restries);
Descrio dos Aributos: Nome do atributo e Tipo de dados
9
Descrio dos Aributos: Nome do atributo e Tipo de dados
(varchar2, char, nvarchar2, nchar, number, number(n),
number(m,n), date (data hora) blob, clob, nclob).
Descrio das Chaves: Definio das chaves primrias e
estrangeiras.
Descriao das restries: Definies das restries de
integridade adicionais para os atributos.
Criando Tabelas
Tipos de Restrio (Constraints):
Primary Key: usada para definio da Chave Primria
de uma tabela. Identificada como tipo P pelo SGBD.
Foreign Key: usada para definio das Chaves
Estrangeiras de uma tabela. Identificada como tipo R Estrangeiras de uma tabela. Identificada como tipo R
pelo SGBD.
Check: usada para definio de regras de integridade
adicionais sobre os campos de uma tabela (por
exemplo, salrio de FUNCIONARIO deve ser maior
que 0. Criada automaticamente para os campos NOT
NULL, porm, dessa forma, tero nomes automticos
tambm.
10
Criando Tabelas
Exemplo Constraint Primary Key
CONSTRAINT XPKFUNCIONARIO PRIMARY KEY (CODIGO_FUNCIONARIO)
Exemplo Constraint Foreign Key
CONSTRAINT FK_DEPARTAMENTO_FUNCIONARIO FOREIGN KEY (CODIGO_DEPARTAMENTO)
REFERENCES DEPARTAMENTO(CODIGO_DEPARTAMENTO)
Exemplo Constraint Foreign Key Exemplo Constraint Foreign Key
CONSTRAINT CK_SALARIO_FUNC CHECK (SALARIO > 0)
11
Criando Tabelas
CREATE TABLE FUNCIONARIO (CODIGO_FUNCIONARIO NUMBER NOT NULL ,
NOME VARCHAR2(120) NOT NULL ,
SALARIO NUMBER NOT NULL,
CODIGO_DEPARTAMENTO NUMBER NOT NULL,
CONSTRAINT XPKFUNCIONARIO PRIMARY KEY (CODIGO_FUNCIONARIO),
CONSTRAINT FK_DEPARTAMENTO_FUNCIONARIO FOREIGN KEY
(CODIGO_DEPARTAMENTO) REFERENCES
12
(CODIGO_DEPARTAMENTO) REFERENCES
DEPARTAMENTO(CODIGO_DEPARTAMENTO),
CONSTRAINT CK_SALARIO_FUNC CHECK (SALARIO > 0)
);
ATENO: Para criao da FK de Departamento
necessrio que a tabela DEPARTAMENTO j tenha sido
criada!
Criando Tabelas
CREATE TABLE FUNCIONARIO (CODIGO_FUNCIONARIO NUMBER NOT NULL ,
NOME VARCHAR2(120) NOT NULL ,
SALARIO NUMBER NOT NULL,
CODIGO_DEPARTAMENTO NUMBER NOT NULL);
ALTER TABLE FUNCIONARIO
ADD CONSTRAINT XPKFUNCIONARIO PRIMARY KEY (CODIGO_FUNCIONARIO);
ALTER TABLE FUNCIONARIO
ADD CONSTRAINT FK_DEPARTAMENTO_FUNCIONARIO FOREIGN KEY
13
ADD CONSTRAINT FK_DEPARTAMENTO_FUNCIONARIO FOREIGN KEY
(CODIGO_DEPARTAMENTO) REFERENCES DEPARTAMENTO(CODIGO_DEPARTAMENTO);
ALTER TABLE FUNCIONARIO ADD CONSTRAINT CK_SALARIO_FUNC CHECK (SALARIO > 0);
Maneira mais indicada de se criar as tabelas, definindo as Chaves e
restries usando comandos ALTER. Dessa forma todas as tabelas
so criadas antes e depois so definidas as chaves e restries.
Ainda assim uma FK s poder ser criada aps a criao da PK na
tabela referenciada!
Alterando Tabelas
Alm do comando ALTER para criao das
chaves e restries, vistos anteriormente,
podemos us-lo para alterar a estrutura das
tabelas, tal como:
Adicionar um novo atributo;
14
Adicionar um novo atributo;
Modificar as caractersticas de um atributo;
Excluir um atributo;
Excluir uma CONSTRAINT (PK, FK ou Check).
Alterando Tabelas
Adicionando um novo atributo:
ALTER TABLE FUNCIONARIO ADD SEXO VARCHAR2(1) NULL;
ATENO:
Caso a tabela alterada j possua dados, apenas campos NULL podem ser
adicionados. Caso seja necessrio um campo NOT NULL devemos usar um
valor DEFAULT, como abaixo:
ALTER TABLE FUNCIONARIO ADD SEXO VARCHAR2(1) DEFAULT M
15
ALTER TABLE FUNCIONARIO ADD SEXO VARCHAR2(1) DEFAULT M
NOT NULL;
Modificando as caractersticas de um Atributo:
Alterando tamanho do atributo:
ALTER TABLE FUNCIONARIO MODIFY NOME VARCHAR2(200);
Alterando NULL / NOT NULL:
ALTER TABLE FUNCIONARIO MODIFY NOME VARCHAR2(200) NULL;
ATENO: Campos NULL s podem ser alterados para NOT NULL se ainda
no existirem valores nulos no campo que se deseja alterar. O uso de
DEFAULT no funciona para esses casos.
Alterando Tabelas
Eliminando um atributo:
ALTER TABLE FUNCIONARIO DROP COLUMN SEXO;
ATENO:
Caso o atributo eliminado seja uma PK ele no ser eliminado!
Caso o atributo seja uma FK ou possua alguma regra de integridade, tanto o
atributo quanto a CONSTRAINT relacionada sero eliminados.
16
Eliminando uma Constraint (PK, FK ou Check)
ALTER TABLE FUNCIONARIO DROP CONSTRAINT
<NOME_CONSTRAINT>;
ATENO:
Todas as CONSTRAINTS so eliminadas da mesma forma, bastando
informar o nome da mesma, usando no momento de sua criao.
A eliminao da CONSTRAINT NO elimina o atributo para o qual a
CONSTRAINT foi definida.
Esta a forma de alterar os atributos para NULL. Para NOT NULL devemos
CRIAR uma CONSTRAINT de Check..
Eliminando Tabelas
Para eliminar uma tabela usamos o comando
abaixo:
DROP TABLE <NOME_TABELA>;
DROP TABLE TRABALHA_EM;
ATENO:
17
ATENO:
Para eliminar uma tabela esta no pode possuir nenhuma
referncia, via FK, de outra tabela. Se existir, as referncias
para a tabela a ser excluda devero ser eliminadas primeiro
(ver eliminado CONSTRAINT, em alterando tabelas).
Incluindo Dados
Comando INSERT
INSERT INTO <tabela> (<lista de atributos>)
VALUES (<valores>);
INSERT INTO DEPARTAMENTO(CODIGO_DEPARTAMENTO, NOME)
VALUES (1, Tecnologia Informao);
18
VALUES (1, Tecnologia Informao);
ATENO:
No momento da incluso, todas as CONSTRAINTS
(PK, FK e Checks) e tipos de dados so verificados.
Caso algum item seja violado o registro no inserido
e o SGDB exibe qual foi a regra violada.
Alterando Dados
Comando UPDATE
UPDATE <tabela> SET atributo1 = valor1,
atributo2 = valor2,
...
atributoN = valorN
[WHERE <condio>];
19
[WHERE <condio>];
Onde CONDIO:
<atributo> <operador_logico> <valor>
<operador_relacional>
<atributo> <operador_logico> <valor>
Operadores Lgicos: =, < >, <, <=, >, >=
Operadores Relacionais: AND, OR NOT
Alterando Dados
Altera o nome de TODOS os departamentos para Tecnologia
da Informao:
UPDATE DEPARTAMENTO SET NOME = Tecnologia Informao;
Altera o nome de um NICO departamento:
UPDATE DEPARTAMENTO SET NOME = Tecnologia Informao
WHERE CODIGO_DEPARTAMENTO = 1;
Altera o salrio dos Funcionrios que ganham menos que R$
20
Altera o salrio dos Funcionrios que ganham menos que R$
1.000,00:
UPDATE FUNCIONARIO SET SALARIO = SALARIO * 1.1
WHERE SALARIO < 1000;
Altera o salrio dos Funcionrios que ganham menos que R$
1.000,00 e trabalham no Departamento 1:
UPDATE FUNCIONARIO SET SALARIO = SALARIO * 1.1
WHERE SALARIO < 1000
AND CODIGO_DEPARTAMENTO = 1;
Alterando Dados
Altera TODOS os atributos de um Funcionrio:
UPDATE FUNCIONARIO SET NOME = Luciano Calderoni
SALARIO = 1500
CODIGO_DEPARTAMENTO = 3
WHERE CODIGO_FUNCIONARIO = 1;
ATENO:
21
No momento da alterao, todas as CONSTRAINTS
(PK, FK e Checks) e tipos de dados so verificados.
Caso algum item seja violado o registro no alterado
e o SGDB exibe qual foi a regra violada.
Apesar de ser possvel, no aconselhvel alterar o
valor de um atributo PK.
Excluindo Dados
Comando DELETE
DELETE [FROM] <tabela>
[WHERE <condio>];
Onde CONDIO:
<atributo> <operador_logico> <valor>
22
<atributo> <operador_logico> <valor>
<operador_relacional>
<atributo> <operador_logico> <valor>
Operadores Lgicos: =, < >, <, <=, >, >=
Operadores Relacionais: AND, OR NOT
Excluindo Dados
Exclui TODOS os departamentos:
DELETE FROM DEPARTAMENTO;
Exclui um NICO departamento:
DELETE FROM DEPARTAMENTO
WHERE CODIGO_DEPARTAMENTO = 1;
Exclui os Funcionrios que ganham menos que R$ 1.000,00 e
trabalham no Departamento 1:
23
trabalham no Departamento 1:
DELETE FROM FUNCIONARIO
WHERE SALARIO < 1000
AND CODIGO_DEPARTAMENTO = 1;
ATENO:
No momento da excluso, todas as CONSTRAINTS
FK so verificadas e, alguma seja violada, o registro
no excludo e o SGDB exibe qual foi a regra
violada.
Consultando Dados
Comando SELECT
SELECT <lista_campos>
FROM <lista_tabelas>
[WHERE <condio>]
[ORDER BY <lista_ordenao>];
Onde:
<lista_campos>: nome de qualquer campo das tabelas relacionadas <lista_campos>: nome de qualquer campo das tabelas relacionadas
em lista_tabelas, separados por vrgula.
<lista_tabelas>: nome das tabelas das quais se deseja retornar
informaes ou apenas so usadas para juno de tabelas.
Condio:
<atributo> <operador_logico> <valor>
<operador_relacional>
<atributo> <operador_logico> <valor>
Operadores Lgicos: =, < >, <, <=, >, >=
Operadores Relacionais: AND, OR NOT
Consultando Dados
Retornando dados de uma nica tabela:
Buscar o nome e o salrio de TODOS os FUNCIONRIOS:
SELECT NOME, SALARIO
FROM FUNCIONARIO;
Buscar dados dos FUNCIONARIO com salario > R$ 1.000,00
SELECT NOME, SALARIO SELECT NOME, SALARIO
FROM FUNCIONARIO
WHERE SALARIO > 1000;
Buscar TODOS os dados dos FUNCIONARIO com salario > R$ 1.000,00 e
trabalhem no departamento de cdigo = 1.
SELECT *
FROM FUNCIONARIO
WHERE SALARIO > 1000
AND CODIGO_DEPARTAMENTO = 1;
Consultando Dados
LIKE e NOT LIKE:
s se aplicam sobre atributos do tipo caracter. Operam como = e < >,
utilizando os smbolos % (substitui uma palavra) e _ (substitui um
caractere). Os smbolos podem ser usados no incio ou fim da palavra de
comparao.
Buscar os FUNCIONRIOS com nome que iniciam por Jos:
SELECT CODIGO, NOME, SALARIO
FROM FUNCIONARIO FROM FUNCIONARIO
WHERE NOME LIKE Jos%;
Buscar os FUNCIONRIOS que possuam Jos em qualquer parte do nome:
SELECT CODIGO, NOME, SALARIO
FROM FUNCIONARIO
WHERE NOME LIKE %Jos%;
Buscar os FUNCIONRIOS possuam o nome terminado em Calderoni:
SELECT CODIGO, NOME, SALARIO
FROM FUNCIONARIO
WHERE NOME LIKE %Calderoni;
Consultando Dados
BETWEEN e NOT BETWEEN:
substituem o uso dos operadores >= e <=, quando desejamos que um
determinado campo possua valor dentro de uma determinada faixa.
Usado normalmente para campos numricos ou datas.
Buscar os FUNCIONRIOS que recebam entre R$ 1.000,00 e R$ 2.000,00:
SELECT CODIGO, NOME, SALARIO
FROM FUNCIONARIO FROM FUNCIONARIO
WHERE SALARIO BETWEEN 1000 AND 2000;
OU
SELECT CODIGO, NOME, SALARIO
FROM FUNCIONARIO
WHERE SALARIO >= 1000
AND SALARIO <= 2000;
Consultando Dados
IN e NOT IN:
procuram dados que esto ou no contidos em um dado conjunto de
valores (Interseo (IN) e Diferena de conjuntos (NOT IN)).
Buscar os FUNCIONRIOS que recebam R$ 1.000,00, R$ 2.000,00 ou R$
3.000,00 de salario:
SELECT CODIGO, NOME, SALARIO
FROM FUNCIONARIO FROM FUNCIONARIO
WHERE SALARIO IN (1000, 2000, 3000);
A lista de valores de uma comparao tambm pode vir de uma Sub-query ou
query aninhada, que veremos adiante como funcionam.
Consultando Dados
IS NULL e IS NOT NULL:
identificam valores nulos (ou no) dos atributos.
Buscar os PROJETOS que ainda esto em andamento, ou seja, que possuam a
DATA_FIM nula:
SELECT NOME_PROJETO
FROM PROJETOS
WHERE DATA_FIM IS NULL;
Buscar os PROJETOS que j terminaram, ou seja, que possuam a DATA_FIM no
nula:
SELECT NOME_PROJETO
FROM PROJETOS
WHERE DATA_FIM IS NOT NULL;
Consultando Dados
ORDER BY:
Usado para ordenar o resultado de um SELECT.
Buscar os PROJETOS que ainda esto em andamento, ou seja, que possuam a
DATA_FIM nula. Ordenar o resultado, mostrando primeiro os que comearam
primeiro:
SELECT NOME_PROJETO
FROM PROJETOS
WHERE DATA_FIM IS NULL WHERE DATA_FIM IS NULL
ORDER BY DATA_INICIO ASC; -- ASC significa ordem CRESCENTE
Buscar os PROJETOS que j terminaram, ou seja, que possuam a DATA_FIM no
nula. Ordenar o resultado pelos que terminaram por ltimo:
SELECT NOME_PROJETO
FROM PROJETOS
WHERE DATA_FIM IS NOT NULL
ORDER BY DATA_FIM DESC; -- DESC significa DECRESCENTE
Os resultados podem ser ordenados por vrias colunas, cada uma com seu
prprio critrio de ordenao (ASC ou DESC). O tipo padro ASC e, portanto,
este pode ser omitido quando usarmos esse tipo de ordenao.
Consultando Dados
Campos Calculados:
Pode-se criar um campo que no pertena tabela a partir de clculos sobre
atributos dessa tabela.
Mostrar o nome e uma simulao de novo salrio dos empregados calculado
com base em um reajuste de 15% para os que ganham abaixo de R$
1.000,00:
SELECT NOME, SALARIO * 1.1 NOVO_SALARIO
FROM FUNCIONARIO FROM FUNCIONARIO
WHERE SALARIO < 1000
Consultando Dados
Funes de Agregao:
So funes pr-definidas pela SQL e que operam sobre os conjuntos de dados.
MIN(atributo) retorna o MENOR valor para o atributo dentro do conjunto.
MAX(atributo) retorna o MAIOR valor para o atributo dentro do conjunto.
AVG(atributo) retorna o valor MDIO para o atributo dentro do conjunto.
SUM(atributo) retorna a SOMA de valores do atributo dentro do conjunto.
COUNT(atributo) retorna a QUANTIDADE de elementos dentro do conjunto. COUNT(atributo) retorna a QUANTIDADE de elementos dentro do conjunto.
Para o COUNT o ideal usar algum atributo no nulo, pois valores nulos no so
contados. Pode, tambm, ser substitudo por *.
ATENO: As funes de agregao somente so disparadas por comandos
SELECT e no podem ser usadas diretamente em clusula WHERE!
Consultando Dados
Funes de Agregao:
Buscar o maior salrio dentre os Funcionrios :
SELECT MAX(SALARIO)
FROM FUNCIONARIO;
Buscar o menor salrio dentre os Funcionrios :
SELECT MIN(SALARIO)
FROM FUNCIONARIO; FROM FUNCIONARIO;
Buscar a mdia salarial dos Funcionrios:
SELECT AVG(SALARIO)
FROM FUNCIONARIO;
Buscar a soma dos salrios dos Funcionrios:
SELECT SUM(SALARIO)
FROM FUNCIONARIO;
Buscar a quantidade de Funcionrios da empresa:
SELECT COUNT(*)
FROM FUNCIONARIO;
Consultando Dados
GROUP BY:
Organiza a seleo de dados em Grupo. Usado em conjunto com as funes de
Agregao e, em alguns casos, seu uso obrigatrio.
Agrupar a quantidade de clientes por sexo:
SELECT COUNT(*)
FROM CLIENTE
GROUP BY SEXO
Funciona, mas no sabemos quantos clientes para cada sexo! Para isso, fazemos
como abaixo:
SELECT SEXO, COUNT(*)
FROM CLIENTE
GROUP BY SEXO
Quando existirem campos no SELECT, alm da Funo de Agregao, o uso do
GROUP BY passa a ser OBRIGATRIO e dever conter a lista de campos do
SELECT, com exceo da Funo de Agregao.
Consultando Dados
Juno de Tabelas (JOIN):
Necessrio quando se necessita de informaes que esto em mais de uma
tabela.
Listar o nome do Funcionrio e o nome do Departamento onde ele est alocado:
SELECT F.NOME, D.NOME -uso de ALIAS para campos com mesmo nome
FROM FUNCIONARIO F,
DEPARTAMENTO D
WHERE F.CODIGO_DEPARTAMENTO = D.CODIGO_DEPARTAMENTO; WHERE F.CODIGO_DEPARTAMENTO = D.CODIGO_DEPARTAMENTO;
F.CODIGO_DEPARTAMENTO = D.CODIGO_DEPARTAMENTO usado para
fazer o JOIN entre as tabelas FUNCIONARIO e DEPARTAMENTO.
A regra para o JOIN sempre a Chave Estrangeira de uma tabela (no caso
CODIGO_DEPARTAMENTO de FUNCIONARIO, que uma FK para a tabela
DEPARTAMENTO) com a respectiva Chave Primria da outra tabela (no caso
CODIGO_DEPARTAMENTO, que PK da tabela DEPARTAMENTO).
Temos que ter muito cuidado ao fazer o JOIN, pois caso no o faamos, o
resultado do SELECT pode conter informaes falsas!
JOINs desse tipo, que sempre esperam que a ligao seja verdadeira, so
chamados de INNER JOIN.
Consultando Dados
Juno de Tabelas (JOIN):
Listar o nome dos Clientes que possuem Projetos em andamento:
SELECT C.NOME
FROM CLIENTE C,
PROJETO P
WHERE C.CODIGO = P.CODIGO_CLIENTE - fazendo o JOIN
AND P.DATA_FIM IS NULL; -- filtrando os projetos
Para o JOIN, vale a regra da Chave Estrangeira de uma tabela (no caso
CODIGO_CLIENTE de PROJETO, que uma FK para a tabela CLIENTE) com a
respectiva Chave Primria da outra tabela (no caso CODIGO_CLIENTE, que PK
da tabela CLIENTE).
Uma dica sempre fazer os JOINs necessrios e apenas depois filtrar as
informaes que desejamos, apesar de ser possvel inverter a ordem e at mesmo
misturar, no WHERE, o que JOIN e o que filtro.
Consultando Dados
Juno de mais que duas Tabelas:
Listar o nome do Funcionrio e o nome dos Projetos em que o Funcionrio esteja
trabalhando:
SELECT F.NOME, P.NOME
FROM FUNCIONARIO F,
FUNCIONARIO_PROJETO FP,
PROJETO P
WHERE F.CODIGO_FUNCIONARIO = FP.CODIGO_FUNCIONARIO WHERE F.CODIGO_FUNCIONARIO = FP.CODIGO_FUNCIONARIO
AND FP.CODIGO_PROJETO = P.CODIGO_PROJETO
AND FP.DATA_FIM IS NULL;
F.CODIGO_FUNCIONARIO = FP.CODIGO_FUNCIONARIO faz o JOIN entre as
tabelas FUNCIONARIO e FUNCIONARIO_PROJETO.
FP.CODIGO_PROJETO = P.CODIGO_PROJETO faz o JOIN entre as tabelas
FUNCIONARIO_PROJETO e PROJETO.
FP_DATAFIM IS NULL o filtro para indicar que o funcionrio ainda trabalha no
projeto.
Note que no existe a necessidade de se ligar cada uma das tabelas com cada
outra existente, bastando apenas ligar as tabelas para que se tenha lgica!
Consultando Dados
Sub-Query ou Query Aninhada:
O resultado de uma consulta utilizado por outra consulta, de forma
encadeada e no mesmo comando SQL.
O resultado do comando SELECT mais interno (sub-query) usado por outro
SELECT mais externo para obter o resultado final.
Uma Sub-Query pode aparecer em qualquer uma das 3 partes principais de um
SELECT, ou seja, na prpria clusula SELECT, no FROM ou no WHERE. Os tipos
mais comuns so encontrados no WHERE.
As Sub-Queries devem sempre ser escritas entre parnteses ()
Consultando Dados
Sub-Query ou Query Aninhada:
Listar os empregados que trabalham no departamento de chamado Informtica:
SELECT NOME
FROM FUNCIONARIO
WHERE CODIGO_DEPARTAMENTO = (SELECT CODIGO_DEPARTAMENTO
FROM DEPARTAMENTO
WHERE NOME = Informtica);
Note que o mesmo resultado poderia ser obtido fazendo o JOIN. Nesse caso cabe Note que o mesmo resultado poderia ser obtido fazendo o JOIN. Nesse caso cabe
ao desenvolvedor escolher a forma que mais lhe agrada. Existem autores que
dizem ser prefervel substituir Sub-Query por JOIN onde for possvel, por questes
de performance.
Listar os empregados cujos salrios so maiores do que a mdia salarial,
mostrando a diferena entre o salrio do funcionrio e a mdia.
SELECT NOME, (SALARIO (SELECT AVG(SALARIO)
FROM FUNCIONARIO)) AS DIFERENCA
FROM FUNCIONARIO
WHERE SALARIO > (SELECT AVG(SALARIO)
FROM FUNCIONARIO);
Consultando Dados
EXISTS e NOT EXISTS:
Foram projetados para uso apenas com Sub-query:
EXISTS retorna TRUE se existe pelo menos uma linha produzida pela Sub-query e
FALSE quando a sub-query no retorna registros.
NOT EXISTS trabalha ao contrrio, ou seja, retorna TRUE se a sub-query no
retorna registros e FALSE caso exista ao menos uma linha produzida pela sub-
query.
Listar os empregados que trabalham no departamento de chamado Informtica:
SELECT NOME
FROM FUNCIONARIO F
WHERE EXISTS (SELECT CODIGO_DEPARTAMENTO
FROM DEPARTAMENTO
WHERE F.CODIGO_DEPARTAMENTO = CODIGO_DEPARTAMENTO
AND NOME = Informtica);
Note que o mesmo resultado poderia ser obtido fazendo o JOIN ou da maneira
feita em exemplo anterior. Esse exemplo difere do anterior por usar uma
comparao dentro da Sub-query, enquanto o anterior usava comparao fora da
Sub-query. Nem sempre ser possvel fazer como no exemplo, 3 forma para
resolver o mesmo problema, e o desenvolvedor dever escolher a opo correta.
Consultando Dados
Regras genricas de Sub-Query:
A clusula ORDER BY no pode ser usada em uma sub-query.
A lista de atributos especificados no SELECT de uma sub-query deve conter
um nico elemento, exceto quando usamos EXISTS / NOT EXISTS, que podem
ter vrios elementos no SELECT.
Nomes de atributos especificados na sub-query esto associados s tabelas
listadas na clusula FROM da sub-query.
Em uma Sub-Query possvel referir-se a atributos de uma tabela da clusula
FROM da consulta mais externa, desde que obrigatriamente utilizando
qualificadores de atributos (ALIAS).
Quando a Sub-query um dos operandos envolvidos em uma comparao,
ela deve aparecer sempre no lado DIREITO da comparao.
Anexo
Em anexo a este, existe o arquivo
ExemploAula.ZIP com os scripts para criao do
Banco de Dados de exemplo usados nessa
apresentao. So 2 arquivos:
script_projetos_alter.sql: Cria as tabelas e as PK
42
script_projetos_alter.sql: Cria as tabelas e as PK
e FK usando ALTER;
script_projetos_on_create.sql: Cria as tabelas,
PKs, FKs e regras de integridade num nico
comando.

Anda mungkin juga menyukai