Banco de Dados I - FTP da PUC

Propaganda
Banco de Dados I
Linguagem de Consulta (parte I)
DDL
DML
Linguagem de Consulta:SQL
contéudo
SQL: Structured Query Language
Originalmente SEQUEL Structured English Query Language
Projeta e Implementada pela IBM para System R.
Não procedural e baseada em álgebra relacional
Linguagem padronizada de consulta (ANSI e ISO)
• SQ-86 (SQL1), SQ-92 (SQL2) e SQ-3 (O.O.)
DDL: criação e modificação de esquemas e restrições
DML: inserção, remoção, atualização e consulta de
dados
Parada técnica
Ciclo de vida do Proj. de Banco de Dados
Análise
Projeto Conceitual
Projeto
Projeto Lógico Implementação
Projeto Físico
Parada técnica
Ciclo de vida do Proj. de Banco de Dados
Análise
Projeto Conceitual
(de onde viemos)
Projeto
Projeto Lógico
(estamos aqui)
Implementação
Projeto Físico
(para onde vamos)
Mundo
Parada técnica
Real
Projeto Conceitual
Modelo
de
Dados
Diag. Entidade Relacionamento
(de onde viemos)
Projeto Lógico
Modelo
Lógico
Diagrama Relacional
(estamos aqui)
Projeto Físico
SQL
(para onde vamos)
Exemplo - pedido
Diagrama Entidade-Relacionamento
N
Pedido
Pedido
N
N
faz
tira
1
1
Cliente
Cliente
Vendedor
Vendedor
possui
N
Produto
Produto
Exemplo Pedido
N
Diagrama ER
Pedido
Pedido
N
possui
N
Produto
Produto
N
faz
tira
1
Cliente
Cliente
1
Vendedor
Vendedor
Diagrama de Tabelas
Pedido
Pedido
Cliente
Cliente
Vendedor
Vendedor
Item_de_Pedido
Item_de_Pedido
(possui )
(possui )
Produto
Produto
Exemplo Pedido
PEDIDO
PEDIDO
Núm_pedido ⌫
Núm_pedido ⌫
Prazo_entrega
Prazo_entrega
Código_cliente Código_cliente Código_vendedor
Código_vendedor
ITEM_DO_PEDIDO
ITEM_DO_PEDIDO
Núm_pedido ⌫
Núm_pedido ⌫
Código_produto⌫
Código_produto⌫
Quantidade
Quantidade
CLIENTE
CLIENTE
Código_cliente ⌫
Código_cliente ⌫
Nome_cliente
Nome_cliente
Endereço
Endereço
Cidade
Cidade
CEP
CEP
UF
UF
CGC
CGC
IE
IE
VENDEDOR
VENDEDOR
Código_vendedor⌫
Código_vendedor⌫
Nome_vendedor
Nome_vendedor
Faixa_comissão
Faixa_comissão
Salário_fixo
Salário_fixo
PRODUTO
PRODUTO
Código_produto⌫
Código_produto⌫
Descrição
Descrição
Unidade
Unidade
Val_unit
Val_unit
SQL:DDL
exemplo - pedido
Linguagem de Definição de
Dados: ... create, alter, drop
Criação e Destruição de Tabelas
0 comando CREATE TABLE cria a tabela solicitada e obedece a
seguinte forma:
CREATE TABLE <tabela>
(<descrição das colunas>);
(<descrição das chaves>);
<tabela> - 0 nome da nova tabela a ser criada;
<descrição das colunas> - É uma lista de colunas
(campos) e seus respectivos tipos de dados. (smallint,
char, money, varchar, integer, decimal, float, real, date,
time, timestamp, logical).
<descrição das chaves> - É a lista de colunas que
são tratadas como chaves: primária ou estrangeira.
Criação e Destruição de Tabelas
Alguns tipos em Oracle:
char (n) : cadeia de caracter de tamanho fixo (pode-se usar character - máx n 255).
varchar ou varchar2(n): caracteres de tamanho variável. (pode-se usar character
varing - máx n 2000).
smallint: é um inteiro pequeno.
number (p,d): número com máx. de 38 caracteres, onde p é o total incluindo a casa
decimal e d é o número de casas decimais. Ex: numeric(3,1) 44,5 444,5 e 0,31
float (n): número em ponto flutuante com precisão definida pelo usuário em pelo menos
n dígitos.
date: tipo calendário contendos século, ano (4 dígitos), mês, dia,horas, minutos e
segundos. 12:00 quando somente data for informado, formato padrão: DD-MON-YY )
long: alfanumérico de tamanho variável. ( 2Giga), um por tabela. Não pode ser usado
em consulta
raw ou long raw: campo binário de tamanho variável. ( 2000 e 2Giga)
Criando tabelas
Create table CLIENTE
( código_cliente smallint not null,
Nome_cliente char(20),
Endereço char (30),
Cidade char(15),
Cep char(8),
uf char(2),
Cgc char(20) unique,
ie char(20),
Primary key(código_cliente) );
Create table PEDIDO
( num_pedido smallint not null primary key,
Prazo_entrega smallint not null,
Código_cliente smallint not null,
Código_vendedor smallint not null,
Foreign key (código_cliente)
References CLIENTE ( codigo_cliente),
Foreign key (código_vendedor)
References VENDEDOR );
Ex:tabelas ITEM_DO_PEDIDO
CREATE TABLE ITEM_DO_PEDIDO
(
num_pedido smallint not null,
codigo_produto smallint not null,
quantidade number(3),
FOREIGN KEY (num_pedido)
REFERENCES PEDIDO,
FOREIGN KEY (codigo_produto)
REFERENCES PRODUTO,
PRIMARY KEY ( num_pedido, codigo_produto ) );
Ex:tabelas Vendedor e Produto
CREATE TABLE VENDEDOR
( código_vendedor smallint not null,
nome_vendedor char(20),
salário_fixo number(6,2),
faixa_comissão char(1),
PRIMARY KEY (código_vendedor) );
CREATE TABLE PRODUTO
( código_produtosmallint not null ,
unidade char(3),
descrição_produtoChar (30),
val_unit number(10,2),
CONSTRAINT CLIC_PK PRIMARY KEY (código_produto));
Destruição de Tabelas
Forma: DROP TABLE <tabela>;
DROP TABLE PEDIDO;
SQL:DML
exemplo - pedido
Linguagem de Manipulação de
Dados (DML): ...
consulta: select
inserção: insert
remoção: delete
atualização: update
Representação de Dados-SQL
Tabela (relação), coluna(atributo) e linhas (tuplas)
Aluno
tabela
RA
Nome
Idade
952001
Ana
19
992655
Marcão
20
302566
Paulinha
22
...
...
...
Coluna 1
Coluna 2
Coluna 3
Linha 1
Consultando dados: estrutura
Select
From
Where
colunas
tabela
restrições
(projeção π)
(linhas seleção δ)
Aluno
RA
Nome
Idade
952001
Ana
19
992655
Marcão
20
302566
Paulinha
22
...
...
...
tabela
Coluna 1
Linha 1
Extraindo Dados de uma Tabela: Comando
SELECT (projeção - π )
A) Selecionando Colunas Especificas da Tabela:
• Forma:
Select <nome(s) da(s) coluna(s)>
From <tabela>;
• Problema :
-Listar todos os produtos com respectivas descrições, unidades e
valores unitários.
SQL:
•
Select descrição, unidade, valor_unitário
From produto;
Resultado:
Extraindo Dados de uma Tabela: Comando
SELECT (projeção - π )
Exerc 2:
-Listar todos
clientes, com seus nomes, endereços e CGC.
SQL:
SELECT nome_cliente, endereço, CGC
FROM Cliente;
•Resultado:
Nome do
Cliente
Ana
Flávio
Jorge
Lúcia
...
Endereço
CGC
Rua 17 n 19
Av. Pres. Vargas 10
Rua Caiapo 13
Rua Itabira 123 Loja 9
...
12113231/0001-34
225334786/9387-9
14512764/98349-9
28315213/9348-8
...
José
Quadra 3 bl. 3 sl 1003
2176357/1232-3
Extraindo Dados de uma Tabela: Comando
SELECT (projeção - π )
B) Selecionando todas as Colunas da Tabela
• Forma:
Select *
From <tabela> ;
• Problema:
- Listar todo o conteúdo de Vendedor
SQL:
Select
From
Código do
Vendedor
209
111
11
240
720
213
101
310
250
*
vendedor ;
Nome do
Vendedor
José
Carlos
João
Antônio
Felipe
Jonas
João
Josias
Maurício
Salário
Fixo
1.800,00
2.490,00
2.780,00
9.500,00
4.600,00
2.300,00
2.650,00
870,00
2.930,00
Faixa de
Comissão
C
A
C
C
A
A
C
B
B
Selecionando somente alguns Registros da
Tabela: ( seleção - δ)
• Forma:
Select <nomes da(s) coluna(s)>
From <tabela>
Where <restrições>;
Onde:
Where
<nome da coluna> <operador> <valor>
C.1) Operadores Relacionais:
Observações:
= , <> ou != , < , >
>= , <=
quando o atributo é do tipo caracter, o <valor> deve estar entre aspas (‘).
Ex: ‘Parafuso’. Em SQL existe diferença entre ‘Parafuso’ e ‘parafuso’.
Selecionando somente alguns Registros da
Tabela: ( seleção - δ)
• Problema:
- Listar o num_pedido, o código_produto e a quantidade dos itens do pedido
com a quantidade igual a 35.
SQL:
Select
From
Where
num_pedido, código_produto, quantidade
item_do_pedido
quantidade = 35;
Resultado:
Número do
Pedido
Código do
Produto
Quantidade
121
31
35
138
77
35
Selecionando somente alguns Registros da
Tabela: ( seleção - δ)
Problema:
- Quais os clientes que moram em Niterói?
SQL:
Select nome_cliente
From cliente
Where cidade = 'Niterói' ;
Resultado:
NOME CLIENTE
Ana
Susana
Selecionando somente alguns Registros da
Tabela:
C.2) Operadores Lógicos:
AND , OR ;
NOT.
Uso de ( ) para alterar a precedência : AND > OR
Problema :
Listar
os produtos que tenham unidade igual a ‘M’ e valor unitário igual a R$ 1,05
SQL:
Select descrição_produto
From produto
Where unidade = ‘M’ AND val_unit = 1.05* ;
•Resultado:
DESCRICAO
Papel
Em inglês val_unit = 1.05 , em português val_unit = 1,05
Selecionando somente alguns Registros da
Tabela:
Exerc 3:
Liste os clientes e seus respectivos endereços que moram em ‘São
Paulo‘OU estejam na faixa de CEP entre '30077000' e '30079000'.
SQL:
SELECT nome_cliente, endereco
FROM Cliente
WHERE (cep >= ‘30077000’ AND cep <= ‘30079000’) OR
cidade = ‘São Paulo’ ;
•Resultado:
NOME CLIENTE
Flávio
Jorge
Maurício
Rodolfo
Beth
Lívio
Renato
ENDERECO CLIENTE
Av.Pres.Vargas10
Rua Caiapo13
Av.Paulista1236 sl 2345
Largo da Lapa 27 sobrado
Av. Climério n.45
Av. Beira Mar n.1256
Rua Meireles n.1231 bl.2 sl.345
Selecionando somente alguns Registros da
Tabela:
Problema:
- Mostrar todos os pedidos que não tenham prazo de entrega igual a 15 dias
SQL:
• Resultado:
Select num_pedido
From pedido
Where NOT ( prazo_entrega = 15 );
NÚMERO DO PEDIDO
121
97
137
148
104
203
......
98
91
138
119
127
Selecionando Registros da Tabela:
C.3) Operadores Between e NOT Between
Where <nome da coluna>
BETWEEN <valor1> AND <valor2>
Where <nome da coluna> NOT BETWEEN <valor1> AND <valor2>
Pesquisa por uma determinada coluna que esteja dentro
da faixa de valores.
Não há necessidade dos operadores >=, <= e AND.
• Os VALOR1 e VALOR2 têm que ser do mesmo tipo de
dado da coluna.
Selecionando Registros da Tabela:
C.3) Operadores Between e NOT Between
Problema:
-Listar o código e a descrição dos produtos que tenham o valor unitário na faixa
de R$ 0,32 até R$ 2,00.
SQL:
Select
From
Where
código_ produto, descrição_produto
produto
val_unit BETWEEN 0.32 AND 2.00;
Resultado:
CÓDIGO DO
PRODUTO
25
31
78
53
87
77
DESCRIÇÃO
Queijo
Chocolate
Vinho
Linha
Cano
Papel
Selecionando Registros da Tabela:
C.4) Operadores LIKE e NOT LIKE
-Where <nome da coluna> LIKE <valor>;
-Where <nome da coluna> NOT LIKE <valor>;
LIKE e NOT LIKE só trabalham sobre colunas que sejam do tipo CHAR.
Eles têm praticamente o mesmo funcionamento que os operadores =, < > ,
Podem utilizar os símbolos ( % ) e ( _ ) que podem fazer o papel de "Curinga":
% - substitui uma palavra
_ - substitui um caractere
Ex ‘LAPIS % 'pode enxergar os seguintes registros:
• ‘LAPIS PRETO’,
• ‘LAPIS CERA',
• 'LAPIS BORRACHA’
‘BROCA N_’ pode enxergar os seguintes registros;
• 'BROCA N1,
• 'BROCA N9,
• ‘BROCA N3,
Selecionando Registros da Tabela:
C.4) Operadores LIKE e NOT LIKE
Exerc 4:
- Listar todos os produtos que tenham a sua unidade começando por ‘Q’.
SQL:
SELECT código_produto, descrição_produto
FROM Produto
WHERE unidade LIKE ‘Q_’ ;
Resultado:
CODIGO DO PRODUTO
25
DESCRIÇÃO
Queijo
Selecionando Registros da Tabela:
C.4) Operadores LIKE e NOT LIKE
Exerc 5:
- Listar os vendedores que não começam pôr ‘Jo’
SQL:
Select
From
Where
código_vendedor, nome_vendedor
vendedor
nome_vendedor NOT LIKE ‘Jo%’ ;
Resultado:
CÓDIGO VENDEDOR
NOME VENDEDOR
111
Carlos
240
Antônio
720
Felipe
250
Maurício
Selecionando Registros da Tabela:
C.5) Operadores IN e NOT IN
-Where
<nome da coluna> IN <valores>;
-Where <nome da coluna> NOT IN <valores> ;
Pesquisam registros que estão ou não contidos no conjunto de
<valores> fornecido.
Estes minimizam o uso dos operadores: =, <>, AND e OR.
Selecionando Registros da Tabela:
C.5) Operadores IN e NOT IN
• Problema:
- Listar os vendedores que são da faixa de comissão A e B.
SQL:
Select nome_vendedor
From vendedor
Where faixa comissão IN (‘A’, 'B');
• Resultado:
NOME
VENDEDOR
Carlos
Felipe
Jonas
Josias
Maurício
Selecionando Registros da Tabela:
C.6) Operadores IS NULL e IS NOT NULL
- Where<nome da coluna> IS NULL;
- Where<nome da coluna> IS NOT NULL;
• Problema:
- Mostrar os clientes que não tenham inscrição estadual.
SQL:
Select
*
From
cliente
Where IE IS NULL ;
Selecionando Registros da Tabela:
D) Ordenando os Dados Selecionados
Select <nome da(s) coluna(s)>
From <tabela>
Where <condição(es)>
Order by <nome da(s) coluna(s)> ASC / DESC
ou
Order by <número da coluna >
ASC (default) / DESC
• Problema:
- Mostrar em ordem alfabética a lista de vendedores e seus respectivos
salários fixos.
SQL:
Select
nome_vendedor, salário_fixo
From
vendedor
Order by nome_vendedor;
Selecionando Registros da Tabela:
D) Ordenando os Dados Selecionados
• Problema:
- Listar os nomes, cidades e estados de todos os clientes, ordenados por estado e
cidade de forma descendente.
SQL:
Select
nome_cliente, cidade, UF
From
cliente
Order by UF DESC, cidade DESC;
• Problema:
- Mostrar a descrição e o valor unitário de todos os produtos que tenham a
unidade 'M', em ordem de valor unitário ascendente.
SQL:
Select
From
Where
Order by
descrição, val_unit
produto
unidade = ‘M’
2 ASC;
Selecionando Registros da Tabela:
E) Realizando CÁLCULOS com Informações Selecionada
• Problema:
- Mostrar o novo salário fixo dos vendedores, de faixa de comissão 'C’,
calculado com base no reajuste de 75% acrescido de R$ 120,00 de
bonificação. Ordenar pelo nome do vendedor.
SQL:
Select
From
Where
Order by
nome_vendedor, novo salário = (salário_fixo * 1.75) + 120
vendedor
faixa comissão = 'C'
nome_vendedor ;
Em SQL pode-se criar um campo que não pertence a tabela ou
mesmo renomear o nome da coluna com “novo nome” após a coluna
no comando select
Selecionando Registros da Tabela:
F) Utilizando Funções sobre Conjuntos
• MAX, MIN
• SUM, AVG
F.1) Buscando Máximos e Mínimos (MAX, MIN)
• Problema:
- Mostrar o menor e o maior salário de vendedor.
Resultado:
SQL:
Select
From
MIN (salário_fixo), MAX (salário_fixo)
vendedor ;
MIN (salário fixo)
MAX (salário fixo)
870,00
9.500,00
F.2) Totalizando Colunas (SUM)
•Problema:
-
Mostrar a quantidade total pedida para o produto 'VINHO' de código '78'.
SQL:
Select SUM(quantidade),
From item_do_pedido
Where código_produto = ‘78’ ;
Resultado:
SUM (Quantidade)
183
Selecionando Registros da Tabela:
F) Utilizando Funções sobre Conjuntos
F.2) Totalizando Colunas (SUM)
• Problema:
- Qual a média dos salários fixos dos vendedores?
SQL:
Resultado:
SELECT AVG(salário_fixo)
FROM Vendedor;
AVG(salário_fixo)
3.324,44
F.4) Contando os Registros (COUNT)
• Problema:
- Quantos vendedores ganham acima de R$ 2.500,00 de salário fixo?
SQL:
Resultado:
Select COUNT(*),
From vendedor
Where salário_fixo >2500 ;
COUNT(*)
5
Selecionando Registros da Tabela:
F.5) Utilizando a Cláusula DISTINCT
Vários registros dentro de uma tabela podem conter os mesmos valores, com
exceção da chave primária.
Algumas consultas podem trazer informações erradas.
A cláusulaDISTINCT,foi criada para não permitir que certas redundâncias,
obviamente necessárias, causem problemas.
• Problema:
- Quais as unidades de produtos, diferentes, na tabela produto?
SQL:
Select DISTINCT unidade
From produto;
Resultado:
UNIDADE
K
BAR
L
M
SAC
G
Selecionando Registros da Tabela:
F.6) Agrupando Informações Selecionadas (GROUP BY)
A cláusula GROUP BY, organiza a se1eção de dados em
grupos determinados.
• Forma:
Select <nome da(s) coluna(s)>
From
<tabela>
Where
<condição (ões)>
Group by <nome da(s) coluna(s)>;
Order by <nome da(s) coluna(s)>;
Selecionando Registros da Tabela:
F.6) Agrupando Informações Selecionadas (GROUP BY)
• Problema:
- Listar o número de produtos que cada pedido contém.
SQL:
Select
num_pedido, total_produto = COUNT(*)
From
item_do_pedido
Group by num_pedido;
Resultado:
NUMERO
DO PEDIDO
TOTAL DE
PRODUTOS
91
1
97
1
98
1
101
3
....
....
143
2
148
5
189
1
203
1
• Inicialmente, os registros são ordenados de forma ascendente por número do
pedido.
• Em segundo passo, é aplicada a operação COUNT (*) para cada grupo de registros
que tenha o mesmo numero de pedido.
• Após a operação de contagem de cada grupo, o resultado da consulta utilizando a
clausula GROUP BY é apresentado.
Selecionando Registros da Tabela:
F.7) Agrupando de forma Condicional (HAVING)
• Problema:
- Listar os pedidos que têm mais do que 3 produtos.
SQL:
Select
num_pedido, total_produto = COUNT(*)
From
item_do_pedido
Group by num_pedido
Having COUNT(*) >3;
Resultado:
NÚMERO DO PEDIDO
TOTAL DE PRODUTOS
119
4
148
5
Download