Você está na página 1de 19

LINGUAGEM SQL

1. INTRODUÇÃO

A Linguagem SQL ("Structured Query Language") foi desenvolvida e


implementada pelo Laboratório de Pesquisa da IBM em San Jose (hoje o
Centro de Pesquisa Almaden) - 1964 e 1969.

Inicialmente chamada "SEQUEL", foi criada como uma forma de


interface entre os usuários e o primeiro Sistema de Gerenciamento de Banco
de Dados Relacional denominado System R. É uma das mais conhecidas
linguagens de manipulação de banco de dados relacionais devido à sua
simplicidade e ao grande poder de consulta, sendo adotada por diversos
SGBD's relacionais existentes comercialmente.

2. PADRONIZAÇÃO

Diversas tentativas de padronização da SQL foram realizadas de modo a


criar um conjunto de comandos e operandos de uso comum entre os diversos
ambientes, possibilitando maior interação entre os usuários e os dados.

O "American National Standard Institute" (ANSI) publicou em 1986 um


padrão, a IBM publicou seu próprio padrão e outros padrões surgiram desde
então, como é o caso do SQL2 e posteriormente o SQL3. Independente da
versão, os comandos da SQL podem ser divididos em três conjuntos:

Linguagem de Definição de Dados (DDL): inclui comandos para definir,


alterar e remover tabelas e índices.

Linguagem de Manipulação de Dados (DML): inclui comandos para inserir,


remover, atualizar e consultar os dados armazenados nas tabelas;

Linguagem de Controle de Dados (DCL): inclui comandos para se trabalhar


em ambiente multi-usuário, permitindo estabelecer níveis de segurança e
manipular transações.

1
3. OPERADORES

Lógicos Aritméticos Relacionais


AND + < <=
OR - > >=
NOT * <> =
/ LIKE BETWEEN

4. FUNÇÕES

AVG - obtém o valor médio de uma coluna


COUNT - obtém a soma da quantidade de linhas analisadas
MAX - obtém o maior valor de uma coluna
MIN - obtém o menor valor de uma coluna
SUM - obtém a soma de valores de uma coluna

Expl: select função(campo), outras funções se necessário.


Obs: ao utilizar uma das funções acima em um comando select, não deve ser
listado outro campo da relação. Funções de grupo devem ser utilizadas
sozinhas.

Exercícios:

Suponha que a empresa construtora de veículos especiais "Star Trek" necessita


armazenar em seu Banco de Dados informações sobre as peças que utiliza em
cada projeto de veículo e os fornecedores dessas peças. O Banco de Dados
deve ser capaz de oferecer respostas rápidas e precisas sobre as peças,
fornecedores e projetos realizados, bem como associações entre esses
elementos, ou seja, a quantidade de peças fornecida por uma determinada
empresa e utilizadas em um projeto.

As PEÇAS são identificadas por um número, sendo utilizada a cor das gavetas
onde estão colocadas as peças para uma localização visual mais rápida por
parte dos funcionários. Para a especificação das compras são necessários, o
nome e o preço atual de cada peça.

2
Para a emissão correta das notas de compra e dos pagamentos é necessário o
nome dos FORNECEDORES bem como a cidade e um número de
identificação. A categoria de cada fornecedor é utilizada para indicar a
qualidade de seus produtos e serviços.

Os PROJETOS de veículos construídos pela "Star Trek" possuem um nome,


número de identificação, a duração para a montagem do veículo e o custo de
cada veículo (incluindo peças e serviços).

Considere que o seguinte esquema relacional foi desenvolvido para suprir as


necessidades dos usuários:

PECAS (PeNro, PeNome, PePreco, PeCor)


FORNECEDOR (FNro, FNome, FCidade, FCateg)
PROJETO (PNro, PNome, PDuracao, PCusto)
FORNECIMENTO (#PeNro, #FNro, #PNro, Quant)

Criação de tabelas

1) Crie as tabelas Pecas, Fornecedor, Projeto e Fornecimento utilizando


comandos SQL:

CREATE TABLE Peca (PeNro number(5) not null,


PeNome varchar2(30) not null,
PePreco number (8,2) not null,
PeCor varchar2(30),
constraint chave_peca primary key(PeNro));

CREATE TABLE Projeto (PNro number (5) not null,


PNome varchar(30) not null,
PDuracao number (2),
PCusto number (10,2),
constraint chave_projeto primary key (Pnro));

CREATE TABLE Fornecedor (FNro number (3) not null,


FNome varchar(30) not null,
FCidade varchar (30),
FCateg char (1),
constraint chave_fornec primary key(FNro));

3
CREATE TABLE Fornecimento (PeNro number(5) not null,
FNro number(3) not null,
PNro number(5) not null,
Quant number(3),
constraint chavefornecimento primary key(PeNro, FNro,
PNro),
constraint estrangeirapeca foreign key(PeNro) references
Peca,
constraint estrangeirafornecedor foreign key(FNro)
references Fornecedor,
constraint estrangeiraprojeto foreign key(PNro) references
Projeto);

Agora considere as seguintes instâncias do banco de dados em um


determinado instante:

Peca
PeNro PeNome PePreco PeCor
1 Cinto R$22,00 Azul
2 Volante R$18,00 Vermelho
3 Lanterna R$14,00 Preto
4 Limpador R$9,00 Amarelo
5 Painel R$43,00 Vermelho
6 Calota R$70,00 Preto
7 Pára-choque R$50,00 Cinza

Insert into peca values (1,'cinto', 22.00, 'Azul');


Insert into peca values (2,'volante', 18.00, 'Vermelho');
Insert into peca values (3,'lanterna', 14.00, 'Preto');
Insert into peca values (4,'limpador', 9.00, 'Amarelo');
Insert into peca values (5,'painel', 43.00, 'Vermelho');
Insert into peca values (6,'calota', 70.00, 'Preto');
Insert into peca values (7,'pára-choque', 50.00, 'Cinza');

Fornecedor
FNro FNome FCidade FCateg
1 Plastec Campinas B
2 CM São Paulo D
3 Kirurgic Campinas A
4 Piloto Piracicaba A
5 Equipament São Paulo C
6 CA Rio de Janeiro A

4
Insert into fornecedor values (1,'Plastec', 'Campinas', 'B');
Insert into fornecedor values (2,'CM', 'São Paulo', 'D');
Insert into fornecedor values (3,'Kirurgic', 'Campinas', 'A');
Insert into fornecedor values (4,'Piloto', 'Piracicaba', 'A');
Insert into fornecedor values (5,'Equipament', 'São Paulo', 'C');
Insert into fornecedor values (6,'CA', 'Rio de Janeiro', 'A');

Projeto
PNro PNome PDuracao PCusto
1 Detroit 5 R$43.000,00
2 Pegasus 3 R$37.000,00
3 Alfa 2 R$26.700,00
4 Sea 3 R$21.200,00
5 Paraíso 1 R$17.000,00

Insert into projeto values (1,'Detroid', 5, 43000.00);


Insert into projeto values (2,'Pegasus', 3, 37000.00);
Insert into projeto values (3,'Alfa', 2, 26700.00);
Insert into projeto values (4,'Sea', 3, 21200.00);
Insert into projeto values (5,'Paraíso', 1, 17000.00);

Fornecimento
PeNro FNro PNro Quant
1 5 4 5
2 2 2 1
2 2 3 1
3 3 4 2
4 3 5 2
4 4 5 3
5 1 1 1

Insert into fornecimento values (1, 5, 4, 5);


Insert into fornecimento values (2, 2, 2, 1);
Insert into fornecimento values (2, 2, 3, 1);
Insert into fornecimento values (3, 3, 4, 2);
Insert into fornecimento values (4, 3, 5, 2);
Insert into fornecimento values (4, 4, 5, 3);
Insert into fornecimento values (5, 1, 1, 1);

5
A) Exercícios:
2) Utilize o Erwin para criar o banco no Oracle e em seguida inclua registros
nas tabelas utilizando o SQL Plus.

B) Exercícios de consultas sobre o banco de dados anterior:

1) Obtenha os nomes de todas as peças


SELECT PeNome
FROM Peca;

PeNome
Cinto
Volante
Lanterna
Limpador
Painel
Calota
Para-choque

2) Obtenha o código de todas as peças fornecidas

SELECT DISTINCT PeNro


FROM Fornecimento;
PeNro
1
2
3
4
5

Obs: O uso de DISTINCT é para que não haja repetição de linhas no resultado
da consulta, ou seja, se colocarmos mais campos após o PeNro, poderemos ter
repetição do PeNro, mas, sempre outro campo da lista SELECT terá um valor
diferente.

SELECT DISTINCT PeNro, FNro


FROM Fornecimento;

Retornárá um número maior de linhas, pois agora ele só não poderá repitir
uma mesma peça para um mesmo fornecedor.

6
3) Obtenha o nome e o número de todos os fornecedores da cidade de
‘Campinas’

SELECT FNome, FNro


FROM Fornecedor
WHERE lower(Fcidade) = ‘campinas’;

FNome FNro
Plastec 1
Kirurgic 3
4) Obtenha o nome e a duração aproximada em dias de cada projeto

SELECT PNome, (PDuracao * 30)


FROM Projeto;
ou

SELECT PNome, (PDuracao*30) as DuracaoDias


FROM Projeto;

PNome DuracaoDias
Detroit 150
Pegasus 90
Alfa 60
Sea 90
Paraíso 30

5) Obtenha o nome dos projetos de custo menor que R$ 28000

SELECT PNome
FROM Projeto
WHERE PCusto < 28000;

PNome
Alfa
Sea
Paraíso

7
6) (Operador Lógico) Obtenha os nomes das peças de cor vermelha e com
preço maior que R$ 25

SELECT PeNome
FROM Peca
WHERE lower(PeCor) = 'vermelho' AND PePreco > 25;

PeNome
Painel

7) (ORDER BY) Obtenha, em ordem decrescente de preço, os nomes das


peças de cor vermelha e com preço maior que R$ 15.

SELECT PeNome
FROM Peca
WHERE (PePreco > 15 AND lower(PeCor) = 'vermelho')
ORDER BY PePreco DESC;

PeNome PePreco
Painel 43
Volante 18

8) (IN) Obtenha, em ordem crescente de preço, o nome das peças de cor


vermelha ou amarela e com preço de $ 9, $ 18, $ 22, $ 40 ou $ 90.

SELECT PeNome
FROM Peca
WHERE (lower(PeCor) = 'vermelho' OR lower(PeCor)='amarelo') AND
PePreco In (9,18,22,40,90)
ORDER BY PePreco;

PeNome
Limpador
Volante

9) (NOT IN) Obtenha o nome das peças cujo preço não seja $ 9,00, $ 14,00 ou
$ 60,00.

8
SELECT PeNome
FROM Peca
WHERE PePreco NOT IN (9,14,60);

PeNome
Cinto
Volante
Painel
Calota
Para-choque
10) (LIKE) Obtenha o nome dos fornecedores residentes em cidades
iniciadas com a letra S

SELECT FNome
FROM Fornecedor
WHERE FCidade LIKE ‘S%’; Obs: utiliza-se * no lugar de % em alguns
outros SGBD’s.

FNome
C&M
Equipament

11) (BETWEEN) Obtenha o nome dos projetos com preço entre $


20.000,00 e $ 30.000,00

SELECT PNome
FROM Projeto
WHERE PCusto BETWEEN 20000 AND 30000;

PNome
Alfa
Sea

12) (Uso explícito das relações) Obtenha o número e o nome dos


fornecedores para o projeto 5.

SELECT Fornecedor.FNro, Fornecedor.FNome


FROM Fornecedor, Fornecimento

9
WHERE Fornecedor.FNro = Fornecimento.FNro AND Fornecimento.PNro =
5;

Fnro FNome
F3 Kirurgic
F4 Piloto's

Onde poderíamos otimizar a consulta invertendo a ordem das restrições na


cláusula where, da seguinte forma:

SELECT Fornecedor.FNro, Fornecedor.FNome


FROM Fornecedor, Fornecimento
WHERE Fornecimento.PNro = 5 AND Fornecedor.FNro =
Fornecimento.FNro;

Nesta segunda consulta, o esforço computacional será menor, pois o produto


cartesiano gerado para realizar o relacionamento entre as duas relações terá
um número menor de elementos (registros), devido ao corte de elementos
efetuado na tabela de fornecimento ao se restringir apenas os registros que
satisfazem o número de projeto = 5. Ou seja, o número de comparações
(registros consultados) será menor e, portanto, mais rápido.

13) Obtenha o nome das peças utilizadas no projeto 4.

SELECT Peca.PeNome
FROM Peca, Fornecimento
WHERE Fornecimento.Pnro = 4 AND Fornecimento.PeNro = Peca.PeNro;

PeNome
Cinto
Lanterna

14) (SubSelect) Obtenha o nome das peças utilizadas no projeto 5.

SELECT PeNome
FROM Peca
WHERE PeNro In (
SELECT Fornecimento.PeNro

10
FROM Fornecimento
WHERE Fornecimento.PNro = 5);

PeNome
Limpador

15) (SubSelect) Obtenha o nome das peças fornecidas pelos fornecedores 4


e 3.

SELECT Peca.PeNome
FROM Peca
WHERE Peca.PeNro IN (
SELECT Fornecimento.PeNro
FROM Fornecimento
WHERE Fornecimento.FNro = 4)
AND Peca.PeNro IN (
SELECT
Fornecimento.PeNro
FROM Fornecimento
WHERE
Fornecimento.FNro = 3);

PeNome
Limpador

Obs: Sempre que possível, evite o uso de subconsultas, pois esta estratégia é
lenta quando comparada com consultas realizadas por meio de joins, seja na
cláusula FROM ou WHERE.

16) (SubSelect)Obtenha o nome das peças utilizadas nos projetos com


duração maior que 3 meses

SELECT Peca.PeNome
FROM Peca
WHERE Peca.PeNro IN (
SELECT Fornecimento.PeNro

11
FROM Fornecimento
WHERE Fornecimento.PNro IN(
SELECT PNro
FROM Projeto
WHERE
PDuracao > 3));

PeNome
Painel
17) (ANY) Obtenha o nome das peças fornecidas por algum fornecedor de
Piracicaba
SELECT Peca.PeNome
FROM Peca PeNome
WHERE Peca.PeNro IN ( Limpador

SELECT Fornecimento.PeNro
FROM Fornecimento
WHERE Fornecimento.FNro =ANY(
SELECT FNro
FROM Fornecedor
WHERE lower(Fcidade) =
'piracicaba'));

18) (ALL)Obtenha o nome das peças não fornecidas por fornecedores de


categoria A

SELECT Peca.PeNome
FROM Peca
WHERE Peca.PeNro IN (SELECT Fornecimento.PeNro
FROM Fornecimento
WHERE Fornecimento.FNro <> ALL (
SELECT FNro
FROM Fornecedor
WHERE Fcateg = 'A'));

PeNome
Cinto
Volante
Painel

12
19) (EXISTS) Obtenha os nomes dos fornecedores que fornecem a peça 2.

SELECT DISTINCT Fornecedor.FNome


FROM Fornecedor, Fornecimento
WHERE (Fornecimento.FNro = Fornecedor.FNro
AND Fornecimento.PeNro = 2);

ou

SELECT FNome
FROM Fornecedor
WHERE EXISTS (
SELECT *
FROM Fornecimento
WHERE (Fornecimento.FNro = Fornecedor.FNro
AND Fornecimento.PeNro = 2));

FNome
CM

20) (GROUP BY) Obtenha a quantidade de cada peça utilizada em todos os


projetos

SELECT Fornecimento.PeNro, Sum(Fornecimento.Quant) AS SomaDeQuant


FROM Fornecimento
GROUP BY Fornecimento.PeNro;

PeNro SomaDeQuant
1 5
2 2
3 2
4 5
5 1

21) (HAVING) Obtenha os códigos das peças que são utilizadas em uma
quantidade inferior a 5 unidades na somatória de todos os projetos

13
SELECT PeNro, SUM(Quant) PeNro Expr1001
FROM Fornecimento 2 2
GROUP BYPeNro 3 2
HAVING SUM(QUANT) < 5; 5 1

22) (UNION) Obtenha os códigos das peças com preço menor que R$ 20 ou
que possuem a cor vermelha

SELECT PeNro
FROM Peca PeNro
WHERE PePreco < 20 2
UNION 3
SELECT PeNro 4
FROM Peca 5
WHERE PeCor = 'Vermelho';

SELECT PeNro
FROM Peca
WHERE PePreco < 20
INTERSECT
SELECT PeNro
FROM Peca
WHERE PeCor = 'Vermelho';

SELECT PeNro
FROM Peca
WHERE PePreco < 20
MINUS
SELECT PeNro
FROM Peca
WHERE PeCor = 'Vermelho';

SELECT PeNro
FROM Peca
WHERE PeCor = 'Vermelho'
MINUS
SELECT PeNro
FROM Peca
WHERE PePreco < 20

14
23) (VARIÁVEIS) Obtenha o código dos fornecedores concorrentes entre si

SELECT X.FNro, Y.FNro X.FNro Y.FNro


FROM Fornecimento X, Fornecimento Y 3 4
WHERE (X.FNro <> Y.FNro AND 4 3
X.PeNro = Y.PeNro);

24) Obtenha o nome das peças fornecidas que tenham o preço maior que R$
20

SELECT PeNome PeNome


FROM Peca, Fornecimento Cinto
WHERE (Peca.PeNro = Fornecimento.PeNro) Painel
AND (PePreco > 20);

25) Obtenha o nome das peças fornecidas que não são vermelhas e as suas
cores.
PeNome PeCor
SELECT DISTINCT Peca.PeNome, Peca.PeCor Cinto Azul
FROM Peca, Fornecimento
Lanterna Preto
WHERE (Peca.PeCor <> 'Vermelho') Limpador Amarelo
AND (Peca.PeNro = Fornecimento.PeNro);

26) (JOINs) Obtenha informações sobre todas as peças

SELECT *
FROM Peca INNER JOIN Fornecimento USING(PeNro);

SELECT *
FROM Peca RIGHT JOIN Fornecimento ON Peca.PeNro =
Fornecimento.PeNro;

15
SELECT *
FROM Peca LEFT JOIN Fornecimento ON Peca.PeNro =
Fornecimento.PeNro;

Peca.PeNro PeNome PePreco PeCor Fornecimento FNro PNro Quant


PE1 Cinto R$22,00 Azul PE1 PeNro F5 P4 5
PE2 Volante R$18,00 Vermelho PE2 F2 P2 1
PE2 Volante R$18,00 Vermelho PE2 F2 P3 1
PE3 Lanterna R$14,00 Preto PE3 F3 P4 2
PE4 Limpador R$9,00 Amarelo PE4 F4 P5 3
PE4 Limpador R$9,00 Amarelo PE4 F3 P5 2
PE5 Painel R$43,00 Vermelho PE5 F1 P1 1
PE6 Calota R$70,00 Preto
PE7 Para -choque R$55,00 Verde

Exercícios complementares:

1) Obtenha o nome dos projetos com duração entre 3 e 5 meses e que


possuam um preço menor que R$ 40000,00;
2) Quais os nomes das peças com preço maior que R$ 20,00 e que são
fornecidas por empresas de Campinas e utilizadas por projeto com duração
maior que 2 meses;
3) Obtenha o nome das peças utilizadas em cada projeto;
4) Obtenha o nome das peças que não são utilizadas em nenhum projeto;
5) Obtenha a cidade dos fornecedores da categoria A ou da categoria B;
6) Obtenha quantos tipos de peças são usados em cada projeto.

16
SQL ORACLE Parte 1 ?

Login : SYSTEM
Senha: MANAGER

Para criar um novo usuário no banco:


Create user nome_usuário identified by senha_usuário
Default tablespace users quota 1m on users // local e quantidade de espaço reservado
Password expire // para solicitar a mudança de senha no primeiro logon

Concessão de alguns privilégios aos usuários:


Grant connect to nome_usuario ; // direito de conexão.
Grant create table to nome_usuario ; // direito para criar tabelas.
Grant create trigger to nome_usuario ; // direito para criar gatilhos.

Para trocar de usuário no SQL Plus: connect;

Para ver as tabelas criadas: Select * from cat;

Para ver os campos e seus respectivos tipos em uma tabela: Desc nome_tabela;

Para excluir uma tabela: drop table nome_tabela ;

Para inserir dados em uma tabela

Insert into nome_da_tabela [(nome dos campos separados por vírgula )]


Values (valores de cada campo separados por virgula, obs: campos do tipo string e data
entre apóstrofos);

Exemplo:
Inserir uma tupla na tabela cliente:
insert into cliente (cpf, nome, idade, est_civ)
values (‘12345678901’, ‘Ademir’, 34, ‘casado’);
Obs: a ordem dos valores colocada na cláusula values deve ser igual a ordem dos
campos.

Supondo que se quisesse inserir o cliente apenas com número de cpf e nome, pode-
se então omitir os outros campos, desde que os campos omitidos possam receber
valores nulos:
insert into cliente (cpf, nome)
values (‘12345678901’, ‘Ademir’);

Também é possível fazer a inclusão sem utilizar os nomes dos campos, mas isso só é
possível quando se sabe a ordem que os campos estão na tabela no banco:
insert into cliente values (‘12345678901’, ‘Ademir’, 34, ‘casado’);

17
Uma observação do caso acima é que, uma vez que não definido em quais campos
da tabela serão inseridos valores, é preciso colocar valores para todos os campos que
existem na tabela do banco, mesmo que sejam valores nulos:
insert into cliente values (‘12345678901’, ‘Ademir’, null, null);

Inserindo um número de telefone:


insert into telefone values (01423451234, ‘fixo’);

Para inserir uma tupla na tabela cli_fone, é necessário que o número de telefone
informado exista na tabela telefone e o número de cpf exista na tabela cliente devido
às restrições de integridade dos relacionamentos:
insert into cli_fone (cpf, numero) values (‘12345678901’, 01423451234);

Para excluir dados de uma tabela


Delete from nome_da_tabela
Where <condição>; //
Obs: A cláusula where serve para selecionar grupos de tuplas que satisfaçam
determinada condição, a falta de uma condição acarreta a exclusão de todas as
tuplas da tabela.

Exemplo:
Delete from cliente
Where cpf = ‘12345678901’; // exclui apenas o cliente de número de cpf 12345678901.

ou

Delete from cliente


Where est_civ <> ‘solteiro’; // exclui todos os clientes que não são solteiros.

Para alterar os dados de uma tabela


Update nome_da_tabela set campo = novo_valor, campo2 = novo_valor
Where <condição>;

Exemplo:
Update cliente set idade = 15
Where cpf = ‘12345678901’;

ou

Update cliente set est_civ = ‘solteiro’


where idade <= 16 and sexo = ‘H’;

18
Recuperação (seleção) de dados
Seleção em uma tabela:

Select * from nome_da_tabela ; // retorna todos os campos da tabela e todas as tuplas.

ou

Select campos separados por vírgula (podendo omitir campos)


From nome_da_tabela
Where <condição>

Exemplo:
Select nome, idade
From Clientes
Where est_civ = ‘Solteiro’; // recupera o nome e a idade de cada cliente solteiro.

19

Você também pode gostar