Escolar Documentos
Profissional Documentos
Cultura Documentos
Principais Intruções - SQL
Principais Intruções - SQL
Ateno:
Esta apostila foi desenvolvida com o auxlio on-Line do banco MS-ACCESS, O SQL para este banco no
totalmente compatvel com o SQL Padro ANSI, que o oficial na maioria dos bancos de dados, ento
algumas clusulas podem no funcionar em outros bancos.
Instruo SELECT
Instrui o programa principal do banco de dados para retornar a informao como um conjunto de registros.
Sintaxe
SELECT [predicado { * | tabela.* | [tabela.]campo1 [AS alias1] [, [tabela.]campo2 [AS alias2] [, ...]]}
FROM expressotabela [, ...] [IN bancodedadosexterno]
[WHERE... ]
[GROUP BY... ]
[HAVING... ]
[ORDER BY... ]
[WITH OWNERACCESS OPTION]
Comentrios
Para executar esta operao, o programa principal de banco de dados procura a tabela ou tabelas
especificadas, extrai as colunas escolhidas, seleciona as linhas que satisfazem o critrio e classifica ou
agrupa as linhas resultantes na ordem especificada.
SELECT normalmente a primeira palavra em uma instruo SQL. A maior parte das instrues
SQL so instrues SELECT.
Voc pode usar um asterisco (*) para selecionar todos os campos na tabela. O exemplo abaixo
seleciona todos os campos na tabela Funcionrios:
SELECT * FROM Funcionrios;
Se o nome de um campo estiver includo em mais de uma tabela na clusula FROM, preceda-o
com o nome da tabela e o operador . (ponto). No exemplo abaixo, o campo Departamento est nas tabelas
Funcionrios e Supervisores. A instruo SQL seleciona Departamento da tabela Funcionrios e NomeSupv
da tabela Supervisores:
Ao criar um objeto Recordset, o programa principal de banco de dados do Jet usa o nome do
campo da tabela como o nome do objeto Field no objeto Recordset. Se voc quiser um nome de campo
diferente ou um nome que no esteja implcito na expresso usada para gerar o campo, use a palavra
reservada AS. O exemplo abaixo usa o ttulo Nasc para nomear o objeto Field retornado no objeto
Recordset resultante:
Sempre que voc usar funes aggregate ou consultas que retornem nomes de objetos Field
ambguos ou duplicados, voc precisar usar a clusula AS para fornecer um nome alternativo para o objeto
Field. O exemplo abaixo usa o ttulo Contagem para nomear o objeto Field retornado no objeto Recordset
resultante:
Clusula GROUP BY
GROUP BY opcional. Valores de resumo so omitidos se no houver qualquer funo aggregate
SQL na instruo SELECT. Os valores Null nos campos GROUP BY so agrupados e no omitidos. No
entanto, os valores Null no so avaliados em qualquer funo aggregate SQL. Use a clusula WHERE para
excluir linhas que voc no quer agrupadas e use a clusula HAVING para filtrar os registros aps eles
terem sido agrupados.
A no ser que contenha dados Memo ou OLE Object, um campo na lista de campos GROUP BY
pode fazer referncia a qualquer campo em qualquer tabela listada na clusula FROM. Mesmo que o campo
no esteja includo na instruo SELECT, fornecida a instruo SELECT, inclua pelo menos uma funo
SQL. O programa principal de banco de dados do Jet no pode agrupar campos Memo ou OLE Objects.
Todos os campos na lista de campos SELECT devem ser includos na clusula GROUP BY ou
includos como argumentos em uma funo aggregate SQL.
Clusula HAVING
HAVING opcional. HAVING semelhante a WHERE, que determina quais registros so
selecionados. Depois que os registros so agrupados com GROUP BY, HAVING determina quais registros
so exibidos:
Uma clusula HAVING pode conter at 40 expresses vinculadas por operadores lgicos, como
And ou Or.
Clusula ORDER BY
ORDER BY opcional. Entretanto, se voc quiser exibir seus dados na ordem classificada, voc
deve utilizar ORDER BY. O padro ordem de classificao ascendente (A a Z, 0 a 9). Os dois exemplos
abaixo classificam os nomes dos funcionrios pelo sobrenome.
Para classificar em ordem descendente (Z a A, 9 a 0), adicione a palavra reservada DESC ao final
de cada campo que voc quiser classificar em ordem descendente. O exemplo abaixo seleciona salrios e os
classifica em ordem descendente
Se voc especificar um campo que contm dados Memo ou OLE Objects na clusula ORDER BY,
um erro ocorrer. O programa principal de banco de dados do Jet no classifica campos deste tipo.
ORDER BY normalmente o ltimo item em uma instruo SQL.
Voc pode incluir campos adicionais na clusula ORDER BY. Os registros so classificados
primeiro pelo primeiro campo listado depois de ORDER BY. Os registros que tiverem valores iguais
naquele campo so classificados pelo valor no segundo campo listado e assim por diante.
Clusula WITH OWNERACCESS OPTION
A declarao WITH OWNERACCESS OPTION opcional. O exemplo abaixo habilita o usurio
a ver as informaes de salrio (mesmo que no tenha outra permisso para ver a tabela Folha de
Pagamentos) desde que o proprietrio da consulta tenha tal permisso:
Se, por outro lado, um usurio for impedido de criar ou anexar a uma tabela, voc poder usar
WITH OWNERACCESS OPTION para habilit-lo a executar uma consulta construo de tabela ou
consulta anexao. Se voc quiser reforar as configuraes de segurana do grupo de trabalho e as
permisses dos usurios, no inclua a declarao WITH OWNERACCESS OPTION. Esta opo exige que
voc tenha acesso ao arquivo System.mda associado ao banco de dados. realmente til em
implementaes de multiusurios seguras.
Esse exemplo conta o nmero de registros que tm uma entrada no campo "CdigoPostal" e
nomeia o campo retornado como "Tcp".
Esse exemplo mostra qual seria o salrio se cada funcionrio recebesse um aumento de 10
porcento. No altera o valor original dos salrios.
Esse exemplo coloca o ttulo Nome no topo da coluna "Sobrenome". O ttulo Salrio exibido no
topo da coluna "Salrio".
Para cada registro, mostra Sobrenome e Salrio no primeiro e ltimo campos. A seqncia de
caracteres "tem um salrio de" retornada como o campo do meio de cada registro.
Para cada ttulo de funo nico, calcula o nmero de funcionrios do departamento de Vendas
que tm este ttulo.
Esse exemplo calcula o nmero de itens em estoque para cada combinao de nmero e cor do
item.
Esse exemplo ordena, primeiro, por categoria ID e depois por nome do produto.
Sintaxe
Consulta anexao de vrios registros:
Parte Descrio
destino O nome da tabela ou consulta em que os registros devem ser anexados.
bancodedadosexterno O caminho para um banco de dados externo. Para uma descrio do
caminho, consulte a clusula IN.
origem O nome da tabela ou consulta de onde os dados devem ser copiados.
campo1, campo2 Os nomes dos campos aos quais os dados devem ser anexados, se
estiverem aps um argumento destino ou os nomes dos campos dos quais
se deve obter os dados, se estiverem aps um argumento origem.
expressodetabela O nome da tabela ou tabelas das quais registros so inseridos. Este
argumento pode ser um nico nome de tabela ou uma combinao
resultante de uma operao INNER JOIN, LEFT JOIN ou RIGHT JOIN
ou de uma consulta gravada.
valor1, valor2 Os valores para inserir em campos especficos do novo registro. Cada valor
inserido no campo que corresponde posio do valor na lista: Valor1
inserido no campo1 do novo registro, valor2 no campo2 e assim por
diante. Voc deve separar os valores com uma vrgula e colocar os
campos de textos entre aspas (" ").
Comentrios
Voc pode usar a instruo INSERT INTO para adicionar um nico registro a uma tabela usando a
sintaxe de consulta anexao de um nico registro como mostrado acima. Neste caso, seu cdigo especifica
o nome e o valor de cada campo do registro. Voc precisa especificar cada um dos campos do registro para
os quais um valor deve ser designado e um valor para este campo. Quando voc no especifica cada campo,
o valor padro ou Null inserido nas colunas omitidas. Os registros so adicionados no final da tabela.
Voc tambm pode usar INSERT INTO para anexar um conjunto de registros de outra tabela ou
consulta usando a clusula SELECT ... FROM como mostrado acima na sintaxe consulta anexao de
vrios registros. Neste caso, a clusula SELECT especifica os campos para acrescentar tabela destino
especificada.
A tabela de origem ou de destino pode especificar uma tabela ou uma consulta. Se uma consulta
for especificada, o programa principal de banco de dados do Microsoft anexa a qualquer e a todas as tabelas
especificadas pela consulta.
Se sua tabela de destino contm uma chave primria, voc deve acrescentar valores nicos, no
Null ao campo ou campos da chave primria. Caso contrrio, o programa principal de banco de dados do
Jet no anexar os registros.
Se voc anexar registros a uma tabela com um campo Counter e quiser numerar novamente os
registros anexados, no inclua o campo Counter em sua consulta. Inclua o campo Counter na consulta se
quiser manter os valores originais do campo.
Use a clusula IN para anexar registros a uma tabela de outro banco de dados. Para achar quais
registros sero anexados, antes de voc executar a consulta anexao, primeiro execute e veja os resultados
de uma consulta seleo que use o mesmo critrio de seleo.
Uma operao de consulta anexao copia os registros de uma ou mais tabelas em outra. As
tabelas que contm os registros que voc anexa no so afetadas pela operao de consulta anexao.
Em lugar de acrescentar registros existentes de outra tabela, voc pode especificar o valor de cada
campo em um nico registro novo usando a clusula VALUES. Se voc omitir a lista de campo, a clusula
VALUES deve incluir um valor para cada campo na tabela; caso contrrio, um erro ocorrer em INSERT.
Use uma instruo adicional INSERT INTO com uma clusula VALUES para cada registro adicional que
voc quiser criar.
Esse exemplo seleciona todos os estagirios de uma tabela hipottica "Estagirios" que foram
contratados h mais de 30 dias e adiciona seus registros tabela "Funcionrios".
Sintaxe
UPDATE tabela
SET valornovo
WHERE critrio;
Parte Descrio
tabela O nome da tabela cujos os dados voc quer modificar.
valornovo Uma expresso que determina o valor a ser inserido em um campo especfico nos
registros atualizados.
critrio Uma expresso que determina quais registros devem ser atualizados. S os registros
que satisfazem a expresso so atualizados.
Comentrios
UPDATE especialmente til quando voc quer alterar muitos registros ou quando os registros
que voc quer alterar esto em vrias tabelas. Voc pode alterar vrios campos ao mesmo tempo. O
exemplo abaixo aumenta o Valor do Pedido em 10 por cento e o valor do Frete em 3 por cento para
embarques do Reino Unido:
UPDATE no gera um conjunto de resultados. Se voc quiser saber quais resultados sero
alterados, examine primeiro os resultados da consulta seleo que use os mesmos critrios e ento execute a
consulta atualizao.
Esse exemplo reduz o PreoUnit de todos os produtos no suspensos fornecidos pela Tokyo
Traders em 5 porcento. As tabelas "Produtos" e "Fornecedores" tm uma relao um para vrios.
Instruo DELETE
Cria uma consulta excluso que remove registros de uma ou mais tabelas listadas na clusula FROM que
satisfaz a clusula WHERE.
Sintaxe
DELETE [tabela.*]
FROM tabela
WHERE critrio
Parte Descrio
tabela.* O nome opcional da tabela da qual os registros so excludos.
tabela O nome da tabela da qual os registros so excludos.
critrio Uma expresso que determina qual registro deve ser excludo.
Comentrios
DELETE especialmente til quando voc quer excluir muitos registros. Para eliminar uma tabela
inteira do banco de dados, voc pode usar o mtodo Execute com uma instruo DROP.
Entretanto, se voc eliminar a tabela, a estrutura perdida. Por outro lado, quando voc usa
DELETE, apenas os dados so excludos. A estrutura da tabela e todas as propriedades da tabela, como
atributos de campo e ndices, permanecem intactos.
Voc pode usar DELETE para remover registros de tabelas que esto em uma relao um por
vrios com outras tabelas. Operaes de excluso em cascata fazem com que os registros das tabelas que
esto no lado "vrios" da relao sejam excludos quando os registros correspondentes do lado "um" da
relao so excludos na consulta. Por exemplo, nas relaes entre as tabelas Clientes e Pedidos, a tabela
Clientes est do lado "um" e a tabela Pedidos est no lado "vrios" da relao. Excluir um registro em
Clientes faz com que os registros correspondentes em Pedidos sejam excludos se a opo de excluso em
cascata for especificada.
Uma consulta de excluso exclui registros inteiros e no apenas dados em campos especficos. Se
voc quiser excluir valores de um campo especfico, crie uma consulta atualizao que mude os valores
para Null.
Importante
Aps remover os registros usando uma consulta excluso, voc no poder desfazer a operao. Se
quiser saber quais arquivos foram excludos, primeiro examine os resultados de uma consulta seleo que
use o mesmo critrio e ento, execute a consulta excluso. Mantenha os backups de seus dados. Se voc
excluir os registros errados, poder recuper-los a partir dos seus backups.
Esse exemplo exclui todos os registros de funcionrios cujo ttulo seja Estagirio e que tambm
tenham um registro na tabela "FolhadePagamento". As tabelas "Funcionrios" e "FolhadePagamento" tm
uma relao um por um.
Subconsultas SQL
Uma subconsulta uma instruo SELECT aninhada dentro de uma instruo SELECT, INSERT,
DELETE ou UPDATE ou dentro de uma outra subconsulta.
Sintaxe
Voc pode usar trs formas de sintaxe para criar uma subconsulta:
Comentrios
Voc pode usar uma subconsulta em vez de uma expresso na lista de campo de uma instruo
SELECT ou em uma clusula WHERE ou HAVING. Em uma subconsulta, voc usa uma instruo
SELECT para fornecer um conjunto de um ou mais valores especficos para avaliar as expresses das
clusulas WHERE ou HAVING.
Use o predicado ANY ou SOME, que so sinnimos, para recuperar registros na consulta principal
que satisfaam a comparao com quaisquer registros recuperados na subconsulta. O exemplo abaixo
retorna todos os produtos cujo preo unitrio maior que o preo de qualquer produto vendido com um
desconto de 25 por cento ou mais:
Use o predicado ALL para recuperar apenas os registros na consulta principal que satisfaam a
comparao com todos os registros recuperados na subconsulta. Se voc mudou ANY para ALL no
exemplo acima, a consulta retornaria apenas os produtos cujo preo unitrio fosse maior que o de todos os
produtos vendidos com um desconto de 25 por cento ou mais. Isto muito mais restritivo.
Use o predicado IN para recuperar apenas os registros na consulta principal para os quais alguns
registros na subconsulta contm um valor igual. O exemplo abaixo retorna todos os produtos com um
desconto de 25 por cento ou mais:
De maneira contrria, voc pode usar NOT IN para recuperar apenas os registros na consulta
principal para os quais no existam registros com valores iguais na subconsulta. Utilize o predicado
EXISTS (com a palavra reservada NOT opcionalmente) em comparaes true/false para determinar se a
subconsulta retorna algum registro.
Voc tambm pode usar aliases de nomes de tabelas em uma subconsulta para fazer referncia a
tabelas listadas em uma clusula FROM fora da subconsulta. O exemplo abaixo retorna os nomes dos
funcionrios cujos salrios sejam iguais ou superiores mdia de salrios de todos os funcionrios na
mesma funo. Para a tabela Funcionrios dada o alias "T1":
Esse exemplo lista o nome e preo unitrio de todos os produtos cujo preo unitrio seja igual ao
do Licor de Cacau.
Esse exemplo lista a empresa e o contato de cada empresa de todos os clientes que fizeram pedidos
no segundo trimestre de 1995.
Esse exemplo lista os funcionrios cujo salrio seja maior que a mdia dos salrios de todos os
funcionrios.
Esse exemplo seleciona o nome de todos os funcionrios que tenham registrado pelo menos um
pedido. Isto tambm poderia ser feito com INNER JOIN.
Altera o campo Efetuado do arquivo de servios para 2 caso o mesmo tenha parecer tcnico da
entidade encaminhanhamento diferente de nulo.