standard_query language_SQL_
SELECT * FROM pedido
WHERE codigo = 1010
O asterisco (*), na linha da cláusula SELECT, significa que devem ser mostra- dos todos os atributos, economizando a expressão de todos os campos. Da mesma forma, é possível fazer comparações:
SQL (3):
SELECT * FROM pedido
WHERE valor > 1.000,00
Produzindo, nesse caso:
codigo codcli data valor
1005 202 10/03/2004 1.200,00
1010 233 17/03/2004 1.020,00
Consultas SQL com condições compostas também são passíveis de serem geradas:
SQL (4):
SELECT * FROM pedido
WHERE(valor > 1.000,00)AND(data < DATE’15/03/2004’)
Note o uso da cláusula lógica AND e também as condições entre parên- teses. Observe que essas consultas são equivalentes a utilizar a opera- ção de seleção (σ) da AR. Os operadores de comparação permitidos são semelhantes aos encontrados na linguagem Pascal: =, <>, <, >, <= e >=. Os operadores lógicos são AND, OR e NOT.
99
Quadro 4.1 – Analogias entre comandos em AR e SQL
SQL Álgebra Relacional
SELECT * FROM pedido
WHERE codigo = 1010 σcodigo=1010(pedido)
SELECT * FROM pedido
WHERE valor > 1.000,00 σvalor>1000,00(pedido)
SELECT * FROM pedido
WHERE(valor > 1.000,00) AND data < DATE’15/03/2004’)
σ(valor >1.000,00) and (data <’15/03/2004’)(pedido)
O conteúdo da tabela “Pedido” pode ser apresentado apenas por um comando:
SQL (5):
SELECT * FROM pedido
Sendo assim, as cláusulas SELECT e FROM são obrigatórias para qual- quer comando SQL, enquanto que a cláusula WHERE é opcional. O equivalente a essa consulta, na AR, é apenas o nome da tabela “Pedido”. Ainda, convém destacarmos que em vez de querer apresentar todos os campos, podemos restringir a apresentação da tabela “Pedido” para cam- pos específicos: codigo valor 1005 1.200,00 1008 960,00 1010 1.020,00 1015 755,00 1023 900,00
Sendo, então, a consulta expressa como:
SQL (6):
SELECT codigo, valor FROM pedido
Nesse procedimento, a restrição ao código do pedido 1010 pode ser adicionada:
SQL (7):
SELECT codigo, valor FROM pedido
WHERE codigo = 1010
Produzindo, como resultado:
codigo valor
1010 1.020,00
A equivalência da operação de projeção (π) da álgebra relacional é encontrada na sintaxe do SQL presente na cláusula SELECT.
Quadro 4.2 – Analogias entre comandos em AR e SQL
SQL Álgebra Relacional
SELECT * FROM pedido pedido
SELECT codigo, valor FROM pedido π codigo,valor(pedido) SELECT codigo, valor FROM pedido
WHERE codigo = 1010 π codigo,valor(πcodigo=1010(pedido))
[
junção
]
Como visto anteriormente em AR, a operação de junção tem por fina- lidade aglutinar duas tabelas mediante atributos em comum existentes nas mesmas. A operação de junção (em AR expressa pelo símbolo ) tem sua contrapartida em SQL através do comando INNER JOIN (junção interna), sendo essa a expressão mais básica para operações de junção em SQL. A sintaxe é:
101
Onde “att_comum1” e “att_comum2” são respectivamente os atributos comuns das tabelas (tabela1 e tabela2). Lembramos que a operação de junção é binária, necessita, portanto, sempre de duas tabelas para ocor- rer a operação, e que a igualdade entre os campos em comum é expressa após o comando ON.
Porém, o comando INNER JOIN geralmente não é expresso como um comando SQL na maneira como foi apresentado na sintaxe, pois é colo- cado em conjunto com as cláusulas da sintaxe geral, vistos na seção anterior. Como a junção produz outra tabela em sua saída, esta é, por sua vez, colocada na cláusula FROM do comando SQL.
No software Microsoft Access é obrigatória a expressão desse tipo de junção como INNER JOIN, porém em outras linguagens de consulta (como nas implementadas em MySQL e Interbase) basta a colocação da palavra JOIN.
Utilizando-nos do mesmo exemplo abordado na AR, temos as tabelas “Clientes” e “Pedido”, a seguir:
CLIENTES
codigo nome telefone limite_compra
202 Ernesto 3222-0809 1.500,00
221 Amélia 3233-2474 2.000,00
233 Luís Alberto 3323-0071 1.500,00
282 José Antonio 3343-9021 800,00
PEDIDO
codigo codcli data valor
1005 202 10/03/2004 1.200,00
1008 221 13/03/2004 960,00
1010 233 17/03/2004 1.020,00
1015 282 20/03/2004 755,00
1023 202 21/03/2004 900,00
Os campos em comum nas tabelas são “clientes.codigo” e “pedido. codcli”. A expressão da junção em SQL é:
SQL (8):
SELECT *
FROM pedido INNER JOIN clientes ON pedido.codcli = clientes.codigo
O resultado produzido é:
pedido.
codigo codcli data valor
clientes.
codigo nome telefone
limite_ compra 1005 202 10/03/2004 1.200,00 202 Ernesto 3222-0809 1.500,00 1008 221 13/03/2004 960,00 221 Amélia 3233-2474 2.000,00 1010 233 17/03/2004 1.020,00 233 Luís Alberto 3323-0071 1.500,00 1015 282 20/03/2004 755,00 282 José Antonio 3343-9021 800,00 1023 202 21/03/2004 900,00 202 Ernesto 3222-0809 1.500,00
No resultado, podemos notar que a saída produzida contém os dois atributos que têm nomes idênticos (“codigo”), e, assim, os atributos são expressos com o nome da tabela de origem colocado antes e separado por um ponto (“.”).
Comandos compostos podem ser efetuados facilmente, se utilizarmos tudo o que foi visto até aqui. Por exemplo, para mostrar apenas o nome e o telefone de quem possui o pedido 1010:
103
SQL (9):
SELECT nome, telefone
FROM pedido INNER JOIN clientes ON pedido.codcli = clientes.codigo WHERE pedido.codigo = 1010
O uso de parênteses pode ajudar na compreensão do comando, principal- mente em casos de comandos mais complexos, com mais de uma junção:
SQL (10):
SELECT nome, telefone
FROM(pedido INNER JOIN clientes ON pedido.codcli = clientes.codigo) WHERE pedido.codigo = 1010
Tendo como resultado:
nome telefone
Luís Alberto 3323-0071
Na seqüência, apresentamos mais algumas analogias entre comandos em AR e SQL utilizando comandos compostos.
Quadro 4.3 – Analogias entre comandos em AR e SQL
SQL Álgebra Relacional
SELECT * FROM pedido INNER JOIN clientes ON pedido.codcli=clientes.codigo
Pedido
pedido.codcli=clientes.codigoclientes
SELECT nome, telefone FROM pedido INNER JOIN clientes ON pedido.codcli=clientes.codigo
πnome, telefone (pedido
pedido.codcli=clientes. codigo clientes)
SELECT pedido.codigo, valor FROM pedido INNER JOIN clientes ON pedido. codcli= clientes.codigo WHERE pedido.codigo=1010
π pedido.codigo,valor (σ pedido.codigo=1010(pedido
pedido.codcli=clientes.codigo clientes))
Agora, vamos a um caso mais complexo de junção, adicionando às tabelas anteriores (“Clientes” e “Pedido”) a tabela “Itens”. Os itens de pedido são relacionados à tabela “Pedido” através do campo em comum “codped”.
ITENS
codigo codped qtd subtotal
001 1005 10 1.200,00 002 1008 12 720,00 003 1008 2 240,00 004 1010 1 500,00 005 1010 2 335,00 006 1010 1 185,00 007 1015 1 125,00 008 1015 1 630,00 009 1023 1 400,00 010 1023 1 300,00 011 1023 1 200,00
Esse tipo de junção é referido na literatura como sendo equiva- lente à junção “theta” ou theta join existente na AR, a qual neces- sita de uma igualdade entre os atributos comuns. Outra sintaxe existente no padrão SQL é a junção natural, ou natural join, que não necessita da igualdade. Ainda existe a cross join (junção cru- zada), que é equivalente ao produto cartesiano. As implemen- tações de banco de dados apresentam diferentes formas de abordagem para os tipos de junção dados pelo padrão.
[
consulta
SQLcom duas junções
]
Caso queiramos saber quais os itens do pedido comprado pelo cliente Luís Alberto, precisaremos de duas junções. A expressão da AR , para essa situação, é:
πitens.codigo,itens.codped,itens.qtd,itens.total (σ clientes.nome= ‘ Luís Alberto ’
105
Como a operação de junção é comutativa, a seguinte expressão da AR gera o mesmo resultado:
πitens.codigo,itens.codped,itens.qtd,itens.total (σclientes.nome= ‘ Luís Alberto ’
(itens pedido.codigo=itens.codped (pedido pedido.codcli=clientes.codigo clientes))
E a expressão da consulta em SQL torna-se:
SQL (11):
SELECT itens.codigo, itens.codped, itens.qtd, itens.subtotal FROM itens INNER JOIN(pedido INNER JOIN clientes ON pedido.codcli
= clientes.codigo) ON pedido.codigo = itens.codped WHERE clientes.nome = ’Luís Alberto’
Ou para simplificar os campos a serem mostrados da tabela “Itens”, colocamos novamente o asterisco no termo a ela referente:
SQL (12):
SELECT itens.*
FROM itens INNER JOIN(pedido INNER JOIN clientes ON pedido.codcli
= clientes.codigo) ON
pedido.codigo = itens.codped
WHERE clientes.nome = ’Luís Alberto’
Ou, ainda, lembrando a propriedade comutativa da operação de jun- ção, alterando a ordem das tabelas temos:
SQL (13):
SELECT itens.*
FROM(pedido INNER JOIN clientes ON pedido.codcli = clientes.
codigo) INNER JOIN itens ON
pedido.codigo = itens.codped
WHERE clientes.nome = ’Luís Alberto’
Com essa operacionalização, a tabela resultado é:
ITENS
codigo codped qtd subtotal
004 1010 1 500,00
005 1010 2 335,00
Também utilizamos esse raciocínio para montar consultas mais comple- xas usando mais de duas junções, bem como encadeando os comandos
INNER JOIN e colocando os parênteses para separar cada junção.
[
consultas
SQLe produto cartesiano
]
O uso da operação de produto cartesiano (×), como visto anterior- mente em AR, é equivalente a operações de junção. Por exemplo, para mostrar apenas o nome do cliente para o pedido 1010, vejamos o comando a seguir:
SQL (14):
SELECT clientes.nome
FROM pedido INNER JOIN clientes ON pedido.codcli = clientes.codigo WHERE pedido.codigo = 1010
Com a seguinte expressão equivalente em AR:
πcliente.nome (σ pedido.codigo=1010 (pedido pedido.codcli=clientes.codigo clientes)) Com produto cartesiano, temos a consulta equivalente:
πclientes.nome (σ pedido.codigo=1010 e pedido.codcli=clientes.codigo(pedido × clientes)) E o comando SQL fica:
SQL (15):
SELECT clientes.nome FROM pedido, clientes
WHERE pedido.codcli = clientes.codigo AND pedido.codigo = 1010
Note que a expressão para os campos em comum foi colocada na cláu- sula WHERE, juntamente com a condição da seleção, separadas as con- dições pela cláusula lógica AND. E as tabelas que fazem parte do produto cartesiano foram dispostas na cláusula FROM.
107
Para a consulta com duas junções, colocada na seção anterior, também podemos fazer um comando equivalente em AR:
πitens.codigo,itens.codped,itens.qtd,itens.total (σ(clientes.nome= ‘ LuÍs Alberto ’) e (pedido.codcli=clientes. codigo) e (pedido.codigo=itens.codped) (pedido × clientes × itens))
Resultando no seguinte comando em SQL:
SQL (16):
SELECT itens.*
FROM itens, pedido, clientes
WHERE pedido.codcli = clientes.codigo AND pedido.codigo = itens.codped AND clientes.nome = ’Luís Alberto’
Consultas mais complexas podem ser formuladas com mais tabelas, desde que sejam explicitadas as igualdades entre os campos em comum de cada tabela.
No quadro, a seguir, são apresentadas algumas analogias adicionais para o produto cartesiano em AR e SQL.
Quadro 4.4 – Analogias adicionais para o produto cartesiano em AR e SQL
SQL Álgebra Relacional
SELECT * FROM pedido,clientes pedido × clientes
SELECT * FROM pedido,clientes WHERE pedido.codcli=clientes. codigo
pedido
pedido.codcli=clientes.codigo clientes