Criando tabelas
Para fazer isso, vamos utilizar como ferramenta o SQLite Online,
porque ele nos traz facilidade de execução, já que não precisamos
instalar nenhum tipo de ferramenta ou recurso em nosso próprio
ambiente, ou seja, fisicamente no nosso computador.
Vamos usar o SQLite Online devido à possibilidade de, sempre que for
necessário, executarmos e buscarmos pelo SQLite Online no
navegador, conseguindo executar a criação das tabelas, a inserção
dos dados e ter a possibilidade de executar as nossas consultas.
Acessando o SQLite Online
Vamos abrir o navegador e buscar por "SQLite Online". Ao acessar
o primeiro link disponível, logo a princípio já temos a área de criação
de tabelas e de execução, bem como todas as informações do SQLite
Online.
Pode haver uma diferença no seu ambiente. No menu lateral à direita,
normalmente, há uma aba de histórico, ou seja, tudo que
executamos, os comandos e assim por diante. No nosso caso, a fonte
está um pouco maior, então a área de histórico não fica localizada na
lateral direita.
Sendo assim, quando executarmos uma consulta que por algum
motivo dê erro, surgirá uma mensagem padrão de erro no centro da
tela e, logo abaixo, na área onde normalmente são retornadas as
informações buscadas na tabela, teremos a área de histórico.
Primeiramente, vamos remover a linha de comando da área central,
bem como a tabela demo na lateral esquerda. Para isso, clicamos
com o botão direito sobre ela e selecionamos a opção "DROP".
Na sequência, surgirá uma janela pop-up com o comando que será
executado:
DROP TABLE demo
Copiar código
Criando a tabela produtos
Agora, vamos começar a criar as nossas tabelas. Para que você
possa conhecer e saber quais campos cada tabela terá,
disponibilizaremos em uma atividade as estruturas de cada tabela.
Além disso, disponibilizaremos todos os comandos executados para
criar as tabelas e inserir os dados futuramente.
No total, teremos seis tabelas:
1. A tabela de produtos, onde teremos as informações dos
produtos;
2. A tabela colaboradores, onde teremos nome, ID, endereço;
3. A tabela fornecedores, com informações da pessoa responsável
quando entramos em contato, endereço, entre outras;
4. A tabela clientes, com endereço e e-mail de contato;
5. A tabela pedidos, com as informações das vendas;
6. E a itenspedidos, com os itens vendidos em cada pedido.
Começaremos criando a tabela produtos. Antes da palavra produtos,
passaremos o comando CREATE TABLE, e vamos abrir e fechar
parênteses ao final da linha de comando. Entre parênteses, vamos
colocar as informações dos produtos. São
elas: id, nome, descricao, preco e categoria.
CREATE TABLE produtos (
id,
nome,
descricao,
preco,
categoria
);
O id será um texto (TEXT), porque não queremos dar um limite para
esse campo, afinal, ele é um campo de ID, então ele deve crescer à
vontade. Além disso, ele é único, então sempre que um novo produto
for inserido, ele precisa ter um valor diferente. Por fim, precisamos
identificar o id como chave primária, então passamos PRIMARY KEY.
id TEXT PRIMARY KEY,
Para o nome, queremos estabelecer um limite, então definiremos
como VARCHAR(255). Da mesma forma, em descricao, também
colocaremos um VARCHAR(255).
nome VARCHAR(255),
descricao VARCHAR(255),
Na sequência, em preco, colocaremos um tipo numérico, mas que nos
permita usar casas decimais. Portanto, passaremos DECIMAL(10,2).
Por fim, em categoria, definiremos VARCHAR(50).
CREATE TABLE produtos (
id TEXT PRIMARY KEY,
nome VARCHAR(255),
descricao VARCHAR(255),
preco DECIMAL(10,2),
categoria VARCHAR(50)
);
Com a estrutura da tabela produtos finalizada, podemos selecionar o
código e executar. Feito isso, ao verificar a lateral esquerda, teremos
a tabela produtos na seção "Table".
Criando a tabela colaboradores
Podemos prosseguir para a criação da segunda tabela,
de colaboradores, seguindo o mesmo padrão. Digitamos CREATE
TABLE antes de colaboradores, e abrimos e fechamos parênteses ao
final.
Na estrutura da tabela colaboradores, temos : id, nome, cargo,
datacontratacao, telefone e email. Em seguida, adicionaremos os
dados de endereço, que estarão em campos diferentes. São
eles: rua, bairro, cidade, estado e cep. Para agilizar nosso processo,
vamos colar as informações já prontas:
CREATE TABLE colaboradores (
ID TEXT PRIMARY KEY,
Nome VARCHAR(255) NOT NULL,
Cargo VARCHAR(100),
DataContratacao DATE,
Telefone VARCHAR(20),
Email VARCHAR(100),
Rua VARCHAR(100) NOT NULL,
Bairro VARCHAR(100) NOT NULL,
Cidade VARCHAR(100) NOT NULL,
Estado VARCHAR(2) NOT NULL,
cep VARCHAR(8) NOT NULL
);
Copiar código
Temos o ID em formato textual novamente; o Nome que será
um VARCHAR(255); o Cargo com VARCHAR(100);
a DataContratacao que será uma data, portanto, tipo DATE;
o Telefone com VARCHAR(20); Email, Rua, Bairro e Cidade com VARCH
AR(100); Estado com VARCHAR(2); e cep com limite de 8 caracteres.
À frente de alguns campos, temos o comando NOT NULL, ou seja, não
aceita nulo. Sendo assim, precisamos obrigatoriamente preencher
esses campos com um valor.
Podemos selecionar o comando e executar. Ao final, teremos também
a tabela colaboradores listada no menu lateral esquerdo, com seus
respectivos campos.
Criando a tabela fornecedores
Vamos prosseguir para a tabela de fornecedores. Na
tabela fornecedores, teremos campos bastante semelhantes aos da
tabela de colaboradores,
como ID, Nome, Telefone, Email, Rua, Bairro, Cidade, Estado e cep.
Além disso, adicionaremos o campo Contato, que será
um VARCHAR(100) NOT NULL, pois é um dado muito importante a ser
inserido.
CREATE TABLE fornecedores (
ID TEXT PRIMARY KEY,
Nome VARCHAR(255) NOT NULL,
Contato VARCHAR(100) NOT NULL,
Telefone VARCHAR(20),
Email VARCHAR(100),
Rua VARCHAR(100) NOT NULL,
Bairro VARCHAR(100) NOT NULL,
Cidade VARCHAR(100) NOT NULL,
Estado VARCHAR(2) NOT NULL,
cep VARCHAR(8) NOT NULL
);
Copiar código
Adicionadas as informações da tabela, vamos selecionar o código e
executar. Feito isso, estarão listadas à esquerda as
tabelas produtos, colaboradores, e agora fornecedores.
Criando a tabela clientes
Vamos usar novamente o comando CREATE TABLE para criar a
tabela clientes e abrir parênteses. Nessa tabela, teremos os seguintes
campos: id, nome, telefone, email e endereco. Nesse caso, o
endereço dos nossos clientes ficará em um único campo.
CREATE TABLE clientes (
id,
nome,
telefone,
email,
endereco
);
Copiar código
Feito isso, vamos definir os tipos. O id será um TEXT e definiremos ele
como PRIMARY KEY. Podemos definir a PRIMARY KEY tanto após o
nome do campo (id TEXT PRIMARY KEY), quanto após todos os
campos, indicando qual é a chave primária com PRIMARY KEY (id).
Ambas as formas funcionam.
id TEXT NOT NULL,
nome,
telefone,
email,
endereco,
PRIMARY KEY (id)
Copiar código
O campo nome será um VARCHAR(255); telefone será
um VARCHAR(20); email receberá um VARCHAR(100); e endereco,
um VARCHAR(255) também.
Vale notar que o email não é um campo obrigatório para os clientes.
Nesse caso, podemos usar outro recurso da linguagem SQL:
definir valores padrão para os campos.
Assim, sempre que um cliente não informar o email, podemos colocar
um valor padrão como DEFAULT e passar um valor entre aspas
simples na sequência, por exemplo, "Sem email".
Isso evita campos vazios sem informações dos dados de clientes, o
que pode afetar alguma análise ou alguma estrutura que necessite
desses valores especificamente.
CREATE TABLE clientes (
id TEXT NOT NULL,
nome VARCHAR(255),
telefone VARCHAR(20),
email VARCHAR(100) DEFAULT 'Sem email',
endereco VARCHAR(255),
PRIMARY KEY (id)
);
Copiar código
Podemos selecionar o código acima e executar em "Run".
Criando a tabela pedidos
Agora vamos criar a penúltima tabela: pedidos. Essa tabela terá
poucos campos: id, idcliente, datahorapedido e status. O
campo datahorapedido corresponde à data e ao horário em que o
pedido foi realizado; e o status serve para saber se o pedido está
aberto, fechado, em andamento ou entregue.
Sabemos que o id é do tipo TEXT e uma PRIMARY KEY. Em idcliente,
vamos passar também o tipo TEXT. datahorapedido será do
tipo DATETIME, e por fim, status será um VARCHAR(50).
Após isso, precisamos fazer o relacionamento entre a
tabela pedidos e a tabela clientes, criando a nossa FOREIGN KEY,
ou chave estrangeira (chave secundária). Primeiro, passaremos
para FOREIGN KEY o campo de referência idcliente. Em seguida,
vamos referenciar a tabela clientes e o seu campo id. Ao final,
adicionaremos a informação ON DELETE CASCADE.
Entenderemos como funciona o ON DELETE CASCADE mais adiante
nos nossos estudos. Porém, lembre-se dessa informação, pois ela será
bastante útil quando formos trabalhar com exclusão de dados das
tabelas no banco de dados.
CREATE TABLE pedidos (
id TEXT PRIMARY KEY,
idcliente TEXT,
datahorapedido DATETIME,
status VARCHAR(50),
FOREIGN KEY (idcliente) REFERENCES clientes(id) ON DELETE
CASCADE
);
Copiar código
Finalizada a estrutura da tabela pedidos, vamos selecionar o código e
executar. Agora, além da tabela clientes no menu lateral esquerdo,
temos a tabela pedidos com seus respectivos campos.
Criando a tabela itenspedidos
Agora vamos criar a nossa última tabela: a tabela itenspedidos. Na
tabela itenspedidos, teremos a quantidade, o precounitario, e a chave
primária, que será diferente de todas que já criamos.
Nesse caso, a PRIMARY KEY será a chave primária de duas outras
tabelas: da tabela de idpedido, pois precisamos referenciar a qual
pedido os itens pertencem; e da tabela idproduto, pois também
precisaremos saber qual produto faz parte do pedido. A junção desses
campos criará a chave primária.
CREATE TABLE itenspedidos (
idpedido,
idproduto,
quantidade,
precounitario
);
Copiar código
Primeiramente, idpedido e idproduto serão do tipo TEXT. Além disso,
indicaremos que ambos são chaves primárias (PRIMARY KEY), porém,
faremos isso após pecounitario, passando PRIMARY KEY e, entre
parênteses, os campos idpedido e idproduto, separados por vírgulas.
A quantidade será um valor inteiro, então passamos INTEGER. Por
fim, precounitario será um DECIMAL de 10 dígitos com duas casas
decimais. Precisamos também referenciar as
tabelas pedidos e produtos. Para isso, podemos copiar o FOREIGN
KEY do código da tabela anterior e colar duas vezes.
Nesse caso, passaremos para a primeira FOREIGN KEY o
campo idpedido, e para a segunda, o campo idproduto. Em seguida,
vamos referenciar, respectivamente, a tabela pedidos e a
tabela produtos.
CREATE TABLE itenspedidos (
idpedido TEXT,
idproduto TEXT,
quantidade INTEGER,
precounitario DECIMAL(10,2),
PRIMARY KEY (idpedido, idproduto),
FOREIGN KEY (idpedido) REFERENCES pedidos(id) ON DELETE
CASCADE,
FOREIGN KEY (idproduto) REFERENCES produtos(id) ON DELETE
CASCADE
);
Copiar código
Após executar o comando, temos a tabela itenspedidos criada com a
chave primária composta.
RESUMINDO - tabelas criadas:
CREATE TABLE produtos (
id text PRIMARY key ,
nome varchar (255),
descricao varchar (255),
preco decimal (10,2),
categoria varchar (50)
);
CREATE TABLE colaboradores (
ID TEXT PRIMARY KEY,
Nome VARCHAR(255) NOT NULL,
Cargo VARCHAR(100),
DataContratacao DATE,
Telefone VARCHAR(20),
Email VARCHAR(100),
Rua VARCHAR(100) NOT NULL,
Bairro VARCHAR(100) NOT NULL,
Cidade VARCHAR(100) NOT NULL,
Estado VARCHAR(2) NOT NULL,
cep VARCHAR(8) NOT NULL
);
CREATE TABLE fornecedores (
ID TEXT PRIMARY KEY,
Nome VARCHAR(255) NOT NULL,
Contato VARCHAR(100) NOT NULL,
Telefone VARCHAR(20),
Email VARCHAR(100),
Rua VARCHAR(100) NOT NULL,
Bairro VARCHAR(100) NOT NULL,
Cidade VARCHAR(100) NOT NULL,
Estado VARCHAR(2) NOT NULL,
cep VARCHAR(8) NOT NULL
);
CREATE TABLE clientes (
id TEXT NOT NULL,
nome VARCHAR(255),
telefone VARCHAR(20),
email VARCHAR(100) DEFAULT 'Sem email',
endereco VARCHAR(255),
PRIMARY KEY (id)
);
CREATE TABLE pedidos (
id TEXT PRIMARY KEY,
idcliente TEXT,
datahorapedido DATETIME,
status VARCHAR(50),
FOREIGN KEY (idcliente) REFERENCES clientes(id) ON DELETE
CASCADE
);
CREATE TABLE itenspedidos (
idpedido TEXT,
idproduto TEXT,
quantidade INTEGER,
precounitario DECIMAL(10,2),
PRIMARY KEY (idpedido, idproduto),
FOREIGN KEY (idpedido) REFERENCES pedidos(id) ON DELETE
CASCADE,
FOREIGN KEY (idproduto) REFERENCES produtos(id) ON DELETE
CASCADE
);
Para saber mais: manipulação de valores default em bancos
de dados
Próxima Atividade
Quando você está aprendendo sobre bancos de dados, um dos
conceitos importantes que você encontrará é o uso de valores
padrão, ou "default values". Valores padrão são aqueles que o banco
de dados automaticamente atribui a um campo quando um novo
registro é criado, caso nenhum outro valor seja fornecido. Agora,
vamos explorar por que isso é útil e como pode influenciar a
consistência dos seus dados.
Por que utilizar valores padrão?
Imagine que você tem um formulário de inscrição para um evento
online. Algumas informações são cruciais, como nome e e-mail, mas
outras, como o telefone de contato, podem ser opcionais. Se o
usuário não preencher o campo do telefone, o que acontece quando
essa informação é enviada para o banco de dados? É aí que o valor
padrão entra.
Se você definir um valor padrão para o campo do telefone, como "Não
fornecido", sempre que um registro for criado sem um número de
telefone, o banco de dados irá automaticamente preencher esse
campo com "Não fornecido". Isso ajuda a manter a consistência dos
dados, evitando campos completamente vazios, que podem causar
confusão ou erros em relatórios e análises futuras.
Como definir valores padrão?
A definição de valores padrão geralmente é feita durante a criação da
tabela no banco de dados. Vamos ver um exemplo de código SQL que
cria uma tabela com um valor padrão:
CREATE TABLE inscricoes_evento (
id INT AUTOINCREMENT PRIMARY KEY,
nome VARCHAR(100) NOT NULL,
email VARCHAR(100) NOT NULL,
telefone VARCHAR(20) DEFAULT 'Não fornecido'
);
Copiar código
Neste exemplo, estamos criando uma tabela
chamada inscricoes_evento, com campos
para id, nome, email e telefone. O campo telefone tem um valor
padrão definido como 'Não fornecido'. Isso significa que, se uma nova
inscrição for inserida sem um número de telefone, o banco de dados
irá automaticamente salvar 'Não fornecido' naquele campo.
Consequências para a consistência de dados
Usar valores padrão ajuda a manter a integridade e a consistência
dos dados. Sem eles, você poderia acabar com muitos campos nulos
(vazios), o que pode complicar a análise de dados. Por exemplo, se
você tentar contar quantas pessoas não forneceram um número de
telefone e o campo é nulo, você terá que tratar esses casos especiais
em suas consultas e relatórios.
Por outro lado, valores padrão inadequados podem levar a
informações enganosas. Se você definir um valor padrão que não faz
sentido para o contexto, como um número de telefone padrão
'123456789', isso pode distorcer sua compreensão dos dados. As
pessoas podem assumir que é um número real, quando, na verdade,
é apenas um substituto para um campo vazio.
Motivação
A teoria por trás dos valores padrão é baseada na ideia de que a
informação completa e consistente é fundamental para a integridade
dos dados. Dados consistentes são mais fáceis de analisar, entender
e manter. A motivação para usar valores padrão está em garantir que
todas as entradas no banco de dados tenham valores significativos e
previsíveis.
Em resumo, valores padrão são uma ferramenta poderosa para
manter a consistência dos dados em um banco de dados. Eles são
úteis não apenas para preencher informações que podem não ser
fornecidas pelo usuário, mas também para garantir que os dados
permaneçam limpos e confiáveis. Ao projetar suas tabelas de banco
de dados, considere cuidadosamente quais campos podem se
beneficiar de valores padrão e quais valores fazem sentido para o
contexto dos seus dados.
Inserindo dados
Salvando os comandos anteriores
Antes de fazer isso, é interessante conhecer um recurso bastante útil
do SQLite que nos auxiliará a sempre ter comandos que executamos
à mão: a opção de salvar os comandos que executamos.
Se observarmos o canto superior direito acima da área de código,
temos três botões: o botão de abrir uma nova aba, representado pelo
símbolo +; um botão para atualizar, representado por duas setas
formando um ciclo; e o botão "Save to file", para salvar os comandos
executados na guia do SQLite.
Quando clicamos nesse último botão, é automaticamente baixado um
arquivo. Esse arquivo estará na área de downloads com o
nome [Link]. Você pode trabalhá-lo em um editor de texto, ou
qualquer outro sistema de gerenciamento de banco de dados (SGBD)
que você utilize para criar tabelas.
Inserindo dados na tabela colaboradores
Agora que já salvamos os comandos, vamos abrir uma nova aba e
começar a inserir os dados. Para isso, vamos utilizar os comandos
de INSERT. Começaremos inserindo na tabela colaboradores.
Já temos a estrutura do comando pronta:
INSERT INTO colaboradores (ID, Nome, Cargo, DataContratacao,
Telefone, Email, Rua, Bairro, Cidade, Estado, CEP) VALUES
(1, 'Carlos Silva', 'Gerente', '2022-03-15', '115551234',
'[Link]@[Link]', 'Rua do Comércio - 258', 'Centro', 'São
Paulo', 'SP', '01000001');
Copiar código
A estrutura é a seguinte: temos o comando INSERT INTO seguido do
nome da tabela (colaboradores); depois, especificamos todos os
campos; passamos o parâmetro VALUES e, para ele, entre parênteses
e separados por vírgulas, informamos todos os valores para os
respectivos campos.
Podemos teclar "Ctrl + A" para selecionar todos os valores da aba e
clicar em "Run" para executar. Assim, teremos o primeiro colaborador
inserido.
Abaixo, vamos digitar o comando SELECT * FROM colaboradores e
executar.
SELECT * FROM colaboradores
Copiar código
DataCo Est
I Nom Car Telef Bai Cida
ntratac Email Rua ad cep
De go one rro de
ao o
Carlo Ger 1155 [Link] Rua do Ce São
2022-03- 0100
1s ent 5123 @[Link] Comércio - ntr Paul SP
15 0001
Silva e 4 m 258 o o
Com isso, inserimos nosso primeiro registro. Agora vamos inserir o
restante dos colaboradores, seguindo a mesma estrutura de código:
INSERT INTO colaboradores (ID, Nome, Cargo, DataContratacao,
Telefone, Email, Rua, Bairro, Cidade, Estado, CEP) VALUES
(2, 'Marta Sousa', 'Chef de Cozinha', '2022-05-10', '215555678',
'[Link]@[Link]', 'Rua dos Sabores - 456', 'Saboroso', 'São
Paulo', 'SP', '20000001'),
(3, 'Pedro Almeida', 'Barista', '2022-07-20', '315557890',
'[Link]@[Link]', 'Avenida do Café - 789', 'Centro', 'São
Paulo', 'SP', '01000001'),
(4, 'Sofia Rodrigues', 'Garçom', '2022-01-12', '415552345',
'[Link]@[Link]', 'Rua da Hospitalidade - 101', 'Boas
Maneiras', 'São Paulo', 'SP', '40000001'),
(5, 'João Pereira', 'Atendente', '2022-09-05', '515558765',
'[Link]@[Link]', 'Rua das flores - 210', 'Centro', 'São Paulo',
'SP', '20000001'),
(6, 'Inês Lima', 'Barista', '2022-04-02', '615553421',
'[Link]@[Link]', 'Rua das Entregas - 280', 'Entregas Rápidas',
'São Paulo', 'SP', '90000001'),
(7, 'Antonio Artur', 'Entregador', '2023-01-10', '568442577',
'[Link]@[Link]', 'Rua das flores - 210', 'Centro', 'São Paulo',
'SP', '20000001');
Copiar código
Essa é uma das formas de inserir mais de um registro
simultaneamente a uma tabela. Podemos simplesmente informar um
único comando de INSERT INTO, com a estrutura dos campos
e VALUES, e entre parênteses, separados por vírgula, inserimos o
restante das informações.
Vamos selecionar todos esses registros e clicar em "Run". Feito isso,
se executarmos o SELECT logo abaixo, todos os colaboradores serão
retornados na tabela a seguir:
DataC Tele Es
I Cid
Nome Cargo ontrat fon Email Rua Bairro ta cep
D ade
acao e do
115 [Link] Rua do São 010
Carlos Gerent 2022-
1 551 @[Link] Comércio - Centro Paul SP 000
Silva e 03-15
234 m 258 o 01
Chef
215 [Link] Rua dos São 200
Marta de 2022- Saboro
2 555 a@email.c Sabores - Paul SP 000
Sousa Cozinh 05-10 so
678 om 456 o 01
a
Pedro 315 [Link] São 010
Barist 2022- Avenida do
3 Almei 557 ida@email. Centro Paul SP 000
a 07-20 Café - 789
da 890 com o 01
Sofia 415 [Link] Rua da Boas São 400
Garço 2022-
4 Rodrig 552 ues@email Hospitalida Maneir Paul SP 000
m 01-12
ues 345 .com de - 101 as o 01
João 515 [Link] Rua das São 200
Atend 2022-
5 Pereir 558 a@email.c flores - Centro Paul SP 000
ente 09-05
a 765 om 210 o 01
Entreg
615 Rua das São 900
Inês Barist 2022- [Link]@ as
6 553 Entregas - Paul SP 000
Lima a 04-02 [Link] Rápida
421 280 o 01
s
Antoni 568 [Link] Rua das São 200
Entreg 2022-
7o 442 ur@email.c flores - Centro Paul SP 000
ador 01-10
Artur 577 om 210 o 01
Inserindo dados na tabela fornecedores
Agora, vamos para a próxima tabela, que será a de fornecedores.
Nesse caso, vamos usar o seguinte comando de INSERT INTO:
INSERT INTO fornecedores (ID, Nome, Contato, Telefone, Email, Rua,
Bairro, Cidade, Estado, CEP) VALUES
(1, 'Café do Brasil Ltda.', 'Maria Oliveira', '115551234',
'cafebrasil@[Link]', 'Rua do Café - 123', 'Centro', 'São Paulo', 'SP',
'01000000'),
(2, 'Laticínios Sabor Puro', 'João Santos', '215555678',
'laticinios@[Link]', 'Avenida das Vacas - 456', 'Leite Feliz', 'Rio de
Janeiro', 'RJ', '20000000'),
(3, 'Frutas Frescas S.A.', 'Carlos Ferreira', '315557890',
'frutasfrescas@[Link]', 'Rua das Maçãs - 789', 'Pomar Verde',
'Belo Horizonte', 'MG', '30000000'),
(4, 'Padaria da Cidade', 'Sofia Alves', '415552345',
'padariacidade@[Link]', 'Rua dos Pães - 101', 'Pão Quentinho',
'Salvador', 'BA', '40000000'),
(5, 'Fornecedor de Chocolate', 'Rui Lima', '515558765',
'chocolatelovers@[Link]', 'Rua do Cacau - 210', 'Chocolateira',
'Florianópolis', 'SC', '88000000'),
(6, 'Distribuidora de Bebidas', 'Ana Pereira', '615553421',
'bebidaspremium@[Link]', 'Avenida das Garrafas - 35', 'Copo
Cheio', 'Porto Alegre', 'RS', '90000000');
Copiar código
Observe que temos seis fornecedores. Vamos selecionar todos esses
registros e executar em "Run". Podemos alterar o comando SELECT *
FROM e colocar fornecedores para visualizar o resultado.
SELECT * FROM fornecedores
Copiar código
Tele Es
I Cont Bairr Cidad
Nome fon Email Rua ta cep
D ato o e
e do
Café do Maria 115 010
cafebrasil@e Rua do Centr São
1 Brasil Oliveir 551 SP 000
[Link] Café - 123 o Paulo
Ltda. a 234 00
João 215 Avenida Rio de 200
Laticínios laticinios@e Leite
2 Santo 555 das Vacas Janeir RJ 000
Sabor Puro [Link] Feliz
s 678 - 456 o 00
Frutas Carlos 315 Rua das Belo 300
frutasfrescas Pomar
3 Frescas Ferreir 557 Maçãs - Horizo MG 000
@[Link] Verde
S.A. a 890 789 nte 00
415 padariacidad Pão 400
Padaria da Sofia Rua dos Salva
4 552 e@[Link] Quent BA 000
Cidade Alves Pães - 101 dor
345 m inho 00
Tele Es
I Cont Bairr Cidad
Nome fon Email Rua ta cep
D ato o e
e do
Fornecedo 515 chocolatelov Rua do Floria 880
Rui Choco
5 r de 558 ers@email.c Cacau - nópoli SC 000
Lima lateira
Chocolate 765 om 210 s 00
Avenida
Distribuido Ana 615 bebidasprem 900
das Copo Porto
6 ra de Pereir 553 ium@email.c RS 000
Garrafas - Cheio Alegre
Bebidas a 421 om 00
35
Inserindo dados na tabela produtos
Vamos continuar populando as nossas tabelas. Já inserimos dados
em colaboradores, em fornecedores, e agora vamos inserir
em produtos. Para produtos, temos um número maior de registros
para inserir na tabela, totalizando 30 registros.
INSERT INTO produtos (ID, Nome, Descricao, Preco, Categoria)
VALUES
(1, 'Espresso', 'Um shot de espresso forte e encorpado.', 2.50, 'Café'),
(2, 'Cappuccino', 'Espresso, leite vaporizado e espuma de leite.', 3.50,
'Café'),
(3, 'Latte Macchiato', 'Leite vaporizado, espresso e espuma de leite.',
4.00, 'Café'),
(4, 'Mocha', 'Espresso, leite vaporizado, chocolate e chantilly.', 4.50,
'Café'),
(5, 'Café da Casa', 'Café da casa especial com sabor suave.', 2.00,
'Café'),
(6, 'Chá de Camomila', 'Chá de camomila com mel e limão.', 2.00,
'Chá'),
(7, 'Omelete de Queijo', 'Omelete recheada com queijo e ervas.', 7.50,
'Almoço'),
(8, 'Quiche de Espinafre', 'Quiche de espinafre e queijo de cabra.',
8.00, 'Almoço'),
(9, 'Frango ao Curry', 'Frango ao curry com arroz basmati.', 9.00,
'Jantar'),
(10, 'Tiramisu', 'Sobremesa italiana com café e mascarpone.', 5.00,
'Sobremesa'),
(11, 'Croissant de Chocolate', 'Croissant recheado com chocolate
belga.', 3.50, 'Sobremesa'),
(12, 'Cappuccino Gelado', 'Cappuccino gelado com chantilly e
canela.', 4.50, 'Café'),
(13, 'Salada de Quinoa', 'Salada de quinoa com vegetais frescos.',
7.00, 'Almoço'),
(14, 'Sanduíche de Peru', 'Sanduíche de peru com queijo e mostarda.',
6.00, 'Almoço'),
(15, 'Salmão Grelhado', 'Salmão grelhado com legumes da estação.',
11.00, 'Jantar'),
(16, 'Cheesecake de Framboesa', 'Cheesecake de framboesa com
calda.', 5.50, 'Sobremesa'),
(17, 'Smoothie de Frutas', 'Smoothie refrescante de frutas da
estação.', 4.00, 'Bebidas'),
(18, 'Chá Verde', 'Chá verde com gengibre e limão.', 2.50, 'Chá'),
(19, 'Baguete de Presunto', 'Baguete fresca recheada com presunto e
queijo.', 10.00, 'Almoço'),
(20, 'Salada de Frutas', 'Salada de frutas frescas com iogurte.', 4.00,
'Sobremesa'),
(21, 'Caprese Wrap', 'Wrap recheado com tomate, mozzarella e
manjericão.', 6.50, 'Almoço'),
(22, 'Muffin de Mirtilo', 'Muffin de mirtilo recém-assado.', 3.00, 'Café'),
(23, 'Smoothie de Manga', 'Smoothie refrescante de manga e
banana.', 4.50, 'Bebidas'),
(24, 'Misto Quente', 'Sanduíche misto quente de presunto e queijo.',
5.50, 'Almoço'),
(25, 'Tarte Tatin de Maçã', 'Tarte de maçã caramelizada.', 5.00,
'Sobremesa'),
(26, 'Sanduíche de Frango', 'Sanduíche de frango grelhado e
abacate.', 7.00, 'Almoço'),
(27, 'Batido de Morango', 'Batido cremoso de morango com chantilly.',
4.50, 'Bebidas'),
(28, 'Croissant de Amêndoa', 'Croissant recheado com chocolate
belga.', 3.50, 'Sobremesa'),
(29, 'Tofu Scramble', 'Scramble de tofu com vegetais e espinafre.',
6.50, 'Sobremesa'),
(30, 'Salada de Atum', 'Salada de atum com feijão e pimentão.', 8.00,
'Almoço');
Copiar código
Nessa tabela, temos uma estrutura
com ID, Nome, Descricao, Preco e Categoria. Por exemplo: o primeiro
produto tem o ID 1; o nome "Espresso"; a descrição "Um shot de
espresso forte e encorpado"; o preço, que é R$ 2,50; e a sua
categoria, que é "Café". Temos toda essa estrutura para cada produto.
Podemos selecionar os 30 registros e clicar em "Run".
Executando o comando abaixo, temos acesso à seguinte tabela:
SELECT * FROM produtos
Copiar código
Visualização dos cinco primeiros registros da tabela. Para visualizá-la
na íntegra, execute o comando na sua máquina.
i prec catego
nome descricao
d o ria
1 Espresso Um shot de espresso forte e encorpado. 2.50 Café
Espresso, leite vaporizado e espuma de
2 Cappuccino 3.50 Café
leite.
Latte Leite vaporizado, espresso e espuma de
3 4.00 Café
Macchiato leite.
Espresso, leite vaporizado, chocolate e
4 Mocha 4.50 Café
chantilly.
5 Café da Casa Café da casa especial com sabor suave. 2.00 Café
Inserindo dados na tabela clientes
Vamos prosseguir e inserir dados na próxima tabela: a de clientes.
Lembre-se: quando criamos essa tabela, definimos um
valor DEFAULT no campo email, então quando o cliente não tiver um
e-mail, colocamos como valor padrão o texto "Sem email" no campo.
Iremos inserir os clientes com o seguinte código:
INSERT INTO clientes (ID, Nome, Telefone, Email, Endereco) VALUES
(1, 'Maria Silva', '115551234', '[Link]@[Link]', 'Rua das
Flores, 123, Cidade A'),
(2, 'João Pereira', '215555678', '[Link]@[Link]', 'Av.
Principal, 456, Cidade B'),
(3, 'Ana Rodrigues', '315557890', '[Link]@[Link]', 'Rua
Central, 789, Cidade C'),
(4, 'Pedro Alves', '415552345', '[Link]@[Link]', 'Travessa
dos Sonhos, 56, Cidade D'),
(5, 'Sofia Santos', '515558765', '[Link]@[Link]', 'Alameda
das Artes, 321, Cidade E'),
(6, 'Jorge Lima', '615553421', '[Link]@[Link]', 'Praça das
Estrelas, 987, Cidade F'),
(7, 'Luisa Ferreira', '715559876', '[Link]@[Link]', 'Rua das
Palmeiras, 789, Cidade G'),
(8, 'Carlos Gomes', '815552345', '[Link]@[Link]', 'Avenida
dos Ventos, 123, Cidade H'),
(9, 'Marta Ribeiro', '915555432', '[Link]@[Link]', 'Travessa
das Maravilhas, 56, Cidade I');
Copiar código
Para essa tabela, temos a seguinte
estrutura: ID, Nome, Telefone, Email e Endereco. Todos esses clientes,
do 1 ao 9, possuem e-mail. Assim, podemos inserir todos em uma
única vez, que é uma das formas de realizar INSERT em tabelas.
Podemos também validar clientes, usando o comando SELECT *
FROM. Como resultado, teremos uma tabela com os 9 clientes, com
seus respectivos e-mails e outras informações.
SELECT * FROM clientes
Copiar código
Porém, quando formos inserir um cliente que não possui e-mail, não
podemos seguir essa mesma estrutura, porque inserindo vários
blocos de clientes, haverá erro ao passar um cliente sem e-mail. Será
indicado que estamos com mais campos do que registros, já que
alguns clientes têm e-mail e, especificamente, os próximos clientes
que adicionaremos não vão ter. Então, vamos inseri-los de outra
forma:
INSERT INTO clientes (ID, Nome, Telefone, Email, Endereco) VALUES
(10, 'Ana Maria Silva', '1515557890', '[Link]@[Link]', 'Rua
Central, 567, Cidade O');
INSERT INTO clientes (ID, Nome, Telefone, Endereco) VALUES
(11, 'André Almeida', '1015556789', 'Praça da Felicidade, 456, Cidade
J');
INSERT INTO clientes (ID, Nome, Telefone, Email, Endereco) VALUES
(12, 'João Carlos Rodrigues', '1615552345',
'[Link]@[Link]', 'Praça dos Poetas, 321, Cidade P');
INSERT INTO clientes (ID, Nome, Telefone, Endereco) VALUES
(13, 'Isabela Pereira', '1115558765', 'Rua das Araras, 789, Cidade K');
Copiar código
Nesse caso, a cada valor, inserimos um comando INSERT INTO.
Observe que, nos clientes 11 e 13, passamos apenas os
campos ID, Nome, Telefone e Endereco e seus respectivos valores.
Após executar o comando, temos essa execução na aba histórico sem
erros.
Ao executar SELECT * FROM clientes novamente, temos uma tabela
com alguns clientes com e-mail registrado e outros sem e-mail. Por
exemplo:
telefon
idnome email endereco
e
…… … … …
1 151555 [Link]@email.c Rua Central, 567,
Ana Maria Silva
0 7890 om Cidade O
1 101555 Praça da Felicidade,
André Almeida Sem email
1 6789 456, Cidade J
1 João Carlos 161555 [Link]@e Praça dos Poetas, 321,
2 Rodrigues 2345 [Link] Cidade P
1 111555 Rua das Araras, 789,
Isabela Pereira Sem email
3 8765 Cidade K
Agora vamos finalizar a inserção dos clientes na tabela. Copiaremos
mais um bloco de INSERT INTO na tabela clientes, colaremos na área
de código e executaremos em "Run".
INSERT INTO clientes (ID, Nome, Telefone, Email, Endereco) VALUES
(14, 'Isabel Gonçalves', '1715558765', '[Link]@[Link]',
'Alameda das Gaivotas, 654, Cidade Q'),
(15, 'Ricardo Ferreira', '1815554321', '[Link]@[Link]',
'Avenida da Paz, 987, Cidade R'),
(16, 'Mariana Costa', '1915551234', '[Link]@[Link]',
'Travessa das Mariposas, 234, Cidade S'),
(17, 'Luís Carlos Sousa', '2015555678', '[Link]@[Link]', 'Rua
dos Sonhos, 456, Cidade T'),
(18, 'Silvia Ribeiro', '2115557890', '[Link]@[Link]',
'Alameda dos Sorrisos, 765, Cidade U'),
(19, 'Artur Santos', '2215552345', '[Link]@[Link]', 'Praça
das Alegrias, 987, Cidade V'),
(21, 'Carolina Lima', '2315558765', '[Link]@[Link]',
'Avenida da Felicidade, 654, Cidade W'),
(22, 'Pedro Almeida', '2415554321', '[Link]@[Link]', 'Rua
das Estrelas, 123, Cidade X'),
(23, 'Inês Gonçalves', '2515551234', '[Link]@[Link]',
'Travessa das Maravilhas, 234, Cidade Y');
Copiar código
Feito isso, adicionaremos outro bloco de código, com clientes que
também não possuem e-mail.
INSERT INTO clientes (ID,Nome, Telefone, Endereco) VALUES
(24, 'Rui Santos', '1215554321', 'Alameda das Estrelas, 654, Cidade
L');
INSERT INTO clientes (ID,Nome, Telefone, Email, Endereco) VALUES
(25, 'Diogo Fernandes', '2615555678', '[Link]@[Link]',
'Praça dos Desejos, 987, Cidade Z');
INSERT INTO clientes (ID,Nome, Telefone, Endereco) VALUES
(26, 'Helena Lima', '1315551234', 'Avenida dos Sonhos, 234, Cidade
M');
INSERT INTO clientes (ID,Nome, Telefone, Endereco) VALUES
(27, 'Paulo Sousa', '1415555678', 'Travessa das Marés, 876, Cidade
N');
Copiar código
Após executar o trecho acima, executaremos o comando SELECT *
FROM clientes. Na aba de histórico, teremos o resultado que tudo
ocorreu sem erros. Como retorno, temos os 27 clientes na tabela,
tanto os que têm e-mail, quanto aqueles que não têm.
Salvando os comandos
Para finalizar essa etapa, vamos salvar todos os comandos inseridos.
Basta clicar no botão "Save to file" no canto superior direito. Ao fazer
isso, será baixado um novo arquivo ([Link]).
Inserindo dados na tabela pedidos
Vamos abrir uma nova guia clicando no botão de mais (+), também
no canto superior direito, para começar a popular a tabela
de pedidos. Nesse caso, o processo será um pouco diferente: vamos
fazer a importação de um arquivo CSV.
Para importar um arquivo, selecionamos no menu superior a opção
"Import". Será aberta uma janela de importação com a mensagem
"import file name", onde encontraremos a opção "Open" para abrir
um diretório do nosso ambiente, isto é, do nosso computador, e
selecionar um arquivo.
No disco C:, criamos uma pasta chamada "SQL" com a subpasta
"Arquivos", onde adicionamos dois arquivos: Itens de
[Link] e [Link]. Disponibilizaremos esses arquivos para que
você possa fazer o seu INSERT nas tabelas. Vamos começar pelo
arquivo [Link].
Na janela do SQLite Online, será informado o tipo, o nome da tabela,
o delimitador, entre outras informações. Porém, o que vai importar
para nós são duas opções.
A primeira delas é a "Column name", ou seja, o nome das colunas,
que no momento são c1, c2, c3 e c4. Vamos definir esse campo como
"First line", isto é, a primeira linha do arquivo enviado. Ao selecionar
essa opção, ele automaticamente sobe essas informações.
A segunda definição que nos interessa é a de "Command", onde
temos as opções "Run", "Run && Show Code", e "Show Code". Vamos
selecionar a última opção, porque não queremos executar, e também
não queremos executar e exibir; queremos apenas visualizar essas
informações para podermos inserir manualmente na tabela. Após
definir isso, podemos clicar em "Ok" no canto inferior direito.
Feito isso, será inserido na nova aba um comando de criação da
tabela, ou seja, um CREATE TABLE, e um comando de INSERT INTO,
para que possamos realizar a inserção dos dados. Automaticamente,
ele faz essa conversão de CSV para comando SQL.
Nesse caso, podemos remover o comando CREATE TABLE, porque já
temos a tabela de pedidos criada. Temos os
campos ID, IDCliente, DataHoraPedido e Status. Agora vamos
executar esse comando.
Ao final, já temos um retorno positivo no histórico de que foi
realmente executado. Porém, ainda podemos executar o
comando SELECT * FROM pedidos. Dessa fora, teremos todos os
pedidos armazenados.
SELECT * FROM pedidos
Copiar código
Visualização dos cinco primeiros registros da tabela. Para visualizá-la
na íntegra, execute o comando na sua máquina.
i idclien
datahorapedidostatus
d te
2023-01-02 Em
1 10
08:15:00 Andamento
2023-01-02
2 3 Concluído
08:45:00
2023-01-02
3 8 Entregue
09:30:00
2023-01-02 Em
4 14
10:00:00 Andamento
2023-01-02
5 7 Concluído
11:30:00
Inserindo dados na tabela itenspedidos
Por último, vamos abrir mais uma vez outra aba, para importar dados
para a tabela itenspedidos. Seguiremos os mesmos passos até
"Import > Open" e selecionaremos o arquivo Itens de [Link].
Vamos mudar o nome da tabela para ItensPedidos, que é como está
na tabela no SQLite. Além disso, mudaremos a opção em "Column
name" para "First line", para pegar a primeira linha conforme fizemos
anteriormente. Por fim, em vez de manter "Run" em "Command",
vamos colocar também "Show Code".
Da mesma forma, removeremos o comando CREATE TABLE e
ajustaremos para o padrão o nome dos campos. Assim, teremos as
colunas IDPedido, IDProduto, Quantidade e PrecoUnitario.
Para finalizar, vamos apenas validar uma informação. Na
tabela itenspedidos, temos muitas linhas. Sendo assim,
provavelmente, foi criado mais de um comando INSERT. Precisamos
validar isso antes de executar a inserção dos dados.
Nesse caso, até o item 259 da tabela, temos um comando INSERT, e a
partir do 260, outro comando INSERT. Portanto, devemos fazer as
alterações dos nomes dos campos também no segundo comando.
Agora vamos selecionar o primeiro comando INSERT e executar. Após
fazer isso, podemos selecionar o restante dos dados, que está no
segundo comando INSERT, e executar da mesma forma.
Desse modo, temos todos os nossos dados dentro da
tabela itenspedidos. Podemos executar o comando SELECT * FROM
itenspedidos para visualizar o resultado da tabela populada.
SELECT * FROM itenspedidos
Copiar código
Visualização dos cinco primeiros registros da tabela. Para visualizá-la
na íntegra, execute o comando na sua máquina.
idpedi idprodu quantida precounita
do to de rio
1 5 1 2
1 2 2 7
2 12 3 13.5
3 8 1 8
3 20 1 4
Conclusão
Agora que já inserimos os dados, podemos executar as
nossas consultas!
INSERT INTO 'Pedidos' ('ID','IDCliente','DataHoraPedido','Status')
VALUES
('1','10','2023-01-02 08:15:00','Em Andamento'),
('2','3','2023-01-02 08:45:00','Concluído'),
('3','8','2023-01-02 09:30:00','Entregue'),
('4','14','2023-01-02 10:00:00','Em Andamento'),
('5','7','2023-01-02 11:30:00','Concluído'),
('6','1','2023-01-02 12:45:00','Entregue'),
('7','25','2023-01-06 08:30:00','Em Andamento'),
('8','9','2023-01-06 09:00:00','Concluído'),
('9','12','2023-01-06 09:30:00','Entregue'),
('10','26','2023-01-06 10:15:00','Em Andamento'),
('11','4','2023-01-06 10:45:00','Concluído'),
('12','5','2023-01-06 12:00:00','Em Andamento'),
('13','22','2023-01-12 08:15:00','Concluído'),
('14','18','2023-01-12 09:45:00','Entregue'),
('15','19','2023-01-12 10:30:00','Em Andamento'),
('16','15','2023-01-12 11:00:00','Concluído'),
('17','20','2023-01-12 12:15:00','Entregue'),
('18','13','2023-01-18 09:15:00','Em Andamento'),
('19','23','2023-01-18 09:45:00','Concluído'),
('20','2','2023-01-18 10:30:00','Entregue'),
('21','6','2023-01-22 08:00:00','Em Andamento'),
('22','11','2023-01-22 09:30:00','Concluído'),
('23','21','2023-01-22 10:45:00','Entregue'),
('24','16','2023-01-22 11:15:00','Em Andamento'),
('25','24','2023-01-26 12:00:00','Concluído'),
('26','17','2023-01-26 12:30:00','Entregue'),
('27','8','2023-02-01 08:30:00','Em Andamento'),
('28','12','2023-02-01 10:00:00','Concluído'),
('29','2','2023-02-01 11:15:00','Entregue'),
('30','16','2023-02-03 09:45:00','Em Andamento'),
('31','25','2023-02-03 12:30:00','Concluído'),
('32','7','2023-02-05 08:15:00','Entregue'),
('33','10','2023-02-05 10:30:00','Em Andamento'),
('34','4','2023-02-06 08:00:00','Concluído'),
('35','11','2023-02-06 10:15:00','Entregue'),
('36','15','2023-02-06 12:45:00','Em Andamento'),
('37','26','2023-02-07 09:00:00','Concluído'),
('38','3','2023-02-07 10:45:00','Entregue'),
('39','18','2023-02-07 11:30:00','Em Andamento'),
('40','20','2023-02-10 08:15:00','Concluído'),
('41','21','2023-02-10 09:30:00','Entregue'),
('42','13','2023-02-10 11:00:00','Em Andamento'),
('43','9','2023-02-12 08:45:00','Concluído'),
('44','5','2023-02-12 10:30:00','Entregue'),
('45','19','2023-02-12 12:15:00','Em Andamento'),
('46','22','2023-02-15 08:30:00','Concluído'),
('47','24','2023-02-15 09:15:00','Entregue'),
('48','1','2023-02-15 10:00:00','Em Andamento'),
('49','23','2023-02-18 11:45:00','Concluído'),
('50','6','2023-02-18 12:00:00','Entregue'),
('51','8','2023-03-01 08:15:00','Em Andamento'),
('52','10','2023-03-01 10:30:00','Concluído'),
('53','4','2023-03-01 11:45:00','Entregue'),
('54','2','2023-03-01 12:00:00','Em Andamento'),
('55','16','2023-03-02 09:00:00','Concluído'),
('56','12','2023-03-02 10:15:00','Entregue'),
('57','26','2023-03-02 11:30:00','Em Andamento'),
('58','5','2023-03-03 08:30:00','Concluído'),
('59','9','2023-03-03 10:45:00','Entregue'),
('60','18','2023-03-03 12:15:00','Em Andamento'),
('61','1','2023-03-04 08:45:00','Concluído'),
('62','22','2023-03-04 09:15:00','Entregue'),
('63','15','2023-03-04 10:00:00','Em Andamento'),
('64','19','2023-03-05 08:00:00','Concluído'),
('65','21','2023-03-05 09:30:00','Entregue'),
('66','7','2023-03-05 10:45:00','Em Andamento'),
('67','11','2023-03-06 11:00:00','Concluído'),
('68','13','2023-03-06 12:30:00','Entregue'),
('69','3','2023-03-07 08:15:00','Em Andamento'),
('70','24','2023-03-07 09:00:00','Concluído'),
('71','17','2023-03-07 10:30:00','Entregue'),
('72','23','2023-03-08 08:00:00','Em Andamento'),
('73','6','2023-03-08 09:45:00','Concluído'),
('74','20','2023-03-08 11:15:00','Entregue'),
('75','14','2023-03-09 12:45:00','Em Andamento'),
('76','25','2023-03-09 13:30:00','Concluído'),
('77','8','2023-04-01 08:15:00','Em Andamento'),
('78','10','2023-04-01 10:30:00','Concluído'),
('79','4','2023-04-01 11:45:00','Entregue'),
('80','2','2023-04-01 12:00:00','Em Andamento'),
('81','16','2023-04-02 09:00:00','Concluído'),
('82','12','2023-04-02 10:15:00','Entregue'),
('83','26','2023-04-02 11:30:00','Em Andamento'),
('84','5','2023-04-03 08:30:00','Concluído'),
('85','9','2023-04-03 10:45:00','Entregue'),
('86','18','2023-04-03 12:15:00','Em Andamento'),
('87','1','2023-04-04 08:45:00','Concluído'),
('88','22','2023-04-04 09:15:00','Entregue'),
('89','15','2023-04-04 10:00:00','Em Andamento'),
('90','19','2023-04-05 08:00:00','Concluído'),
('91','21','2023-04-05 09:30:00','Entregue'),
('92','7','2023-04-05 10:45:00','Em Andamento'),
('93','11','2023-04-06 11:00:00','Concluído'),
('94','13','2023-04-06 12:30:00','Entregue'),
('95','3','2023-04-07 08:15:00','Em Andamento'),
('96','24','2023-04-07 09:00:00','Concluído'),
('97','17','2023-04-07 10:30:00','Entregue'),
('98','23','2023-04-08 08:00:00','Em Andamento'),
('99','6','2023-04-08 09:45:00','Concluído'),
('100','20','2023-04-08 11:15:00','Entregue'),
('101','14','2023-04-09 12:45:00','Em Andamento'),
('102','25','2023-04-09 13:30:00','Concluído'),
('103','8','2023-05-01 08:15:00','Em Andamento'),
('104','10','2023-05-01 10:30:00','Concluído'),
('105','4','2023-05-01 11:45:00','Entregue'),
('106','2','2023-05-01 12:00:00','Em Andamento'),
('107','16','2023-05-02 09:00:00','Concluído'),
('108','12','2023-05-02 10:15:00','Entregue'),
('109','26','2023-05-02 11:30:00','Em Andamento'),
('110','5','2023-05-03 08:30:00','Concluído'),
('111','9','2023-05-03 10:45:00','Entregue'),
('112','18','2023-05-03 12:15:00','Em Andamento'),
('113','1','2023-05-03 08:45:00','Concluído'),
('114','22','2023-05-03 09:15:00','Entregue'),
('115','15','2023-05-03 10:00:00','Em Andamento'),
('116','19','2023-05-04 08:00:00','Concluído'),
('117','21','2023-05-04 09:30:00','Entregue'),
('118','7','2023-05-04 10:45:00','Em Andamento'),
('119','11','2023-05-05 11:00:00','Concluído'),
('120','13','2023-05-05 12:30:00','Entregue'),
('121','3','2023-05-06 08:15:00','Em Andamento'),
('122','24','2023-05-06 09:00:00','Concluído'),
('123','17','2023-05-06 10:30:00','Entregue'),
('124','23','2023-05-07 08:00:00','Em Andamento'),
('125','6','2023-05-07 09:45:00','Concluído'),
('126','20','2023-05-07 11:15:00','Entregue'),
('127','14','2023-05-08 12:45:00','Em Andamento'),
('128','25','2023-05-08 13:30:00','Concluído'),
('129','8','2023-05-15 08:15:00','Entregue'),
('130','10','2023-05-15 10:30:00','Em Andamento'),
('131','4','2023-05-15 11:45:00','Concluído'),
('132','2','2023-05-15 12:00:00','Entregue'),
('133','16','2023-05-15 09:00:00','Em Andamento'),
('134','12','2023-05-15 10:15:00','Concluído'),
('135','26','2023-05-15 11:30:00','Entregue'),
('136','5','2023-05-20 08:30:00','Em Andamento'),
('137','9','2023-05-20 10:45:00','Concluído'),
('138','18','2023-05-20 12:15:00','Entregue'),
('139','1','2023-05-20 08:45:00','Em Andamento'),
('140','22','2023-05-20 09:15:00','Concluído'),
('141','15','2023-05-20 10:00:00','Entregue'),
('142','19','2023-05-25 08:00:00','Em Andamento'),
('143','21','2023-05-25 09:30:00','Concluído'),
('144','7','2023-05-25 10:45:00','Entregue'),
('145','11','2023-05-25 11:00:00','Em Andamento'),
('146','13','2023-05-25 12:30:00','Concluído'),
('147','3','2023-05-30 08:15:00','Entregue'),
('148','24','2023-05-30 09:00:00','Em Andamento'),
('149','17','2023-05-30 10:30:00','Concluído'),
('150','23','2023-05-30 08:00:00','Em Andamento'),
('151','6','2023-05-30 09:45:00','Entregue'),
('152','8','2023-06-01 08:15:00','Em Andamento'),
('153','10','2023-06-01 10:30:00','Concluído'),
('154','4','2023-06-01 11:45:00','Entregue'),
('155','2','2023-06-01 12:00:00','Em Andamento'),
('156','16','2023-06-02 09:00:00','Concluído'),
('157','12','2023-06-02 10:15:00','Entregue'),
('158','26','2023-06-02 11:30:00','Em Andamento'),
('159','5','2023-06-03 08:30:00','Concluído'),
('160','9','2023-06-03 10:45:00','Entregue'),
('161','18','2023-06-03 12:15:00','Em Andamento'),
('162','1','2023-06-04 08:45:00','Concluído'),
('163','22','2023-06-04 09:15:00','Entregue'),
('164','15','2023-06-04 10:00:00','Em Andamento'),
('165','19','2023-06-05 08:00:00','Concluído'),
('166','21','2023-06-05 09:30:00','Entregue'),
('167','7','2023-06-05 10:45:00','Em Andamento'),
('168','11','2023-06-06 11:00:00','Concluído'),
('169','13','2023-06-06 12:30:00','Entregue'),
('170','3','2023-06-07 08:15:00','Em Andamento'),
('171','24','2023-06-07 09:00:00','Concluído'),
('172','17','2023-06-07 10:30:00','Entregue'),
('173','23','2023-06-08 08:00:00','Em Andamento'),
('174','6','2023-06-08 09:45:00','Concluído'),
('175','20','2023-06-08 11:15:00','Entregue'),
('176','14','2023-06-09 12:45:00','Em Andamento'),
('177','25','2023-06-09 13:30:00','Concluído'),
('178','8','2023-06-10 08:15:00','Entregue'),
('179','10','2023-06-10 10:30:00','Em Andamento'),
('180','4','2023-06-10 11:45:00','Concluído'),
('181','2','2023-06-10 12:00:00','Entregue'),
('182','16','2023-06-11 09:00:00','Em Andamento'),
('183','12','2023-06-11 10:15:00','Concluído'),
('184','26','2023-06-11 11:30:00','Entregue'),
('185','5','2023-06-12 08:30:00','Em Andamento'),
('186','9','2023-06-12 10:45:00','Concluído'),
('187','18','2023-06-12 12:15:00','Entregue'),
('188','1','2023-06-13 08:45:00','Em Andamento'),
('189','22','2023-06-13 09:15:00','Concluído'),
('190','15','2023-06-13 10:00:00','Entregue'),
('191','19','2023-06-14 08:00:00','Em Andamento'),
('192','21','2023-06-14 09:30:00','Concluído'),
('193','7','2023-06-14 10:45:00','Entregue'),
('194','11','2023-06-15 11:00:00','Em Andamento'),
('195','13','2023-06-15 12:30:00','Concluído'),
('196','3','2023-06-15 08:15:00','Entregue'),
('197','24','2023-06-15 09:00:00','Em Andamento'),
('198','17','2023-06-15 10:30:00','Concluído'),
('199','23','2023-06-16 08:00:00','Entregue'),
('200','6','2023-06-16 09:45:00','Em Andamento'),
('201','8','2023-07-01 08:15:00','Em Andamento'),
('202','10','2023-07-01 10:30:00','Concluído'),
('203','4','2023-07-01 11:45:00','Entregue'),
('204','2','2023-07-01 12:00:00','Em Andamento'),
('205','16','2023-07-02 09:00:00','Concluído'),
('206','12','2023-07-02 10:15:00','Entregue'),
('207','26','2023-07-02 11:30:00','Em Andamento'),
('208','5','2023-07-03 08:30:00','Concluído'),
('209','9','2023-07-03 10:45:00','Entregue'),
('210','18','2023-07-03 12:15:00','Em Andamento'),
('211','1','2023-07-04 08:45:00','Concluído'),
('212','22','2023-07-04 09:15:00','Entregue'),
('213','15','2023-07-04 10:00:00','Em Andamento'),
('214','19','2023-07-05 08:00:00','Concluído'),
('215','21','2023-07-05 09:30:00','Entregue'),
('216','7','2023-07-05 10:45:00','Em Andamento'),
('217','11','2023-07-06 11:00:00','Concluído'),
('218','13','2023-07-06 12:30:00','Entregue'),
('219','3','2023-07-07 08:15:00','Em Andamento'),
('220','24','2023-07-07 09:00:00','Concluído'),
('221','17','2023-07-07 10:30:00','Entregue'),
('222','23','2023-07-08 08:00:00','Em Andamento'),
('223','6','2023-07-08 09:45:00','Concluído'),
('224','20','2023-07-08 11:15:00','Entregue'),
('225','14','2023-07-09 12:45:00','Em Andamento'),
('226','25','2023-07-09 13:30:00','Concluído'),
('227','8','2023-07-10 08:15:00','Entregue'),
('228','10','2023-07-10 10:30:00','Em Andamento'),
('229','4','2023-07-10 11:45:00','Concluído'),
('230','2','2023-07-10 12:00:00','Entregue'),
('231','16','2023-07-11 09:00:00','Em Andamento'),
('232','12','2023-07-11 10:15:00','Concluído'),
('233','26','2023-07-11 11:30:00','Entregue'),
('234','5','2023-07-12 08:30:00','Em Andamento'),
('235','9','2023-07-12 10:45:00','Concluído'),
('236','18','2023-07-12 12:15:00','Entregue'),
('237','1','2023-07-13 08:45:00','Em Andamento'),
('238','22','2023-07-13 09:15:00','Concluído'),
('239','15','2023-07-13 10:00:00','Entregue'),
('240','19','2023-07-14 08:00:00','Em Andamento'),
('241','21','2023-07-14 09:30:00','Concluído'),
('242','7','2023-07-14 10:45:00','Entregue'),
('243','11','2023-07-15 11:00:00','Em Andamento'),
('244','13','2023-07-15 12:30:00','Concluído'),
('245','3','2023-07-15 08:15:00','Entregue'),
('246','24','2023-07-15 09:00:00','Em Andamento'),
('247','17','2023-07-15 10:30:00','Concluído'),
('248','23','2023-07-16 08:00:00','Entregue'),
('249','6','2023-07-16 09:45:00','Em Andamento'),
('250','8','2023-07-20 08:15:00','Concluído'),
('251','10','2023-07-20 10:30:00','Entregue'),
('252','4','2023-07-20 11:45:00','Em Andamento'),
('253','2','2023-07-20 12:00:00','Concluído'),
('254','16','2023-07-21 09:00:00','Entregue'),
('255','12','2023-07-21 10:15:00','Em Andamento'),
('256','26','2023-07-21 11:30:00','Concluído'),
('257','5','2023-07-22 08:30:00','Entregue'),
('258','9','2023-07-22 10:45:00','Em Andamento'),
('259','18','2023-07-22 12:15:00','Concluído'),
('260','1','2023-07-23 08:45:00','Entregue'),
('261','22','2023-07-23 09:15:00','Em Andamento'),
('262','15','2023-07-23 10:00:00','Concluído'),
('263','19','2023-07-24 08:00:00','Entregue'),
('264','21','2023-07-24 09:30:00','Em Andamento'),
('265','7','2023-07-24 10:45:00','Concluído'),
('266','11','2023-07-25 11:00:00','Entregue'),
('267','13','2023-07-25 12:30:00','Em Andamento'),
('268','3','2023-07-25 08:15:00','Concluído'),
('269','24','2023-07-25 09:00:00','Entregue'),
('270','17','2023-07-25 10:30:00','Em Andamento'),
('271','23','2023-07-26 08:00:00','Concluído'),
('272','6','2023-07-26 09:45:00','Entregue'),
('273','8','2023-07-30 08:15:00','Em Andamento'),
('274','10','2023-07-30 10:30:00','Concluído'),
('275','4','2023-07-30 11:45:00','Entregue'),
('276','2','2023-07-30 12:00:00','Em Andamento'),
('277','8','2023-08-01 08:15:00','Em Andamento'),
('278','10','2023-08-01 10:30:00','Concluído'),
('279','4','2023-08-01 11:45:00','Entregue'),
('280','2','2023-08-01 12:00:00','Em Andamento'),
('281','16','2023-08-02 09:00:00','Concluído'),
('282','12','2023-08-02 10:15:00','Entregue'),
('283','26','2023-08-02 11:30:00','Em Andamento'),
('284','5','2023-08-03 08:30:00','Concluído'),
('285','9','2023-08-03 10:45:00','Entregue'),
('286','18','2023-08-03 12:15:00','Em Andamento'),
('287','1','2023-08-04 08:45:00','Concluído'),
('288','22','2023-08-04 09:15:00','Entregue'),
('289','15','2023-08-04 10:00:00','Em Andamento'),
('290','19','2023-08-05 08:00:00','Concluído'),
('291','21','2023-08-05 09:30:00','Entregue'),
('292','7','2023-08-05 10:45:00','Em Andamento'),
('293','11','2023-08-06 11:00:00','Concluído'),
('294','13','2023-08-06 12:30:00','Entregue'),
('295','3','2023-08-07 08:15:00','Em Andamento'),
('296','24','2023-08-07 09:00:00','Concluído'),
('297','17','2023-08-07 10:30:00','Entregue'),
('298','23','2023-08-08 08:00:00','Em Andamento'),
('299','6','2023-08-08 09:45:00','Concluído'),
('300','20','2023-08-08 11:15:00','Entregue'),
('301','14','2023-08-09 12:45:00','Em Andamento'),
('302','25','2023-08-09 13:30:00','Concluído'),
('303','8','2023-08-10 08:15:00','Entregue'),
('304','10','2023-08-10 10:30:00','Em Andamento'),
('305','4','2023-08-10 11:45:00','Concluído'),
('306','2','2023-08-10 12:00:00','Entregue'),
('307','16','2023-08-11 09:00:00','Em Andamento'),
('308','12','2023-08-11 10:15:00','Concluído'),
('309','26','2023-08-11 11:30:00','Entregue'),
('310','5','2023-08-12 08:30:00','Em Andamento'),
('311','9','2023-08-12 10:45:00','Concluído'),
('312','18','2023-08-12 12:15:00','Entregue'),
('313','1','2023-08-13 08:45:00','Em Andamento'),
('314','22','2023-08-13 09:15:00','Concluído'),
('315','15','2023-08-13 10:00:00','Entregue'),
('316','19','2023-08-14 08:00:00','Em Andamento'),
('317','21','2023-08-14 09:30:00','Concluído'),
('318','7','2023-08-14 10:45:00','Entregue'),
('319','11','2023-08-15 11:00:00','Em Andamento'),
('320','13','2023-08-15 12:30:00','Concluído'),
('321','3','2023-08-15 08:15:00','Entregue'),
('322','24','2023-08-15 09:00:00','Em Andamento'),
('323','17','2023-08-15 10:30:00','Concluído'),
('324','23','2023-08-16 08:00:00','Entregue'),
('325','6','2023-08-16 09:45:00','Em Andamento'),
('326','8','2023-08-20 08:15:00','Concluído'),
('327','10','2023-08-20 10:30:00','Entregue'),
('328','4','2023-08-20 11:45:00','Em Andamento'),
('329','2','2023-08-20 12:00:00','Concluído'),
('330','16','2023-08-21 09:00:00','Entregue'),
('331','12','2023-08-21 10:15:00','Em Andamento'),
('332','26','2023-08-21 11:30:00','Concluído'),
('333','5','2023-08-22 08:30:00','Entregue'),
('334','9','2023-08-22 10:45:00','Em Andamento'),
('335','18','2023-08-22 12:15:00','Concluído'),
('336','1','2023-08-23 08:45:00','Entregue'),
('337','22','2023-08-23 09:15:00','Em Andamento'),
('338','15','2023-08-23 10:00:00','Concluído'),
('339','19','2023-08-24 08:00:00','Entregue'),
('340','21','2023-08-24 09:30:00','Em Andamento'),
('341','7','2023-08-24 10:45:00','Concluído'),
('342','11','2023-08-25 11:00:00','Entregue'),
('343','13','2023-08-25 12:30:00','Em Andamento'),
('344','3','2023-08-25 08:15:00','Concluído'),
('345','24','2023-08-25 09:00:00','Entregue'),
('346','17','2023-08-25 10:30:00','Em Andamento'),
('347','23','2023-08-26 08:00:00','Concluído'),
('348','6','2023-08-26 09:45:00','Entregue'),
('349','8','2023-08-30 08:15:00','Em Andamento'),
('350','10','2023-08-30 10:30:00','Concluído'),
('351','4','2023-08-30 11:45:00','Entregue'),
('352','2','2023-08-30 12:00:00','Em Andamento'),
('353','16','2023-08-31 09:00:00','Concluído'),
('354','12','2023-08-31 10:15:00','Entregue'),
('355','8','2023-09-01 08:15:00','Em Andamento'),
('356','10','2023-09-01 10:30:00','Concluído'),
('357','4','2023-09-01 11:45:00','Entregue'),
('358','2','2023-09-01 12:00:00','Em Andamento'),
('359','16','2023-09-02 09:00:00','Concluído'),
('360','12','2023-09-02 10:15:00','Entregue'),
('361','26','2023-09-02 11:30:00','Em Andamento'),
('362','5','2023-09-03 08:30:00','Concluído'),
('363','9','2023-09-03 10:45:00','Entregue'),
('364','18','2023-09-03 12:15:00','Em Andamento'),
('365','1','2023-09-04 08:45:00','Concluído'),
('366','22','2023-09-04 09:15:00','Entregue'),
('367','15','2023-09-04 10:00:00','Em Andamento'),
('368','19','2023-09-05 08:00:00','Concluído'),
('369','21','2023-09-05 09:30:00','Entregue'),
('370','7','2023-09-05 10:45:00','Em Andamento'),
('371','11','2023-09-06 11:00:00','Concluído'),
('372','13','2023-09-06 12:30:00','Entregue'),
('373','3','2023-09-07 08:15:00','Em Andamento'),
('374','24','2023-09-07 09:00:00','Concluído'),
('375','17','2023-09-07 10:30:00','Entregue'),
('376','23','2023-09-08 08:00:00','Em Andamento'),
('377','6','2023-09-08 09:45:00','Concluído'),
('378','20','2023-09-08 11:15:00','Entregue'),
('379','14','2023-09-09 12:45:00','Em Andamento'),
('380','25','2023-09-09 13:30:00','Concluído'),
('381','8','2023-09-10 08:15:00','Entregue'),
('382','10','2023-09-10 10:30:00','Em Andamento'),
('383','4','2023-09-10 11:45:00','Concluído'),
('384','2','2023-09-10 12:00:00','Entregue'),
('385','16','2023-09-11 09:00:00','Em Andamento'),
('386','12','2023-09-11 10:15:00','Concluído'),
('387','26','2023-09-11 11:30:00','Entregue'),
('388','5','2023-09-12 08:30:00','Em Andamento'),
('389','9','2023-09-12 10:45:00','Concluído'),
('390','18','2023-09-12 12:15:00','Entregue'),
('391','1','2023-09-13 08:45:00','Em Andamento'),
('392','22','2023-09-13 09:15:00','Concluído'),
('393','15','2023-09-13 10:00:00','Entregue'),
('394','19','2023-09-14 08:00:00','Em Andamento'),
('395','21','2023-09-14 09:30:00','Concluído'),
('396','7','2023-09-14 10:45:00','Entregue'),
('397','11','2023-09-15 11:00:00','Em Andamento'),
('398','13','2023-09-15 12:30:00','Concluído'),
('399','3','2023-09-15 08:15:00','Entregue'),
('400','24','2023-09-15 09:00:00','Em Andamento'),
('401','17','2023-09-15 10:30:00','Concluído'),
('402','23','2023-09-16 08:00:00','Entregue'),
('403','6','2023-09-16 09:45:00','Em Andamento'),
('404','8','2023-09-20 08:15:00','Concluído'),
('405','10','2023-09-20 10:30:00','Entregue'),
('406','4','2023-09-20 11:45:00','Em Andamento'),
('407','2','2023-09-20 12:00:00','Concluído'),
('408','16','2023-09-21 09:00:00','Entregue'),
('409','12','2023-09-21 10:15:00','Em Andamento'),
('410','26','2023-09-21 11:30:00','Concluído'),
('411','5','2023-09-22 08:30:00','Entregue'),
('412','9','2023-09-22 10:45:00','Em Andamento'),
('413','18','2023-09-22 12:15:00','Concluído'),
('414','1','2023-09-23 08:45:00','Entregue'),
('415','22','2023-09-23 09:15:00','Em Andamento'),
('416','15','2023-09-23 10:00:00','Concluído'),
('417','19','2023-09-24 08:00:00','Entregue'),
('418','21','2023-09-24 09:30:00','Em Andamento'),
('419','7','2023-09-24 10:45:00','Concluído'),
('420','11','2023-09-25 11:00:00','Entregue'),
('421','13','2023-09-25 12:30:00','Em Andamento'),
('422','3','2023-09-25 08:15:00','Concluído'),
('423','24','2023-09-25 09:00:00','Entregue'),
('424','17','2023-09-25 10:30:00','Em Andamento'),
('425','23','2023-09-26 08:00:00','Concluído'),
('426','6','2023-09-26 09:45:00','Entregue'),
('427','8','2023-09-30 08:15:00','Em Andamento'),
('428','10','2023-09-30 10:30:00','Concluído'),
('429','4','2023-09-30 11:45:00','Entregue'),
('430','2','2023-09-30 12:00:00','Em Andamento'),
('431','16','2023-10-01 09:00:00','Concluído'),
('432','12','2023-10-01 10:15:00','Entregue'),
('433','26','2023-10-01 11:30:00','Em Andamento'),
('434','5','2023-10-02 08:30:00','Concluído'),
('435','9','2023-10-02 10:45:00','Entregue'),
('436','18','2023-10-02 12:15:00','Em Andamento'),
('437','1','2023-10-03 08:45:00','Concluído'),
('438','22','2023-10-03 09:15:00','Entregue'),
('439','15','2023-10-03 10:00:00','Em Andamento'),
('440','19','2023-10-04 08:00:00','Concluído'),
('441','21','2023-10-04 09:30:00','Entregue'),
('442','7','2023-10-04 10:45:00','Em Andamento'),
('443','11','2023-10-05 11:00:00','Concluído'),
('444','13','2023-10-05 12:30:00','Entregue'),
('445','3','2023-10-05 08:15:00','Em Andamento'),
('446','24','2023-10-05 09:00:00','Concluído'),
('447','17','2023-10-05 10:30:00','Entregue'),
('448','23','2023-10-06 08:00:00','Em Andamento'),
('449','6','2023-10-06 09:45:00','Concluído'),
('450','8','2023-10-06 10:30:00','Entregue');
INSERT INTO 'Itenspedidos'
('IDPedido','IDProduto','Quantidade','PrecoUnitario') VALUES
('1','5','1','2.00'),
('1','2','2','7.00'),
('2','12','3','13.50'),
('3','8','1','8.00'),
('3','20','1','4.00'),
('3','15','2','22.00'),
('4','6','1','2.00'),
('4','10','4','20.00'),
('5','19','1','10.00'),
('6','25','1','5.00'),
('6','1','2','5.00'),
('7','18','3','7.50'),
('8','27','1','4.50'),
('8','21','2','13.00'),
('9','9','1','9.00'),
('9','13','1','7.00'),
('9','4','2','9.00'),
('10','14','1','6.00'),
('10','3','3','12.00'),
('11','7','1','7.50'),
('11','28','2','7.00'),
('12','11','4','14.00'),
('13','22','1','3.00'),
('13','30','1','8.00'),
('13','16','2','11.00'),
('14','26','1','7.00'),
('14','17','3','12.00'),
('15','23','2','9.00'),
('16','29','1','6.50'),
('17','12','1','4.50'),
('17','24','1','5.50'),
('17','5','2','4.00'),
('18','19','2','20.00'),
('18','8','3','24.00'),
('19','21','1','6.50'),
('19','10','2','10.00'),
('20','6','1','2.00'),
('20','27','2','9.00'),
('21','15','1','11.00'),
('21','9','3','27.00'),
('22','13','1','7.00'),
('22','4','2','9.00'),
('23','3','1','4.00'),
('23','14','2','12.00'),
('24','7','1','7.50'),
('24','28','3','10.50'),
('25','16','1','5.50'),
('25','22','3','9.00'),
('25','11','2','7.00'),
('26','30','1','8.00'),
('26','17','2','8.00'),
('27','23','1','4.50'),
('27','26','3','21.00'),
('28','24','1','5.50'),
('28','29','2','13.00'),
('29','1','1','2.50'),
('29','20','2','8.00'),
('30','12','1','4.50'),
('30','5','3','6.00'),
('31','1','1','2.50'),
('31','9','2','18.00'),
('32','21','1','6.50'),
('32','13','3','21.00'),
('32','15','2','22.00'),
('33','7','1','7.50'),
('34','18','2','5.00'),
('34','12','3','13.50'),
('35','3','1','4.00'),
('36','28','1','3.50'),
('36','1','2','5.00'),
('37','14','2','12.00'),
('37','8','3','24.00'),
('38','20','1','4.00'),
('38','25','1','5.00'),
('38','16','2','11.00'),
('39','19','3','30.00'),
('40','6','1','2.00'),
('41','11','2','7.00'),
('42','26','1','7.00'),
('42','30','2','16.00'),
('43','10','1','5.00'),
('43','5','2','4.00'),
('43','22','3','9.00'),
('44','24','1','5.50'),
('45','29','2','13.00'),
('45','17','3','12.00'),
('46','23','1','4.50'),
('46','2','2','7.00'),
('47','9','1','9.00'),
('47','13','2','14.00'),
('47','28','3','10.50'),
('48','21','1','6.50'),
('49','4','2','9.00'),
('50','1','3','7.50'),
('51','8','1','8.00'),
('51','14','2','12.00'),
('52','16','1','5.50'),
('52','20','3','12.00'),
('53','4','2','9.00'),
('54','11','1','3.50'),
('54','21','3','19.50'),
('55','27','1','4.50'),
('55','28','2','7.00'),
('56','10','1','5.00'),
('56','19','3','30.00'),
('57','9','2','18.00'),
('58','30','1','8.00'),
('58','15','3','33.00'),
('59','3','1','4.00'),
('59','13','2','14.00'),
('60','24','3','16.50'),
('61','6','1','2.00'),
('61','23','2','9.00'),
('62','18','1','2.50'),
('62','25','3','15.00'),
('63','2','1','3.50'),
('63','5','2','4.00'),
('64','17','1','4.00'),
('64','29','3','19.50'),
('65','12','1','4.50'),
('65','26','2','14.00'),
('66','1','3','7.50'),
('67','22','1','3.00'),
('67','7','2','15.00'),
('68','15','3','33.00'),
('69','4','1','4.50'),
('69','9','2','18.00'),
('70','21','1','6.50'),
('70','13','3','21.00'),
('70','15','2','22.00'),
('71','7','1','7.50'),
('71','18','2','5.00'),
('72','10','1','5.00'),
('72','19','3','30.00'),
('73','4','1','4.50'),
('73','9','2','18.00'),
('74','26','2','14.00'),
('74','11','3','10.50'),
('75','20','1','4.00'),
('75','16','2','11.00'),
('76','27','1','4.50'),
('76','5','2','4.00'),
('76','28','3','10.50'),
('77','24','1','5.50'),
('78','29','2','13.00'),
('78','17','3','12.00'),
('79','23','1','4.50'),
('79','2','2','7.00'),
('80','9','1','9.00'),
('80','28','2','7.00'),
('80','13','3','21.00'),
('81','21','1','6.50'),
('82','4','2','9.00'),
('83','22','1','3.00'),
('83','1','3','7.50'),
('84','7','2','15.00'),
('84','15','3','33.00'),
('85','24','1','5.50'),
('85','12','2','9.00'),
('86','19','3','30.00'),
('87','12','1','4.50'),
('87','5','2','4.00'),
('88','16','1','5.50'),
('88','20','3','12.00'),
('89','4','2','9.00'),
('90','21','2','13.00'),
('90','11','3','10.50'),
('91','28','1','3.50'),
('91','27','2','9.00'),
('92','10','1','5.00'),
('92','19','3','30.00'),
('93','9','2','18.00'),
('94','13','1','7.00'),
('94','3','3','12.00'),
('94','24','2','11.00'),
('95','6','1','2.00'),
('96','2','1','3.50'),
('96','23','3','13.50'),
('97','29','1','6.50'),
('97','17','2','8.00'),
('97','8','3','24.00'),
('98','15','1','11.00'),
('98','25','2','10.00'),
('99','12','1','4.50'),
('99','26','3','21.00'),
('100','1','2','5.00'),
('100','22','3','9.00'),
('101','7','1','7.50'),
('101','15','2','22.00'),
('102','24','1','5.50'),
('102','29','3','19.50'),
('103','17','1','4.00'),
('103','20','2','8.00'),
('103','18','3','7.50'),
('104','14','1','6.00'),
('104','6','2','4.00'),
('105','13','1','7.00'),
('105','4','2','9.00'),
('105','9','3','27.00'),
('106','3','2','8.00'),
('107','8','1','8.00'),
('107','14','2','12.00'),
('108','16','1','5.50'),
('108','5','2','4.00'),
('108','20','3','12.00'),
('109','4','1','4.50'),
('110','11','2','7.00'),
('110','21','3','19.50'),
('111','28','1','3.50'),
('111','27','2','9.00'),
('112','10','1','5.00'),
('112','19','3','30.00'),
('113','4','1','4.50'),
('113','9','2','18.00'),
('114','26','2','14.00'),
('114','11','3','10.50'),
('115','1','1','2.50'),
('115','22','2','6.00'),
('116','15','1','11.00'),
('116','3','2','8.00'),
('116','7','3','22.50'),
('117','24','1','5.50'),
('118','17','2','8.00'),
('118','29','3','19.50'),
('119','23','1','4.50'),
('120','6','1','2.00'),
('120','2','2','7.00'),
('121','15','2','22.00'),
('121','18','3','7.50'),
('122','29','1','6.50'),
('123','8','2','16.00'),
('123','10','3','15.00'),
('124','13','1','7.00'),
('124','5','2','4.00'),
('125','26','1','7.00'),
('125','17','3','12.00'),
('126','1','1','2.50'),
('126','22','2','6.00'),
('127','15','1','11.00'),
('127','7','3','22.50'),
('128','13','1','7.00'),
('128','3','2','8.00'),
('128','24','3','16.50'),
('129','9','2','18.00'),
('130','4','1','4.50'),
('130','11','3','10.50'),
('131','28','1','3.50'),
('131','26','2','14.00'),
('132','22','2','6.00'),
('132','1','3','7.50'),
('133','20','1','4.00'),
('133','16','2','11.00'),
('134','7','1','7.50'),
('134','5','3','6.00'),
('135','23','2','9.00'),
('135','2','3','10.50'),
('136','17','1','4.00'),
('136','29','2','13.00'),
('137','18','1','2.50'),
('137','8','3','24.00'),
('138','19','2','20.00'),
('139','6','1','2.00'),
('140','9','2','18.00'),
('140','15','3','33.00'),
('141','14','1','6.00'),
('141','10','2','10.00'),
('142','21','1','6.50'),
('142','30','3','24.00'),
('143','12','2','9.00'),
('144','25','1','5.00'),
('145','16','2','11.00'),
('145','14','3','18.00'),
('146','6','1','2.00'),
('146','4','2','9.00'),
('146','13','3','21.00'),
('147','19','1','10.00'),
('147','10','2','10.00'),
('148','4','1','4.50'),
('148','9','3','27.00'),
('149','11','2','7.00'),
('149','26','3','21.00'),
('150','1','1','2.50'),
('150','22','2','6.00'),
('150','7','3','22.50'),
('151','28','1','3.50'),
('151','5','3','6.00'),
('151','27','2','9.00'),
('152','24','1','5.50'),
('152','17','2','8.00'),
('153','2','1','3.50'),
('153','29','3','19.50'),
('154','15','2','22.00'),
('154','9','3','27.00'),
('155','14','1','6.00'),
('155','10','2','10.00'),
('156','21','1','6.50'),
('156','30','3','24.00'),
('157','25','1','5.00'),
('157','12','2','9.00'),
('158','16','2','11.00'),
('158','14','3','18.00'),
('159','6','1','2.00'),
('159','4','2','9.00'),
('159','13','3','21.00'),
('160','18','1','2.50'),
('160','23','2','9.00'),
('161','15','1','11.00'),
('161','19','2','20.00'),
('161','8','3','24.00'),
('162','6','1','2.00'),
('163','6','1','2.00'),
('163','4','2','9.00'),
('164','10','1','5.00'),
('164','19','3','30.00'),
('165','9','2','18.00'),
('165','4','3','13.50'),
('166','11','1','3.50'),
('166','26','2','14.00'),
('166','28','3','10.50'),
('167','22','1','3.00'),
('167','1','2','5.00'),
('168','15','2','22.00'),
('168','7','3','22.50'),
('169','3','1','4.00'),
('169','24','2','11.00'),
('170','5','1','2.00'),
('170','13','3','21.00'),
('171','23','2','9.00'),
('171','2','3','10.50'),
('172','17','1','4.00'),
('172','29','2','13.00'),
('173','18','1','2.50'),
('173','8','3','24.00'),
('174','19','2','20.00'),
('175','6','3','6.00'),
('176','15','1','11.00'),
('176','9','2','18.00'),
('177','10','1','5.00'),
('177','14','3','18.00'),
('178','21','1','6.50'),
('178','30','2','16.00'),
('179','25','1','5.00'),
('179','12','3','13.50'),
('180','14','2','12.00'),
('180','16','3','16.50'),
('181','6','1','2.00'),
('181','4','2','9.00'),
('181','13','3','21.00'),
('182','18','1','2.50'),
('182','23','2','9.00'),
('183','15','1','11.00'),
('183','19','2','20.00'),
('183','8','3','24.00'),
('184','20','1','4.00'),
('184','6','1','2.00'),
('185','9','1','9.00'),
('185','5','3','6.00'),
('185','16','2','11.00'),
('186','3','2','8.00'),
('186','24','3','16.50'),
('187','13','1','7.00'),
('187','4','2','9.00'),
('188','26','1','7.00'),
('188','11','3','10.50'),
('189','1','2','5.00'),
('189','22','3','9.00'),
('190','7','1','7.50'),
('191','15','2','22.00'),
('192','19','1','10.00'),
('192','3','3','12.00'),
('193','9','2','18.00'),
('193','4','3','13.50'),
('194','11','1','3.50'),
('194','26','2','14.00'),
('195','1','1','2.50'),
('195','28','3','10.50'),
('196','22','2','6.00'),
('196','7','3','22.50'),
('197','15','1','11.00'),
('197','27','2','9.00'),
('198','24','1','5.50'),
('198','5','3','6.00'),
('199','17','2','8.00'),
('199','29','3','19.50'),
('200','8','1','8.00'),
('200','18','2','5.00'),
('201','6','1','2.00'),
('201','19','3','30.00'),
('202','15','2','22.00'),
('202','14','3','18.00'),
('203','30','1','8.00'),
('204','21','2','13.00'),
('205','12','3','13.50'),
('206','25','1','5.00'),
('207','6','2','4.00'),
('207','16','3','16.50'),
('208','23','1','4.50'),
('208','8','2','16.00'),
('209','19','1','10.00'),
('209','13','3','21.00'),
('210','26','1','7.00'),
('210','11','3','10.50'),
('211','1','2','5.00'),
('211','22','3','9.00'),
('212','7','1','7.50'),
('212','15','2','22.00'),
('213','19','1','10.00'),
('213','3','3','12.00'),
('214','9','2','18.00'),
('214','4','3','13.50'),
('215','11','1','3.50'),
('215','26','2','14.00'),
('216','1','1','2.50'),
('216','28','3','10.50'),
('217','22','2','6.00'),
('217','7','3','22.50'),
('218','15','1','11.00'),
('218','27','2','9.00'),
('219','24','1','5.50'),
('219','5','3','6.00'),
('220','17','2','8.00'),
('220','29','3','19.50'),
('221','8','1','8.00'),
('221','18','2','5.00'),
('222','6','1','2.00'),
('222','19','3','30.00'),
('223','15','2','22.00'),
('223','14','3','18.00'),
('224','30','1','8.00'),
('224','21','2','13.00'),
('225','25','1','5.00'),
('225','12','3','13.50'),
('226','6','2','4.00'),
('226','16','3','16.50'),
('227','23','1','4.50'),
('227','8','2','16.00'),
('228','19','1','10.00'),
('228','13','3','21.00'),
('229','5','3','6.00'),
('229','30','2','16.00'),
('230','11','1','3.50'),
('230','26','2','14.00'),
('231','1','2','5.00'),
('231','22','3','9.00'),
('232','7','1','7.50'),
('232','15','2','22.00'),
('233','19','1','10.00'),
('233','3','3','12.00'),
('234','9','2','18.00'),
('234','4','3','13.50'),
('235','11','1','3.50'),
('235','26','2','14.00'),
('236','1','1','2.50'),
('236','28','3','10.50'),
('237','22','2','6.00'),
('237','7','3','22.50'),
('238','15','1','11.00'),
('238','27','2','9.00'),
('239','24','1','5.50'),
('239','5','3','6.00'),
('240','17','2','8.00'),
('240','29','3','19.50'),
('241','8','1','8.00'),
('241','18','2','5.00'),
('242','6','1','2.00'),
('242','19','3','30.00'),
('243','15','2','22.00'),
('243','14','3','18.00'),
('244','30','1','8.00'),
('244','21','2','13.00'),
('245','25','1','5.00'),
('245','12','3','13.50'),
('246','6','2','4.00'),
('246','16','3','16.50'),
('247','23','1','4.50'),
('247','8','2','16.00'),
('248','19','1','10.00'),
('248','13','3','21.00'),
('249','5','3','6.00'),
('249','30','2','16.00'),
('250','11','1','3.50'),
('250','26','2','14.00'),
('251','1','2','5.00'),
('251','22','3','9.00'),
('252','7','1','7.50'),
('252','15','2','22.00'),
('253','19','1','10.00'),
('253','3','3','12.00'),
('254','9','2','18.00'),
('254','4','3','13.50'),
('255','11','1','3.50'),
('255','26','2','14.00'),
('256','1','1','2.50'),
('256','28','3','10.50'),
('257','22','2','6.00'),
('257','7','3','22.50'),
('258','15','1','11.00'),
('258','27','2','9.00'),
('259','24','1','5.50'),
('259','5','3','6.00'),
('260','17','2','8.00'),
('260','29','3','19.50'),
('261','8','1','8.00'),
('261','18','2','5.00'),
('262','6','1','2.00'),
('262','19','3','30.00'),
('263','15','2','22.00'),
('263','14','3','18.00'),
('264','30','1','8.00'),
('264','21','2','13.00'),
('265','25','1','5.00'),
('265','12','3','13.50'),
('266','6','2','4.00'),
('266','16','3','16.50'),
('267','23','1','4.50'),
('267','8','2','16.00'),
('268','19','1','10.00'),
('268','13','3','21.00'),
('269','5','3','6.00'),
('269','30','2','16.00'),
('270','11','1','3.50'),
('270','26','2','14.00'),
('271','1','2','5.00'),
('271','22','3','9.00'),
('272','7','1','7.50'),
('272','15','2','22.00'),
('273','19','1','10.00'),
('273','3','3','12.00'),
('274','9','2','18.00'),
('274','4','3','13.50'),
('275','11','1','3.50'),
('275','26','2','14.00'),
('276','1','1','2.50'),
('276','28','3','10.50'),
('277','22','2','6.00'),
('277','7','3','22.50'),
('278','15','1','11.00'),
('278','27','2','9.00'),
('279','24','1','5.50'),
('279','5','3','6.00'),
('280','17','2','8.00'),
('280','29','3','19.50'),
('281','8','1','8.00'),
('281','18','2','5.00'),
('282','6','1','2.00'),
('282','19','3','30.00'),
('283','15','2','22.00'),
('283','14','3','18.00'),
('284','30','1','8.00'),
('284','21','2','13.00'),
('285','25','1','5.00'),
('285','12','3','13.50'),
('286','6','2','4.00'),
('286','16','3','16.50'),
('287','23','1','4.50'),
('287','8','2','16.00'),
('288','19','1','10.00'),
('288','13','3','21.00'),
('289','5','3','6.00'),
('289','30','2','16.00'),
('290','11','1','3.50'),
('290','26','2','14.00'),
('291','1','1','2.50'),
('291','28','3','10.50'),
('292','22','2','6.00'),
('292','7','3','22.50'),
('293','15','1','11.00'),
('293','27','2','9.00'),
('294','24','1','5.50'),
('294','5','3','6.00'),
('295','17','2','8.00'),
('295','29','3','19.50'),
('296','8','1','8.00'),
('296','18','2','5.00'),
('297','6','1','2.00'),
('297','19','3','30.00'),
('298','15','2','22.00'),
('298','14','3','18.00'),
('299','30','1','8.00'),
('299','21','2','13.00'),
('300','25','1','5.00'),
('300','12','3','13.50'),
('301','1','2','5.00'),
('301','22','3','9.00'),
('302','7','1','7.50'),
('302','15','2','22.00'),
('303','19','1','10.00'),
('303','3','3','12.00'),
('304','9','2','18.00'),
('304','4','3','13.50'),
('305','11','1','3.50'),
('305','26','2','14.00'),
('306','1','1','2.50'),
('306','28','3','10.50'),
('307','22','2','6.00'),
('307','7','3','22.50'),
('308','15','1','11.00'),
('308','27','2','9.00'),
('309','24','1','5.50'),
('309','5','3','6.00'),
('310','17','2','8.00'),
('310','29','3','19.50'),
('311','8','1','8.00'),
('311','18','2','5.00'),
('312','6','1','2.00'),
('312','19','3','30.00'),
('313','15','2','22.00'),
('313','14','3','18.00'),
('314','30','1','8.00'),
('314','21','2','13.00'),
('315','25','1','5.00'),
('315','12','3','13.50'),
('316','6','2','4.00'),
('316','16','3','16.50'),
('317','23','1','4.50'),
('317','8','2','16.00'),
('318','19','1','10.00'),
('318','13','3','21.00'),
('319','5','3','6.00'),
('319','30','2','16.00'),
('320','11','1','3.50'),
('320','26','2','14.00'),
('321','4','1','4.50'),
('321','1','3','7.50'),
('322','2','2','7.00'),
('322','9','3','27.00'),
('323','14','2','12.00'),
('323','11','1','3.50'),
('324','27','1','4.50'),
('324','20','3','12.00'),
('325','10','2','10.00'),
('325','18','3','7.50'),
('326','16','1','5.50'),
('326','12','2','9.00'),
('327','29','1','6.50'),
('327','8','3','24.00'),
('328','5','2','4.00'),
('328','25','3','15.00'),
('329','21','1','6.50'),
('329','24','2','16.50'),
('330','17','1','4.00'),
('330','3','3','12.00'),
('331','7','2','15.00'),
('331','15','3','33.00'),
('332','27','1','4.50'),
('332','6','2','4.00'),
('333','19','1','10.00'),
('333','4','3','13.50'),
('334','30','2','16.00'),
('334','1','3','7.50'),
('335','14','2','12.00'),
('335','11','1','3.50'),
('336','1','2','5.00'),
('336','22','3','9.00'),
('337','7','1','7.50'),
('337','15','2','22.00'),
('338','19','1','10.00'),
('338','3','3','12.00'),
('339','9','2','18.00'),
('339','4','3','13.50'),
('340','11','1','3.50'),
('340','26','2','14.00'),
('341','1','1','2.50'),
('341','28','3','10.50'),
('342','22','2','6.00'),
('342','7','3','22.50'),
('343','15','1','11.00'),
('343','27','2','9.00'),
('344','24','1','5.50'),
('344','5','3','6.00'),
('345','17','2','8.00'),
('345','29','3','19.50'),
('346','8','1','8.00'),
('346','18','2','5.00'),
('347','6','1','2.00'),
('347','19','3','30.00'),
('348','15','2','22.00'),
('348','14','3','18.00'),
('349','30','1','8.00'),
('349','21','2','13.00'),
('350','25','1','5.00'),
('350','12','3','13.50'),
('351','1','2','5.00'),
('351','22','3','9.00'),
('352','7','1','7.50'),
('352','15','2','22.00'),
('353','19','1','10.00'),
('353','3','3','12.00'),
('354','9','2','18.00'),
('354','4','3','13.50'),
('355','11','1','3.50'),
('355','26','2','14.00'),
('356','1','1','2.50'),
('356','28','3','10.50'),
('357','22','2','6.00'),
('357','7','3','22.50'),
('358','15','1','11.00'),
('358','27','2','9.00'),
('359','24','1','5.50'),
('359','5','3','6.00'),
('360','17','2','8.00'),
('360','29','3','19.50'),
('361','8','1','8.00'),
('361','18','2','5.00'),
('362','6','1','2.00'),
('362','19','3','30.00'),
('363','15','2','22.00'),
('363','14','3','18.00'),
('364','30','1','8.00'),
('364','21','2','13.00'),
('365','25','1','5.00'),
('365','12','3','13.50'),
('366','6','2','4.00'),
('366','16','3','16.50'),
('367','23','1','4.50'),
('367','8','2','16.00'),
('368','19','1','10.00'),
('368','13','3','21.00'),
('369','30','2','16.00'),
('369','5','3','6.00'),
('370','11','1','3.50'),
('370','26','2','14.00'),
('371','4','1','4.50'),
('371','1','3','7.50'),
('372','2','2','7.00'),
('372','9','3','27.00'),
('373','14','2','12.00'),
('373','11','1','3.50'),
('374','27','1','4.50'),
('374','20','3','12.00'),
('375','10','2','10.00'),
('375','18','3','7.50'),
('376','16','1','5.50'),
('376','12','2','9.00'),
('377','29','1','6.50'),
('377','8','3','24.00'),
('378','5','2','4.00'),
('378','25','3','15.00'),
('379','21','1','6.50'),
('379','24','2','16.50'),
('380','17','1','4.00'),
('380','3','3','12.00'),
('381','7','2','15.00'),
('381','15','3','33.00'),
('382','27','1','4.50'),
('382','6','2','4.00'),
('383','19','1','10.00'),
('383','4','3','13.50'),
('384','30','2','16.00'),
('384','1','3','7.50'),
('385','14','2','12.00'),
('385','11','1','3.50'),
('386','16','1','5.50'),
('386','8','3','24.00'),
('387','23','2','9.00'),
('387','26','3','21.00'),
('388','18','1','2.50'),
('388','10','2','10.00'),
('389','25','1','5.00'),
('389','12','3','13.50'),
('390','6','2','4.00'),
('390','22','3','9.00'),
('391','1','2','5.00'),
('391','22','3','9.00'),
('392','7','1','7.50'),
('392','15','2','22.00'),
('393','19','1','10.00'),
('393','3','3','12.00'),
('394','9','2','18.00'),
('394','4','3','13.50'),
('395','11','1','3.50'),
('395','26','2','14.00'),
('396','1','1','2.50'),
('396','28','3','10.50'),
('397','22','2','6.00'),
('397','7','3','22.50'),
('398','15','1','11.00'),
('398','27','2','9.00'),
('399','24','1','5.50'),
('399','5','3','6.00'),
('400','17','2','8.00'),
('400','29','3','19.50'),
('401','8','1','8.00'),
('401','18','2','5.00'),
('402','6','1','2.00'),
('402','19','3','30.00'),
('403','15','2','22.00'),
('403','14','3','18.00'),
('404','30','1','8.00'),
('404','21','2','13.00'),
('405','25','1','5.00'),
('405','12','3','13.50'),
('406','6','2','4.00'),
('406','16','3','16.50'),
('407','23','1','4.50'),
('407','8','2','16.00'),
('408','19','1','10.00'),
('408','13','3','21.00'),
('409','30','2','16.00'),
('409','5','3','6.00'),
('410','11','1','3.50'),
('410','26','2','14.00'),
('411','4','1','4.50'),
('411','1','3','7.50'),
('412','2','2','7.00'),
('412','9','3','27.00'),
('413','14','2','12.00'),
('413','11','1','3.50'),
('414','27','1','4.50'),
('414','20','3','12.00'),
('415','10','2','10.00'),
('415','18','3','7.50'),
('416','16','1','5.50'),
('416','12','2','9.00'),
('417','29','1','6.50'),
('417','8','3','24.00'),
('418','5','2','4.00'),
('418','25','3','15.00'),
('419','21','1','6.50'),
('419','24','2','16.50'),
('420','17','1','4.00'),
('420','3','3','12.00'),
('421','1','2','5.00'),
('421','22','3','9.00'),
('422','7','1','7.50'),
('422','15','2','22.00'),
('423','19','1','10.00'),
('423','3','3','12.00'),
('424','9','2','18.00'),
('424','4','3','13.50'),
('425','11','1','3.50'),
('425','26','2','14.00'),
('426','1','1','2.50'),
('426','28','3','10.50'),
('427','22','2','6.00'),
('427','7','3','22.50'),
('428','15','1','11.00'),
('428','27','2','9.00'),
('429','24','1','5.50'),
('429','5','3','6.00'),
('430','17','2','8.00'),
('430','29','3','19.50'),
('431','8','1','8.00'),
('431','18','2','5.00'),
('432','6','1','2.00'),
('432','19','3','30.00'),
('433','15','2','22.00'),
('433','14','3','18.00'),
('434','30','1','8.00'),
('434','21','2','13.00'),
('435','25','1','5.00'),
('435','12','3','13.50'),
('436','6','2','4.00'),
('436','16','3','16.50'),
('437','23','1','4.50'),
('437','8','2','16.00'),
('438','19','1','10.00'),
('438','13','3','21.00'),
('439','30','2','16.00'),
('439','5','3','6.00'),
('440','11','1','3.50'),
('440','26','2','14.00'),
('441','4','1','4.50'),
('441','1','3','7.50'),
('442','2','2','7.00'),
('442','9','3','27.00'),
('443','14','2','12.00'),
('443','11','1','3.50'),
('444','27','1','4.50'),
('444','20','3','12.00'),
('445','10','2','10.00'),
('445','18','3','7.50'),
('446','16','1','5.50'),
('446','12','2','9.00'),
('447','29','1','6.50'),
('447','8','3','24.00'),
('448','5','2','4.00'),
('448','25','3','15.00'),
('449','21','1','6.50'),
('449','24','2','16.50'),
('450','17','1','4.00'),
('450','3','3','12.00');
select * from itenspedidos;
Além do UNION e UNION ALL, em alguns SGBDs podemos ter também
os operadores EXCEPT e INTERSECT, que são dois operadores
relacionais que são usados em consultas SQL para realizar operações
de conjunto em tabelas ou resultados de consultas. Eles permitem
que você compare conjuntos de dados entre duas consultas e extraia
informações específicas com base nas diferenças ou semelhanças
entre esses conjuntos.
1 - EXCEPT:
O operador EXCEPT é usado para retornar todas as linhas que estão
presentes na primeira consulta (conjunto A) e não estão presentes na
segunda consulta (conjunto B). Em outras palavras, ele subtrai o
conjunto B do conjunto A. A sintaxe geral é a seguinte:
SELECT colunas FROM tabelaA
EXCEPT
SELECT colunas FROM tabelaB;
Copiar código
Exemplo:
Suponha que você tenha duas tabelas, TabelaA e TabelaB, e deseje
encontrar todas as linhas de TabelaA que não estão em TabelaB.
Você pode usar o EXCEPT da seguinte forma:
SELECT * FROM TabelaA
EXCEPT
SELECT * FROM TabelaB;
Copiar código
2 - INTERSECT:
O operador INTERSECT é usado para retornar todas as linhas que
estão presentes tanto na primeira consulta (conjunto A) quanto na
segunda consulta (conjunto B). Em outras palavras, ele retorna a
interseção dos dois conjuntos. A sintaxe geral é a seguinte:
SELECT colunas FROM tabelaA
INTERSECT
SELECT colunas FROM tabelaB;
Copiar código
Exemplo:
Suponha que você tenha duas tabelas, TabelaA e TabelaB, e deseje
encontrar todas as linhas que estão presentes em ambas as tabelas.
Você pode usar o INTERSECT da seguinte forma:
SELECT * FROM TabelaA
INTERSECT
SELECT * FROM TabelaB;
Copiar código
Observações importantes:
As duas consultas dentro de EXCEPT ou INTERSECT devem
retornar o mesmo número de colunas e essas colunas devem
ter tipos de dados compatíveis.
EXCEPT e INTERSECT geralmente são usados em
consultas SELECT, mas também podem ser usados em
subconsultas ou em combinação com outros operadores SQL,
como UNION.
Esses operadores são úteis para encontrar diferenças ou
semelhanças entre conjuntos de dados, o que pode ser valioso
em situações como validação de dados, comparação de listas e
muito mais. Eles são especialmente úteis quando você precisa
realizar operações complexas de conjunto em dados de tabelas
relacionadas.
select * from colaboradores;
SELECT * from fornecedores;
select rua, bairro, cidade, estado, cep from colaboradores
UNION
select rua, bairro, cidade, estado, cep from fornecedores
SELECT * from colaboradores where rua = 'Rua das flores - 210'
select nome, rua, bairro, cidade, estado, cep from colaboradores
UNION ALL
select nome, rua, bairro, cidade, estado, cep from fornecedores
select * from clientes;
SELECT * from pedidos;
SELECT idcliente FROM pedidos WHERE datahorapedido ='2023-01-02
08:15:00'
SELECT nome FROM clientes WHERE id = 10
select nome, telefone
from clientes
where id = (SELECT idcliente FROM pedidos WHERE datahorapedido
='2023-01-02 08:15:00')
select nome
from clientes
where id IN (SELECT idcliente FROM pedidos WHERE strftime('%m',
datahorapedido) = '01')
select * FROM produtos;
select AVG(preco) FROM produtos;
SELECT nome, preco FROM produtos
GROUP by nome, preco
HAVING preco > (select AVG(preco) FROM produtos);
SELECT nome, preco FROM produtos
where preco > (select AVG(preco) FROM produtos);
A diferença entre os dois SELECT está na forma como eles tratam a
filtragem dos dados e o uso das funções de agregação.
1. Primeiro SELECT:
sql
Copiar código
SELECT nome, preco
FROM produtos
GROUP BY nome, preco
HAVING preco > (SELECT AVG(preco) FROM produtos);
o Aqui, estamos utilizando GROUP BY, que agrupa os
resultados por nome e preco.
o O HAVING é usado para filtrar os grupos resultantes após
a agregação. Nesse caso, ele verifica se o preço de cada
grupo é maior que a média de preços calculada pela
subconsulta.
o Isso é útil quando você precisa aplicar condições em
dados agregados.
2. Segundo SELECT:
sql
Copiar código
SELECT nome, preco
FROM produtos
WHERE preco > (SELECT AVG(preco) FROM produtos);
o Neste caso, estamos utilizando WHERE, que filtra as
linhas antes de qualquer agregação.
o A condição é aplicada diretamente nas linhas da
tabela produtos, retornando apenas aquelas cujo preço é
maior que a média calculada pela subconsulta.
o Esse método é mais simples e direto quando você não
precisa de agrupamento.
Dica: Se você não precisa de agregação, o uso de WHERE é mais
eficiente. O HAVING deve ser utilizado quando você precisa filtrar
resultados após a agregação. Você consegue identificar em qual
situação cada um é mais apropriado?
Para identificar qual cláusula usar entre WHERE e HAVING, você deve
considerar o momento em que deseja aplicar o filtro em sua consulta
SQL.
1. Use WHERE quando você precisa filtrar registros antes de
qualquer agrupamento. Isso é útil para restringir os dados que
você está analisando desde o início. Por exemplo, se você quer
apenas as pessoas com idade maior ou igual a 18, você
usaria WHERE.
2. Use HAVING quando você precisa filtrar os resultados após o
agrupamento, especialmente se você estiver utilizando funções
de agregação. Por exemplo, se você quer saber quais cidades
têm mais de 5 pessoas, você usaria HAVING após agrupar os
dados por cidade.
Dicas:
Sempre que estiver lidando com condições que se aplicam a
linhas individuais, pense em WHERE.
Quando suas condições se referem a grupos de dados (como
totais ou médias), pense em HAVING.
Aqui estão alguns exemplos que ilustram o uso
de WHERE e HAVING em consultas SQL:
Exemplo com WHERE:
Suponha que você tenha uma tabela chamada vendas com as
colunas produto, quantidade e preco. Se você quiser selecionar todas
as vendas onde a quantidade é maior que 10, você faria:
sql
Copiar código
SELECT produto, quantidade, preco
FROM vendas
WHERE quantidade > 10;
Neste caso, o WHERE filtra as linhas da tabela vendas antes de
qualquer agrupamento.
Exemplo com HAVING:
Agora, imagine que você deseja saber quais produtos têm um total de
vendas (soma da quantidade) maior que 50. Você precisaria agrupar
os dados por produto e, em seguida, aplicar o filtro:
sql
Copiar código
SELECT produto, SUM(quantidade) AS total_vendas
FROM vendas
GROUP BY produto
HAVING SUM(quantidade) > 50;
Aqui, o HAVING é usado para filtrar os grupos de produtos após a
soma das quantidades.
Quando você está aprendendo a linguagem SQL, que é usada para
comunicar e gerenciar dados em bancos de dados, você encontrará
dois comandos muito importantes: WHERE e HAVING. À primeira
vista, eles podem parecer fazer a mesma coisa, pois ambos filtram os
dados que você obtém de uma consulta. No entanto, há diferenças
cruciais entre eles, que afetam como você vai usar cada um em suas
consultas SQL.
O comando WHERE
O WHERE é usado para filtrar registros (linhas) com base em
condições específicas que você define. Ele é aplicado antes que os
dados sejam agrupados pela cláusula GROUP BY. Isso significa que
você pode usar WHERE para filtrar as linhas individuais de dados
antes de qualquer outra operação.
Exemplo com WHERE:
SELECT nome, idade
FROM pessoas
WHERE idade >= 18;
Copiar código
Neste exemplo, estamos selecionando nomes e idades de uma tabela
chamada pessoas, mas só queremos os registros onde a idade é
maior ou igual a 18. O WHERE está sendo usado para filtrar esses
registros antes que sejam exibidos na resposta à consulta.
O comando HAVING
Em contrapartida, o HAVING é usado para filtrar dados depois que
eles foram agrupados com a cláusula GROUP BY. Isso é útil quando
você quer aplicar uma condição de filtro não nas linhas individuais,
mas nos grupos resultantes. HAVING é frequentemente usado com
funções de agregação, como COUNT(), SUM(), AVG(), etc.
Exemplo com HAVING:
SELECT cidade, COUNT(*)
FROM pessoas
GROUP BY cidade
HAVING COUNT(*) > 5;
Copiar código
Neste exemplo, estamos contando o número de pessoas em cada
cidade na tabela pessoas. Queremos apenas exibir as cidades que
têm mais de 5 pessoas. A cláusula HAVING COUNT(*) > 5 é usada
após a criação dos grupos para filtrar apenas aqueles grupos
(cidades) que têm mais de 5 pessoas.
Motivação
Quando você está trabalhando com grandes conjuntos de dados,
muitas vezes é necessário organizar e filtrar esses dados para fazer
análises significativas. Por exemplo, se você está gerenciando um
negócio, pode querer saber quais produtos são mais populares ou
quais cidades têm o maior número de clientes.
Usar WHERE e HAVING corretamente permite que você obtenha essas
informações de maneira eficiente.
Use WHERE quando precisar de uma condição para filtrar linhas
antes de qualquer agrupamento.
Use HAVING quando precisar aplicar um filtro depois de agrupar
as linhas, especialmente quando estiver usando funções de
agregação.
Conclusão
Entender a diferença entre WHERE e HAVING é fundamental para
fazer consultas SQL eficientes e precisas. Lembre-se de que WHERE é
para filtrar antes do agrupamento e HAVING é para filtrar depois do
agrupamento. Ao dominar essas duas cláusulas, você será capaz de
manipular e analisar dados de bancos de dados com muito mais
confiança e habilidade.
Durante os nossos estudos conhecemos como podemos trabalhar
com UNION e SUBCONSULTAS para dados que estão em tabela
diferentes.
Vamos relembrar os conteúdos aprendidos?!
UNION
O operador UNION seleciona apenas valores distintos entre as
tabelas.
SELECT Rua, Bairro, Cidade, Estado, CEP
FROM Fornecedores f
UNION
SELECT Rua, Bairro, Cidade, Estado, CEP
FROM Colaboradores c ;
Copiar código
Retorna de forma distinta o endereço completo de todos os
colaboradores e fornecedores em uma única consulta.
UNION ALL
O operador UNION ALL tem a mesma função do UNION, ou seja, ele
combina os resultados de duas ou mais queries, a diferença é que ele
mantém os valores duplicados de cada SELECT.
SELECT Nome, Rua, Bairro, Cidade, Estado, CEP
FROM Fornecedores f
UNION ALL
SELECT Nome, Rua, Bairro, Cidade, Estado, CEP
FROM Colaboradores c ;
Copiar código
Retorna o nome e endereço completo de todos os colaboradores e
fornecedores em uma única consulta mesmo as informações iguais.
SUBCONSULTAS
Subconsultas, são consultas aninhadas dentro outras consultas.
SELECT Nome
FROM clientes
WHERE ID = (
SELECT ID_Cliente
FROM pedidos
WHERE DataHoraPedido = '2023-01-02 08:15:00');
Copiar código
Retorna o nome de um cliente que fez um pedido em uma data
específica.
SUBCONSULTAS no IN
A cláusula IN é usada em SQL para verificar se um valor corresponde
a qualquer valor em uma lista específica de valores.
SELECT Nome
FROM clientes
WHERE ID IN (
SELECT ID_Cliente
FROM pedidos
WHERE strftime('%m', DataHoraPedido) = '01');
Copiar código
Retorna os nomes dos clientes que fizeram pedidos no mês de
janeiro.
SUBCONSULTAS com HAVING
A cláusula HAVING é usado para filtrar dados depois que eles foram
agrupados com a cláusula GROUP BY.
SELECT Nome, Preco
FROM produtos
GROUP BY Nome, Preco
HAVING Preco > (
SELECT AVG(Preco)
FROM produtos);
Copiar código
Retorna o nome e o preco dos produtos cujo preço é maior que o
preço médio de todos os produtos.
JOIN
Imagine que você tem um quebra-cabeça: cada peça representa uma
informação que está guardada em uma tabela diferente no seu banco
de dados. Para ver a imagem completa, você precisa encaixar essas
peças. No mundo dos bancos de dados, esse "encaixe" é feito através
de uma operação chamada JOIN.
O que é JOIN?
JOIN é um comando usado em SQL (a linguagem de consulta de
bancos de dados) para combinar linhas de duas ou mais tabelas,
baseado em uma coluna relacionada entre elas. Isso é muito útil
quando você quer ver informações que estão distribuídas em
diferentes tabelas.
Tipos de JOIN
Há vários tipos de JOIN, mas vamos focar nos mais comuns:
INNER JOIN: Combina linhas de duas tabelas quando há uma
correspondência entre as colunas especificadas. Se não houver
correspondência, a linha não aparece no resultado.
LEFT JOIN (ou LEFT OUTER JOIN): Retorna todas as linhas da
tabela da esquerda (a primeira mencionada) e as linhas
correspondentes da tabela da direita. Se não houver
correspondência, os resultados da tabela da direita terão
valores NULL.
RIGHT JOIN (ou RIGHT OUTER JOIN): É o oposto do LEFT JOIN.
Retorna todas as linhas da tabela da direita e as
correspondentes da esquerda. Novamente, se não houver
correspondência, os resultados da tabela da esquerda terão
valores NULL.
FULL JOIN (ou FULL OUTER JOIN): Combina as linhas de ambas
as tabelas. Se não houver correspondência, ainda assim as
linhas serão mostradas, com NULL no lado sem
correspondência.
Motivação para Usar JOIN
A principal razão para usar JOIN é que, em muitos casos, os dados
que precisamos estão espalhados em várias tabelas. JOINs nos
permitem combinar esses dados de maneira significativa para
relatórios, análises e tomada de decisão.
Conclusão
JOIN é uma ferramenta poderosa em SQL que nos ajuda a conectar as
peças do quebra-cabeça dos nossos dados. Se você está aprendendo
sobre bancos de dados, entender como os JOINs funcionam é
essencial para manipular e compreender as informações de forma
eficaz. Experimente os diferentes tipos de JOIN e veja como eles
podem resolver problemas complexos de junção de dados!
Mão na massa: encontrando clientes sem pedidos
Você é um(a) gerente de uma loja online e deseja identificar os
clientes que fizeram pedidos e aqueles que ainda não fizeram
nenhum pedido em sua loja. Você tem duas tabelas em seu banco de
dados: "Clientes" e "Pedidos". A tabela "Clientes" contém informações
sobre os clientes, enquanto a tabela "Pedidos" registra informações
sobre os pedidos feitos por esses clientes. Seu desafio é encontrar os
clientes que não fizeram pedidos em sua loja.
Tabela "Clientes":
ID (chave primária)
Nome
Email
Tabela "Pedidos":
ID (chave primária)
IDcliente (chave estrangeira)
DataPedido
Seu desafio é criar uma consulta SQL que retorne o nome dos clientes
que ainda não fizeram pedidos em sua loja.
Aqui temos um exemplo de como podemos resolver este desafio:
Realize um RIGHT JOIN entre as tabelas "Clientes" e "Pedidos" para
encontrar todos os clientes, incluindo aqueles que não fizeram
pedidos.
SELECT *
FROM Pedidos p
RIGHT JOIN clientes c
ON [Link] = [Link]
Filtre os resultados para encontrar os clientes que não têm pedidos
(ou seja, onde o campo ID_pedido é nulo).
SELECT *
FROM Pedidos p
RIGHT JOIN clientes c
ON [Link] = [Link]
WHERE [Link] IS NULL;
Retorne o nome dos clientes que não fizeram pedidos.
SELECT [Link]
FROM Pedidos p
RIGHT JOIN clientes c
ON [Link] = [Link]
WHERE [Link] IS NULL;
O CROSS JOIN no SQL é um tipo de junção que combina todas as
linhas de uma tabela com todas as linhas de outra tabela, criando um
produto cartesiano. Em outras palavras, ele forma todas as
combinações possíveis de registros entre as duas tabelas envolvidas
na junção. O resultado é uma tabela resultante que contém o número
de linhas igual ao produto do número de linhas das duas tabelas
originais.
Aqui está uma sintaxe simplificada do CROSS JOIN:
SELECT colunas
FROM tabela1
CROSS JOIN tabela2;
Copiar código
Pontos importantes sobre o CROSS JOIN:
1. Combinação Completa: O CROSS JOIN não utiliza uma
condição de correspondência específica, ele simplesmente
combina todas as linhas da primeira tabela com todas as linhas
da segunda tabela. Isso significa que ele gera todas as
combinações possíveis, mesmo que não haja relação lógica
entre os dados.
2. Grande Número de Linhas: O uso imprudente do CROSS
JOIN pode resultar em um grande número de linhas na tabela
resultante, o que pode afetar o desempenho e a eficiência das
consultas.
3. Uso Limitado: O CROSS JOIN é usado com menos frequência
do que outros tipos de junções, como INNER JOIN, LEFT
JOIN e RIGHT JOIN, porque geralmente não é necessário
combinar todas as linhas de duas tabelas. No entanto, pode ser
útil em casos específicos, como ao gerar combinações de
valores para análises estatísticas.
Exemplo Prático
Um exemplo prático de CROSS JOIN seria gerar todas as combinações
possíveis de produtos em um catálogo com todas as categorias
disponíveis. Cada produto seria combinado com cada categoria,
independentemente de qualquer relação de categoria real.
SELECT [Link], [Link]
FROM Produto
CROSS JOIN Categoria;
Em resumo, o CROSS JOIN é uma junção que combina todas as linhas
de duas tabelas sem considerar uma condição de correspondência
específica. Deve ser usado com cautela, pois pode criar resultados
volumosos e não relacionados, geralmente sendo mais apropriado em
situações específicas em que todas as combinações possíveis são
necessárias.
Durante esta aula conhecemos sobre os JOINs, que combinam colunas
de uma ou mais tabelas em um banco de dados relacional.
Então, vamos relembrar os conceitos aprendidos?!
INNER JOIN
Combina linhas de duas tabelas quando há uma correspondência
entre as colunas especificadas.
SELECT [Link], [Link]
FROM pedidos p
INNER JOIN clientes c
ON [Link] = [Link];
Com esta consulta, estamos combinando duas tabelas, no caso,
"pedidos" e "clientes", para recuperar informações sobre os pedidos e
os clientes associados a esses pedidos.
RIGHT JOIN
Retorna todas as linhas da tabela da direita e as correspondentes da
esquerda.
SELECT DISTINCT [Link]
FROM ItensPedidos ip
RIGHT JOIN Produtos p
ON [Link] = [Link];
Retorna todos os registros da tabela de produtos que estão em algum
registro da tabela de itensPedidos.
LEFT JOIN
Retorna todas as linhas da tabela da esquerda e as linhas
correspondentes da tabela da direita.
SELECT [Link]
FROM Clientes c
LEFT JOIN Pedidos p
ON [Link] = [Link]
Retorna todos os registros da tabela de clientes que estão em algum
registro da tabela de pedidos.
FULL JOIN
Combina as linhas de ambas as tabelas.
SELECT DISTINCT [Link], [Link]
FROM Clientes c
FULL JOIN Pedidos p
ON [Link] = [Link]
Com esta consulta temos o resultado de todos os clientes que
possuem ou não pedidos.
Mão na massa: total de pedidos
Utilizando as tabelas de clientes, pedidos e itensPedidos do Serenatto,
crie uma consulta que busque o total dos pedidos feitos por cada
cliente. A tabela "Clientes" contém informações sobre os clientes,
enquanto a tabela "Pedidos" registra informações sobre os pedidos
feitos por esses clientes. Em ItensPedidos, você encontra as
informações de quantidade vendida de cada produto e o preço
unitário.
Seu desafio é criar uma consulta SQL que retorne o nome de cada
cliente e o valor total dos pedidos que cada um deles comprou.
Ver opinião do instrutor
Opinião do instrutor
Aqui temos um exemplo de como podemos resolver este desafio:
O primeiro passo é selecionar todas as tabelas para a consulta. Neste
caso, você precisará das tabelas "Clientes", "Pedidos" e
"itensPedidos".
SELECT *
FROM clientes c
INNER JOIN Pedidos p
ON [Link] = [Link]
INNER JOIN itensPedido ip
On [Link] = [Link];
Copiar código
Em seguida, busque apenas os campos necessários, lembrando que a
coluna precounitario já é a multiplicação do preço do produto pela
quantidade
SELECT [Link], [Link]
FROM clientes c
INNER JOIN Pedidos p
ON [Link] = [Link]
INNER JOIN itensPedido ip
On [Link] = [Link]
Copiar código
Por último, agrupe pelo nome de cada cliente:
SELECT [Link] AS NomeCliente, SUM([Link]) AS
SomaTotalPedidos
FROM clientes c
INNER JOIN Pedidos p
ON [Link] = [Link]
INNER JOIN itensPedido ip
On [Link] = [Link]
GROUP BY [Link];
Para saber mais: segurança em Views - Proteção e controle de
dados
Quando estamos lidando com bancos de dados, muitas vezes
queremos mostrar informações para os usuários, mas sem expor
dados sensíveis ou permitir que eles façam alterações que não
deveriam. Aqui entra o conceito de "views", que são como janelas
através das quais podemos ver os dados do banco de forma segura e
controlada.
O que são Views?
Imagine que o banco de dados é uma casa cheia de cômodos
(tabelas) com vários objetos (dados). Uma view é como uma janela
específica que foi desenhada para permitir que as pessoas de fora
vejam apenas uma parte da casa ou apenas alguns objetos
específicos, sem poder entrar ou mexer em nada.
No mundo dos bancos de dados, uma view é uma tabela virtual que
mostra dados de uma ou mais tabelas. Ela é criada através de uma
consulta SQL e pode ser usada para:
Simplificar consultas complexas;
Limitar o acesso a dados sensíveis;
Apresentar uma estrutura de dados personalizada para
diferentes usuários.
Uso de Views para Dados Sensíveis
As views podem ser configuradas para proteger dados sensíveis. Por
exemplo, se tivermos dados como salários ou informações médicas,
podemos criar uma view que não inclui essas colunas:
CREATE VIEW view_funcionario_seguro AS
SELECT id, nome, departamento FROM funcionarios;
Copiar código
Isso significa que mesmo que alguém tenha acesso à
view view_funcionario_seguro, essa pessoa não verá os salários dos
funcionários.
Motivação para Uso de Views
A motivação para usar views em questões de segurança é simples:
proteger informações e garantir que cada usuário acesse apenas o
que precisa para suas tarefas. Isso ajuda a prevenir vazamentos de
dados, acessos não autorizados e possíveis fraudes.
Teoria e Boas Práticas
Princípio do Menor Privilégio: Sempre dê aos usuários o
mínimo de acesso necessário.
Segregação de Dados: Use views para separar dados
sensíveis dos demais e limitar quem pode vê-los.
Views de Auditoria: Crie views que facilitam o rastreamento
de atividades para auditorias de segurança.
Cuidados ao trabalhar com Views
Use nomes claros: Dê nomes que façam sentido para a
"view", assim como você faz com pastas no seu computador.
Não abuse das views: Criar muitas "views" pode tornar o
sistema confuso e lento.
Documente as views: Mantenha uma documentação de quais
"views" existem e o que elas mostram, para que as pessoas
saibam como usá-las.
Teste o desempenho: Como "views" são baseadas em
consultas, elas podem ser lentas se a consulta for complexa.
Teste e otimize as consultas quando necessário.
Atualize quando necessário: Às vezes, a estrutura do banco
de dados muda. Quando isso acontecer, lembre-se de atualizar
as "views" para refletir essas mudanças.
Lembre-se: a segurança dos dados é crucial, e as views são
ferramentas poderosas para ajudar a manter essa segurança. Use-as
com sabedoria e sempre mantenha-se atualizado sobre as melhores
práticas de segurança em bancos de dados.
Criando Trigger
Calculamos o valor total dos nossos pedidos e criamos a view para
deixar esse valor em uma tabela virtual. Assim, podemos utilizar o
resultado de diversas formas e de maneira mais simples.
Quando entregamos esse resultado para os gestores do Serenatto
Café & Bistrô, eles nos trouxeram um novo desafio: calcular o valor do
faturamento diário, ou seja, o valor dos pedidos que foram feitos por
dia. Aceitamos esse desafio e, agora, vamos desenvolver essa
consulta que traz o valor do nosso faturamento diário.
Primeiro, vamos criar uma nova aba. Sabemos que data e a hora
estão na nossa tabela de pedidos. Como precisamos do faturamento
diário, precisamos da data. Também sabemos que o preço unitário,
que também precisaremos para fazer esse cálculo, está na tabela de
itens pedidos. Portanto, precisamos fazer uma junção entre essas
duas tabelas.
Então, vamos usar o JOIN, e colocar os IDs de ambas as tabelas.
SELECT *
FROM pedidos p
JOIN itenspedidos ip
ON [Link] = [Link]
Copiar código
Com isso, fizemos a primeira parte da nossa consulta.
Já sabemos que precisamos exatamente de duas informações: data e
o valor total daquele dia. Não precisamos exatamente da data e hora,
só precisamos da data. Então, vamos usar uma nova função da
linguagem SQL para trabalhar com data, que é DATE.
Com DATE, extraímos de datahorapedido apenas a data, e damos
o alias de Dia. Precisamos do preço unitário, então, [Link].
Sabemos que precisamos somar esse campo, porque já temos o valor
por produto, naquele pedido específico, então, só precisamos somar
esse valor. Sendo assim, vamos dar um SUM() em [Link] e
colocar um alias de FaturamentoDiario.
SELECT DATE (datahorapedido) AS Dia, SUM([Link]) AS
FaturamentoDiario
FROM pedidos p
JOIN itenspedidos ip
ON [Link] = [Link];
Copiar código
Ao executar a consulta, obtemos como resultado a data e o
faturamento diário, que na realidade não está diário, está o
faturamento total de todas as vendas.
FaturamentoDi
Dia
ario
2023-01- 9542
FaturamentoDi
Dia
ario
02
Isso ocorreu porque não indicamos que queríamos agrupar essa soma
pelas datas. Faremos isso agora.
Então, ao final, depois de ON, passamos GROUP BY, indicando que
essa soma deve ser agrupada por Dia. Podemos, inclusive, fazer a
ordenação utilizando o ORDER BY também por Dia.
SELECT DATE datahorapedido AS Dia, SUM([Link]) AS
FaturamentoDiario
FROM pedidos p
JOIN itenspedidos ip
ON [Link] = [Link]
GROUP BY Dia
ORDER BY Dia;
Copiar código
Agora, temos o nosso faturamento diário para cada dia do ano,
calculando os pedidos que já existem na nossa base de dados.
Visualização dos 5 primeiros registros. Para conferir o retorno na
íntegra, execute-o na sua máquina.
FaturamentoDi
Dia
ario
2023-01-
98.5
02
2023-01-
96.5
06
2023-01-
70.5
12
2023-01-
71.5
18
2023-01-
88
22
Para facilitar, poderíamos usar uma view, que criaria uma tabela
virtual que armazenaria esse resultado nesse formato, com o dia e o
faturamento diário. Sempre que chamássemos essa view, teríamos
esse resultado. Mas será que existe uma forma mais simples e
automática de fazer o cálculo do nosso faturamento diário e
armazenar em uma tabela física? Isso facilitaria o acesso dos nossos
gestores a essa informação. A resposta é sim, temos essa
possibilidade.
Para isso, podemos usar Trigger (gatilho), um procedimento
armazenado que é acionado através de alguma ação. É utilizado
justamente para automatizar algumas etapas, como a inserção,
exclusão ou atualização de dados. Pode ser utilizado justamente para,
por exemplo, calcular um valor e inserir de forma automática em uma
tabela.
Vamos utilizar esse recurso, Trigger, para facilitar ainda mais o nosso
trabalho. Quando começarmos a criar todo o processo e acionar o
nosso gatilho, você entenderá melhor como funciona esse recurso.
O primeiro passo é criar a nossa tabela. Portanto, vamos criar uma
nova tabela de faturamento diário com o seguinte comando:
CREATE TABLE FaturamentoDiario (
Dia DATE,
FaturamentoTotal DECIMAL(10, 2)
);
Copiar código
FaturamentoDiario será o nome da tabela. Nela, teremos dois
campos, 'Dia', que é um DATE, e 'FaturamentoTotal', que vai ser
um DECIMAL.
Ao executar, criamos a nossa tabela, que aparecerá na lateral
esquerda, na área de tabelas. Agora, podemos criar o Trigger. Para
isso, usamos o comando CREATE TRIGGER e passamos um nome.
Vamos chamar de CalculaFaturamentoDiario.
Em seguida, informamos quando deve ser acionado, no caso, AFTER
INSERT ON itenspedidos. Ou seja, após o comando INSERT na tabela
de itens pedidos. Na sequência, passamos a informação FOR EACH
ROW, indicando que isso deve acontecer para cada linha da tabela.
Agora, abrimos um bloco de código com BEGIN, onde colocaremos
o SELECT, e o fechamos com END.
CREATE TRIGGER CalculaFaturamentoDiario
AFTER INSERT ON itenspedidos
FOR EACH ROW
BEGIN
END
Copiar código
Antes de trazer a nossa consulta, seria interessante validar se ela
realmente está funcionando. Então, vamos fazer um INSERT na nossa
tabela de faturamento diário para importar os valores totais dos
pedidos que já existem na nossa base de dados. Para isso, podemos
usar o SELECT no INSERT, da seguinte forma:
INSERT INTO FaturamentoDiario (Dia, FaturamentoTotal)
SELECT DATE(datahorapedido) AS Dia, SUM([Link]) AS
FaturamentoDiario
FROM pedidos p
JOIN itenspedidos ip
ON [Link] = [Link]
GROUP BY Dia
ORDER BY Dia;
Copiar código
Dessa forma, os valores virão do comando que busca o dia e o
faturamento diário, fazendo o cálculo.
Ao executar, não tivemos nenhum erro. Para nos certificar, vamos
executar SELECT * FROM FaturamentoDiario.
SELECT * FROM FaturamentoDiario
Copiar código
Como retorno, temos a nossa tabela com os registros que já existiam
nas tabelas de itens pedidos e pedidos.
Retorno omitido.
Agora, podemos copiar o INSERT INTO e colar dentro da nossa Trigger.
Assim, vamos inserir na nossa tabela de faturamento diário através
dessa consulta.
Antes disso, incluiremos um DELETE FROM FaturamentoDiario. Dessa
forma, sempre que a Trigger CalculaFaturamentoDiario for acionada,
que será quando for inserido um novo registro na tabela de itens
pedidos, ela deverá deletar tudo que já existe na
tabela FaturamentoDiario e inserir novamente através do SELECT.
CREATE TRIGGER CalculaFaturamentoDiario
AFTER INSERT ON itenspedidos
FOR EACH ROW
BEGIN
DELETE FROM FaturamentoDiario
INSERT INTO FaturamentoDiario (Dia, FaturamentoTotal)
SELECT DATE(datahorapedido) AS Dia, SUM([Link]) AS
FaturamentoDiario
FROM pedidos p
JOIN itenspedidos ip
ON [Link] = [Link]
GROUP BY Dia
ORDER BY Dia
END
Ao executar, a nossa Trigger foi criada. Na sequência, vamos
entender como ela funciona na prática.
OBS:
A professora incluiu a linha DELETE FROM FaturamentoDiario dentro
da trigger CalculaFaturamentoDiario para garantir que a
tabela FaturamentoDiario seja sempre atualizada com os valores
corretos a cada nova inserção na tabela itenspedidos.
Imagine o seguinte cenário:
1. Tabela Inicial: A tabela FaturamentoDiario está vazia ou
contém dados desatualizados.
2. Inserção: Um novo registro é inserido na tabela itenspedidos.
3. Trigger: A trigger CalculaFaturamentoDiario é acionada.
4. DELETE: A trigger primeiro remove todos os dados existentes
na tabela FaturamentoDiario para garantir que não haja
duplicatas ou informações incorretas.
5. INSERT: Em seguida, a trigger recalcula o faturamento diário
com base nos dados atualizados das
tabelas pedidos e itenspedidos e insere os novos valores na
tabela FaturamentoDiario.
Dessa forma, a tabela FaturamentoDiario sempre refletirá o
faturamento diário correto, mesmo após a inserção de novos pedidos.
Para saber mais: TRIGGER com DELETE e UPDATE
Uma trigger em um banco de dados é um tipo de procedimento
armazenado que é automaticamente executado em resposta a um
evento específico, como uma instrução DELETE ou UPDATE sendo
executada em uma tabela. As triggers são usadas para automatizar
tarefas, impor regras de integridade, auditar ações e realizar outras
ações automaticamente em um banco de dados.
Existem dois tipos principais de triggers relacionadas a
instruções DELETE e UPDATE:
Trigger com DELETE:
Uma trigger com DELETE é uma trigger que é acionada
automaticamente quando uma instrução DELETE é executada em
uma tabela específica.
Ela pode ser usada para realizar ações antes ou após a exclusão de
dados da tabela. Por exemplo, você pode criar uma
trigger DELETE para registrar informações sobre os registros excluídos
em uma tabela de log antes de excluí-los.
A trigger com DELETE pode ser usada para impor regras de
integridade referencial, como impedir a exclusão de registros em uma
tabela pai que têm filhos relacionados em uma tabela filho.
Exemplo: Suponha que você tenha uma tabela de "Pedidos" e uma
tabela de "ItensPedidos". Você pode criar uma trigger DELETE para
garantir que os itens de pedido correspondentes sejam excluídos
automaticamente quando um pedido for excluído.
Trigger UPDATE:
Uma trigger com UPDATE é uma trigger que é acionada
automaticamente quando uma instrução UPDATE é executada em
uma tabela específica.
Ela pode ser usada para realizar ações antes ou após a atualização de
dados na tabela. Por exemplo, você pode criar uma
trigger UPDATE para registrar as alterações feitas em determinados
campos de registro antes de atualizá-los.
A trigger com UPDATE pode ser usada para impor regras de validação
ou de negócios, como impedir que um valor específico seja atualizado
em uma coluna.
Exemplo: Em uma tabela de "Colaboradores", você pode criar uma
trigger UPDATE para rastrear a data da última atualização do registro
de funcionário e impedir que o salário de um funcionário seja reduzido
em mais de 10%.
Em ambas as situações, as triggers DELETE e UPDATE são usadas
para automatizar ações relacionadas às
instruções DELETE e UPDATE no banco de dados. Elas podem ser
poderosas, mas devem ser usadas com cuidado, pois podem afetar o
desempenho e a integridade dos dados do banco de dados. É
importante projetá-las e testá-las com atenção para garantir que elas
atendam aos requisitos específicos do sistema.
Executando TRIGGER
Vamos recapitular o que fizemos!
Nós implementamos um comando que calcula o nosso faturamento
diário. Ele busca a data e faz a soma do nosso preço unitário,
agrupando pela data. Portanto, se o executarmos, teremos resultado
até o dia 06.10.2023, que é a última data que temos em nossa tabela
de itenspedidos. Neste caso, a nossa tabela de pedidos é de onde a
data vem. Portanto, temos esse registro.
Em seguida, criamos a nossa tabela de faturamento diário e a
nossa trigger, que calcula esse faturamento diário automaticamente,
após o INSERT na nossa tabela de itenpedidos. Se executarmos,
teremos o mesmo resultado daquele cálculo, só que de forma mais
simples, porque ele já está armazenado dentro da tabela. Portanto,
sempre que executarmos esse SELECT, buscaremos de uma tabela
física, e não de uma view.
Agora que já criamos a nossa trigger, você pode estar se perguntando
onde ela fica armazenada. Diferentemente das tabelas e views, ela
não possui uma área específica na lateral esquerda. Então, como
temos a certeza que ela foi criada?
Se verificarmos as informações de itenspedidos, que é a tabela que
associamos a essa trigger, temos uma nova área, que é justamente a
área de trigger, onde ela está armazenada. Portanto, sempre que
criarmos uma trigger no SQLite, podemos encontrá-la na tabela na
qual fizemos essa associação, dentro das informações da tabela.
Agora, vamos inserir novos dados nas tabelas
de pedidos e itenspedidos, já que a nossa trigger só é acionada
quando inserirmos novos registros. Para isso, vamos abrir uma nova
aba e executar os seguintes comandos de SELECT:
SELECT * FROM FaturamentoDiario
SELECT * FROM pedidos
SELECT * FROM itenspedidos
Copiar código
Note que o último registro de FaturamentoDiario é do dia 06.10.2023,
no valor de 58. Já nas tabelas pedidos e itenspedidos, o último
registro é do ID 450. Vamos inserir um novo pedido na tabela pedidos,
de ID 451, usando o comando de INSERT:
INSERT INTO Pedidos(ID, IDCliente, DataHoraPedido, Status)
VALUES (451, 27, '2023-10-07 14:30:00', 'Em Andamento');
Copiar código
Após executar essa inserção, podemos checar novamente a tabela de
pedidos. Agora, o último registro de pedidos possui o ID 451. Já o
último registro de FaturamentoDiario continua sendo do dia
06.10.2023, no valor de 58. Isso ocorre porque o gatilho só será
acionado quando inserirmos em itenspedidos. Portanto, vamos fazer
isso.
INSERT INTO ItensPedidos(IDPedido, IDProduto, Quantidade,
PrecoUnitario)
VALUES (451, 14, 1, 6.0),
(451, 13, 1, 7.0);
Copiar código
Após executar essa inserção, podemos checar a tabela itenspedidos.
Agora, o último registro possui o ID 451. Já o último registro
de FaturamentoDiario é do dia 07.10.2023, no valor de 13. Portanto, o
nosso gatilho está funcionando.
Sempre que um novo pedido for inserido, automaticamente esse valor
vai aparecer na nossa tabela de FaturamentoDiario, o que será muito
interessante para ajudar nossos gestores, porque eles terão acesso a
essa informação à mão.
Vamos inserir outro registro, primeiro em pedidos, depois
em itenspedidos:
INSERT INTO Pedidos (ID, IDCliente, DataHoraPedido, Status)
VALUES (452, 28, '2023-10-07 14:35:00', 'Em Andamento');
Copiar código
INSERT INTO ItensPedidos (IDPedido, IDProduto, Quantidade,
PrecoUnitario) VALUES (452, 10, 1, 5.0),
(452, 31, 1, 12.50);
Copiar código
Feito isso, vamos para a nossa tabela de FaturamentoDiario. Ao final
dela, temos, agora, o valor de 30.5.
Conhecemos diversos recursos da linguagem SQL que podemos
utilizar para facilitar o dia a dia dos gestores, das pessoas que
precisam tomar decisões dentro de um negócio. Agora que
conseguimos calcular o faturamento diário do Serenatto Café e Bistrô,
acreditamos que os gerentes desse empreendimento ficarão felizes
por terem essa informação em mãos.
Além de buscar todas essas informações, precisamos saber montar as
consultas e deixar os dados atualizados dentro das tabelas. É o que
aprenderemos na sequência!
Faça como eu fiz: relembrando - VIEWs e TRIGGER
Durante esta aula conhecemos sobre os como criar VIEWs para
simplificar a execução de consultas e como utilizar Triggers para
automatizar alguns processos.
Então, vamos relembrar os conceitos aprendidos?!
VIEW
Uma VIEW em SQL é uma consulta armazenada que cria uma
representação virtual de uma tabela a partir dos resultados de uma
consulta SQL.
CREATE VIEW ViewTotalPorPedido AS
SELECT
[Link] AS ID_Pedido,
[Link],
[Link] AS NomeCliente,
SUM([Link] * [Link]) AS TotalPorPedido
FROM Pedidos AS P
JOIN Clientes AS C ON P.ID_Cliente = [Link]
JOIN ItensPedido AS IP ON [Link] = IP.ID_Pedido
GROUP BY [Link], [Link], [Link];
Copiar código
Criando uma View com a consulta que calcula o total dos pedidos.
SELECT * FROM ViewTotalPorPedido;
Copiar código
Após criar a View podemos utilizá-la normalmente como uma tabela.
TRIGGER
Uma Trigger é um procedimento armazenado que é executado
automaticamente em resposta a um evento específico em uma
tabela.
CREATE TRIGGER CalculoFaturamentoDiario
AFTER INSERT ON ItensPedido
FOR EACH ROW
BEGIN
DELETE FROM FaturamentoDiario ;
INSERT INTO FaturamentoDiario (Dia, FaturamentoTotal)
SELECT
DATE([Link]) AS Dia,
SUM([Link] * [Link]) AS Faturamento
FROM Pedidos AS P
JOIN ItensPedido AS IP ON [Link] = IP.ID_Pedido
GROUP BY Dia
ORDER BY Dia;
END;
Copiar código
Criando uma trigger que calcula automaticamente o faturamento
diário. Ao inserir nossos registros na nossa tabela de itens pedidos, a
nossa trigger será acionada.
Atualizando dados
Já elaboramos diversos relatórios importantes. Nesta aula,
atualizaremos as informações para garantir sua integridade e
alinhamento com a realidade. Não é suficiente apenas buscar os
dados; é imperativo que estejam em conformidade com o mundo real.
Para isso, no SQL Online, selecionamos a primeira aba "[Link]"
(aba padrão). Nela, iremos atualizar as informações da tabela de
produto. Primeiro, rodamos o select para visualizar os dados:
SELECT * FROM produtos
Copiar código
Logo após, clicamos em "Run" no canto superior esquerdo.
A tabela abaixo foi parcialmente transcrita. Para conferi-la na íntegra,
execute o código na sua máquina.
i prec categor
nome descricao
d o ia
Um shot de espresso forte e
1 Espresso 2.5 Café
encorpado
2 Cappuccin Espresso, leite vaporizado e espuma 3.5 Café
i prec categor
nome descricao
d o ia
o de leite
Precisamos atualizar algumas informações, incluindo preço e
descrição. No entanto, antes de usar o comando update para realizar
essas atualizações, é crucial compreender um ponto essencial sobre o
SQLite online: ele não valida as chaves estrangeiras.
Tomemos, por exemplo, a tabela de pedidos do lado esquerdo, que
contém o campo idcliente. Ao adicionar um pedido e especificar
o idcliente, é necessário que esse ID exista na tabela de clientes.
Entretanto, o SQLite online não realiza essa validação. Já tivemos
casos em que conseguimos inserir pedidos sem que estivessem
vinculados a um cliente existente, indicando a falta de validação da
chave estrangeira.
Essa é uma característica intrínseca do SQLite online, de seus
parâmetros e de sua configuração padrão.
É necessário indicar explicitamente que desejamos validar essa chave
estrangeira, essa ligação. E como isso pode ser feito? Através
do pragma.
Usando o pragma
O pragma é uma funcionalidade exclusiva do SQLite online. Se por
acaso estiver presente, não está relacionado à linguagem SQL, sendo
uma configuração específica do próprio SGBD, sujeita a alterações
conforme a versão do SQLite online que estamos utilizando.
Por meio desse pragma, podemos modificar as configurações do
nosso SQLite online. Informamos a ele que desejamos validar nossas
chaves estrangeiras, estabelecendo foreign_keys = ON.
PRAGMA foreign_keys = ON
Copiar código
Ao executar esse comando clicando em "Run", como retorno ele
confirma a execução na parte inferior. A partir deste ponto, nossas
chaves estrangeiras estão sendo validadas.
Vocês podem estar se questionando: por que abordar esse aspecto
agora? Por que não no início, durante a inserção dos dados? Este é
um ponto importante. Aqui, estamos focados no aprendizado,
buscando compreender e dominar o uso da linguagem SQL e de seus
recursos. Contudo, é essencial não apenas conhecer a linguagem
SQL, mas também entender o SGBD que estamos utilizando.
No contexto do SQLite Online, se estivéssemos implementando em
um ambiente de produção sem prévia pesquisa, já teríamos todos os
dados importados em nosso banco de dados e realizado diversas
consultas, o que poderia acarretar problemas. Como mencionado,
esse cenário não é exclusivo do SQLite Online.
Por exemplo, ao utilizar o MySQL Workbench, que é o client do
MySQL, é necessário fornecer uma cláusula where ao executar os
comandos update e delete, mesmo que seja intencional. Para
contornar isso, é preciso acessar as configurações e modificar o
parâmetro para permitir a execução do update sem a cláusula where.
Cada Sistema de Gerenciamento de Banco de Dados (SGBD) possui
suas peculiaridades.
Essa é a razão pela qual é fundamental possuirmos um conhecimento
aprofundado sobre o SGBD que estamos utilizando e avaliar se ele
atende efetivamente às necessidades do nosso projeto. Agora que
ativamos a validação das chaves estrangeiras, podemos prosseguir
com a atualização dos nossos dados.
Atualizando os dados
Atualizaremos os dados, mais especificamente, o preço de um
produto inserido recentemente. Para isso, no comando select usamos
o where e modificaremos o id para 31, correspondente ao nosso
último produto inserido.
SELECT * FROM produtos WHERE id = 31
Copiar código
Ao rodarmos clicando em "Run", observamos que esse produto é a
Lasanha à Bolonhesa. Agora, o preço não será mais R$12,50, mas
sim R$13.
Atualizando o preço
Utilizaremos o UPDATE produtos para setar o valor do campo de preço
para R$13. Em seguida, aplicamos o filtro com o WHERE.
UPDATE produtos SET preco = 13.0 WHERE id = 31
Copiar código
O que aconteceria sem o filtro? O preço de todos os produtos seria
atualizado para R$13, o que não desejamos. Executamos o comando
selecionando-o por completo e clicando em "Run". Como retorno
temos uma confirmação da execução.
Para visualizar se deu certo, rodamos:
SELECT * FROM produtos WHERE id = 31
Copiar código
Agora, na coluna "preco" consta o valor R$13.
Usando o like
Além da atualização da lasanha, também modificaremos outro
produto. Rodamos o SELECT para visualizar as informações:
SELECT * FROM produtos
Copiar código
Possuímos diversas informações, incluindo o Croissant, que possui
duas variantes: chocolate e amêndoas. Se buscarmos apenas pelo
nome, não conseguiremos distinguir entre eles.
Podemos buscar pelo nome utilizando o LIKE. Com essa abordagem,
conseguimos especificar trechos exatos de strings para comparação.
Informamos que desejamos trazer apenas os produtos cujo nome
comece com "croissant".
SELECT * FROM produtos WHERE nome LIKE 'croissant%'
Copiar código
Adotamos a expressão "croissant%" para essa finalidade. Com essa
estrutura, a busca será restrita aos produtos que iniciam com
"croissant". Selecionamos "Run" na parte superior esquerda.
Obtemos como retorno:
prec categori
id nome descricao
o a
1 Croissant Croissant recheado com Sobreme
3.5
1 Chocolate chocolate belga. sa
2 Croissant de Croissant recheado com Sobreme
3.5
8 Amêndoa chocolate belga. sa
Notamos que o croissant de amêndoa possui a mesma descrição do
chocolate, algo que precisamos modificar.
Procedemos com a atualização dessa informação, ajustando a
descrição para "croissant recheado com amêndoas" no produto de id
28. Usaremos o UPDATE produtos SET descricao informando o id que
desejamos alterar a descrição desejada para substituir a anterior.
UPDATE produtos SET descricao = 'Crossaint recheado com
amêndoas.' WHERE id = 28
Copiar código
Selecionamos o comando e clicamos em "Run". Como retorno,
obtemos a confirmação da atualização. Ao rodarmos o SELECT * FROM
produtos WHERE nome LIKE 'croissant%' novamente, temos como
retorno seguinte tabela:
prec categori
id nome descricao
o a
1 Croissant Croissant recheado com Sobreme
3.5
1 Chocolate chocolate belga. sa
2 Croissant de Croissant recheado com Sobreme
3.5
8 Amêndoa amêndoas. sa
Conclusão
A atualização foi bem-sucedida, sem retornar erros. Agora, nossos
dados estão devidamente atualizados. Entretanto,
também removeremos os dados que não fazem mais sentido
persistir em nossa base de dados.
Excluindo dados
Atualizamos os dados, incluindo o preço da lasanha e a descrição
alterada do croissant recheado com amêndoas, que, no caso, passou
a ser recheado com chocolate belga. Chegou o momento
de excluir os dados não mais utilizados. Podemos, por exemplo,
remover nossas informações.
Removendo dados não usados
Rodamos o seguinte select para visualizar as informações:
SELECT * FROM colaboradores
Copiar código
Fomos informados de que um dos colaboradores do Serenatto foi
desligado, tendo solicitado o desligamento voluntário. Agora, iremos
atualizar nossa tabela, excluindo as informações referentes a esse
colaborador. Neste caso, não há problema, pois não temos conexão
entre a tabela de colaboradores e qualquer outra tabela, como a de
pedidos.
Dado o pedido de desligamento desse colaborador, as pessoas
gestoras concordaram em remover suas informações da nossa tabela
de colaboradores. Vamos realizar essa exclusão, aplicando o filtro com
o ID 3, correspondente a Pedro Almeida.
SELECT * FROM colaboradores WHERE id =3
Copiar código
Obtemos como retorno os dados do Pedro Almeida, como id, nome,
cargo, data de contratação, telefone, e-mail, rua, cidade, Estado e
cep.
Usando o delete para remover uma pessoa colaboradora
Para remover informações e excluir dados, utilizaremos o
comando delete. Assim, delete from o colaborador com ID igual a 3.
DELETE FROM colaboradores WHERE id =3
Copiar código
É simples utilizar o delete, sendo bastante semelhante ao select, com
a única diferença de que não especificamos o asterisco ou o campo.
Executamos clicando em "Run" e como retorno obtemos uma
confirmação da execução.
Ao buscar todos os dados de colaboradores (SELECT * FROM
colaboradores), observamos a ausência de Pedro Almeida. Agora,
temos apenas Inês Lima, atuando como barista. Isso é relevante, pois
conseguimos manter nossa tabela de colaboradores atualizada, e
agora procederemos à remoção de outras informações, desta vez da
tabela de clientes.
Removendo informações da tabela clientes
Primeiro, buscamos pelas informações:
SELECT * FROM clientes
Copiar código
Clicamos em "Run". Obtemos como retorno todos os clientes na parte
inferior, mas há um cliente específico que fez apenas um pedido e
não realizou mais nenhuma compra, não retornando posteriormente.
Ele não deseja mais que seus dados permaneçam cadastrados no
banco de dados do Serenatto Café & Bistrô. Procederemos à exclusão
dos dados desse cliente.
Excluiremos os dados do cliente com ID 27:
SELECT * FROM clientes WHERE ID = 27
Copiar código
Clicamos em "Run" novamente. Obtemos como retorno o nome Paulo
Sousa, conforme sua solicitação para remover seu cadastro dos
registros do Serenatto Café & Bistrô. Entretanto, Paulo já efetuou um
pedido, com apenas uma entrada registrada. Buscamos por essa
informação na tabela de pedidos com o seguinte comando:
SELECT * FROM pedidos WHERE idcliente = 27
Copiar código
Novamente selecionamos "Run".
Ao consultar nossa tabela de pedidos, identificamos o ID 27,
correspondente ao cliente Paulo, e seu único pedido registrado,
identificado como 451 conforme observamos na coluna "id". Podemos
também validar essa informação na seção de itens pedidos, onde
encontramos o mesmo ID.
SELECT * FROM itenspedidos WHERE idpedido = 451
Copiar código
Obtemos como retorno dois itens do pedido. A tabela possui os
campos: "idpedido", "idproduto", "quantidade" e outro campo que não
é possível ser visualizado.
O cliente deseja a remoção dessa informação, portanto,
procederemos com a exclusão. Antes de executar nosso
comando delete, surge a questão: caso optemos por remover os
dados do Paulo, há a preocupação de perdermos os dados do pedido.
Este pedido já foi efetuado, vendido, e a exclusão dos dados do
cliente não impactaria nos dados de pedidos, essenciais para o
faturamento e elaboração de relatórios.
Vamos pegar o outro delete e substituir as informações:
DELETE FROM clientes WHERE id = 27
Copiar código
A princípio, deveríamos ter um erro. Por quê? Porque já que está
habilitado o nosso foreign_keys, não podemos excluir um cliente onde
o dado dele está em outras tabelas.
Verificamos o que acontecerá. A seguir, excluiremos executando o
comando delete. Não houve retorno de erros. Se buscarmos o id 27,
não temos nada de retorno; ao buscarmos por pedidos e itenspedidos
também não.
Portanto, ao executarmos todos os comandos abaixo após a exclusão,
não obtemos retorno:
SELECT * FROM clientes WHERE ID = 27
SELECT * FROM pedidos WHERE idcliente = 27
SELECT * FROM itenspedidos WHERE idpedido = 451
Copiar código
Se buscarmos todos os dados de colaboradores com SELECT * FROM
clientes, não encontraremos mais Paulo Sousa. Do id 26 pula para o
28. Ao buscarmos em pedidos com o comando SELECT * FROM
pedidos, observamos que não temos mais o pedido 451 na coluna
"id". Também perdemos as informações em itenspedidos, ao
executarmos o comando select observamos que não temos mais o id
451.
Isso acontece porque estabelecemos uma relação que resultou que ao
removermos o cliente, foi removido todos os dados
de pedidos e itenspedidos. Isso porque ao criar a tabela de clientes e
configurar a chave estrangeira com o comando ON DELETE CASCADE,
decidimos que, ao excluir um cliente da tabela de clientes, todos os
registros relacionados a ele também seriam removidos. Foi
exatamente o que ocorreu.
A exclusão do cliente com ID 27 resultou na remoção automática de
seus pedidos, incluindo os itens associados, tudo de uma só vez.
Isso não representaria um problema se precisássemos manter, como
é o caso, os registros de vendas dos nossos clientes. Por quê? Porque
isso é importante para o faturamento. É essencial estruturar nossas
tabelas de maneira cuidadosa no momento da criação e compreender
quais recursos fazem sentido utilizar ou não.
O Delete Cascade, foi realmente vantajoso para manter esse
faturamento atualizado? Não foi. A partir do momento em que
excluímos nosso cliente, perdemos os dados de pedidos e itens
pedidos, essenciais para as pessoas gestoras acompanharem o
faturamento.
Embora o dinheiro tenha entrado em caixa e esteja registrado, não
está presente em nosso banco de dados. Neste caso, o Delete
Cascade não é muito vantajoso.
Precisamos ter muito cuidado ao utilizar o Delete Cascade ou outras
restrições ao criar nossas tabelas. Dessa forma, quando o banco de
dados estiver em produção, evitaremos contratempos que possam
prejudicar a empresa com a qual estamos colaborando.
Já realizamos a exclusão. Demonstramos como o Delete
Cascade funciona. É um recurso bastante interessante. No entanto, é
importante ter cautela ao utilizar tanto o Delete quanto o Update.
Atualizando o status
Falando em Update, é necessário atualizar mais uma informação.
Houve uma omissão, e agora que as pessoas gestoras perceberam,
solicitaram que realizemos a atualização, especificamente, para
o status.
SELECT * FROM pedidos
Copiar código
Se observarmos nosso primeiro pedido do mês de janeiro, assim como
vários outros, ainda estão em andamento. Eles desejam atualizar
essa informação, alterando o status dos pedidos em andamento para
serem concluídos.
Digitamos:
UPDATE Pedidos SET Status = 'Concluído'
Copiar código
Poderia executar, atualizando realmente os status dos meus pedidos.
Contudo, isso afetaria todos eles. Por quê? Porque não estamos
aplicando uma cláusula WHERE para filtrar. Isso representaria um
grande problema.
Conclusão
Contudo, há outra maneira de garantir uma camada adicional de
segurança para os dados, além do WHERE, durante a manipulação do
banco de dados, utilizando o Delete e o Update?
A resposta será abordada no próximo vídeo!