Professional Documents
Culture Documents
Query SQL
EAC SOFTWARE
GERNCIA DE SERVIOS E COORDENAO DE TREINAMENTOS
QuerySQL
BELO HORIZONTE
Convenes Tipogrficas
-> : Este smbolo ser usado para comandos a serem executados no prompt do
Linux ou opes de configuraes (comandos do .bash_profile por exemplo).
Crditos
A reproduo ou transmisso por qualquer meio, seja este eletrnico, mecnico,
fotocpia, gravao ou outros, s ser permitido com prvia autorizao por escrito da
EAC Software.
Copyright 2008 da EAC - Engenharia Automao e Controle
Produzido por EAC Software
Sumrio
1. Como comear a montar um relatrio no SACI.................................................................6
1.2 Definir o objetivo do relatrio.......................................................................................6
1.3 Filtro.............................................................................................................................6
1.4 Colunas a serem impressas........................................................................................7
1.5 Exerccio 1...................................................................................................................8
2. Introduo a Banco de Dados...........................................................................................9
2.1 Definies....................................................................................................................9
2.1.1 Dados...................................................................................................................9
2.1.2 Tabela...................................................................................................................9
2.1.3 S.G.B.D. (Sistema Gerenciador de Banco de Dados).......................................10
2.1.4 Chave .................................................................................................................11
2.2 Relacionamento entre Tabelas..................................................................................12
2.3 Tipos de Relacionamento..........................................................................................13
2.3.1 Um-para-Um.......................................................................................................13
2.3.2 Um-para-Muitos..................................................................................................13
2.3.3 Muitos-para-Muitos.............................................................................................13
3. Onde Buscar a informao?............................................................................................14
3.1 Definir a tabela Mestre...............................................................................................15
3.2 Quais as chaves podero ser utilizadas?..................................................................15
3.3 Conhecendo as tabelas do SACI atravs do Query Gerenciador............................15
3.4 Exerccio 2.................................................................................................................16
3.5 Exerccio 3.................................................................................................................17
4. Conceitos Bsicos de SQL..............................................................................................17
4.1 O cliente MySQL........................................................................................................17
4.2 Modos de Logar no banco MySQL............................................................................18
4.3 Comandos..................................................................................................................18
5. Comando SELECT...........................................................................................................19
5.1 Sintaxe.......................................................................................................................19
5.2 Exemplos simples......................................................................................................19
5.3 O QuerySQL - Editar e Executar SELECTS..............................................................20
5.4 Criar uma nova QuerySQL........................................................................................20
5.5 Exerccio 4.................................................................................................................21
5.6 Padronizao.............................................................................................................21
Ttulo do Relatrio
Objetivo
Endereos de Clientes
1.3 Filtro
Na maioria dos relatrios necessrio que sejam informados alguns parmetros de
seleo ou filtragem. Assim, no exemplo acima, no relatrio de Despesas por
Perodo/Conta Razo o usurio poder informar qual o perodo e at mesmo qual a conta
razo para gerao do relatrio.
Sendo assim, antes de comear a fazer o seu relatrio, tenha em mente como
sero os parmetros de seleo ou filtragem dos dados.
Exemplos de parmetros de filtragem aplicados ao SACI (em todos os casos a
seleo pode ser feita informado-se o parmetro inicial e final, todos ou apenas um).
MN SACI 035
1.3 Filtro
Perodo
Centro de Lucro
Loja
Conta Razo
Cliente
Produto
Fornecedor
Funcionrio
Telefone do cliente
Data da ltima Compra
importante tambm observar se as colunas escolhidas para a impresso do
relatrio so coerentes com o seu objetivo.
1.5 Exerccio 1
Pense em um relatrio que seja necessrio em sua empresa e nos espaos abaixo,
escreva sua anlise, baseado nos conceitos vistos.
Ttulo do Relatrio
Objetivo do Relatrio:
Filtro:
Colunas:
MN SACI 035
2.1 Definies
2.1.1 Dados
So fatos que podem ser armazenados. Por exemplo, nomes, endereos e
telefones, ou seja, um pedao da informao, que, solto no tem sentido. Ex.: CPF. De
quem este CPF?
Banco de Dados - Como banco de dados podemos entender uma coleo de
dados inter-relacionados, representando informaes sobre um domnio especfico. Por
exemplo uma lista telefnica. De maneira mais simples dizemos que um conjunto de
tabelas.
2.1.2 Tabela
Uma tabela composta por registros (linhas) e (colunas).
As colunas so nomeadas e definidos para guardar cada um dos dados
organizadamente. Assim, em uma tabela de lista de telefones temos os campos de nome,
endereo e telefone basicamente.
Os Registros so os dados gravados em uma tabela. No exemplo, ao gravar na
tabela o nome do instrutor deste curso, o seu endereo e o seu telefone, temos inserido
na tabela um registro.
MN SACI 035
2.1 Definies
2.1.3 S.G.B.D. (Sistema Gerenciador de Banco de Dados)
o software responsvel pelo gerenciamento (armazenamento e recuperao) dos
dados no Banco de Dados.
Este software pode trabalhar sozinho ou associado a algum outro tipo de software.
Tem basicamente cinco funes, sendo:
1. Manipulao dos dados (escrever, consultar e retirar)
2. Restrio de integridade (no permitir dados inconsistentes)
3. Segurana dos dados (controle de acessos)
4. Controle de Concorrncia (vrios acessos ao mesmo dado no mesmo tempo)
5. Independncia dos dados (modificaes no esquema de gerenciamento dos
dados sem comprometer a aplicao que os utiliza)
MN SACI 035
10
2.1 Definies
2.1.4 Chave
Cada tabela possui uma ou mais ordenaes diferentes. Ordenao, como o
prprio nome j diz, a ordem dos campos dentro da tabela. Esta ordenao tambm
chamada de chave e serve para que as buscas na tabela sejam feitas de maneira
inteligente e fcil.
Em uma analogia mais simples, podemos dizer que as chaves so para a tabela o
que o ndice para um livro. muito mais fcil buscar uma informao em um livro lendo
o seu ndice do que lendo todas as suas pginas.
Uma chave formada por um ou mais campos que nos permitem identificar
unicamente um registro em uma tabela.
As Chaves Primrias so, obrigatoriamente, unique (nica). Chaves uniques so
aquelas que no podero ser repetidas dentro da tabela, ou seja, chaves que no
armazenam um mesmo valor mais de uma vez. Exemplo: Em uma tabela de clientes, o
nmero do CPF no pode ser repetido. No existem duas pessoas com um mesmo
nmero de CPF.
Chaves Secundrias ou estrangeiras so outra forma de restrio, ou seja, de
acesso rpido s informaes da tabela. Estas chaves podem, opcionalmente, ser unique
(nica) ou no. Exemplo:
Chave secundria no unique: Em uma tabela de clientes, a cidade pode ser
uma chave secundria, pois vrios clientes pertencem a uma mesma cidade.
Chave secundria unique: Em uma tabela de clientes no podem existir dois
clientes com um mesmo nmero de carteira de identidade.
MN SACI 035
11
2.1 Definies
MN SACI 035
12
2.3.1 Um-para-Um
Quando um campo em uma tabela A est associada com no mximo um campo em
uma tabela B, e um campo na tabela B est ligado com no mximo um campo na tabela
A.
Por exemplo, as tabelas de produtos do SACI (prd) e centro de lucro (cl) so
relacionadas do tipo um-para-um, pois para cada produto existe apenas um nico centro
de lucro
2.3.2 Um-para-Muitos
Quando um campo em uma tabela A est associado a qualquer nmero de campos
em uma tabela B. Entretanto, um campo da tabela B pode estar associado a no mximo
um campo na tabela A.
Por exemplo, a relao entre a tabela de pedidos de clientes (eord) e os produtos
de pedidos de clientes (eoprd)
2.3.3 Muitos-para-Muitos
Quando um ou mais campos de uma tabela A est associado a qualquer nmero
de campos em uma tabela B, e um ou mais campos da tabela B esto associados a um
ou mais campos da tabela A.
Como exemplo podemos citar a relao entre as tabelas de notas fiscais de sada
(nf) e a tabela de duplicatas (dup). Podem haver uma ou mais duplicatas para uma
mesma nota fiscal. Tambm podem existir vrias notas fiscais para uma mesma duplicata.
Neste exemplo especfico, existe uma terceira tabela intermediria, que relaciona
duplicatas e notas fiscais (nfdup).
MN SACI 035
13
Tabelas-pai
Tabelas-filho
prd
eord
inv
SACI. Teclando F1 duas vezes seguidas e depois a letra " q ", o sistema de busca do help
posiciona em " Query - ....... Diagrama de Relacionamentos .......". Tecle <enter> para
confirmar esta opo.
So exibidos para cada tabela-pai, as tabelas-filhos relacionadas ela
14
MN SACI 035
15
3.4 Exerccio 2
3.4 Exerccio 2
Qual o nome dos bancos de dados utilizados pelo SACI?
3.5 Exerccio 3
Baseado no que j foi visto at agora, responda as informaes complementares
ao exerccio 1:
* Onde est a informao:
MN SACI 035
16
3.5 Exerccio 3
* Tabela Mestre:
* Chaves possveis:
MN SACI 035
17
4.3 Comandos
Todo comando digitado no cliente MySQL deve ser terminado pelo sinal '' ; '' (ponto
e vrgula)
-> show databases; - Exibe os bancos de dados existentes
-> show tables from [database]; Exibe as tabelas existentes para o banco de dados
informado
-> show columns from [tabela]; Exibe as colunas da tabela informada
-> create database [nome_banco]; Cria um novo banco com o nome informado
-> drop database [nome_banco]; Deleta o banco de dados informado
-> auto rirash (auto complementar)
-> parametro -A (mysql -A)
-> desc [nome tabela];
-> explain [nome tabela];
-> pager less -S (exibe paginado)
-> show index [tabela]; (exibe as chances da tabela)
5. Comando SELECT
Se fosse em Portugus este comando seria algo como:
SELECIONE
O QU (colunas)
DE QUEM (tabelas)
NA CONDIO (seleo)
MN SACI 035
18
5. Comando SELECT
INCLUINDO OUTROS (outras tabelas)
AGRUPADO POR (agrupamento)
INCLUI SE TIVER (filtro)
ORDENADO POR (ordenao)
5.1 Sintaxe
SELECT
coluna1, coluna2, ...
FROM tabela1, tabela2 [JOIN]
WHERE condio
GROUP BY (coluna1, ...)
HAVING (...)
ORDER BY (coluna3, coluna4, ...)
MN SACI 035
19
MN SACI 035
20
5.5 Exerccio 4
5.5 Exerccio 4
Insira uma nova query e, utilizando os recursos de editor e executar, crie as selects
dos exemplos vistos anteriormente
5.6 Padronizao
importante que o usurio tenha o cuidado de padronizar a SELECT, mantendo o
arquivo com as instrues de maneira que possa ser facilmente entendido.
Uma boa maneira de se comear optar pela letra maiscula para os comandos
SELECT. Exemplo:
SELECT
no, name FROM custp
Outra forma interessante a identao. Cada comando em uma linha. Exemplo:
SELECT
no AS Codigo,
name AS Descrio
FROM
custp
WHERE
name LIKE 'a%'
ORDER BY
name
LIMIT 20
Nomear as colunas e tabelas tambm fundamental. Isso feito atravs da
declarao AS. Exemplo:
MN SACI 035
21
5.6 Padronizao
no AS Codigo,
name AS Descrio
Parmetros
Opes/ Descrio
Igual a
!=
Diferente de
>
Maior que
<
Menor que
>=
Maior igual
<=
Menor que
BETWEEN
Entre
LIKE
IN
Otimizao
AND/OR
E / OU
Exemplos:
WHERE clno = 010101
WHERE empno != 3
WHERE date >= 20040101 AND <= 20040131
WHERE storeno = 1 OR storeno = 2 OR storeno = 3
WHERE storeno IN(1,2,3,5)
MN SACI 035
22
MN SACI 035
23
MN SACI 035
24
MN SACI 035
25
MN SACI 035
26
5.9 Exerccio 5
Monte uma select buscando todos os clientes do SACI que possuam ''silva'' no
nome
Monte uma select buscando todos os produtos que estejam cadastrados com o
MN SACI 035
27
5.9 Exerccio 5
centro de lucro 010101
Liste o total de vendas da loja 1 para o ms de janeiro de 2002
Liste os valores totais em aberto para duplicatas e recibos para a loja 2 e emitidos
no ano de 2001
6. Relacionando Tabelas
Na maioria dos casos, para que se obtenha o resultado desejado em uma SELECT,
necessrio que a consulta seja feita em mais de uma tabela. Nestes casos, as tabelas
devem ser relacionadas.
Relacionar tabelas significa un-las atravs de um ou mais campos em comum.
Nestas situaes, o usurio dever sempre observar as chaves das tabelas,
visando a melhor forma de relacion-las.
Por exemplo, imagine uma SELECT simples onde devem ser listados o nome do
produto e o nome do centro de lucro a que o produto pertence.
Os dados do produto esto na tabela prd, inclusive qual o nmero do centro de
lucro cadastrado para ele. Porm a descrio deste centro de lucro est na tabela onde
so cadastrados os centros de lucro, a tabela cl. A SELECT ficaria ento:
SELECT
prd.no AS Codigo,
prd.name AS Descrio,
cl.name AS 'Centro Lucro'
FROM
sqldados.prd, sqldados.cl
WHERE
prd.clno = cl.no
A este tipo de relacionamento chamamos de join plena.
MN SACI 035
28
6. Relacionando Tabelas
importante ficar atento em relao as joins. Conforme a maneira que uma
SELECT feita, a join pode resultar em um produto cartesiano entre as tabelas
relacionadas, ou seja, para cada registro lido da tabela mestre, sero lidos todos os
registros da tabela relacionada. Imagine esta situao entre duas tabelas grandes, como
por exemplo xalog2 e custp....
6.2 Exerccio 6
Monte um relatrio com cdigo do vendedor, nome do vendedor e valor total de
vendas para loja 1 e ano de 2002
MN SACI 035
29
6.4 Exerccio 7
Monte uma SELECT para identificar se existe inconsistncia entre contratos e
parcelas do credirio.
MN SACI 035
30
7. O QuerySQL
7. O QuerySQL
Esta ferramenta foi criada para permitir aos usurios do EAC-SACI for MySQL
elaborar relatrios diversos, aliando a velocidade do MySQL com recursos de formatao
do SACI. Assim, de qualquer mdulo do sistema ser possvel executar estes relatrios
atravs da tecla de atalho < Ctrl A >, ou ento diretamente no mdulo QuerySQL Biblioteca. O acesso ser configurado para cada usurio, semelhante as outras opes do
SACI.
Alm das ferramentas prprias do MySQL, foram desenvolvidas vrias outras
exclusivas para este mdulo, facilitando a elaborao de '' selects '' pelo usurio.
7.1 Configuraes
O arquivo executvel para o QuerySQL o qsql e a tabela correspondente a
sqlexe. Cada query criado ter um arquivo-texto correspondente, onde ser digitada a "
select " correspondente a ele. A sugesto da EAC que seja criado o diretrio /u/saci/sql
para armazenamento dos arquivos de " selects ".
Tambm, a fim de manter um certo padro e organizao, todo arquivo de " select "
dever ter a extenso .sql
MN SACI 035
31
32
MN SACI 035
33
MN SACI 035
34
Nome Vendedor
Duplicatas
Valor
Data
Roberto Carlos
234/1
3.514,00
31/01/2002
Roberto Carlos
152/1
1.135,00
31/01/2002
Roberto Carlos
831/6
1.453,15
15/02/2002
Opo 2:
Relatrio tipo Mestre/Detalhe > S
Colunas que definem o Mestre > 1, 2
Formato de Impresso > 0 - Detalhes na mesma linha
O resultado seria:
No Vend
1
Nome Vendedor
Roberto Carlos
Duplicatas
Valor
Data
234/1
3.514,00
31/01/2002
152/1
1.135,00
31/01/2002
831/6
1.453,15
15/02/2002
Opo 3:
Relatrio tipo Mestre/Detalhe > S
Colunas que definem o Mestre > 1, 2 Formato de Impresso > 1 - Detalhes abaixo
O resultado seria:
No Vend
Nome Vendedor
Duplicatas
Valor
Data
Roberto Carlos
234/1
3.514,00
31/01/2002
152/1
1.135,00
31/01/2002
831/6
1.453,15
15/02/2002
MN SACI 035
35
No Vend
Nome Vendedor
Duplicatas
Valor
Data
Roberto Carlos
234/1
3.514,00
31/01/2002
152/1
1.135,00
31/01/2002
Sub-Total
4.649,00
831/6
1.453,15
Sub-Total
1.453,15
Total
6.102,15
15/02/2002
MN SACI 035
36
MN SACI 035
37
MN SACI 035
38
MN SACI 035
39
MN SACI 035
40
41
#
SELECT_LIST no
FROM sqldados.store
WHERE active = 1
ORDER BY no
#
SELECT no, name
FROM sqldados.custp
WHERE storeno IN ([LISTA1])
ORDER BY storeno,name
Explicando o relatrio acima:
A primeira " select " temporria (o comando est entre '' # '') e uma " select "
especial: SELECT_LIST. Isso sinaliza para o QuerySQL que dever ser gerada uma lista
com valores para serem usados em conjunto com o comando IN. Observaes:
O comando SELECT_LIST no existe na linguagem SQL - apenas o QuerySQL
entende esse comando.
No comando SELECT_LIST, apenas a primeira coluna ser considerada para se
criar a lista. Se no exemplo acima fosse usado "SELECT_LIST name, no" seria criada
uma lista com os nomes das lojas, e no o nmero. Portanto, os comandos do tipo
"SELECT_LIST" devem listar apenas um campo, e esse campo que ser usado para
compor a lista.
MN SACI 035
42
A segunda " select " faz uso da lista criada na primeira " select ", atravs da
varivel [LISTA1]. Como podem existir at 8 " selects " temporrias, ser possvel criar
uma lista para cada " select ". Logo, a varivel [LISTA] pode variar de [LISTA1] at
[LISTA8]. No exemplo acima, se as lojas ativas forem as de nmero 1, 2, 4, 5, 10 e 12, a
varivel [LISTA1] ter o seguinte contedo: 1, 2, 4, 5, 10, 12. Para o QuerySQL portanto, a
" select " final ser executada da seguinte forma:
%vars
$dataI = {:d:Data Inicial}
$dataF = {:d:Data Final}
MN SACI 035
43
%
SELECT
dup.dupno AS Numero,
dup.issuedate AS Emissao,
dup.duedate AS Vencimento
FROM sqldados.dup
WHERE (dup.issuedate >= [$dataI] AND dup.issuedate <= [$dataF])
OR (dup.duedate >= [$dataI] AND dup.duedate <= [$dataF])
No exemplo acima, sero listadas todas as duplicatas cujas datas de emisso ou
datas de vencimento estejam dentro do perodo informado. Perceba que as variveis ''
Data Inicial'' e ''Data Final'' foram utilizadas dentro do comando SQL mais de uma vez,
mas no momento da execuo do relatrio ser necessrio inform-las apenas uma nica
vez.
Observaes:
A seo de variveis deve comear obrigatoriamente com a palavra '' %vars ''
(sem as aspas) e essa palavra deve estar sempre na primeira linha do arquivo
Toda varivel deve ser declarada com o sinal '' $ '' na frente, seguido do nome da
varivel, do sinal de igualdade (com ou sem espaos) e da definio da varivel
O QuerySQL far a distino de variveis maisculas e minsculas. Isso significa
que $DataI e $dataI so 2 variveis diferentes
MN SACI 035
44
45
03/2005
02/2005
01/2005
46
47
# SELECT
store.no AS loja,
stk.prdno AS cod,
sum(stk.qtty_atacado) AS total
FROM sqldados.store
LEFT JOIN sqldados.stk
ON (store.no=stk.storeno)
GROUP BY stk.storeno,stk.prdno
HAVING total > 0
#
SELECT
store.no AS Loja,
SUM([tabela].total) AS Total
FROM sqldados.store
LEFT JOIN [tabela]
ON (store.no = [tabela].loja)
GROUP BY store.no
MN SACI 035
48
MN SACI 035
49
50
RUA A, 1234
AV. B, 5678
BELO HORIZONTE/MG
SAO PAULO/SP
7.14 Exerccio 8
Crie um relatrio com as seguintes colunas: Cdigo do Produto, Descrio do
Produto, Nmero do Centro de Lucro, Total em Vendas e Estoque Atual. Os filtros so:
MN SACI 035
51
7.14 Exerccio 8
Produtos do Centro de Lucro 010101, Vendas para a loja 1 e perodo de vendas entre
01/01/2002 at 31/12/2002. Obs. Os produtos devem ser listados, independentemente se
houver vendas ou estoques.
8. Dicas
Nesta parte esto algumas dicas para a elaborao de " selects " , aliando recursos
do QuerySQL e do MySQL.
#
SELECT @linha:=0 AS linha
#
SELECT
@linha:=linha+1 AS linha,
(restante da select ....)
52
0000000000000101
Existem vrias alternativas para a montagem de selects com este tipo de campo,
como nos exemplos abaixo, todos objetivando produtos fora de linha.
Caso o usurio queira especificar apenas 1 dentre os 16 bits basta informar a sua
posio, de 0 a 15, elevando-a ao quadrado. (bit que define se o produto est fora de
linha = 2 -> 22 -> 4 ). Neste exemplo sero listados somente produtos fora de linha.
SELECT
prd.no, prd.name
FROM sqldados.prd
WHERE (prd.dereg & 4)
O mesmo exemplo acima, porm excluindo-se produtos fora de linha.
SELECT
prd.no, prd.name
FROM sqldados.prd
MN SACI 035
53
SELECT
prd.no, prd.name
FROM sqldados.prd
WHERE NOT (prd.dereg & POW(2, x)) - Onde x
igual a posio do bit
Caso o usurio queira especificar vrios dentre os 16 bits. O underline funciona
como meta-caractere no ''LIKE'' do MySQL. Neste exemplo sero listados somente
produtos que no esto fora de linha.
SELECT
prd.no, prd.name
FROM sqldados.prd
WHERE LPAD(bin(dereg),16,"0") like "_____________0_"
O usurio poder usar o underscore como meta-caractere ao informar o valor da
varivel {Bits} .Neste exemplo tambm est sendo utilizado a seo de variveis, com
definio do valor default e obrigatoriedade do campo (Varivel Bits, tamanho = 16, Valor
default = ________________; Preenchimento Obrigatrio = Sim).
%vars
$Bits = {Bits,16;________________;S}
MN SACI 035
54
MN SACI 035
55
%vars
$rl = {:s:No Relatrio}
%
SELECT
sqluser.userno AS Cod,
users.name AS Nome,
sqluser.auxShort1 AS Execucoes
FROM
sqldados.sqluser, sqldados.users
WHERE
sqlexeno = [$rl] AND
sqluser.userno = users.no
9. Otimizao de SELECTS
O MySQL possui um otimizador interno. Em alguns casos ele executa a SELECT
de maneira totalmente diferente da que achamos que ele faz.
MN SACI 035
56
9. Otimizao de SELECTS
Uma boa maneira de estudar as opes de otimizao a utilizao do comando
explain. De uma maneira resumida, este comando explica o caminho que o MySQL far
para executar a SELECT.
Sintaxe:
EXPLAIN SELECT ....
Resultados (do melhor para o pior)
Parmetros
Opes/ Descrio
system
const
No mximo 1 linha
eq_ref
ref
range
index
ALL
voc j conhece as tabelas e tem exata noo do qu deve ser pesquisado, pode ganhar
algum tempo na execuo dizendo ao MySQL como dever ser a pesquisa, ou quais
chaves devero ser utilizadas.
O uso do comando explain antes do comando SELECT retorna a anlise feita pelo
otimizador MySQL. Exemplos:
EXPLAIN SELECT * FROM xalog2 WHERE date > 0;
MN SACI 035
57
9. Otimizao de SELECTS
Este resultado informa que todas as linhas da tabela esto sendo lidas (type = ALL)
e no existem opes de utilizao de chaves (possible_keys = NULL), isto porque no
existe uma chave date na tabela
EXPLAIN SELECT * FROM xalog2 WHERE storeno > 0;
Neste caso, o otimizador do MySQL est nos informando que, apesar de ler a
tabela toda (type = ALL), seria possvel a leitura partir das chaves primria, i2, i5, i10, i11
e i12 (estas chaves possuem o campo date). A leitura feita na tabela toda porque a
condio informada na clusula WHERE condiciona o nmero da loja seja maior que 0
(zero)
EXPLAIN SELECT * FROM xalog2 WHERE storeno > 2;
MN SACI 035
58
9. Otimizao de SELECTS
Esta SELECT est mais otimizada ainda, pois a leitura est sendo feita atravs do
uso da chave i10 (key = i10) e somente quando a chave for igual a 2 (condio WHERE).
Observe o campo type = ref
EXPLAIN SELECT storeno, date, prd.name FROM xalog2 left join prd on
xalog2.prdno = prd.no where storeno = 2;
MN SACI 035
59
9. Otimizao de SELECTS
Nesta SELECT colocamos uma condio para a tabela prd. Note que o otimizador
utilizou ento a prd como mestre e a leitura ficou do tipo ref para ambas as tabelas.
Experimente agora executar esta mesma SELECT para a loja 2.
MN SACI 035
60
9. Otimizao de SELECTS
Esta SELECT um exemplo da utilizao do IN. Faa a mesma SELECT porm
para a condio da loja coloque a seguinte sintaxe: ... AND storeno = 1 OR storeno = 2
AND ...
SELECT storeno, prd.name, COUNT(*) AS counter FROM xalog2, prd WHERE
xalog2.prdno = prd.no AND storeno IN(1,2) GROUP BY prdno HAVING counter > 5;
Esta SELECT exemplifica o uso da clusula HAVING. Ela utilizada quando se
quer uma seleo em cima do resultado da SELECT. No exemplo estamos buscando
produtos que tiveram mais de cinco vendas por loja, independente do perodo.
Apesar de no ser uma opo otimizada, em alguns casos seu uso inevitvel
9.1 Resumo
LEFT JOIN sempre mais rpido
A funo IN MUITO otimizada
No use HAVING se voc pode usar WHERE
Simplifique as expresses, sempre que possvel
9.2 Exerccio 9
Monte o relatrio referente a anlise dos exerccios 1 e 3
MN SACI 035
61
MN SACI 035
62
MN SACI 035
63
MN SACI 035
64
11.2 Exerccio 2
sqldados e sqlpdv
xalog2
MySQL
Cdigo e Descrio
001 - Guitarra Tagima tsb 206
11.3 Exerccio 3
Correo em sala com o instrutor
11.4 Exerccio 4
Inserir e editar SELECTS no QuerySQL
11.5 Desafio
SELECT
no AS Cdigo,
name AS Descrio,
REPLACE(REPLACE(REPLACE(FORMAT(sp/100,2),'.','?'),',','.'),'?',',')
MN SACI 035
65
11.5 Desafio
AS Preco
FROM
sqldados.prd
11.6 Exerccio 5
SELECT
name AS Nome
FROM
sqldados.custp
WHERE
name LIKE "%SILVA%"
SELECT
prd.no AS Codigo,
prd.name AS Descrio,
prd.clno AS 'Centro Lucro'
FROM sqldados.prd
WHERE prd.clno = 010101
SELECT
storeno AS Loja, REPLACE(REPLACE(REPLACE(FORMAT(SUM(ABS(qtty/1000)
* price/100 - discount/100),2
),'.','?'),',','.'),'?',',') AS Venda
FROM
sqldados.xalog2
WHERE
storeno = 1 AND
date BETWEEN 20020101 AND 20020131
GROUP BY
storeno
MN SACI 035
66
11.6 Exerccio 5
SELECT
DATE_FORMAT(issuedate, '%m/%Y') AS Data,
SUM(IF(type = 0, amtdue, NULL)) AS 'Recibo_____',
SUM(IF(type = 1, amtdue, NULL)) AS 'Duplicata__'
FROM
sqldados.dup
WHERE
storeno = 2 AND
dup.issuedate BETWEEN 20010101 AND 20011231 AND
dup.status != 2
GROUP BY
Data
11.7 Exerccio 6
SELECT
xalog2.empno AS cod,
emp.name AS vendedor,
SUM(ABS(qtty/1000) * price) - discount AS venda
FROM
sqldados.xalog2
LEFT JOIN
sqldados.emp ON
xalog2.empno = emp.no
WHERE
xalog2.storeno = 1 AND
xalog2.date BETWEEN 20020101 AND 20021231
GROUP BY
cod
MN SACI 035
67
11.8 Exerccio 7
11.8 Exerccio 7
SELECT
IFNULL(inst.contrno, 'Inconsistencia') AS contrato_loja,
itxa.storeno AS loja_itxa,
itxa.contrno AS contrato_itxa
FROM
sqldados.itxa
LEFT JOIN
sqldados.inst ON
inst.storeno = itxa.storeno AND
inst.contrno = itxa.contrno
WHERE
inst.contrno IS NULL
11.9 Exerccio 8
%
vars$cl = {:cl:Centro Lucro;010101;S}
$lj = {:store:Loja;1;S}
$di = {:d:Data Inicial;20020101;S}
$df = {:d:Data Final;20021231;S}
%
#
SELECT
xalog2.prdno AS prd,
SUM(ABS(qtty/1000) * xalog2.price) - xalog2.discount AS vendas
FROM
sqldados.xalog2
WHERE
xalog2.clno = [$cl] AND
MN SACI 035
68
11.9 Exerccio 8
xalog2.storeno = [$lj] AND
xalog2.date BETWEEN [$di] AND [$df]
GROUP BY
xalog2.prdno
#
#
SELECT
stk.prdno AS prd,
stk.qtty_varejo + stk.qtty_atacado AS estoque
FROM
sqldados.stk
WHERE
stk.storeno = [$lj]
GROUP BY
stk.storeno, stk.prdno
#
SELECT
prd.no AS Codigo,
prd.name AS Descrio,
prd.clno AS "Centro Lucro",
[tabela].vendas AS "Vendas__________",
[tabela2].estoque AS Estoque
FROM
sqldados.prd
LEFT JOIN
[tabela] ON
prd.no = [tabela].prd
LEFT JOIN
[tabela2] ON
prd.no = [tabela2].prd
MN SACI 035
69
11.9 Exerccio 8
WHERE
prd.clno = [$cl]
MN SACI 035
70