• Nenhum resultado encontrado

SELECT * FROM pedido

No documento Banco de Dados - Princípios e Prática (páginas 100-109)

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

SQL

com 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.totalclientes.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.totalclientes.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

SQL

e 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.nomepedido.codigo=1010 (pedido pedido.codcli=clientes.codigo clientes)) Com produto cartesiano, temos a consulta equivalente:

πclientes.nomepedido.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

[

comparação de

No documento Banco de Dados - Princípios e Prática (páginas 100-109)

Documentos relacionados