Sei sulla pagina 1di 60

Quantcast

O que é SQL
As aplicações em rede são cada dia mais numerosas e versáteis. Em muitos casos, o
esquemabásico de operação é uma série de scripts que dirigem o comportamento de uma base
dedados.Devido à diversidade de linguagens e de base de dados existentes, a maneira de
comunicarentre umas e outras seria realmente complicado de providenciar, a não ser pela
existência depadrões que nos permite realizar as operações básicas de una forma universal.É
justamente disso que se trata o Structured Query Language que não é mais do que
umalinguagem padrão de comunicação com base de dados. Falamos portanto, de uma
linguagemnormalizada que nos permite trabalhar com qualquer tipo de linguagem (ASP ou PHP)
emcombinação com qualquer tipo de base de dados (MS Access, SQL Server, MySQL...).O fato
de ser padrão não quer dizer que seja idêntico para cada base de dados. Na
prática,determinadas bases de dados implementam funções específicas que não têm
necessariamenteque funcionar em outras.À parte desta universalidade, o SQL possui outras
duas características muito apreciadas. Poruma parte, apresenta potência e versatilidade notáveis
que contrasta, por outra, com suaacessibilidade de aprendizagem.
Informe de
Rubén Alvarez
Mail:
ruben@desarrolloweb.com

Tipos de campos
Como sabemos, um banco de dados é composto por tabelas onde armazenamos
registroscatalogados em função de diferentes campos (características).Um aspecto prévio a
considerar é a natureza dos valores que introduzimos nesses campos.Visto que um banco de
dados trabalha com todo o tipo de informações, é importante especificarque tipo de valor
estamos introduzindo de maneira a, por um lado, facilitar a buscaposteriormente e por outro,
otimizar os recursos de memória.Cada banco de dados introduz tipos de valores de campo que
não necessariamente estãopresentes em outros. Entretanto, existe um conjunto de tipos que
estão representados natotalidade destes bancos. Estes tipos comuns são os seguintes:
Tutorial de SQL
Manual por:
Criar Web, manuais e recursos para desenvolvimento web
Versão on-line:
http://www.criarweb.com/manuais/32
Alfanuméricos
Contém cifras e letras. Apresentam uma longitude limitada (255caracteres)
Numéricos
Existem de vários tipos, principalmente, inteiros (sem decimais) e reais(com decimais).
Booleanos
Possuem duas formas: Verdadeiro e falso (Sim ou Não)
Page 1 of 90Tutorial de SQL - Manual
completo11/07/2008http://www.criarweb.com/manuais/32/print.php

Informe de
Rubén Alvarez
Mail:
ruben@desarrolloweb.com

Adicionar um novo registro


Os registros podem ser introduzidos a partir de sentenças que empregam a instrução Insert.A
sintaxe utilizada é a seguinte:Insert Into nome_tabela (nome_campo1, nome_campo2,...) Values
(valor_campo1,valor_campo2...)Um exemplo simples a partir da nossa tabela modelo é a
introdução de um novo cliente queseria feito com uma instrução deste tipo:Insert Into clientes
(nome, sobrenomes, endereço, cidade, código postal, e-mail, pedidos)Values ('Pedro', 'Palotes',
'Percebe n°13', 'Londrina', '123456', 'pedro@criarweb.com', 33)Como se pode ver, os campos
não numéricos ou booleanos vão delimitados por apóstrofes: '.Também é interessante ver que o
código postal foi salvo como um campo não numérico. Isto édevido a que em determinados
países (Inglaterra,por exemplo) os códigos postais contémtambém letras.Obviamente, não é
imprescindível preencher todos os campos do registro. Porém, poder serque determinados
campos sejam necessários. Estes campos necessários podem ser definidosquando construirmos
nossa tabela mediante o banco de dados.É muito interessante, já veremos mais adiante o
porquê, o introduzir durante a criação denossa tabela um campo auto-incrementável que nos
permita atribuir um único número a cadaum dos registros. Deste modo, nossa tabela clientes
apresentaría para cada registro um
Datas
Armazenam datas facilitando posteriormente sua exploração. Armazenardatas desta forma
possibilita ordenar os registros por datas ou calcular osdias entre uma data e outra...
Memos
São campos alfanuméricos de longitude ilimitada. Apresentam oinconveniente de não poder ser
indexados (veremos mais adiante o queisto quer dizer).
Auto-incrementáveis
São campos numéricos inteiros que incrementam em uma unidade seuvalor para cada registro
incorporado. Sua utilidade é mais que evidente:Servir de identificador já que são exclusivos de
um registro.
Nota:
Se desejarmos praticar com um banco de dados que está vazio, primeiro devemos criar as
tabelasque vamos preencher. As tabelas também se criam com sentenças SQL eaprendemos a
fazer isso noúltimo capítulo.Embora, de qualquer forma, pode ser que seja mais cômodo utilizar
um programa com interface gráfica,como Access, que pode nos servir para criar as tabelas em
banco de dados do próprio Access ou por ODBCa outros bancos de dados como SQL Server
ouMySQL, por dar dois exemplos.Outra possibilidade em um banco de dados como MySQL,
seria criar as tabelas utilizando um softwarecomoPhpMyAdmin.
Nota:
Se não inserirmos um dos campos no banco de dados se iniciará com o valor padrão que
tivermosdefinido na hora de criar a tabela. Se não houver um valor padrão, provavelmente se
inicie como NULL(vazio), no caso de que este campo permita valores nulos. Se esse campo não
permitir valores nulos (issose define também ao criar a tabela) o mais seguro é que a execução
da sentença SQL nos dê um erro.
Page 2 of 90Tutorial de SQL - Manual
completo11/07/2008http://www.criarweb.com/manuais/32/print.php

número exclusivo do cliente que será muito útil quando consultarmos várias
tabelassimultaneamente.
Informe de
Rubén Alvarez
Mail:
ruben@desarrolloweb.com

Apagar um registro
Para apagar um registro nos servimos da instrução Delete. Neste caso devemos especificar
qualou quais são os registros que queremos apagar. Por isso, é necessário estabelecer uma
seleçãoque se realize mediante a cláusula Where.A forma de selecionar será vista;
detalhadamente em capítulos posteriores. Agora, noscontentaremos em mostrar qual é o tipo de
sintaxe utilizada para efetuar estas supressões:Delete From nome_tabela Where
condicoes_de_selecaoSe quisermos, por exemplo, apagar todos os registros dos clientes que se
chamarem Pedro,faríamos da seguinte forma:Delete From clientes Where nome='Pedro'Temos
que ter cuidado com esta instrução, pois se não especificarmos uma condição comWhere, o que
estamos fazendo é
apagar toda a tabela
:
Delete From clientes

Informe de
Rubén Alvarez
Mail:
ruben@desarrolloweb.com

Atualizar um registro
Update é a instrução que nos serve para modificar nossos registros. Como para o caso
deDelete, necessitamos especificar por meio de Where quais são os registros que queremos
fazerefetivas nossas modificações. Ademais, obviamente, teremos que especificar quais são os
novosvalores dos campos que desejamos atualizar. A sintaxe é deste tipo:Update nome_tabela
Set nome_campo1 = valor_campo1, nome_campo2 = valor_campo2,...Where
condicoes_de_selecaoUm exemplo aplicado:Update clientes Set nome='José' Where
nome='Pedro'Mediante esta sentença mudamos o nome Pedro por José em todos os registros
cujo nome sejaPedro.Aqui também há que ser cuidadoso de não esquecer de usar Where, do
contrário,modificaríamos todos os registros de nossa tabela.
Informe de
Rubén Alvarez
Mail:
ruben@desarrolloweb.com

Nota:
Se desejarmos praticar com um banco de dados que estiver vazio, primeiro devemos criar
astabelas que vamos preencher. As tabelas também se criam com sentenças SQL que
aprendemos a fazer noúltimo capítulo.
Page 3 of 90Tutorial de SQL - Manual
completo11/07/2008http://www.criarweb.com/manuais/32/print.php

Seleção de tabelas I
A seleção total ou parcial de uma tabela se realiza mediante a instrução Select. Em tal
seleçãohá que especificar:-Os campos que queremos selecionar-A tabela na qual fazemos a
seleçãoEm nossa tabela modelo de clientes poderíamos fazer, por exemplo, uma seleção do
nome eendereço dos clientes com uma instrução deste tipo:Select nome, endereço From
clientesSe quiséssemos selecionar todos os campos, ou seja,
toda a tabela
, poderíamos utilizar oasterisco * da seguinte forma:
Select * From clientes
Também é muito útil filtrar os registros mediante condições que vêem expressas depois da
cláusula Where
. Se quiséssemos mostrar os clientes de uma determinada cidade usaríamosuma expressão
como esta:Select * From clientes Where cidade Like 'Rio de janeiro'Ademais, poderíamos
ordenar os resultados
em função de um ou vários de seus campos.Para este último exemplo poderíamos ordená-los
por nome assim:Select * From clientes Where cidade Like 'Rio de janeiro'
Order
By nomeTendo em conta que pode haver mais de um cliente com o esmo nome, poderíamos dar
umsegundo critério que poderia ser o sobrenome:Select * From clientes Where cidade Like 'Rio
de Janeiro' Order By nome, sobrenomeSe invertêssemos a ordem " nome,sobrenome " por "
sobrenome, nome ", o resultado seriadiferente. Teríamos os clientes ordenados por sobrenome e
aqueles que tivessem sobrenomesidênticos se sub-classificariam pelo nome.É possível também
classificar por ordem inversa
. Se por exemplo quiséssemos ver nossosclientes por ordem de pedidos realizados tendo aos
maiores em primeiro lugar escreveríamosalgo assim:Select * From clientes Order By pedidos
Decres
Uma opção interessante é a de efetuar
seleções sem coincidência
. Se por exemplo,buscássemos saber em que cidades se encontram nossos clientes sem a
necessidade de quepara isso apareça várias vezes a mesma cidade, usaríamos uma sentença
desta classe:Select
Distinct
cidade From clientes Order By cidadeAssim evitaríamos ver repetido Rio de Janeiro tantas vezes
quantos clientes tivermos nessacidade.
Informe de
Rubén Alvarez

Page 4 of 90Tutorial de SQL - Manual


completo11/07/2008http://www.criarweb.com/manuais/32/print.php

Mail:
ruben@desarrolloweb.com

Seleção de tabelas II
Quisemos compilar na forma de tabela certos operadores que podem ser úteis em
determinadoscasos. Estes operadores serão utilizados depois da cláusula Where e podem ser
combinadoshabilmente mediante parênteses
para otimizar nossa seleção a níveis bastante altos.Vejamos a seguir aplicações práticas destes
operadores.Nesta sentença selecionamos todos os clientes de Salvador cujo nome não seja
Jose. Como sepode ver, empregamos
Like
ao invés de
=
simplesmente para evitar inconvenientes devido aoemprego ou não de maiúsculas.
Operadores matemáticos:
> Maior que< Menor que>= Maior ou igual que<= Menor ou igual que<> Diferente= Igual
Operadores lógicos
AndOrNot
Outros operadores
LikeSeleciona os registros cujo valor de campo se assemelhe, não tendo emconta maiúsculas e
minúsculas.In e Not InDá um conjunto de valores para um campo para os quais a condição
deseleção é (ou não) válidaIs Null e Is NotNullSeleciona aqueles registros onde o campo
especificado está (ou não) vazio.Between...And Seleciona os registros compreendidos em um
intervaloDistinct Seleciona os registros não coincidentesDesc Classifica os registros por ordem
inversa
Curingas
* Substitui a todos os campos% Substitui a qualquer coisa ou nada dentro de uma cadeia_
Substitui só um caractere dentro de uma cadeia
Page 5 of 90Tutorial de SQL - Manual
completo11/07/2008http://www.criarweb.com/manuais/32/print.php

Select * From clientes Where cidade


Like
'salvador'
And Not
nome
Like
'Jose'Se quiséssemos recolher em uma seleção aos clientes de nossa tabela cujo
sobrenomecomeça por A e cujo número de pedidos esteja compreendido entre 20 e 40
:Select * From clientes Where sobrenomes
like 'A%'
And pedidos
Between 20 And 40
O operador
In
, será visto mais adiante, é muito prático para consultas em várias tabelas. Paracasos em uma
única tabela é empregada da seguinte forma:Select * From clientes Where cidade
In ('Salvador','Fortaleza','Florianopolis')
Desta forma
selecionamos aqueles clientes que vivem nessas três cidades
.
Informe de
Rubén Alvarez
Mail:
ruben@desarrolloweb.com

Seleção de tabelas III


Um banco de dados pode ser considerado como um conjunto de tabelas. Estas tabelas,
emmuitos casos, estão relacionadas entre elas e se complementam unas com outras.Fazendo
referência ao nosso clássico exemplo de um banco de dados para uma aplicação de e-comercio,
a tabela clientes que estivemos falando pode estar perfeitamente coordenada comuma tabela
onde armazenamos os pedidos realizados por cada cliente. Esta tabela de pedidospode por sua
vez, estar conectada com uma tabela onde armazenamos os dadoscorrespondentes a cada
artigo do inventário.Deste modo poderíamos facilmente obter informações contidas nessas três
tabelas como podeser a designação do artigo mais popular em uma determinada região onde a
designação doartigo seria obtida na tabela de artigos, a popularidade (quantidade de vezes que
esse artigo foivendido) viria da tabela de pedidos e a região estaria compreendida obviamente na
tabelaclientes.Este tipo de organização baseada em múltiplas tabelas conectadas nos permite
trabalhar comtabelas muito mais manejáveis e ao mesmo tempo, nos evita copiar o mesmo
campo em várioslugares já que podemos acessa-lo a partir de uma simples chamada à tabela
que o contém.Neste capítulo veremos como, usando o que foi aprendido até agora, podemos
realizarfacilmente seleções sobre várias tabelas. Definiremos antes de nada as diferentes
tabelas ecampos que vamos utilizar em nossos exemplos:
Tabela de clientes
Nome campo Tipo campo
id_cliente Numérico inteironome Textosobrenomes Textoendereço Textocidade Textocep
Textotelefone Numérico inteiroemail Texto
Page 6 of 90Tutorial de SQL - Manual
completo11/07/2008http://www.criarweb.com/manuais/32/print.php

Estas tabelas podem ser utilizadas simultaneamente para extrair informações de todo
tipo.Suponhamos que queremos enviar um mailing a todos aqueles que tiverem realizado um
pedidonesse mesmo dia. Poderíamos escrever algo assim:
Select clientes.sobrenomes, clientes.email From clientes,pedidos Where pedidos.datalike
'25/02/00' And pedidos.id_cliente= clientes.id_cliente
Como pode ser visto desta vez, depois da cláusula From, introduzimos o nome das duas
tabelasde onde tiramos as informações. Ademais, o nome de cada campo vai precedido da
tabela deproveniência separado ambos por um ponto. Nos campos que possuem um nome que
sóaparece em uma das tabelas, não é necessário especificar sua origem embora na hora de
lersua sentença possa ser mais claro tendo esta informação mais precisa. Neste caso, o
campodata poderia ter sido designado como "data" ao invés de "pedidos.data".Vejamos outro
exemplo mais para consolidar estes novos conceitos. Desta vez queremos ver otítulo do livro
correspondente a cada um dos pedidos realizados:
Select pedidos.id_pedido, artigos.titulo From pedidos, artigos
Wherepedidos.id_artigo=artigos.id_artigo
Na verdade a filosofia continua sendo a mesma que para a consulta de uma única tabela.
Informe de
Rubén Alvarez
Mail:
ruben@desarrolloweb.com

Seleção de tabelas IV
Além dos critérios até agora explicados para realizar as consultas em tabelas, SQL
permitetambém aplicar um conjunto de funções pré-definidas. Estas funções, embora sejam
básicas,
Tabela de pedidos
Nome campo Tipo campo
id_pedido Numérico inteiroid_cliente Numérico inteiroid_artigo Numérico inteirodata
Dataquantidade Numérico inteiro
Tabela de artigos
Nome campo Tipo campo
id_artigo Numérico inteirotitulo Alfanuméricoautor Alfanuméricoeditorial Alfanuméricopreço
Numérico real
Page 7 of 90Tutorial de SQL - Manual
completo11/07/2008http://www.criarweb.com/manuais/32/print.php

podem nos ajudar em alguns momentos a expressar nossa seleção de uma maneira
maissimples sem ter que recorrer a operações adicionais por parte do script que
estivermosexecutando.Algumas destas funções são representadas na seguinte tabela:Dado que
o campo da função não existe no banco de dados, pois o estamos gerandovirtualmente, isto
pode criar inconvenientes quando estivermos trabalhando com nossos scriptsna hora de tratar
seu valor e seu nome de campo. É por isso que o valor da
função tem queser recuperada a partir de um apelido
que nós especificaremos na sentença SQL a partir dainstrução
AS
. A coisa poderia ficar assim:
Select Soma(total) As soma_pedidos From pedidos
A partir desta sentença calculamos a soma dos valores de todos os pedidos realizados
earmazenamos esse valor em um campo virtual chamado soma_pedidos que poderá ser
utilizadocomo qualquer outro campo por nossas páginas dinâmicas.Obviamente, tudo que foi
visto até agora pode ser aplicado neste tipo de funções de modo que,por exemplo, podemos
estabelecer condições com a cláusula Where construindo sentençascomo esta:
Select Soma(quantidade) as soma_artigos From pedidos Where id_artigo=6
Isto nos proporcionaria a quantidade de
exemplares de um determinado livro que foramvendidos
.Outra propriedade interessante destas funções é que
permitem realizar operações comvários campos dentro de um mesmo parênteses
:
Select Avg(total/quantidade) From pedidos
Esta sentença dá como resultado o
preço médio que estão sendo vendidos os livros
. Esteresultado não tem porquê coincidir com o do
preço médio dos livros presentes noinventário
, já que, pode ser que as pessoas tenham tendência a comprar os livros caros ou osbaratos:
Select Avg(precio) as preco_venda From artigos
Uma cláusula interessante no uso das funções é Group By. Esta cláusula nos permite
agruparregistros aos quais vamos aplicar a função. Podemos por exemplo calcular o
dinheiro gastadopor cada cliente
:
Select id_cliente, Soma(total) as soma_pedidos From pedidos Group By id_cliente
Ou saber o
número de pedidos que foram realizados
:
Select id_cliente, Count(*) as numero_pedidos From pedidos Group By id_cliente

Função Descrição
Soma(campo) Calcula a soma dos registros do campo especificadoAvg(Campo) Calcula a média
dos registros do campo especificadoCount(*) Proporciona o valor do número de registros que
foram selecionadosMax(Campo) Indica qual é o valor máximo do campoMin(Campo) Indica qual
é o valor mínimo do campo
Page 8 of 90Tutorial de SQL - Manual
completo11/07/2008http://www.criarweb.com/manuais/32/print.php

As possibilidades como vemos são numerosas e pode ser práticas. Agora tudo fica à
disposiçãode nossas ocorrências e imaginação.
Informe de
Rubén Alvarez
Mail:
ruben@desarrolloweb.com

Aproveite seu banco de dados


Bancos de dados deixaram há muito de ser simplesmente um repositório de informações
usadospara, no máximo, organizar registros de tal forma que posteriormente pudessem ser
indexadose/ou recuperados de alguma forma. Hoje eles são ferramentas poderosas nas
tomadas dedecisões dentro das empresas que, aproveitando-se da grande quantidade de dados
láexistentes, extraem análises de vários tipos para executarem os próximos movimentos e
açõesem seus mercados.Mas o banco de dados por sí não opera milagres. É necessária a
presença de um profissionalconhecedor de suas ferramentas e entranhas para tirar dele tudo
aquilo que é possível. Esteprofissional normalmente conhecido por DBA (Database
Administrator) é a peça fundamentalneste processo.Por outro lado, os desenvolvedores de
software mesmo não sendo especialistas em bancos dedados como os DBA's, podem (e devem)
aproveitar um pouco do que é oferecido por estasferramentas para criar aplicações mais rápidas,
mais enxutas e mais “limpas”, aproveitandofunções existentes mas que na maioria das vezes
são esquecidas no momento dodesenvolvimento. Sobre isso que vamos falar hoje:
aproveitamento de funções de bancos dedados.Obs: neste artigo usarei exemplos com o banco
de dados MySQL e a linguagem PHP. Entretantocom toda a certeza eles podem ser usados
também com outras bases e linguagens de formasemelheante.
Somando valores, e concatenando campos
Com uma frequência impressionante, precisamos somar valores vindos de uma base de
dados.Para fazer isso dentro do código do programa, podemos ter:Mas, que tal assim:Hmmm...
de 5 linhas para duas? Mas como?O “segredo” está na função SUM usada na segunda
instrução. Ela simplesmente soma osvalores do campo e reduz um laço dentro do código. Com
isso temos mais eficiência, velocidade$Rst = mysql_query("SELECT valor FROM tabela",
$conexao);while($valor=mysql_fetch_row($Rst)){$resultado = $resultado + $valor[0];}print
$resultado;$Rst = mysql_fetch_row(mysql_query("SELECT SUM(valor) FROM tabela",
$conexao));print $Rst[0];
Page 9 of 90Tutorial de SQL - Manual
completo11/07/2008http://www.criarweb.com/manuais/32/print.php

e código limpo.Um outro exemplo interessante pode ser visto quando, por exemplo, precisamos
concatenar(unir) dois campos. Para criar uma tabela no código, faríamos assim:Mas também
pode ser feito assim:Observe que não temos redução de linhas mas de caracteres que deixam o
código mais limpo eaproveitamos o processamento do banco ao invés do servidor web. A
concatenação é feita pelafunção CONCAT no segundo exemplo e depois somente precisamos
imprimir uma variável, aoinvés de duas, evitando assim problemas de interpretação.
Datas? Não se perca
Muitas vezes o trabalho com datas é um pesadelo para o programador. Soma de dias,
meses,em que dia da semana caiu tal data e assim por diante.Como para strings, bancos de
dados também possuem um conjunto interessante de funçõespara a manipulação de datas.
Vamos ver algumas.
A data atual
Já vi muito programador criar função para a inserção de datas dentro de registros em bases
dedados. Acredito que isso seja por não conhecer uma pequena mas muito útil função
chamadanow(). Com ela, a data e/ou hora atual são armazenadas em campos que necessitam
estevalor.Esta função simplesmente pega a informação de data e hora do servidor e insere no
campo quedeseja (neste exemplo, em data). Mas cuidado; se o servidor está com a data/hora
erradas, ovalor que será inserido também estará errado. Assim é interessante manter o servidor
comhorário sempre sincronizado com time servers existentes na Internet.Além disso, em alguns
momentos precisamos saber em que semana estamos do ano ou aindaquantas semanas faltam
para o fim do ano. Ao invés de complexos códigos de linguagem,podemos usar a base de dados
para nos informar este resultado rapidamente. Por exemplo, emque semana do mês estamos
agora?$Rst = mysql_query("SELECT nome, sobrenome FROM tabela",
$conexao);while($valor=mysql_fetch_row($Rst)){echo 'Nome Completo: '.$valor[0].
$valor[1].'<br>';}$Rst = mysql_query("SELECT CONCAT(nome, sobrenome) FROMtabela",
$conexao);while($valor=mysql_fetch_row($Rst)){echo 'Nome Completo: '.
$valor[0].'<br>';}mysql_query("INSERT INTO tabela (data) VALUES (now())",$conexao);print
mysql_result(mysql_query("SELECT WEEK(now())",$conexao),0);// resultado: 18
Page 10 of 90Tutorial de SQL - Manual
completo11/07/2008http://www.criarweb.com/manuais/32/print.php

Aqui foi usada a função WEEK que retorna o número da semana de uma determinada
data.Neste caso, a data informada é “hoje” pois usamos como parâmetro de data a função
now()que, como já apresentado anteriormente, é a data atual do servidor.Outra tarefa comum
com datas é a soma de dias em uma data específica. Pode parecer simplesmas como o formato
de data é diferente de formatos numéricos e strings, muitas vezes oresultado está errado e não
sabemos porquê.A forma mais simples é novamente deixar o banco de dados trabalhar por você.
Então paraacrescentar, por exemplo, dez dias à data atual, fazemos:Com isso temos, em uma
única linha, o valor que precisamos com a certeza que se trata deuma data válida, inclusive
contando meses que possuem somente 28,29 ou 30 dias(experimente fazer a soma de 10 dias à
data de 25/02/2006 e verá o resultado).
Conclusão
Pequenas e simples funções quando bem utilizadas facilitam a vida de qualquer
desenvolvedor.Assim, antes de “quebrar a cabeça” com dezenas de linhas de código para
resolver umproblema ou demanda, procure saber se as ferramentas que está utilizando não
dispõem deformas mais simples para a solução deste problema. Muitas vezes a solução mais
simples estádiante dos olhos e perdemos tempo tentando algo diferente.Estes exemplos são
pequenos e simples se comparados a enorme gama de opções existentesnas bases de dados.
Funções para data, strings, funções matemáticas e outras tantas estãodisponíveis na maioria
das bases de dados relacionais existentes hoje em dia. Para o
MySQL,acessehttp://dev.mysql.com/doc/refman/4.1/pt/functions.html. Já para o PostgreSQL,
acessehttp://www.postgresql.org/docs/8.1/static/functions.html Espero que tenha gostado e
aprendido um pouco mais.Abraços!Obs: Os códigos deste artigo podem ser encontrados
emhttp://www.michelazzo.com.brnaseção de downloads.Copyright 2006 Paulino Michelazzo
-http://www.michelazzo.com.br Obra licenciada sob Creative Commons Developing Nations 2.0
Informe de
Paulino Michelazzo
Mail:
paulino@michelazzo.com.br
URL:
http://www.devmedia.com.br

Tabelas temporárias no Sql Server


A sintaxe para criar uma tabela temporária no Sql Server é bastante simples, basta acrescentaro
# antes do nome da mesma.Sintaxe:print mysql_result(mysql_query("SELECT
DATE_ADD(now(),INTERVAL 10DAY)",$conexao),0);// resultado: 2006-05-16

Page 11 of 90Tutorial de SQL - Manual


completo11/07/2008http://www.criarweb.com/manuais/32/print.php

CREATE TABLE #nomeTable(nomecampoA varchar(80),nomecampoB money)Tabelas


temporárias são muito utilizadas quando precisamos reunir vários registros de váriastabelas em
uma única seleção e exibi-las em uma aplicação qualquer (p.ex.: Delphi, VisualStudio, ASP.NET,
etc.). .É fundamental para aplicações cliente/servidor onde vários usuários estão acessando
aquelaprocedure ao mesmo tempo.Aqui vai um exemplo prático da utilização de tabelas
temporárias.É importante saber que atabela temporária só existe enquanto a procedure está
sendo executada, após a execução damesma ela é automaticamente excluída. Aproveitei para
colocar um exemplo utilizando o CASEdo Sql ServerCREATE PROCEDURE
TesteTabelaTemporariaascreate table #tmpTotalPage(mes smallint null,totalmes smallint
null,mediames decimal(9, 3) null )Insert into #tmpTotalPage ( mes, totalmes, media)(select
DATEPART(MONTH,data) as Mes, count(*) as TotalAcessos, nullfrom Acessos AS ACINNER
JOIN CadastroTB AS C ON AC.idcad = C.idCadgroup by DATEPART(MONTH,data))select mes,
totalmes,media = casewhen mes = 1 then totalmes / 31when mes = 2 then totalmes / 28when
mes = 3 then totalmes / 30when mes = 4 then totalmes / 31when mes = 5 then totalmes / 30when
mes = 6 then totalmes / 31when mes = 7 then totalmes / 30when mes = 8 then totalmes / 31when
mes = 9 then totalmes / 30when mes = 10 then totalmes / 31when mes = 11 then totalmes /
30when mes = 12 then totalmes / 31endfrom #tmpTotalPagePor enquanto é só, até a próxima
pessoal!
Informe de
Fabio Correa
URL:
http://www.devmedia.com.br

Adquirindo informações do Usuário com a classe System

Page 12 of 90Tutorial de SQL - Manual


completo11/07/2008http://www.criarweb.com/manuais/32/print.php

Acredito que muitas pessoas já tiveram a necessidade de saber qual o nome do


sistemaoperacional de um usuário, o seu login do Windows, o diretório home etc. em suas
aplicações.Se você é um dos que se enquadram nessa situação, saiba que existe uma forma de
adquiriressas informações: através da função System.getProperty().Segue um exemplo:
public class Main{public static void main( String[] args ) {System.out.println("Usuario: " +
System.getProperty("user.name").toUpperCase());System.out.println("Sistema Operacional: " +
System.getProperty("os.name").toUpperCase());}}
Veja a saída:
Usuário: GLAUCIOSistema Operacional: WINDOWS XP
Abaixo seguem alguns parâmetros para a função getProperty():os.arch – Retorna a arquitetura
do Sistema operacionalos.version – Retorna a versão do Sistema operacionalos.name – Nome
do Sistema Operacionalava.version – Retorna a versão da JREava.home – Diretório de
Instalação Javaava.class.path – Retorna o Class Pathuser.home – Diretório home do
usuáriouser.name – Nome da conta do usuárioA lista completa encontra-se neste
endereço:http://java.sun.com/j2se/1.4.2/docs/api/java/lang/System.html#getProperties()Essa
recurso também pode ser usado em JSPs:Código da JSP:Saída:
Page 13 of 90Tutorial de SQL - Manual
completo11/07/2008http://www.criarweb.com/manuais/32/print.php

Esse tipo de função permite que, por exemplo, quando um usuário acessar o sistema, seu
loginseja obrigatoriamente o mesmo do Sistema Operacional. Isso oferece ao administrador
dosistema total controle de quem está usando a ferramenta, garantindo que o usuário possui
umaconta na Intranet.
Informe de
Glaucio Guerra
URL:
http://www.devmedia.com.br

Alguns truques práticos

Eliminar chamadas aos bancos de dados


Em páginas do tipo portal nas que nas laterais se encontram links que são impressos a partir
debancos de dados (distintas seções, serviços,...) existe sempre um efeito lentalizador devido
aque se trata de páginas altamente visitadas que efetuam múltiplas chamadas a
BDsistematicamente em cada uma de suas páginas.Uma forma de agilizar a visualização destas
páginas é textualizando estes links a partir descripts internos. Colocamos o exemplo de
Criarweb:Como se pode ver, na lateral existem seções como "Suas Páginas", "Manuais" cujos
links estãoarmazenados no banco de dados. Entretanto, os links que se visualizam na página
não foramobtidos por chamadas a banco de dados e sim que, cada vez que um novo elemento
da seção éadicionado, isto se atualiza automaticamente, por meio de um script, um arquivo texto
no qualo novo link é incluído e o mais antigo é eliminado. De fato, este arquivo de texto é o que
éinserido no código fonte da página. Deste modo, evitamos meia dúzia de chamadas a bancos
dedados cada vez que uma página é vista, o qual permite otimizar recursos de servidor de
umamaneira significativa.
Eliminar palavras curtas e repetições
Em situações na qual nosso banco de dados tem que armazenar campos de textoextremamente
longos, e tais campos são requeridos para realizar seleções do tipo LIKE '%
Page 14 of 90Tutorial de SQL - Manual
completo11/07/2008http://www.criarweb.com/manuais/32/print.php

algo%', os recursos do BD podem se ver sensivelmente minguados Uma forma de ajudar


agerenciar este tipo de buscas é incluindo um campo adicional.Este campo adicional pode ser
criado automaticamente por meio de scripts e nele incluiríamos otexto original, do qual teremos
eliminado palavras triviais como artigos, preposições oupossessivos. Além disso, nos
encarregaremos de eliminar as palavras que estiverem repetidas.Desta forma poderemos
diminuir sensivelmente o tamanho do campo que vai ser realmenteconsultado.Comentamos em
outros capítulos que os campos de texto de mais de 255 caracteresdenominados memo não
podem ser indexados. Se ainda depois desta primeira filtragem nossocampo continuar sendo
longo demais para ser indexado, o que se pode fazer é corta-lo empedaços de 255 caracteres de
maneira que o armazenemos em diferentes campos que poderãoser indexados e portanto,
consultados com maior rapidez.
Informe de
Rubén Alvarez
Mail:
ruben@desarrolloweb.com

Criação de tabelas
Em geral, a maioria dos bancos de dados possui potentes editores de bancos que permitem
acriação rápida e simples de qualquer tipo de tabela com qualquer tipo de formato.Entretanto,
uma vez que o banco de dados esteja hospedado no servidor, pode acontecer ocaso de que
queiramos introduzir uma nova tabela já seja com caráter temporário (paragerenciar um carrinho
de compra, por exemplo) ou permanente, por necessidades concretas denossa aplicação.Nestes
casos, podemos, a partir de uma sentença SQL, criar a tabela com o formato quedesejarmos, o
qual pode nos poupar mais que um quebra-cabeça.Estes tipos de sentenças são especialmente
úteis para bancos de dados como Mysql, os quaistrabalham diretamente com comandos SQL e
não por meio de editores.Para criar uma tabela devemos especificar diversos dados: O nome
que queremos atribuir, osnomes dos campos e suas características. Ademais, pode ser
necessário especificar quaisdestes campos vão ser índices e de que tipo serão.A sintaxe de
criação pode variar ligeiramente de um banco de dados para outro já que os tiposde campos
aceitos, não estarão completamente padronizados.A seguir explicamos meramente a sintaxe
desta sentença e lhes propomos uma série deexemplos:
Sintaxe
Create Table nome_tabela(nome_campo_1 tipo_1nome_campo_2 tipo_2nome_campo_n
tipo_nKey(campo_x,...))Ponhamos agora como exemplo a criação da tabela pedidos que
empregamos em capítulosanteriores:
Page 15 of 90Tutorial de SQL - Manual
completo11/07/2008http://www.criarweb.com/manuais/32/print.php

Create Table pedidos(id_pedido INT(4) NOT NULL AUTO_INCREMENT,id_cliente INT(4) NOT


NULL,id_artigo INT(4)NOT NULL,data DATE,quantidade INT(4),total INT(4),
KEY(id_pedido,id_cliente,id_artigo))Neste caso criamos os campos
id
os quais são considerados de tipo inteiro de uma longitudeespecificada pelo número entre
parênteses. Para
id_pedido
requeremos que tal campo seincremente automaticamente (AUTO_INCREMENT) de uma
unidade a cada introdução a umnovo registro para, desta forma, automatizar sua criação. Por
outro lado, para evitar umamensagem de erro, é necessário requerer que os campos que vão ser
definidos como índicesnão possam ser nulos (NOT NULL).O campo
data
é armazenado com formato de data (DATE) para permitir sua correta exploraçãoa partir das
funções previstas a tal efeito.Finalmente, definimos os índices numerando-os entre parênteses
precedidos da palavra KEY ouINDEX.Da mesma forma poderíamos criar a tabela de
artigos
com uma sentença como esta:Create Table artigos(id_artigo INT(4) NOT NULL
AUTO_INCREMENT,titulo VARCHAR(50),autor VARCHAR(25),editorial VARCHAR(25),preco
REAL,KEY(id_artigo))Neste caso pode-se ver que os campos alfanuméricos são introduzidos da
mesma forma que osnuméricos. Voltemos a recordar que em tabelas que têm campos comuns é
de vital importânciadefinir estes campos da mesma forma para o bom funcionamento da
base.Muitas são as opções que se oferecem ao gerar tabelas. Não vamos a trata-las
detalhadamente,pois sai do estritamente prático. Mostraremos somente alguns dos tipos de
campos que podemser empregados na criação de tabelas com suas características:
Tipo Bytes Descrição
INT ouINTEGER4Números inteiros. Existem outros tipos de maior ou menorlongitude específicos
de cada banco de dados.DOUBLE ouREAL8Números reais (grandes e com decimais). Permitem
armazenartodo tipo de número não inteiro.CHAR 1/caractere Alfanuméricos de longitude fixa
pré-definidaVARCHAR 1/caractere+1 Alfanuméricos de longitude variávelDATE 3Datas, existem
múltiplos formatos específicos de cada banco dedadosBLOB 1/caractere+2 Grandes textos não
indexáveisBIT ouBOOLEAN1 Armazenam um bit de informação (verdadeiro ou falso)
Page 16 of 90Tutorial de SQL - Manual
completo11/07/2008http://www.criarweb.com/manuais/32/print.php

Informe de
Rubén Alvarez
Mail:
ruben@desarrolloweb.com

SQL e Programação de Banco de Dados


Quero me apresentar a você e iniciar um contato periódico para tratarmos assuntosrelacionados
à linguagem SQL e à programação de banco de dados. Trabalho com banco dedados há algum
tempo e sei o quanto é importante trocar experiências com outrosprofissionais. Ninguém é capaz
de extrair o máximo de um banco de dados, mas, juntos,podemos realizar mais e de uma
maneira cada vez melhor.Minha experiência maior tem sido desenvolvida junto ao banco de
dados Oracle, mas apadronização do comando SQL e pelo fato de os conceitos de programação
de um banco dedados serem facilmente aplicados a qualquer outro banco de dados, faz com
que possamostratar destes assuntos quase que universalmente.
SQL
A linguagem SQL (Structured Query Language) é a base para utilização de bancos de
dadosrelacionais. Com a utilização dos comandos básicos (INSERT, DELETE, UPDATE e
SELECT) pode-se resolver a maior parte dos problemas relacionados a manutenção e extração
de dados nobanco de dados. Com o SQL é possível criar as estruturas básicas de
armazenamento, comotabelas e índices. Também há comandos específicos da linguagem para o
controle e segurançarelacionado a um banco de dados. Em princípio, os comandos SQL são
divididos em:

DDL (Data Definition Language) ou Linguagem de definição de dados

DML (Data Manipulation Language) ou Linguagem de manipulação de dados

DQL (Data Query Language) ou Linguagem de recuperação de dados

DCL (Data Control Language) ou Linguagem de controle de dadosO SQL tem sido aprimorado
ao longo do tempo. Duas entidades (ANSI – American NationalStandards Institute e ISO –
International Standards Organization) vêm, desde 1986, publicandopadrões de especificação da
linguagem SQL.Vamos discutir como abordar e tirar o máximo de proveito desta linguagem que
éextremamente importante para todos os profissionais de banco de dados. Os principais
tópicosque serão de interesse envolvem:

Fundamentos da linguagem SQL

Extensões e particularidades de cada banco de dados

Melhoria no desempenho de consultas

Utilização de funções analíticas em banco de dados

Tendências do uso da linguagemNaturalmente a idéia é ter uma visão prática, com exemplos e
com a abertura de umadiscussão entre todos os leitores.
Programação de Banco de Dados
Os comandos da linguagem SQL são muito poderosos, mas normalmente consegue-se
melhoraro desempenho das aplicações através da programação do banco de dados. Ao
desenvolvermódulos que sejam executados diretamente no servidor diminui-se o tráfego de
informações narede, esconde-se boa parte das estruturas das tabelas e agiliza-se o
processamento e retornodas mensagens. Internamento o banco de dados possui mecanismos
integrados que permitemunir as estruturas tradicionais de programação com os comandos SQL.
Page 17 of 90Tutorial de SQL - Manual
completo11/07/2008http://www.criarweb.com/manuais/32/print.php

O banco de dados possui mecanismos próprios que podem ser utilizados em favor
dodesenvolvedor. Cada banco de dados possui um conjunto específico de comandos que
definema linguagem de programação do banco de dados. No caso do Oracle, a linguagem é o
PL/SQL, oSQL Server possui o Transact-SQL, o DB2 possui sua própria linguagem de
programação, oPostGreSQL possui diversas extensões que podem ser utilizadas como
linguagem deprogramação e o MySQL lançou sua mais recente versão com a possibilidade de
programar oservidor. Cada banco de dados é único sob este aspecto, mas todos trabalham
sobre osmesmos conceitos. É possível criar módulos programáveis, como funções,
procedimentos,objetos, pacotes, gatilhos, etc. Em todos os casos, há um engine responsável
pela integração eexecução dos módulos no servidor de banco de dados.Desta forma, os tópicos
que serão trabalhados serão:

Fundamentos de programação de banco de dados

Aspectos avançados da programação

Desempenho dos módulos

Programação aliada à extração de dados gerenciais

Tendências em programação de banco de dadosComo se pode notar, os tópicos são quase os
mesmos da linguagem SQL. Também teremosartigos que poderão ser implementados, testados
e melhorados por todos os leitores.
Informe de
Eber M. Duarte
URL:
http://www.devmedia.com.br

Funções para buscas com datas em Access


Buscas com datas em Access Recebemos uma pergunta recentemente de um amigo
quedesejava realizar buscas em Access utilizando, nas condições do Where, campos do tipo
data.Depois de várias tentativas resgatamos umas anotações que podem ser interessantes
parapublicar. Seguro que servem de ajuda a outras pessoas que tenham que trabalhar com
datasem consultas de Access.A consulta era a seguinte:
Tenho uma tabela com vários campos. Dois deles são datas, que correspondem com
umintervalo. Um deles é a data de início do intervalo (datadesde) e outro a de final do
intervalo(dataate)Queria saber como se pode fazer uma consulta SQL em Access para obter os
registros cujointervalo de datas contenha o dia de hoje.Ou seja, que a data desde seja menor
que hoje e data até seja maior que hoje.
Estivemos primeiro fazendo duas provas sem êxito, comparando as datas com
operadoresaritméticos. Em alguns casos obtivemos a resposta esperada, porém nem sempre
funcionavamas sentenças e tínhamos problemas ao executa-las desde Access ou desde o
servidor web,porque não devolviam os mesmos resultados.
Função DateDiff()
Afinal, a resposta que propusemos passou por utilizar a função DateDiff, que serve para obter
adiferença entre duas datas. Por exemplo:DateDiff("y", #06/10/2004#, Now())
Page 18 of 90Tutorial de SQL - Manual
completo11/07/2008http://www.criarweb.com/manuais/32/print.php

Conta-nos os dias que passaram desde seis de outubro de 2004.Nós podemos utiliza-la como
condição em um where de uma sentença SQL. Por exemplo, parauma sentença como
esta:DateDiff("y",A,B)

Se são iguais, a função devolverá zero.

Se A é uma data anterior a B, então a função devolverá um número de dias que serámaior que
zero.

Se A é uma data posterior a B, então devolverá um número de dias que será menor
quezero.Temos que comparar o dia de hoje com as datas desde e ate. Hoje tem que ser maior
quedesde e menor que ate. Fica como resultado esta sentença:
SELECT * FROM vuelos WHEREDateDiff('y',datadesde,now())>=0and
DateDiff('y',dataate,nom())<=0
Função DatePart
Serve para extrair parte de uma data. Recebe dois parâmetros, o primeiro indica mediante
umstring a parte a obter. O outro parâmetro é a data com a que se deseja
trabalhar.DatePart("m",data)Neste caso está sendo indicado que se deseja obter o mês do ano.
Outro valor possível para oprimeiro parágrafo é, por exemplo "yyyy", que se utiliza para obter o
ano com quatro dígitos.Um exemplo de sentença SQL que utiliza esta função pode ser a
seguinte:
SELECT DatePart("yyyy",validadedesde) FROM voos
Função DateAdd
Esta última função que vamos ver no presente artigo serve para acrescentar à data, algo
comodias, meses ou anos. Para isso a função recebe três parâmetros, o primeiro corresponde
comum string para indicar as unidades do que desejamos acrescentar, por exemplo, dias, meses
ouanos. O segundo parâmetro é o número de dias, meses ou anos a adicionar e o
terceiroparâmetro é a data a qual somar esses valores. Vemos um exemplo de sua
sintaxe:DateAdd("yyyy",10,validadedesde)Neste exemplo a função DateAdd devolveria uma data
dez anos posterior a validadedesde.Outros valores para o string do primeiro parâmetro são "d",
para acrescentar dias, ou "m", paraacrescentar meses.Um exemplo do funcionamento desta
função em uma sentença SQL é a seguinte:
SELECT DateAdd("yyyy",10,validadedesde) FROM voosInforme de
M. A. A. Tradução Juliana Monteiro
Mail:
juliana@criarweb.com

Nota:
Há que ter cuidado com o idioma das datas, pois em português se escrevem de maneira
diferenteque em inglês. Access tenta interpretar a data corretamente, por exemplo, se
introduzimos 02/26/04pensará que está trabalhando em datas em inglês e se introduzimos
26/02/04 pensará que estamosescrevendo as datas em português. O problema é com uma data
como 02/02/04 que seu valor dependeráde como esteja configurado o Access, em português ou
em inglês.
Page 19 of 90Tutorial de SQL - Manual
completo11/07/2008http://www.criarweb.com/manuais/32/print.php

Função em SQL para o cálculo de dias de trabalho

/*Primeiramente declaramos que vamos criar uma função, neste caso se chama Dif Dias e
recebe dois parâmetros, adata inicial do período e a final*/CREATE FUNCTION
DifDias(@StartDate DATETIME,@EndDate DATETIME)RETURNS integerASBegin//Com esta
variavel calculamos quantos dias "normais" existem na classe de datasDECLARE
@DaysBetween INT//Com esta variavel acumulamos os dias totaisDECLARE @BusinessDays
INT//esta variavel nos serve de contador para saber quando chegarmos ao ultimo dia da
classeDECLARE @Cnt INT/*esta variavel eh a que comparamos para saber se o dia que esta
calculando eh sabado ou domingo*/DECLARE @EvalDate DATETIME/*Estas duas variaveis
servem para comparar as duas datas, se sao iguais, a funcao nos regressa um 0*/DECLARE
@ini VARCHAR(10)DECLARE @fin VARCHAR(10)//Iniciamos algumas variaveisSELECT
@DaysBetween = 0SELECT @BusinessDays = 0SELECT @Cnt=0//Calculamos quantos dias
normais existem na classe de datasSELECT @DaysBetween =
DATEDIFF(DAY,@StartDate,@EndDate) + 1/*Ordenamos o formato das datas para que não
importando como se proporcionem se comparem igual*/SELECT @ini = (SELECT
CAST((CAST(datepart(dd,@StartDate)ASVARCHAR(2))+'/'+
CAST(datepart(mm,@StartDate)ASVARCHAR(2))+'/'+CAST(datepart(yy,@StartDate)AS
VARCHAR(4))) asvarchar(10)))SELECT @fin = (SELECT
CAST((CAST(datepart(dd,@EndDate)ASVARCHAR(2))+'/'+ CAST(datepart(mm,@EndDate)AS
VARCHAR(2))+'/'+CAST(datepart(yy,@EndDate)AS VARCHAR(4)))as varchar(10)))//Comparam-
se as duas datasIF @ini <>@finBEGIN/*Se a diferenca de datas for igual a dois, eh porque so foi
transcorrido um dia, portanto somente se valida de que naovai marcar dias de mais*/IF
@DaysBetween = 2BEGINSELECT @BusinessDays = 1ENDELSEBEGINWHILE @Cnt <
@DaysBetweenBEGIN/*Iguala-se a data que vamos calcular para saber se eh sabado ou
domingo na variavel @EvalDate somando os diasque marque o contador, o qual nao deve ser
maior que o numero total de dias que existem na classe de datas*/SELECT @EvalDate =
@StartDate + @Cnt
Page 20 of 90Tutorial de SQL - Manual
completo11/07/2008http://www.criarweb.com/manuais/32/print.php

/*Utilizando a funcao datepart com o parametro dw que calcula que dia da semana corresponde
uma data determinada,determinados que nao seja sabado (7) ou domingo (1)*/IF
((datepart(dw,@EvalDate) <> 1) and(datepart(dw,@EvalDate) <> 7) )BEGIN/*Se nao eh sabado
ou domingo, entao se soma um ao total de dias que queremos desdobrar*/SELECT
@BusinessDays = @BusinessDays + 1END//Soma-se um dia a mais ao contadorSELECT @Cnt
= @Cnt + 1ENDENDENDELSEBEGIN//Se fosse certo que as datas eram iguales se desdobraria
em zeroSELECT @BusinessDays = 0END//Ao finalizar o ciclo, a funcao regressa o numero total
de diasreturn (@BusinessDays)ENDInforme de
Rosendo Lopez Robles
Mail:
soulus@gmail.com

SQL com Oracle

Introdução:
Antes de começar, gostaria de dizer que este curso está baseado em Oracle, ou seja,
osexemplos expostos e o material foram atualizados sobre Oracle. Por outro lado dizer que
achointeressante saber algo de SQL antes de começar com MYSQL, já que, embora existam
algumasmudanças insignificantes, sabendo manejar SQL você saberá manejar MYSQL.
Algumas características:

SQL: Structured query language.


Permite a comunicação com o sistema administrador de banco de dados.

Em seu uso pode-se especificar o que quer o usuário.

Permite fazer consulta de dados.
Tipos de dados:

CHAR:


Têm uma longitude fixa.

Armazena de 1 a 255.

Se introduzimos uma cadeia de menos longitude que a definida se preencherá combrancos à
direita até ficar completa.

Se introduzirmos uma cadeia de maior longitude que a fixada nos dará um erro.
Page 21 of 90Tutorial de SQL - Manual
completo11/07/2008http://www.criarweb.com/manuais/32/print.php

VARCHAR:


Armazena cadeias de longitude variável.

A longitude máxima é de 2000 caracteres.

Se introduzimos uma cadeia de menor longitude que a que está definida, se armazenacom essa
longitude e não se preencherá com brancos nem com nenhum outro caractere àdireita até
completar a longitude definida.

Se introduzimos uma cadeia de maior longitude que a fixada, nos dará um erro.
NUMBER:


Armazenam-se tanto inteiros como decimais.

Number (precisão, escala)

Exemplo:
X=number (7,2)X=155'862 à Erro já que só pode tomar 2 decimaisX= 155'86 à Bem
LONG:


Não armazena números de tamanho grande, e sim cadeias de caracteres de até 2 GB
DATE:


Armazena a data. Armazena da seguinte forma:
Seculo/Ano/Mes/Dia/Hora/Minutos/Segundos
RAW:


Armazena cadeias de Bytes (gráficos, áudio…)
LONGRAW:


Como o anterior, mas com maior capacidade.
ROWID:


Posição interna de cada uma das colunas das tabelas.

Sentenças de consultas de dados
Select:Select [ALL | Distinct] [expresao_coluna1, expresao_coluna2, …., | *]From [nome1,
nome_tabela1, …, nome_tabelan]{[Where condicao][Order By expresao_coluna [Desc | Asc]…]};
Vamos explicar como ler a consulta anterior e assim seguir a pauta para todas as
demais.Quando compomos [] significa que a que vai dentro deve existir, e sim, além disso,
colocamos |
Nota:
A categoria máxima vai de 1 a 38.
Page 22 of 90Tutorial de SQL - Manual
completo11/07/2008http://www.criarweb.com/manuais/32/print.php

significa que deveremos escolher um valor dos que colocamos e não mais de um. Em troca
secolocarmos {} significa que o que vai dentro das chaves pode ir ou não, ou seja, é opcional e
secolocará segundo a consulta.

Alias = O novo nome que se dá a uma tabela. Coloca-se entre aspas

Order By = Ordena ascendentemente (Asc) (valor por default) ou descendentemente(Desc).

All = Recupera todas as filas da tabela embora estejam repetidas.

Distinct = Só recupera as filas que são distintas.

Desc Emple; = Dá um resumo da tabela e suas colunas. Neste caso da tabela Emple.

Not Null= Se aparecer em uma lista de uma coluna significa que a coluna não pode tervalores
nulos.

Null= Se estiver nulo.Vários exemplos para vê-lo mais claro:
SELECT JOGADOR_NO, SOBRENOME, POSICAO, TIMEFROM JOGADORESWHERE
TIME_NO = 'FLAMENGO'ORDER BY SOBRENOME;
Este exemplo mostra o número do jogador (jogador_no) o sobrenome (Sobrenome), a posiçãona
que joga (Posição), e o time (Time) ao que pertence.Selecionará todos os dados da tabela
jogadores onde (Where) o nome do time (Time_No) forigual que a palavra 'Flamengo' e se
ordenará (order by) sobrenome. Observe também que nãopõe nem 'Distinct' nem 'All'. Por
padrão, gerará a sentença com ALL.
SELECT *FROM JOGADORESWHERE POSICAO = 'ATACANTE'ORDER BY JOGADOR_NO;
Este exemplo mostra todos os campos da tabela jogadores onde (Where) a posição for igualque
'Atacante' e o ordena por número de jogador. Ao não colocar nada se supõe que
éascendentemente (Asc).
SELECT *FROM JOGADORESWHERE TIME_NAO = 'FLAMENGO' AND POSICAO =
'ATACANTE'ORDER BY SOBRENOME DESC, JOGADOR_NAO ASC;
Neste exemplo seleciona todos os campos da tabela jogadores onde (Where) o nome do timefor
igual a 'Flamengo' e a posição dos jogadores for igual a 'Atacante'. Por ultimo os ordena
por'Sobrenome' descendentemente e por número de jogador ascendentemente.
Informe de
Agustin Jareño
Mail:
agustin@levanteweb.com
URL:
http://www.levanteweb.com/

SQL com Oracle. Operadores

Operadores aritméticos:
+ = Soma- = Subtração
Nota:
No select o valor por default entre ALL e DISTINCT é ALL.
Nota:
Note que cada consulta de SQL que fazemos temos de termina-la com um ponto e vírgula";".

Page 23 of 90Tutorial de SQL - Manual


completo11/07/2008http://www.criarweb.com/manuais/32/print.php

* = Multiplicação/ = Divisião
Operadores de comparação e lógicos:
!> = Diferente>= = Maior ou igual que<= = Menor ou igual que = = Igual queLike = Utiliza para
unir cadeias de caracteres. Propriedades:% = representa qualquer cadeia de caracteres de 0 ou
mais caracteres._= representa um único caractere qualquer.Not = NegaçãoAnd = ea and bCerto
se são certas a e b.Or = oa or bCerto se a ou b são certas
Vejamos dois exemplos:
Obtemos os dados dos jogadores cujos sobrenomes comecem com a letra "S":
SELECT SOBRENOMESFROM JOGADORESWHERE SOBRENOMES LIKE 'S%';Obtemos
aqueles sobrenomes que tiverem uma "R" na segunda posição:SELECT SOBRENOMESFROM
JOGADORESWHERE SOBRENOMES LIKE '_R*';
Obtemos aqueles sobrenomes que começam por "A" e tem uma "o" em seu interior:
SELECT SOBRENOMESFROM JOGADORESWHERE SOBRENOMES LIKE 'A%O%';
Comprovação com conjuntos de valores:


In= permite saber se uma expressão pertence ou não a um conjunto de valores.

Between= permite saber se uma expressão está ou não entre esses valores:
Exemplo:

SELECT SOBRENOMESFROM JOGADORESWHERE JOGADOR_NUM IN (10, 20);


Seleciona os sobrenomes dos jogadores onde o número de jogador (Jogador_num) seja (In)
ou10 ou 20
SELECT SOBRENOMESFROM JOGADORESWHERE SALARIO NOT BETWEEN 15000000
AND 20000000;
Seleciona os sobrenomes dos jogadores onde o salário destes não esteja entre (Not
Between)15000000 e 20000000.
Informe de
Agustin Jareño
Mail:
agustin@levanteweb.com
URL:
http://www.levanteweb.com/

Page 24 of 90Tutorial de SQL - Manual


completo11/07/2008http://www.criarweb.com/manuais/32/print.php

Sub-consultas SQL

Sub-consultas:
Consulta que se faz sobre os dados que nos dá outra consulta. Seu formato é:
SELECT______FROM________WHERE CONDICAO OPERADOR (SELECT ______FROM
___________WHERE CONDICAO OPERADOR);
Exemplo:Obtemos os jogadores com a mesma posição que "Sanchez":
SELECT SOBRENOMEFORM EMPLEWHERE POSICAO = (SELECT OFICIOFROM
EMPLEWHERE SOBRENOME LIKE 'GIL');
Selecionamos em todos os campos da tabela Jogadores cuja sede está em Madrid ou
Barcelona:
SELECT *FROM JOGADORESWHERE EQUIPE_NOM IN (SELECT EQUIPE_NOMFROM
SEDEWHERE LOC IN ('MADRID', 'BARCELONA');FROM SEDEWHERE LOC IN ('MADRID',
'BARCELONA');Informe de
Agustin Jareño
Mail:
agustin@levanteweb.com
URL:
http://www.levanteweb.com/

Funções SQL

Funções de valores simples:

ABS(n)=
Devolve o valor absoluto de (n).
CEIL(n)=
Obtém o valor inteiro imediatamente superior ou igual a "n".
FLOOT(n) =
Devolve o valor inteiro imediatamente inferior ou igual a "n".
MOD (m, n)=
Devolve o resto resultante de dividir "m" entre "n".
NVL (valor, expressão)=
Substitui um valor nulo por outro valor.
POWER (m, exponente)=
Calcula a potência de um número.
ROUND (numero [, m])=
Arredonda números com o número de dígitos de precisão indicados.
SIGN (valor)=
Indica o signo do "valor".
SQRT(n)=
Devolve a raiz quadrada de "n".
TRUNC (numero, [m])=
Trunca números para que tenham uma certa quantidade de dígitos deprecisão.
VAIRANCE (valor)=
Devolve a média de um conjunto de valores.
Funções de grupos de valores:

AVG(n)=
Calcula o valor médio de "n" ignorando os valores nulos.
COUNT (* | Expressão)=
Conta o número de vezes que a expressão avalia algum dado com valornão nulo. A opção "*"
conta todas as filas selecionadas.

Page 25 of 90Tutorial de SQL - Manual


completo11/07/2008http://www.criarweb.com/manuais/32/print.php

MAX (expressão)=
Calcula o máximo.
MIN (expressão)=
Calcula o mínimo.
SUM (expressão)=
Obtém a soma dos valores da expressão.
GREATEST (valor1, valor2…)=
Obtém o maior valor da lista.
LEAST (valor1, valor2…)=
Obtém o menor valor da lista.
Funções que devolvem valores de caracteres:

CHR(n) =
Devolve o caractere cujo valor em binário é equivalente a "n".
CONCAT (cad1, cad2)=
Devolve "cad1" concatenada com "cad2".
LOWER (cad)=
Devolve a cadeia "cad" em minúsculas.
UPPER (cad)=
Devolve a cadeia "cad" em maiúsculas.
INITCAP (cad)=
Converte a cadeia "cad" a tipo título.
LPAD (cad1, n[,cad2])=
Adiciona caracteres à esquerda da cadeia até que tenha uma certalongitude.
RPAD (cad1, n[,cad2])=
Adiciona caracteres à direita até que tenha uma certa longitude.
LTRIM (cad [,set])=
Suprime um conjunto de caracteres à esquerda da cadeia.
RTRIM (cad [,set])=
Suprime um conjunto de caracteres à direita da cadeia.
REPLACE (cad, cadeia_busca [, cadeia_substitucao])=
Substitui um caractere ou caracteres de uma cadeiacom 0 ou mais caracteres.
SUBSTR (cad, m [,n])=
Obtém parte de uma cadeia.
TRANSLATE (cad1, cad2, cad3)=
Converte caracteres de uma cadeia em caracteres diferentes,segundo um plano de substituição
marcado pelo usuário.
Funções que devolvem valores numéricos:

ASCII(cad)=
Devolve o valor ASCII da primeira letra da cadeia "cad".
INSTR (cad1, cad2 [, comeco [,m]])=
Permite uma busca de um conjunto de caracteres em umacadeia, mas não suprime nenhum
caractere depois.
LENGTH (cad)=
Devolve o número de caracteres de cad.
Funções para o manejo de datas:

SYSDATE=
Devolve a data do sistema.
ADD_MONTHS (data, n)=
Devolve a data "data" incrementada em "n" meses.
LASTDAY (data)=
Devolve a data do último dia do mês que contém "data".
MONTHS_BETWEEN (data1, data2)=
Devolve a diferença em meses entre as datas "data1" e "data2".
NEXT_DAY (data, cad)=
Devolve a data do primeiro dia da semana indicado por "cad" depois dadata indicada por "data".
Funções de conversão:

TO_CHAR=
Transforma um tipo DATE ou NUMBER em uma cadeia de caracteres.
TO_DATE=
Transforma um tipo NUMBER ou CHAR em DATE.
TO_NUMBER=
Transforma uma cadeia de caracteres em NUMBER.
Informe de
Agustin Jareño
Mail:
agustin@levanteweb.com
URL:
http://www.levanteweb.com/

Agrupamento e combinação de elementos com SQL

Agrupamento de elementos. Group by e Having:


Para saber qual é o salário médio de cada departamento da tabela Jogadores seria:
SELECT TIME_NO, AVG (SALARIO) "SALARIO MEDIO"FROM JOGADORES
Page 26 of 90Tutorial de SQL - Manual
completo11/07/2008http://www.criarweb.com/manuais/32/print.php

GROUP BY DEPT_NO;
A sentença "Select" possibilita agrupar um ou mais conjuntos de filas. O agrupamento se
realizamediante a cláusula "GROUP BY" pelas comunas especificadas e na ordem
especificada.Formato:
SELECT…FROM…GROUP BY COLUNA1, COLUNA2, COLUNAN…HAVING
CONDICAOGROUP BY …
Os dados selecionados na sentença "Select" que leva o "Group By" devem ser:

Uma constante.

Uma função de grupo (SUM, COUNT, AVG…)

Uma coluna expressa no Group By.A cláusula Group By serve para calcular propriedades de um
ou mais conjuntos de filas. Se seseleciona mais de um conjunto de filas, Group By controla que
as filas da tabela original sejamagrupadas em um temporário.A cláusula Having se emprega para
controlar qual dos conjuntos de filas se visualiza. Avalia-sesobre a tabela que devolve o Group
By. Não pode existir sem Group By.Having é parecido ao Where, porém trabalha com grupos de
filas; pergunta por umacaracterística de grupo, ou seja, pergunta pelos resultados das funções
de grupo, o qual Wherenão pode fazer.
Combinação externa (outer joins):
Permite-nos selecionar algumas filas de uma tabela embora estas não tenham
correspondênciacom as filas da outra tabela com a que se combina. Formato:
SELECT TABELA1.COLUNA1, TABELA1.COLUNA2, TABELA2.COLUNA1,
TABELA2.COLUNA2FROM TABELA1, TABELA2WHERE TABELA1.COLUNA1 =
TABELA2.COLUNA1 (+);
Isto seleciona todas as filas da tabela "tabela1" embora não tenham correspondência com asfilas
da tabela "tabela2", se utiliza o símbolo +.O resto de colunas da tabela "tabela2" se preenche
com NULL.
Union, intersec e minus:
Permite combinar os resultados de vários "Select" para obter um único resultado. Formato:
SELECT… FROM… WHERE…OPERADOR_DE_CONJUNTOSELECT…FROM…WHERE…
UNION=
Combina os resultados de duas consultas. As filas duplicadas que aparecem se reduzema uma
fila única.
UNION ALL=
Como a anterior, porém aparecerão nomes duplicados.
INTERSEC=
Devolve as filas que são iguais em ambas consultas. Todas as filas duplicadas serãoeliminadas.
MINUS=
Devolve aquelas filas que estão na primeira "Select" e não estão na segunda "Select".As filas
duplicadas do primeiro conjunto se reduzirão a uma fila única antes que comece acomparação
com o outro conjunto.
Page 27 of 90Tutorial de SQL - Manual
completo11/07/2008http://www.criarweb.com/manuais/32/print.php

Regras para a utilização de operadores de conjunto:



As colunas das duas consultas se relacionam em ordem, da esquerda à direita.

Os nomes de coluna da primeira sentença "Select" não tem porque ser os mesmos que osnomes
da segunda.

Os "Select" necessitam ter o mesmo número de colunas.

Os tipos de dados devem coincidir, embora a longitude não tem que ser a mesma.>
Informe de
Agustin Jareño
Mail:
agustin@levanteweb.com
URL:
http://www.levanteweb.com/

Manipulação de dados com SQL

Insert, Update e Delete:


Insert:Adicionam-se filas de dados em uma tabela:
INSERT INTO NOMBTABELA [(COL [,COL]…)]VALUES (VALOR [,VALOR]…);
Nometabela= É a tabela na que se vão inserir as filas.Propriedades:

Se as colunas não se especificam na cláusula Insert se consideram, por padrão, todas ascolunas
da tabela.

As colunas às quais damos valores se identificam pelo seu nome.

A associação coluna valor é posicional.

Os valores que se dão às colunas devem coincidir com o tipo de dado definido na coluna.

Os valores constantes de tipo caractere tem de ir fechados entre aspas simples (' ') (os detipo
data também).Com Select:Adicionam-se tantas filas como devolva a consulta:
INSERT INTO NOMBTABELA [(COL [,COL]…)]SELECT {COLUNA [, COLUNA]… | *}FROM
NOMETABELA2 [CLAUSULAS DE SELECT];
Update:Atualiza os valores das colunas para uma ou várias filas de uma tabela:
UPDATE NOMETABELASET COLUNA1= VALOR1, …, COLUNAN= VALORNWHERE
CONDICAO;
Set= Indica as colunas que vão se atualizar e seus valores.Com Select:Quando a subconsulta
(orden select) forma parte de SET, deve selecionar o mesmo número de
Page 28 of 90Tutorial de SQL - Manual
completo11/07/2008http://www.criarweb.com/manuais/32/print.php

colunas, (com tipos de dados adequados) que os que existem entre parênteses ao lado de SET.
UPDATE NOMETABELASET COLUNA= VALOR1, COLUNA2= VALOR2, …WHERE
COLUNA3= (SELECT…)
OU
UPDATE NOMETABELASET (COLUNA1, COLUNA2, …)= (SELECT …)WHERE CONDICAO;
Delete:Elimina uma ou várias filas de uma tabela:
DELETE [FROM] NOMETABELAWHERE CONDICAO;Informe de
Agustin Jareño
Mail:
agustin@levanteweb.com
URL:
http://www.levanteweb.com/

Chaves primárias com SQL com Oracle

Rollback:
Permite ir até o último COMMIT feito ou em seu padrão até o começo das ordens com o
queestas não se executam.
Commit:
Quando executamos ordens, estas não são criadas na tabela até que coloquemos esta
ordem,portanto as mudanças realizadas se perderão se ao sair do programa não realizarmos
estaação. Pode se programar para que seja feito automaticamente.Algumas ordens que levam
COMMIT implícito:

QUIT

EXIT

CONNECT

DISCONNECT

CREATE TABLE

CREATE VIEW

GRANT

REVOQUE

DROP TABLE

DROP VIEW

ALTER

AUDIT

NO AUDIT
Criação de uma tabela:
Seu primeiro caractere deve ser alfabético e o resto pode ser letras, números e o
caracteresublinhado.
CREATE TABLE NOMETABELA(COLUNA1 TIPO_DADO {NOT NULL},
Page 29 of 90Tutorial de SQL - Manual
completo11/07/2008http://www.criarweb.com/manuais/32/print.php

COLUNA2 TIPO_DADO {NOT NULL},…) TABLESPACE ESPACO_DE_TABELA;


Características:

As definições individuais de colunas se separam mediante vírgulas.

Não se coloca vírgula depois da última definição de coluna.

As maiúsculas e minúsculas são indiferentes.Os usuários podem consultar as tabelas criadas
por meio da vista USER_TABLES.
Integridade de dados:
A integridade faz referência ao fato de que os dados do banco de dados têm que se ajustar
àsrestrições antes de se armazenar nele. Uma restrição de integridade será:Uma regra que
restringe classe de valores para uma ou mais colunas na tabela.
Restrições em create table:
Usamos a cláusula CONSTRAINT, que pode restringir uma só coluna ou um grupo de colunas
deuma mesma tabela.Existem dois modos de especificar restrições:

Como parte da definição de colunas.

Afinal, uma vez especificadas todas as colunas.Formato:
CREATE TABLE NOME_TABELA(COLUNA1 TIPO_DE_DADO{CONSTRAINT
NOME_RESTRICAO}{NOT NULL}{UNIQUE}{PRIMARY KEY}{DEFAULT VALOR}
{REFERENCES NOMETABELA [(COLUNA, [,COLUNA]){ON DELETE CASCADE}}{CHECK
CONDICAO},COLUNA2...){TABLESPACE ESPACO_DE_TABELA} ;CREATE TABLE
NOME_TABELA(COLUNA1 TIPO_DADO ,COLUNA2 TIPO_DADO,COLUNA3 TIPO_DADO,...
{CONSTRAINT NOMERESTRICAO}[{UNIQUE} | {PRIMARY KEY} (COLUNA [, COLUNA])],
{CONSTRAINT NOMERESTRICAO}{FOREIGN KEY (COLUNA [, COLUNA])REFERENCES
NOMETABELA {(COLUNA [,COLUNA]){ON DELETE CASCADE}},{CONSTRINT
NOMERESTRICAO}{CHECK (CONDICAO)}…)[TABLESPACE ESPACO_DE_TABELA];Informe
de
Agustin Jareño
Mail:
agustin@levanteweb.com
URL:
http://www.levanteweb.com/

Page 30 of 90Tutorial de SQL - Manual


completo11/07/2008http://www.criarweb.com/manuais/32/print.php

Definição de chaves para tabelas e restrições

Chave primária: Primary key


É uma coluna ou um conjunto de colunas que identificam univocamente a cada fila. Deve
serúnica, não nula e obrigatória. Como máximo, podemos definir uma chave primária por
tabela.Esta chave pode ser referenciada por uma coluna ou colunas. Quando se cria uma
chaveprimária, automaticamente se cria um índice que facilita o acesso à tabela.Formato de
restrição de coluna:
CREATE TABLE NOME_TABELA(COL1 TIPO_DADO [CONSTRAINT NOME_RESTRICAO]
PRIMARY KEYCOL2 TIPO_DADO…)[TABLESPACE ESPACO_DE_TABELA];
Formato de restrição de tabela:
CREATE TABLE NOME_TABELA(COL1 TIPO_DADO,COL2 TIPO_DADO,…[CONSTRAINT
NOMERESTRICAO] PRIMARY KEY (COLUNA [,COLUNA]),…)[TABLESPACE
ESPACO_DE_TABELA];
Chaves alheias: Foreign Key:
Está formada por uma ou várias colunas que estão associadas a uma chave primária de outraou
da mesma tabela. Pode-se definir tantas chaves alheias quantas se necessite, e podem estarou
não na mesma tabela que a chave primária. O valor da coluna ou colunas que são chavesalheias
deve ser: NULL ou igual a um valor da chave referenciada (regra de
integridadereferencial).Formato de restrição de coluna:
CREATE TABLE NOME_TABELA(COLUNA1 TIPO_DADO[CONSTRAINT
NOMERESTRICAO]REFERENCES NOMETABELA [(COLUNA)] [ON DELETE CASCADE]…)
[TABLESPACE ESPACO_DE_TABELA];
Formato de restrição de tabela:
CREATE TABLE NOME_TABELA(COLUNA1 TIPO_DADO,COLUNA2 TIPO_DADO,…
[CONTRAINT NOMERESTRICAO]FOREIGN KEY (COLUNA [,COLUNA])REFERENCES
NOMETABELA [(COLUNA [,COLUNA])][ON DELETE CASCADE],)[TABLESPACE
ESPACO_DE_TABELA];
Notas:

Na cláusula REFERENCES indicamos a tabela a qual remite a chave alheia.

Há que criar primeiro uma tabela e depois aquela que lhe faz referência.

Há que apagar primeiro a tabela que faz referência a outra tabela e depois a tabela quenão faz
referência.

Eliminado em cascata (ON DELETE CASCADE): Se eliminarmos uma fila de uma tabela
Page 31 of 90Tutorial de SQL - Manual
completo11/07/2008http://www.criarweb.com/manuais/32/print.php

mãe, todas as filas da tabela detalhe cuja chave alheia seja referenciada se
eliminarãoautomaticamente. A restrição se declara na tabela detalhe. A mensagem "n
filaseliminadas" só indica as filas eliminadas da tabela mãe.NOT NULL: Significa que a coluna
não pode ter valores nulos.DEFAULT: Proporcionamos a uma coluna um valor padrão quando o
valor da coluna não seespecifica na cláusula INSERT. Na especificação DEFAULT é possível
incluir várias expressões:constantes, funções SQL e variáveis UID e SYSDATE.Verificação de
restrições: CHECK: Atua como uma cláusula where. Pode fazer referência a umaou mais
colunas, porém não a valores de outras filas. Em uma cláusula CHECK não se podemincluir sub-
consultas nem as pseudo-consultas SYSDATE, UID e USER.UNIQUE: Evita valores repetidos
na mesma coluna. Pode conter uma ou várias colunas. Ésimilar à restrição PRIMARY KEY, salvo
que são possíveis várias colunas UNIQUE definidas emuma tabela. Admite valores NULL. Assim
como em PRIMARY KEY, quando se define umarestrição UNIQUE se cria um índice
automaticamente.
Vistas do dicionário de dados para as restrições:
Contém informação geral as seguintes:USER_CONSTRAINTS: Definições de restrições de
tabelas propriedade do usuário.ALL_CONSTRAINTS: Definições de restrições sobre tabelas as
quais pode acessar o usuário.DBA_CONSTRAINTS: Todas as definições de restrições sobre
todas as tabelas.
Criação de uma tabela com dados recuperados em uma consulta:
CREATE TABLE: permite criar uma tabela a partir da consulta de outra tabela já existente.
Anova tabela conterá os dados obtidos na consulta. Realiza-se esta ação com a cláusula
AScolocada ao final da ordem CREATE TABLE.
CREATE TABLE NOMETABELA(COLUNA [,COLUNA])[TABLESPACE
ESPACO_DE_TABELA]AS CONSULTA;
Não é necessário especificar tipos nem tamanho das consultas, já que vêm determinadas
pelostipos e os tamanhos das recuperadas na consulta.A consulta pode ter uma sub-consulta,
uma combinação de tabelas ou qualquer sentença selectválida.As restrições COM NOME não se
criam em uma tabela desde a outra, só se criam aquelasrestrições que carecem de nome.
Informe de
Agustin Jareño
Mail:
agustin@levanteweb.com
URL:
http://www.levanteweb.com/

Supressão e modificação de tabelas com SQL

Supressão de tabelas:
DROP TABLE: suprime uma tabela do banco de dados. Cada usuário pode eliminar suas
própriastabelas, porém só o administrador ou algum usuário com o privilégio "DROP ANY
TABLE" podeeliminar as tabelas de outro usuário. Ao suprimir uma tabela também se suprimem
os índices eos privilégios associados a ela. As vistas e os sinônimos criados a partir desta tabela
deixam de
Nota:
A restrição NOT NULL é similar a CHECK (NOME_COLUNA IS NOT NULL)

Page 32 of 90Tutorial de SQL - Manual


completo11/07/2008http://www.criarweb.com/manuais/32/print.php

funcionar, mas continuam existindo no banco de dados, portanto deveríamos elimina-


los.Exemplo:
DROP TABLE [USUARIO].NOMETABELA [CASCADE CONSTRAINTS];
TRUNCATE: permite suprimir todas as filas de uma tabela e liberar o espaço ocupado
paraoutros usos sem que reapareça a definição da tabela do banco de dados. Uma
ordemTRUNCATE não se pode anular, assim como também não ativa os disparadores DELETE.
TRUNCATE TABLE [USUARIO.]NOMETABELA [{DROP | REUSE} STORAGE];
Modificação de tabelas:
Modificam-se as tabelas de duas formas: Mudando a definição de uma coluna (MODIFY)
ouacrescentando uma coluna a uma tabela existente (ADD):Formato:
ALTER TABLE NOMETABELA{[ADD (COLUNA [,COLUNA]…)][MODIFY (COLUNA [,COLUNA]
…)][ADD CONSTRAINT RESTRICAO][DROP CONSTRAINT RESTRICAO]};
ADD= Adiciona uma coluna ou mais no final de uma tabela.MODIFY= Modifica uma ou mais
colunas existentes na tabela.ADD CONSTRAINT= Adiciona uma restrição à definição da
tabela.DROP CONSTRAINT= Elimina uma restrição da tabela.Na hora de adicionar uma coluna
a uma tabela há que ter em conta:

Se a coluna não estiver definida como NOT NULL pode-se adicionar em qualquermomento.

Se a coluna estiver definida como NOT NULL pode-se seguir estes passos:1. Adiciona-se uma
coluna sem especificar NOT NULL.2. Dá-se valor à coluna para cada uma das filas.3. Modifica-
se a coluna NOT NULL.Ao modificar uma coluna de uma tabela, há que ter em conta:

Pode-se aumentar a longitude de uma coluna em qualquer momento.

É possível aumentar ou diminuir o número de posições decimais em uma coluna de
tipoNUMBER.

Se a coluna for NULL em todas as filas da tabela, pode-se diminuir a longitude e modificaro tipo
de dado.

A opção MODIFY… NOT NULL só será possível quando a tabela não contiver nenhuma filacom
valor nulo na coluna que se modifica.
Adição de restrições:
Com a ordem ALTER TABLE se acrescentam restrições a uma tabela.Formato:
ALTER TABLE NOMETABELAADD CONSTRAINT NOMECONSTRAINT…
Eliminação de restrições:
Page 33 of 90Tutorial de SQL - Manual
completo11/07/2008http://www.criarweb.com/manuais/32/print.php

A ordem ALTER TABLE com a cláusula DROP CONSTRAINT; com a que se eliminam as
restriçõescom nome e as atribuídas pelo sistema. Formato:
ALTER TABLE NOMETABELADROP CONSTRAINT
NOME_CONSTRAINT,NOME_RESTRICAO:Informe de
Agustin Jareño
Mail:
agustin@levanteweb.com
URL:
http://www.levanteweb.com/

Gerenciamento de vistas em SQL

Criação e uso de vistas


Não contém informação por si mesmas, e sim, estão baseadas nas que contém outras tabelas
ereflete os dados destas.Se se suprime uma tabela a vista associada se invalida. Formato:
CREATE [OR REPLACE] VIEW NOMEVISTA[(COLUNA [,COLUNA])]AS CONSULTA;
AS CONSULTA= Determina as colunas e as tabelas que aparecerão na vista.[OR REPLACE]=
Cria de novo a vista se já existia.Para consultar a vista criada, USER_VIEWS:
SELECT VIEW_NAME FROM…
Eliminação de vistas
Faz-se com DROP VIEW. Formato:
DROP VIEW NOMEVISTA;
Operações sobre vistas
Pode-se realizar as mesmas operações que se fazem sobre as tabelas. Restrições:

Atualização. Se uma vista está baseada em uma só tabela, pode-se modificar as filas davista.

A modificação da vista muda a tabela sobre a qual está definida.

Eliminação de filas através de uma vista= Para eliminar filas de uma tabela através deuma vista,
esta se deve criar:

Com filas de uma só tabela.

Sem utilizar a cláusula GROUP BY nem DISTINCT.

Sem usar funções de grupo ou referências a pseudo-colunas.

Atualização de filas através de uma vista: Para atualizar filas em uma tabela através deuma
vista, esta tem que estar definida segundo as restrições anteriores e, ademais,nenhuma das
colunas que vai se atualizar terá definido como uma expressão.

Inserção de filas através de uma vista: Para inserir filas em uma tabela através de umavista, há
que ter em conta todas as restrições anteriores e, ademais, todas as colunasobrigatórias da
tabela associada devem estar presentes na vista.

Manejo de expressões e de funções em vistas: Pode-se criar vistas usando funções,expressões
em colunas e consultas avançadas, porém unicamente se emparelham
Nota:
ao eliminar as tabelas, as vistas dessas tabelas não se eliminam e ficam inutilizadas.

Page 34 of 90Tutorial de SQL - Manual


completo11/07/2008http://www.criarweb.com/manuais/32/print.php

consultar estas vistas. Também podemos modificar filas sempre e quando a coluna quevai se
modificar não for a coluna expressada em forma de cálculo ou com funções.
Mudanças de nome
RENAME muda o nome de uma tabela, vista ou sinônimo. O novo nome não pode ser
umapalavra reservada no nome de um objeto que o usuário tiver criado. As restrições
deintegridade, os índices e as permissões dadas ao objeto se transferem automaticamente
aonovo objeto.
REANME NOME_ANTERIOR TO NOME_NOVO;
Com esta ordem não podemos re-nomear colunas de uma tabela, estas se re-nomeiammediante
CREATE TABLE AS…
Informe de
Agustin Jareño
Mail:
agustin@levanteweb.com
URL:
http://www.levanteweb.com/

Usuários em Oracle
É um nome definido no banco de dados que se pode conecta-lo e acessar a
determinadosobjetos segundo certas condições que o administrador estabelece.Os objetos do
dicionário de dados aos que um usuário pode acessar, encontram-se na vistaDICTIONARY, que
é propriedade do usuário SYS.
DESC DICTIONARY;
Com a ordem:
SELECT TABLENAME FROM DICTIONARY;
Visualizam-se os objetos do dicionário de dados aos que se pode acessar.
Criação de usuários:

CREATE USER NOME_USUARIOIDENTIFIED BY SENHA_ACESSO[DEFAULT TABLESPACE


ESPACO_TABELA][TEMPORARY TABLESPACE ESPACO_TABELA][COTA {INTEIRO {K | M} |
UNLIMITED } ON ESPACO_TABELA][PROFILE PERFIL];
DEFAULT TABLESPACE= Atribui a um usuário o tablespace padrão para armazenar os
objetosque crie. Se não se atribui nenhum, o tablespace padrão é SYSTEM.TEMPORARY
TABLESPACE= Especifica o nome do tablespace para trabalhar temporais. Se nãose especifica
nenhum, o tablespace padrão é SYSTEM.QUOTA= Atribui um espaço em megabites ou kilobites
no tablespace atribuído. Se não seespecifica esta cláusula, o usuário não tem cota atribuída e
não poderá criar objetos notablespace. Para ter espaço e acesso ilimitado a um tablespace é:
GRANT UNLIMITED TABLESPACE NOME_TABLESPACE;
PROFILE= Atribui um perfil a um usuário.
Modificação de usuários:

Nota:
Não é possível inserir filas se as colunas da vista contém cálculos ou funções.

Page 35 of 90Tutorial de SQL - Manual


completo11/07/2008http://www.criarweb.com/manuais/32/print.php

ALTER USER NOME_USUARIOIDENTIFIED BY SENHA _ACESSO[DEFAULT TABLESPACE


ESPACO_TABELA][TEMPORARY TABLESPACE ESPACO_TABELA][COTA {INTEIRO {K | M } |
UNLIMITED } ON ESPACO_TABELA[PROFILE PERFIL];
Eliminação de usuarios:

DROP USER USUARIO [CASCADE];


CASCADE= Suprime todos os objetos do usuário antes de elimina-lo.
Informe de
Agustin Jareño
Mail:
agustin@levanteweb.com
URL:
http://www.levanteweb.com/

Gerenciamento em Oracle com SQL

Privilégios
é a capacidade de um usuário dentro do banco de dados a realizar determinadas operações
ouacessar a determinados objetos de outros usuários.
Privilégios sobre os objetos
Permite-nos acessar e realizar mudanças nos dados de outros usuários. Exemplo: O
privilégiode consultar a tabela de outro usuário é um privilégio sobre objetos.
GRANT {PRIV_OBJETO [, PRIV_OBJETO]… | ALL [PRIVILEGES]}[(COL [,COL]…)]ON
[USUARIO] OBJETOTO {USUARIO | ROL | PUBLIC} [,{USUARIO | ROL | PUBLIC}…][WITH
GRANT OPTION];
ON= Especifica o objeto sobre o qual se dão os privilégios.TO= Identifica aos usuários ou rols
aos quais se concedem os privilégios.ALL= Concede todos os privilégios sobre o objeto
especificado.WITCH GRANT OPTION= Permite que o receptor do privilégio ou rol se atribua a
outros usuáriosou rols.PUBLIC= Atribui os privilégios a todos os usuários atuais e futuros: O
propósito principal dogrupo PUBLIC é garantir o acesso a determinados objetos a todos os
usuários do banco dedados.
Privilégios de sistema
Dão direito a executar um tipo de comando SQL ou a realçar alguma ação sobre objetos de
umtipo especificado. Por exemplo, o privilégio para criar TABLESPACES é um privilégio de
sistema.Formato:
GRANT {PRIVILEGIO | ROL} [, {PRIVILEGIO | ROL}, …]TO {USUARIO | ROL | PUBLIC} [,
{USUARIO | ROL | PUBLIC}][WITH ADMIN OPTION];
WITH ADMIN OPTION= Permite que o receptor do privilégio ou rol possa conceder
essesmesmos privilégios a outros usuários ou rols.
Retirada de privilégios de objetos aos usuários

REVOKE {PRIV_OBJETO [,PRIV_OBJETO]… | ALL [PRIVILEGES]}ON [USUARIO.]OBJETO


Page 36 of 90Tutorial de SQL - Manual
completo11/07/2008http://www.criarweb.com/manuais/32/print.php

FROM {USUARIO | ROL | PUBLIC} [, {USUARIO | ROL | PUBLIC}]…;


Retirada de privilégios de sistema ou rols aos usuários

REVOKE {PRIV_SISTEMA | ROL} [,{PRIV_SISTEMA | ROL}]…FROM {USUARIO | ROL |


PUBLIC} [,{USUARIO | ROL | PUBLIC}]…;
Roles
Conjunto de privilégios agrupados. Formato:
CREATE ROLE NOMEROL [IDENTIFIED BY SENHA];
Supressão de privilégios nos roles

REVOKE NOMEPRIVILEGIO ON NOMETABELA FROM NOMEROL;REVOKE


NOMEPRIVILEGIO FROM NOMEROL;
Supressão de um rol

DROP ROLE NOMEROL;


Estabelecer um rol padrão

ALTER USER NOMEUSUARIODEFAULT {[ROLE NOME_ROL] | [NONE]};


NONE= Faz com que o usuário não tenha rol padrão.
Perfis:
Conjunto de limites aos recursos do banco de dados:
CREATE PROFILE NOMEPERFIL LIMIT{NOME DOS LIMITES}{INTEIRO [K | M] | UNLIMITED |
DEFAULT };
UNLIMITED= Não há limites sobre um recurso em particular.DEFAULT= Pega o limite do perfil
default.
Eliminação de um perfil:

DROP FILE NOMEPERFIL [CASCADE];


Gerenciamento de tablespaces
Um tablespace é uma unidade lógica de armazenamento de dados representada fisicamente
porum ou mais arquivos de dados. Recomenda-se não misturar dados de diferentes aplicações
emum mesmo tablespace.
Para criar um tablespace

CREATE TABLESPACE NOMETABLESPACEDATAFILE 'NOMEARQUIVO' [SIZE INTEIRO [K |


M] [REUSE][DEFAULT STORAGE(INITIAL TAMANHOMINEXTENTS TAMANHOMAXEXTENTS
TAMANHOPCTINCREASE VALOR)]
Nota:
Um rol pode decidir o acesso de um usuário a um objeto, mas não pode permitir a criação
deobjetos.
Page 37 of 90Tutorial de SQL - Manual
completo11/07/2008http://www.criarweb.com/manuais/32/print.php

[ONLINE | OFFLINE];
REUSE= Reutiliza o arquivo se já existe ou o cria se não existe.DEFAULT STORAGE= Define o
armazenamento por omissão para todos os objetos que se criamneste espaço da tabela.
Observe a quantidade de espaço se não se especifica na sentençaCREATE TABLE.
Modificação de tablespaces

ALTER TABLESPACE NOMETABLESPACE{[ADD DATAFILE 'NOMEARQUIVO' [SIZE INTEIRO


[K | M] [REUSE][AUTOEXTEND ON… | OFF]][REANME DATAFILE 'ARQUIVO' [, 'ARQUIVO']…
TO 'ARQUIVO' [, 'ARQUIVO']][DEFAULT STORAGE CLAUSULAS_ARMAZENAMENTO]
[ONLINE | OFFLINE]};
ADD_DATAFILE= Adiciona ao tablespace um ou vários arquivos.AUTOEXTEND= Ativa ou
desativa o crescimento automático dos arquivos de dados dotablespace. Quando um tablespace
se enche podemos usar esta opção para que o tamanho doarquivo ou arquivos de dados
associados cresça automaticamente.Autoextend off: desativa o crescimento
automático.RENAME_DATAFILE= Muda o nome de um arquivoe existente do tablespace. Esta
mudança temque ser feita através do sistema operacional e, depois, executar a ordem SQL.
Eliminação de tablespaces

DROP TABLESPACE NOMETABLESPACE[INCLUDING CONTENTS];


INCLUDING CONTENTS= Permite eliminar um tablespace que tenha dados. Sem esta opção
sóse pode suprimir um tablespace vazio.Recomenda-se colocar o talespace offline antes de
elimina-lo para certificarmos de que nãohaja sentenças SQL que estejam acessando dados do
tablespace, em cujo caso não seriapossível elimina-lo.Quando se elimina um tablespace os
arquivos associados não se apagam do sistemaoperacional, portanto teremos que elimina-los de
forma manual.
Informe de
Agustin Jareño
Mail:
agustin@levanteweb.com
URL:
http://www.levanteweb.com/

Otimizar consultas SQL


A linguagem SQL é não procedimental, ou seja, nas sentenças se indica o que
queremosconseguir e não como tem que fazer o intérprete para consegui-lo. Isto é pura teoria,
pois naprática todos os gerenciadores de SQL têm que especificar seus próprios truques para
otimizaro rendimento.Portanto, muitas vezes não basta com especificar uma sentença SQL
correta, e sim que alémdisso, há que indicar como tem que fazer se quisermos que o tempo de
resposta seja o mínimo.Nesta seção, veremos como melhorar o tempo de resposta de nosso
intérprete ante umasdeterminadas situações:
Design de tabelas


Normalize as tabelas, pelo menos até a terceira forma normal, para garantir que não
hajaduplicidade de dados e aproveitar o máximo de armazenamento nas tabelas. Se tiver que
Page 38 of 90Tutorial de SQL - Manual
completo11/07/2008http://www.criarweb.com/manuais/32/print.php

desnormalizar alguma tabela pense na ocupação e no rendimento antes de proceder.



Os primeiros campos de cada tabela devem ser aqueles campos requeridos e dentro
dosrequeridos primeiro se definem os de longitude fixa e depois os de longitude variável.

Ajuste ao máximo o tamanho dos campos para não desperdiçar espaço.

É normal deixar um campo de texto para observações nas tabelas. Se este campo forutilizado
com pouca freqüência ou se for definido com grande tamanho, por via dasdúvidas, é melhor criar
uma nova tabela que contenha a chave primária da primeira e ocampo para observações.
Gerenciamento e escolha dos índices
Os índices são campos escolhidos arbitrariamente pelo construtor do banco de dados
quepermitem a busca a partir de tal campo a uma velocidade notavelmente superior.
Entretanto,esta vantagem se vê contra-arrestada pelo fato de ocupar muito mais memória (o
dobro maisou menos) e de requerer para sua inserção e atualização um tempo de processo
superior.Evidentemente, não podemos indexar todos os campos de uma tabela extensa já que
dobramoso tamanho do banco de dados. Igualmente, tampouco serve muito indexar todos os
campos emuma tabela pequena já que as seleções podem se efetuar rapidamente de qualquer
forma.Um caso em que os índices podem ser muito úteis é quando realizamos petições
simultâneassobre várias tabelas. Neste caso, o processo de seleção pode se acelerar
sensivelmente seindexamos os campos que servem de nexo entre as duas tabelas.Os índices
podem ser contraproducentes se os introduzimos sobre campos triviais a partir dosquais não se
realiza nenhum tipo de petição já que, além do problema de memória jámencionado, estamos
lentificando outras tarefas do banco de dados como são a edição,inserção e eliminação. É por
isso que vale a pena pensar duas vezes antes de indexar umcampo que não serve de critério
para buscas ou que é usado com muita freqüência por razõesde manutenção.
Campos a Selecionar


Na medida do possível há que evitar que as sentenças SQL estejam embebidas dentro docódigo
da aplicação. É muito mais eficaz usar vistas ou procedimentos armazenados porque o
gerenciador os salva compilados. Se se trata de uma sentença embebida ogerenciador deve
compila-la antes de executa-la.

Selecionar exclusivamente aqueles que se necessitem

Não utilizar nunca SELECT * porque o gerenciador deve ler primeiro a estrutura da tabelaantes
de executar a sentença

Se utilizar várias tabelas na consulta, especifique sempre a que tabela pertence cadacampo, isso
economizará tempo ao gerenciador de localizar a que tabela pertence ocampo. Ao invés de
SELECT Nome, Fatura FROM Clientes, Faturamento WHERE IdCliente= IdClienteFaturado, use:
SELECT Clientes.Nome, Faturamento.Fatura WHEREClientes.IdCliente =
Faturamento.IdClienteFaturado.
Campos de Filtro


Procuraremos escolher na cláusula WHERE aqueles campos que fazem parte da chave
doarquivo pelo qual interrogamos. Ademais se especificarão na mesma ordem na qualestiverem
definidas na chave.

Interrogar sempre por campos que sejam chave.

Se desejarmos interrogar por campos pertencentes a índices compostos é melhor utilizartodos
os campos de todos os índices. Suponhamos que temos um índice formado pelocampo NOME e
o campo SOBRENOME e outro índice formado pelo campo IDADE. Asentença WHERE
NOME='Jose' AND SOBRENOME Like '%' AND IDADE = 20 seria melhorque WHERE NOME =
'Jose' AND IDADE = 20 porque o gerenciador, neste segundo caso,não pode usar o primeiro
índice e ambas sentenças são equivalentes porque a condiçãoSOBRENOME Like '%' devolveria
todos os registros.
Page 39 of 90Tutorial de SQL - Manual
completo11/07/2008http://www.criarweb.com/manuais/32/print.php

Ordem das Tabelas


Quando se utilizam várias tabelas dentro da consulta há que ter cuidado com a
ordemempregada na cláusula FROM. Se desejarmos saber quantos alunos se matricularam no
ano1996 e escrevermos: FROM Alunos, Matriculas WHERE Aluno.IdAluno = Matriculas.IdAluno
ANDMatriculas.Ano = 1996 o gerenciador percorrerá todos os alunos para buscar suas
matrículas edevolver as correspondentes. Se escrevermos FROM Matriculas, Alunos WHERE
Matriculas.Ano= 1996 AND Matriculas.IdAluno = Alunos.IdAlunos, o gerenciador filtra as
matrículas e depoisseleciona os alunos, desta forma tem que percorrer menos registros.
Informe de
Claudio
Mail:
claudio@lobocom.es
URL:
http://personal.lobocom.es/claudio/

Consultas de seleção
Este conjunto de registros pode ser modificável.
Consultas básicas
A sintaxe básica de uma consulta de seleção é a seguinte:
SELECTCamposFROMTabela
Onde "campos" é a lista de campos que se deseja recuperar e "tabela" é a origem dos
mesmos,por exemplo:
SELECTNombre, TelefoneFROMClientes
Esta sentença devolve um conjunto de resultados com o campo nome e telefone da
tabelaclientes.
Devolver Literais
Em determinadas ocasiões pode nos interessar incluir uma coluna com um texto fixo em
umaconsulta de seleção, por exemplo, suponhamos que temos uma tabela de empregados
edesejamos recuperar as tarifas semanais dos eletricistas, poderíamos realizar a
seguinteconsulta:
SELECTEmpregados.Nome, 'Tarifa semanal: ', Empregados.TarifaHora *
40FROMEmpregadosWHEREEmpleados.Cargo = 'Eletricista'
Ordenar los registros
Adicionalmente pode se especificar a ordem em que se deseja recuperar os registros
dastabelas mediante a cláusula ORDER BY Lista de Campos. Em onde Lista de campos
representaos campos a ordenar. Exemplo:
SELECTCodigoPostal, Nome, TelefoneFROM

Page 40 of 90Tutorial de SQL - Manual


completo11/07/2008http://www.criarweb.com/manuais/32/print.php

ClientesORDER BYNome
Esta consulta devolve os campos CodigoPostal, Nome, Telefone da tabela Clientes
ordenadospelo campo Nome.Pode-se ordenar os registros por mais de um campo, como por
exemplo:
SELECTCodigoPostal, Nome, TelefoneFROMClientesORDER BYCodigoPostal, Nome
Inclusive pode-se especificar a ordem dos registros: ascendente mediante a cláusula (ASC
-toma-se este valor padrão) ou descendente (DESC)
SELECTCodigoPostal, Nome, TelefoneFROMClientesORDER BYCodigoPostal DESC , Nome
ASC
Uso de Índices das tabelas
Se desejarmos que a sentença SQL utilize um índice para mostrar os resultados se pode
utilizara palavra reservada INDEX da seguinte forma:
SELECT ... FROM Tabela (INDEX=Indice) ...
Normalmente os motores dos bancos de dados decidem que índice se deve utilizar para
aconsulta, para isso utilizam critérios de rendimento e sobretudo, os campos de
buscaespecificados na cláusula WHERE. Se se deseja forçar a não utilizar nenhum índice
utilizaremosa seguinte sintaxe:
SELECT ... FROM Tabela (INDEX=0) ...
Consultas com Predicado
O predicado se inclui entre a cláusula e o primeiro nome do campo a recuperar, os
possíveispredicados são:
ALL
Se não se inclui nenhum dos predicados se assume ALL. O Motor de banco de dados
selecionatodos os registros que cumprem as condições da instrução SQL e devolve todos e cada
um deseus campos. Não é conveniente abusar deste predicado já que obrigamos ao motor do
bancode dados a analisar a estrutura da tabela para averiguar os campos que contém, é muito
maisrápido indicar a lista de campos desejados.
SELECT ALLFROM
Predicado Descrição
ALL Devolve todos os campos da tabelaTOP Devolve um determinado número de registros da
tabelaDISTINCT Omite os registros cujos campos selecionados coincidam
totalmenteDISTINCTOWOmite os registros duplicados baseando-se na totalidade do registro e
não só noscampos selecionados.
Page 41 of 90Tutorial de SQL - Manual
completo11/07/2008http://www.criarweb.com/manuais/32/print.php

EmpregadosSELECT *FROMEmpregados
TOP
Devolve um certo número de registros que entram entre ao princípio ou ao final de umacategoria
especificada por uma cláusula ORDER BY. Suponhamos que queremos recuperar osnomes dos
25 primeiros estudantes do curso 1994:
SELECT TOP 25Nome, SobrenomeFROMEstudantesORDER BYNota DESC
Se não se inclui a cláusula ORDER BY, a consulta devolverá um conjunto arbitrário de
25registros da tabela de Estudantes. O predicado TOP não escolhe entre valores iguais.
Noexemplo anterior, se a nota média número 25 e a 26 são iguais, a consulta devolverá
26registros. Pode-se utilizar a palavra reservada PERCENT para devolver uma certa
porcentagemde registros que caem ao princípio ou ao final de uma categoria especificada pela
cláusulaORDER BY. Suponhamos que no lugar dos 25 primeiros estudantes desejamos o 10 por
centodo curso:
SELECT TOP 10 PERCENTNome, SobrenomeFROMEstudantesORDER BYNota DESC
O valor que vai a seguir de TOP deve ser um inteiro sem signo. TOP não afeta à
possívelatualização da consulta.
DISTINCT
Omite os registros que contém dados duplicados nos campos selecionados. Para que os
valoresde cada campo listado na instrução SELECT se incluam na consulta devem ser únicos.
Porexemplo, vários empregados listados na tabela Empregados podem ter o mesmo
sobrenome.Se dois registros contém Lopez no campo Sobrenome, a seguinte instrução SQL
devolve umúnico registro:
SELECT DISTINCTSobrenomeFROMEmpregados
Com outras palavras o predicado DISTINCT devolve aqueles registros cujos campos
indicadosna cláusula SELECT possuam um conteúdo diferente. O resultado de uma consulta
que utilizaDISTINCT não é atualizável e não reflete as mudanças subseqüentes realizadas por
outrosusuários.
DISTINCTROW
Este predicado não é compatível com ANSI. Que eu saiba no dia de hoje só funciona
comACCESS.Devolve os registros diferentes de uma tabela; a diferença do predicado anterior
que só sefixava no conteúdo dos campos selecionados, este o faz no conteúdo do registro
completoindependentemente dos campos indicados na cláusula SELECT.
Page 42 of 90Tutorial de SQL - Manual
completo11/07/2008http://www.criarweb.com/manuais/32/print.php

SELECT DISTINCTROWSobrenomeFROM Empregados


Se a tabela empregados contém dois registros: Antonio Lopez e Marta Lopez o exemplo
dopredicado DISTINCT devolve um único registro com o valor Lopez no campo Sobrenome já
quebusca não duplicados em tal campo. Este último exemplo devolve dois registros com o
valorLopez no sobrenome já que se buscam não duplicados no registro completo.
ALIAS
Em determinadas circunstâncias é necessário atribuir um nome a alguma coluna determinadade
um conjunto devolvido, outras vezes por simples capricho ou porque estamos recuperandodados
de diferentes tabelas e acabam tendo um campo com igual nome. Para resolver todaselas,
temos a palavra reservada AS que se encarrega de atribuir o nome que desejamos àcoluna
desejada. Tomado como referência o exemplo anterior podemos fazer a coluna devolvidapela
consulta, ao invés de se chamar sobrenome (assim como o campo devolvido) se
chameEmpregado. Neste caso procederíamos da seguinte forma:
SELECT DISTINCTROWSobrenome AS EmpregadoFROM Empregados
AS não é uma palavra reservada de ANSI, existem diferentes sistemas de atribuir os alias
emfunção do motor de banco de dados. Em ORACLE para atribuir um alias a um campo há
quefazer da seguinte forma:
SELECTSobrenome AS "Empregado"FROM Empregados
Também podemos atribuir alias às tabelas dentro da consulta de seleção, neste caso há que
terem conta que em todas as referências que desejarmos fazer a tal tabela há que utilizar o
aliasao invés do nome. Esta técnica será de grande utilidade mais adiante quando se estudarem
asvinculações entre tabelas. Por exemplo:
SELECTApellido AS EmpregadoFROMEmpregados AS Trabalhadores
Para atribuir alias às tabelas em ORACLE e SQL-SERVER os alias se atribuem escrevendo
onome da tabela, deixando um espaço em branco e escrevendo o Alias (se atribuem dentro
dacláusula FROM).
SELECTTrabalhadores.Sobrenome (1) AS EmpregadoFROMEmpregadore Trabalhadores
(1)Esta nomenclatura [Tabela].[Campo] deve-se utilizar quando se está recuperando um
campocujo nome se repete em várias das tabelas que se utilizam na sentença. Não obstante
quandona sentença se empregam várias tabelas é aconselhável utilizar esta nomenclatura para
evitar otrabalho que supõem ao motor de dados averiguar em que tabela está cada um dos
camposindicados na cláusula SELECT.
Recuperar Informação de um banco de Dados Externo
Para concluir este capítulo se deve fazer referência à recuperação de registros de banco
dedados externos. Em ocasiões é necessário a recuperação de informação que se encontra
contidaem uma tabela que não se encontra no banco de dados que executará a consulta ou que
nessemomento não se encontra aberta, esta situação podemos salva-la com a palavra
reservada IN
Page 43 of 90Tutorial de SQL - Manual
completo11/07/2008http://www.criarweb.com/manuais/32/print.php

da seguinte forma:
SELECTSobrenome AS EmpregadoFROMEmpleados IN'c: \databases\gerenciamento.mdb'
Em onde c: \databases\gerenciamento.mdb é o banco de dados que contém a
tabelaEmpregados. Esta técnica é muito simples e comum em banco de dados do tipo ACCESS
emoutros sistemas como SQL-SERVER ou ORACLE, a cosa é mais complicada por ter que
existirrelações de confiança entre os servidores ou ao ser necessária a vinculação entre os
banco dedados. Este exemplo recupera a informação de um banco de dados de SQL-SERVER
localizadoem outro servidor (obviamente que os servidores estão linkados):
SELECTSobrenomeFROMServidor1.BancoDados1.dbo.EmpregadosInforme de
Claudio
Mail:
claudio@lobocom.es
URL:
http://personal.lobocom.es/claudio/

Critérios de seleção em SQL


Na seção anterior vimos a forma de recuperar os registros das tabelas, as formas
empregadasdevolviam todos os registros da mencionada tabela. Ao longo deste manual se
estudarão aspossibilidades de filtrar os registros com o fim de recuperar somente aqueles que
cumpramumas condições pré-estabelecidas.Antes de começar o desenvolvimento deste artigo,
há que ressaltar três detalhes de vitalimportância. O primeiro deles é que cada vez que se
deseja estabelecer uma condição referidaa um campo de texto a condição de busca deve ir
fechada entre aspas simples; a segunda éque não é possível estabelecer condições de busca
nos campos memo e; a terceira e última fazreferência às datas. Ate hoje não fui capaz de
encontrar uma sintaxe que funcione em todos ossistemas, por isso se faz necessário
particulariza-las segundo o banco de dados:
Exemplo
Banco de Dados Exemplo (para gravar a data 18 de maio de 1969)Referente aos valores
lógicos True ou False cabe destacar que não são reconhecidos emORACLE, nem nesse sistema
de banco de dados, nem em SQL-SERVER existem os campos detipo "SIM/NAO" de ACCESS;
nesses sistemas se utilizam os campos BIT que permitemarmazenar valores de 0 ou 1.
Internamente, ACCESS, armazena neste campos valores de 0 ou-1, por tanto tudo se complica
bastante, porém, aproveitando a coincidência do 0 para osvalores FALSE, pode-se utilizar a
sintaxe seguinte que funciona em todos os casos: se se desejasaber se o campo é falso "...
CAMPO = 0" e para saber os verdadeiros "CAMPO <> 0".Banco de Datos SintaxeSQL-SERVER
Data = #mm-dd-aaaa#ORACLE Data = to_date('YYYYDDMM','aaaammdd',)ACCESS Fecha =
#mm-dd-aaaa#SQL-SERVERData = #05-18-1969# óData = 19690518ORACLE Data =
to_date('YYYYDDMM', '19690518')ACCESS Data = #05-18-1969#
Page 44 of 90Tutorial de SQL - Manual
completo11/07/2008http://www.criarweb.com/manuais/32/print.php

Operadores Lógicos
Os operadores lógicos suportados por SQL são: AND, OR, XOR, Eqv, Imp, Is e Not.
Comexceção dos dois últimos, todos possuem a seguinte sintaxe:
<expressao1> operador <expressao2>
Onde expressao1 e expressao2 são as condições a avaliar, o resultado da operação varia
emfunção do operador lógico. A tabela anexa mostra os diferentes possíveis resultados:Se a
qualquer das anteriores condições lhe ante-pusermos o operador NOT o resultado daoperação
será o contrário ao devolvido sem o operador NOT.O último operador denominado Is se emprega
para comparar duas variáveis de tipo objeto<Objeto1> Is <Objeto2>. este operador devolve
verdadeiro se os dois objetos forem iguais.
SELECT *FROMEmpregadosWHEREIdade > 25 AND Idade < 50SELECT
*FROMEmpregadosWHERE(Idade > 25 AND Idade < 50)OR
<expressao1>

Operador

<expressao2>

Resultado
Verdadeiro AND Falso FalsoVerdadeiro AND Verdadeiro VerdadeiroFalso AND Verdadeiro
FalsoFalso AND Falso FalsoVerdadeiro OR Falso VerdadeiroVerdadeiro OR Verdadeiro
VerdadeiroFalso OR Verdadeiro VerdadeiroFalso OR Falso FalsoVerdadeiro XOR Verdadeiro
FalsoVerdadeiro XOR Falso VerdadeiroFalso XOR Verdadeiro VerdadeiroFalso XOR Falso
FalsoVerdadeiro Eqv Verdadeiro VerdadeiroVerdadeiro Eqv Falso FalsoFalso Eqv Verdadeiro
FalsoFalso Eqv Falso VerdadeiroVerdadeiro Imp Verdadeiro VerdadeiroVerdadeiro Imp Falso
FalsoVerdadeiro Imp Null NullFalso Imp Verdadeiro VerdadeiroFalso Imp Falso VerdadeiroFalso
Imp Null VerdadeiroNull Imp Verdadeiro VerdadeiroNull Imp Falso NullNull Imp Null Null
Page 45 of 90Tutorial de SQL - Manual
completo11/07/2008http://www.criarweb.com/manuais/32/print.php

Salario = 100SELECT *FROMEmpregados WHERENOT Estado = 'Solteiro'SELECT


*FROMEmpregadosWHERE(Salario >100 AND Salario < 500)OR(Cidade = 'Madri' AND Estado
= 'Casado')
Intervalos de Valores
Para indicar que desejamos recuperar os registros segundo o intervalo de valores de um
campoempregaremos o operador Between cuja sintaxe é:
campo [Not] Between valor1 And valor2 (a condição Not é opcional)
Neste caso a consulta devolveria os registros que contiverem em "campo" um valor incluído
nointervalo valor1, valor2 (ambos inclusive). Se ante-pusermos a condição Not devolverá
aquelosvalores não incluídos no intervalo.
SELECT *FROMPedidosWHERECodPostal Between 28000 And 28999(Devolve os pedidos
realizados na cidade de Madrid)
O Operador Like
Utiliza-se para comparar uma expressão de cadeia com um modelo em uma expressão
SQL.Sua sintaxe é:
expressão Like modelo
Onde expressão é uma cadeia modelo ou campo contra o que se compara expressão. Pode-
seutilizar o operador Like para encontrar valores nos campos que coincidam com o
modeloespecificado. Por modelo pode especificar um valor completo (Ana Maria), ou se pode
utilizaruma cadeia de caracteres asterisco como os reconhecidos pelo sistema operacional
paraencontrar uma classificação de valores (Like An*).O operador Like pode ser utilizado em
uma expressão para comparar um valor de um campocom uma expressão de cadeia. Por
exemplo, se introduzirmos Like C* em uma consulta SQL, aconsulta devolve todos os valores de
campo que começarem pela letra C. Em uma consulta comparâmetros, pode fazer com que o
usuário escreva o modelo que será utilizado.O exemplo seguinte devolve os dados que
começam com a letra P seguido de qualquer letraentre A e F e de três dígitos:
Like 'P[A-F]###'
Este exemplo devolve os campos cujo conteúdo comece com uma letra da A à D seguidas
dequalquer cadeia.
Like '[A-D]*'
Na tabela seguinte se mostra como utilizar o operador Like para comprovar expressões
comdiferentes modelos.
Page 46 of 90Tutorial de SQL - Manual
completo11/07/2008http://www.criarweb.com/manuais/32/print.php

ACCESS

SQL-SERVER
Em determinado motores de banco de dados, esta cláusula, não reconhece o asterisco
comocaractere e há que substitui-lo pelo caractere tanto por cento (%).
O Operador In
Este operador devolve aqueles registros cujo campo indicado coincide com algum dos em
umalista. Sua sintaxe é:
expressao [Not] In(valor1, valor2, . . .)SELECT *FROMPedidosWHERECidade In ('Madri',
'Barcelona', 'Sevilha')
A cláusula WHERE
A cláusula WHERE pode ser usada para determinar que registros das tabelas enumeradas
nacláusula FROM aparecerão nos resultados da instrução SELECT. Depois de escrever
estacláusula deve-se especificar as condições expostas nas seções anteriores. Se não se
empregaesta cláusula, a consulta devolverá todas as filas da tabela. WHERE é opcional, mas
quandoaparece deve ir a seguir de FROM.
SELECTSobrenome, SalarioFROMEmpregadosWHERESalario = 21000SELECTIdProduto,
ExistenciasFROMProdutosWHEREExistencias <= NovoPedido
'
Tipo de coincidência Modelo Planejado Coincide
e
Nao coincide
Varios caracteres 'a*a' aa', 'aBa', 'aBBBa' 'aBC'Caractere especial 'a[*]a' 'a*a' 'aaa'Varios
caracteres 'ab*' 'abcdefg', 'abc' 'cab', 'aab'Um so caractere 'a?a' 'aaa', 'a3a', 'aBa' 'aBBBa'Um so
digito 'a#a' 'a0a', 'a1a', 'a2a' 'aaa', 'a10a'Categoria de caracteres '[a-z]' 'f', 'p', 'j' '2', '&'Fora de uma
categoria '[!a-z]' '9', '&', '%' 'b', 'a'Diferente de um digito '[!0-9]' 'A', 'a', '&', '~' '0', '1', '9'Combinada
'a[!b-m]#' 'An9', 'az0', 'a99' 'abc', 'aj0'
Exemplo Descrição
LIKE 'A%' Tudo que comecar por ALIKE '_NG' Tudo que comece por qualquer caractere e logo
siga NGLIKE '[AF]%' Tudo que comecar por A ou FLIKE '[A-F]%' Tudo que comece por qualquer
letra compreendida entre a A e a FLIKE '[A^B]%' Tudo que comecar por A e a segunda letra nao
for uma B
Page 47 of 90Tutorial de SQL - Manual
completo11/07/2008http://www.criarweb.com/manuais/32/print.php

SELECT *FROMPedidosWHEREDataEnvio = #05-30-1994#SELECTSobrenomes,


NomeFROMEmpregadosWHERESobrenomes = 'King'SELECTSobrenomes,
NomeFROMEmpregadosWHERESobrenomes Like 'S*'SELECTSobrenomes,
SalarioFROMEmpregadosWHERESalario Between 200 And 300SELECTSobrenomes,
SalarioFROMEmpregadosWHERESobrenomes Between 'Lon' And 'Tol'SELECTIdPedido,
DataPedidoFROMPedidosWHEREDataPedido Between #01-01-1994# And #12-31-
1994#SELECTSobrenomes, Nome, CidadeFROMEmpregadosWHERECidade In ('Sevilha', 'Los
Angeles', 'Barcelona')Informe de
Claudio
Mail:
claudio@lobocom.es
URL:
http://personal.lobocom.es/claudio/

Como exibir informações com múltiplas instruções SQL


Ao utilizar múltiplas instruções SQL economizamos os recursos compartilhados da rede
eservidor, como largura de banda, memória, CPU, pois reduzimos o número de acessos
aoservidor web.Neste artigo, veremos como retornar registros com uma stored procedure com
duas instruçõesSQL. Inicialmente, declaramos a string de conexão com o banco de dados
string strConexao = "Data Source=(local);Integrated Security=SSPI;Initial Catalog=Northwind;";
e a stored procedure usada no exemplo:
string sSql = "GetTotalAndProdutos";

Page 48 of 90Tutorial de SQL - Manual


completo11/07/2008http://www.criarweb.com/manuais/32/print.php

Se preferir utilize instruções SQL separadas por ponto-e-vírgula:


string sSql = " SELECT Count(*) AS Total FROM Products; SELECT ProductName, UnitPrice
FROM Products";
Com a instrução using criamos uma nova instância da classe SqlConnection e passamos a
stringde conexão:
using (SqlConnection conn = new SqlConnection(strConexao))
{Criamos e definimos um objeto SqlDataReader como null.
SqlDataReader r = null;
Em seguida, criamos uma nova instância da classe SqlCommand e passamos ao construtor
oobjeto SqlConnection e a string com o nome da stored procedure.
SqlCommand cmd = new SqlCommand(sSql, conn);
Definimos a propriedade CommandType como StoredProcedure.
cmd.CommandType = CommandType.StoredProcedure;
Ao usar instruções SQL defina a propriedade CommandType como Text:
cmd.CommandType = CommandType.Text;
Dentro dos blocos try, catch, finally, respectivamente, abrimos e exibimos os
dados,manipulamos as exceções que podem ocorrer e fechamos a conexão com o banco de
dados.
try{conn.Open();
Definimos o objeto SqlDataReader:
r = cmd.ExecuteReader(CommandBehavior.CloseConnection);
Retornamos o índice do campo "total":
int t = r.GetOrdinal("total");
Exibimos a string "Total de registros:".
Response.Write("<b><span style=\"text-decoration: underline\">Total de registros:</span></b> ");
Iniciamos a leitura dos dados
r.Read();
e exibimos o total de registros retornados:
Response.Write(r.GetInt32(t) + "<br/>");
Usamos o método NextResult para exibir os registros do próximo conjunto de registros.
r.NextResult();
Verificamos se há registros para exibir:
if (r.HasRows)
Neste caso especifico, podemos usar também:
Page 49 of 90Tutorial de SQL - Manual
completo11/07/2008http://www.criarweb.com/manuais/32/print.php

if (r.GetInt32(t) > 0)
Em seguida, extraímos o índice do campo ProductName e do campo UnitPrice.
int produto = r.GetOrdinal("ProductName");int valor = r.GetOrdinal("UnitPrice");
Criamos a tabela onde exibiremos os dados.
Response.Write("<table><tr><td style=\"width: 150px\"><b>Produto</b></td><td
style=\"width:100px\"><b>Valor unitário</b></td></tr>");
Percorremos todos os registros do segundo conjunto de registros.
while (r.Read()){
Exibimos o nome do produto com o método GetString
Response.Write("<tr><td style=\"width: 150px\">" + r.GetString(produto) + "</td>");
e o valor unitário de cada produto com o método GetDecimal:
Response.Write("<td style=\"width: 100px\">" + string.Format(ci,"{0:c}", r.GetDecimal(valor)) +
"</td></tr>");
O método Format da classe String formata a saída como um valor monetário
string.Format(ci,"{0:c}", r.GetDecimal(valor))
e define a cultura como pt-BR - Português Brasil. Desta forma, a saída será sempre em
reais,independente do idioma usado pelo computador do usuário.
CultureInfo ci = new CultureInfo("pt-BR");
Ao finalizar o exemplo, exibimos a tag de fechamento da tabela
Response.Write("</table>");
exibimos o bloco catch
catch (SqlException){Response.Write("Erro SQL.");}
e o bloco finally, onde encerramos a conexão com o banco de dados.
finally{if (!r.IsClosed) r.Close();}
A seguir, temos os arquivos e códigos que compõe este exemplo.//Arquivo de exemplo:
Default.aspx.cs
using System;using System.Web.UI;using System.Web.UI.WebControls;using System.Data;using
System.Data.SqlClient;
Page 50 of 90Tutorial de SQL - Manual
completo11/07/2008http://www.criarweb.com/manuais/32/print.php

using System.Globalization;public partial class _Default : System.Web.UI.Page{protected void


Page_Load(object sender, EventArgs e){string strConexao = "Data Source=(local);Integrated
Security=SSPI;Initial Catalog=Northwind;";string sSql = "GetTotalAndProdutos";using
(SqlConnection conn = new SqlConnection(strConexao)){SqlDataReader r = null;SqlCommand
cmd = new SqlCommand(sSql, conn);cmd.CommandType =
CommandType.Text;try{conn.Open();r =
cmd.ExecuteReader(CommandBehavior.CloseConnection);int t =
r.GetOrdinal("total");Response.Write("<b><span style=\"text-decoration: underline\">Total de
registros:</span></b> ");r.Read();Response.Write(r.GetInt32(t) + "<br/>");r.NextResult();if
(r.HasRows){int produto = r.GetOrdinal("ProductName");int valor =
r.GetOrdinal("UnitPrice");Response.Write("<table><tr><td style=\"width:
150px\"><b>Produto</b></td><td style=\"width:100px\"><b>Valor
unitário</b></td></tr>");CultureInfo ci = new CultureInfo("pt-BR");while (r.Read())
{Response.Write("<tr><td style=\"width: 150px\">" + r.GetString(produto) +
"</td>");Response.Write("<td style=\"width: 100px\">" + string.Format(ci,"{0:c}",
r.GetDecimal(valor)) + "</td></tr>");}Response.Write("</table>");}}catch (SqlException)
{Response.Write("Erro SQL.");}finally{if (!r.IsClosed) r.Close();}}}}
Temos o arquivo Default.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs"
Inherits="_Default" %><html><head runat="server"><title>Exemplo com o método
NextResult</title></head><body><form id="form1"
runat="server"><div></div></form></body></html>
e a stored procedure GetTotalAndProdutos usada no exemplo:
CREATE PROCEDURE GetTotalAndProdutosASSET NOCOUNT ONSELECT Count(*) AS Total
FROM Products
Page 51 of 90Tutorial de SQL - Manual
completo11/07/2008http://www.criarweb.com/manuais/32/print.php

SELECT ProductName, UnitPrice FROM ProductsGO

Informe de
Alfredo Lotar
Mail:
alfredo.programador@bol.com.br

Critérios de seleção em SQL II


Combine os registros com valores idênticos, na lista de campos especificados, em um
únicoregistro. Para cada registro se cria um valor sumário se se inclui uma função SQL
agregada,como por exemplo, Sum ou Count, na instrução SELECT. Sua sintaxe é:
SELECT campos FROM tabela WHERE criterio GROUP BY campos do grupo
GROUP BY é opcional. Os valores de resumo se omitem se não existe uma função SQL
agregadana instrução SELECT. Os valores Null nos campos GROUP BY se agrupam e não se
omitem. Nãoobstante, os valores Null não se avaliam em nenhuma das funções SQL
agregadas.Utiliza-se a cláusula WHERE para excluir aquelas filas que não deseja agrupar, e a
cláusulaHAVING para filtrar os registros uma vez agrupados.Ao menos que contenha um dado
Memo ou Objeto OLE, um campo da lista de campos GROUPBY pode se referir a qualquer
campo das tabelas que aparecem na cláusula FROM, inclusive se ocampo não estiver incluído
na instrução SELECT, sempre e quando a instrução SELECT incluirpelo menos uma função SQL
agregada.Todos os campos da lista de campos de SELECT devem ou se incluir na cláusula
GROUP BY, oucomo argumentos de uma função SQL agregada.
SELECTIdFamilia, Sum(Stock) AS StockAtualFROMProdutosGROUP BYIdFamilia
Uma vez que GROUP BY combinou os registros, HAVING mostra qualquer registro
agrupadopela cláusula GROUP BY que satisfaça as condições da cláusula HAVING.HAVING é
similar a WHERE, determina que registros se selecionam. Uma vez que os registrosse
agruparam utilizando GROUP BY, HAVING determina quais deles serão mostrados.
SELECTIdFamilia, Sum(Stock) AS StockAtualFROMProdutosGROUP
BYIdFamiliaHAVINGStockAtual > 100ANDNomeProduto Like BOS*
AVG

Sobre o autor:
Alfredo Lotar é consultor, programador, escritor. Desenvolve aplicações com
ASP.NET,JavaScript, XML, C#, Visual Basic e SQL Server. É autor do livro XML para
Programadores ASP, da editoraAxcel Books, e dos livros ASP.NET com C# ? Curso Prático,
eComo programar com ASP.NET e C#, ambospublicados pela Novatec Editora. Atualmente,
passa a maior parte do tempo desenvolvendo aplicações,escrevendo livros ou artigos, testando
códigos e analisando falhas de segurança em web sites de clientes.O autor pode ser contactado
pelo e-mail: alfredo.programador@bol.com.br.
Page 52 of 90Tutorial de SQL - Manual
completo11/07/2008http://www.criarweb.com/manuais/32/print.php

Calcula a média aritmética de um conjunto de valores contidos em um campo especificado


deuma consulta. Sua sintaxe é a seguinte:
Avg(expr)
Onde expr representa o campo que contém os dados numéricos para os que se deseja calculara
média ou uma expressão que realiza um cálculo utilizando os dados de tal campo. A
médiacalculada por Avg é a média aritmética (a soma dos valores dividido pelo número de
valores). Afunção Avg não inclui nenhum campo Null no cálculo.
SELECTAvg(Gastos) AS PromedioFROMPedidosWHEREGastos > 100
Count
Calcula o número de registros devolvidos por uma consulta. Sua sintaxe é a seguinte
Count(expr)
Onde expr contém o nome do campo que se deseja contar. Os operandos de expr podem
incluiro nome de um campo de uma tabela, uma constante ou uma função (a qual pode ser
intrínsecaou definida pelo usuário, mas não outras das funções agregadas de SQL). Pode contar
comqualquer tipo de dados inclusive texto.Embora expr possa realizar um cálculo sobre um
campo, Count simplesmente conta o númerode registros sem ter em conta que valores se
armazenam nos registros. A função Count nãoconta os registros que têm campos null a não ser
que expr seja o caractere asterisco (*). Seutilizar um asterisco, Count calcula o número total de
registros, incluindo aqueles que contémcampos null. Count(*) é consideravelmente mais rápida
que Count(Campo). Não se devecolocar o asterisco entre aspas duplas ('*').
SELECTCount(*) AS TotalFROMPedidos
Se expr identifica a múltiplos campos, a função Count conta um registro só se ao menos umdos
campos não for Null. Se todos os campos especificados forem Null, não se contará oregistro. Há
que separar os nomes dos campos com ampersand (&).
SELECTCount(DataEnvio & Transporte) AS TotalFROMPedidos
Podemos fazer com que o gestor conte os dados diferentes de um determinado campo
SELECTCount(DISTINCT Localidade) AS TotalFROMPedidos
Max, Min
Devolvem o mínimo ou o máximo de um conjunto de valores contidos em um campo
especificode uma consulta. Sua sintaxe é:
Min(expr)Max(expr)
Page 53 of 90Tutorial de SQL - Manual
completo11/07/2008http://www.criarweb.com/manuais/32/print.php

Onde expr é o campo sobre o qual se deseja realizar o cálculo. Expr pode incluir o nome de
umcampo de uma tabela, uma constante ou uma função (a qual pode ser intrínseca ou
definidapelo usuário, porém não outras das funções agregadas de SQL).
SELECTMin(Gastos) AS ElMinFROMPedidosWHEREPais = 'Espanha'SELECTMax(Gastos) AS
ElMaxFROMPedidosWHEREPais = 'Espanha'
StDev, StDevP
Devolve estimações do desvio padrão para a povoação (o total dos registros da tabela) ou
umamostra da povoação representada (mostra aleatória). Sua sintaxe é:
StDev(expr)StDevP(expr)
Onde expr representa o nome do campo que contém os dados que desejam avaliar ou
umaexpressão que realiza um cálculo utilizando os dados de tais campos. Os operandos de
exprpodem incluir o nome de um campo de uma tabela, uma constante ou uma função (a qual
podeser intrínseca ou definida pelo usuário, porém não outras das funções agregadas de
SQL).StDevP avalia uma povoação, e StDev avalia uma mostra da povoação. Se a consulta
contémmenos de dois registros (ou nenhum registro para StDevP), estas funções devolvem um
valorNull (o qual indica que o desvio padrão não pode se calcular).
SELECTStDev(Gastos) AS DesvioFROMPedidosWHEREPaís =
'Espanha'SELECTStDevP(Gastos) AS DesvioFROMPedidosWHEREPaís = 'Espanha'
Sum
Devolve a soma do conjunto de valores contido em um campo especifico de uma consulta.
Suasintaxe é:
Sum(expr)
Onde expr representa o nome do campo que contém os dados que se desejam somar ou
umaexpressão que realiza um cálculo utilizando os dados de tais campos. Os operandos de
exprpodem incluir o nome de um campo de uma tabela, uma constante ou uma função (a qual
podeser intrínseca ou definida pelo usuário, mas não outras das funções agregadas de SQL).
SELECTSum(PrecoUnidade * Quantidad) AS Total
Page 54 of 90Tutorial de SQL - Manual
completo11/07/2008http://www.criarweb.com/manuais/32/print.php

FROMDetalhePedido
Var, VarP
Devolve uma estimação da variabilidade de uma povoação (sobre o total dos registros) ou
umamostra da povoação (mostra aleatória de registros) sobre os valores de um campo. Sua
sintaxeé:
Var(expr)VarP(expr)
VarP avalia uma povoação, e Var avalia uma mostra da povoação. Expr o nome do campo
quecontém os dados que se desejam avaliar ou uma expressão que realiza um cálculo utilizando
osdados de tais campos. Os operandos de expr podem incluir o nome de um campo de
umatabela, uma constante ou uma função (a qual pode ser intrínseca ou definida pelo usuário,
masnão outras das funções agregadas de SQL)Se a consulta contiver menos de dois registros,
Var e VarP devolvem Null (isto indica que avariabilidade não pode ser calculada). Pode utilizar
Var e VarP em uma expressão de consultaou em uma Instrução SQL.
SELECTVar(Gastos) AS VariabilidadeFROMPedidosWHEREPaís =
'Espanha'SELECTVarP(Gastos) AS VariabilidadeFROMPedidosWHEREPaís = 'Espanha'
COMPUTE de SQL-SERVER
Esta cláusula acrescenta uma fila no conjunto de dados que se está recuperando, se utiliza
pararealizar cálculos em campos numéricos. COMPUTE age sempre sobre um campo ou
expressãodo conjunto de resultados e esta expressão deve figurar exatamente igual na cláusula
SELECT esempre se deve ordenar o resultado pela mesma ou ao memos agrupar o resultado.
Estaexpressão não pode utilizar nenhum ALIAS.
SELECTIdCliente, Count(IdPedido)FROMPedidosGROUP BYIdPedidoHAVINGCount(IdPedido)
> 20COMPUTESum(Count(IdPedido))SELECTIdPedido, (PrecoUnidade * Quantidade -
Desconto)FROM[Detalhes de Pedidos]ORDER BYIdPedidoCOMPUTESum((PrecoUnidade *
Quantidade - Desconto)) // Calcula o TotalBY IdPedido // Calcula o SubtotalInforme de
Claudio

Page 55 of 90Tutorial de SQL - Manual


completo11/07/2008http://www.criarweb.com/manuais/32/print.php

Mail:
claudio@lobocom.es
URL:
http://personal.lobocom.es/claudio/

Consultas de ação
As consultas de ação são aquelas que não devolvem nenhum registro, são as encarregadas
deações como adicionar, excluir e modificar registros. Tanto as sentenças de atualização como
asde exclusão desencadeiarão (segundo o motor de dados) as atualizações em cascata,
exclusõesem cascata, restrições e valores padrões definidos para os diferentes campos ou
tabelasafetadas pela consulta.
DELETE
Cria uma consulta de eliminação que elimina os registros de uma ou mais das tabelas listadasna
cláusula FROM que satisfaçam a cláusula WHERE. Esta consulta elimina os registroscompletos,
não é possível eliminar o conteúdo de algum campo em concreto. Sua sintaxe é:DELETE FROM
Tabela WHERE criterioUma vez eliminados os registros utilizando uma consulta de exclusão,
não se poderá desfazer aoperação. Se desejar saber que registros foram eliminados, primeiro
examine os resultados deuma consulta de seleção que utilize o mesmo critério e depois execute
a consulta de exclusão.Mantenha cópias de segurança (back ups) de seus dados em todo
momento. Se eliminar osregistros errados poderá recuperá-los a través das cópias de
segurança.DELETEFROMEmpregadosWHERECargo = 'Vendedor'
INSERT INTO
Agrega um registro em uma tabela. É conhecida como uma consulta de dados adicionados.
Estaconsulta pode ser de dois tipos: Inserir um único registro ou Inserir em uma tabela os
registroscontidos em outra tabela.
Para inserir um único Registro:
Neste caso a sintaxe é a seguinte:INSERT INTO Tabela (campo1, campo2, ...,
campoN)VALUES (valor1, valor2, ..., valorN)Esta consulta grana no campo1 o valor1, no campo2
e valor2 e assim, sucessivamente.
Para selecionar registros e inseri-los em uma tabela nova
Neste caso, a sintaxe é a seguinte:SELECT campo1, campo2, ..., campoN INTO
novatabelaFROM tabelaorigem [WHERE criterios]Pode-se utilizar as consultas de criação de
tabela para arquivar registros, fazer cópias desegurança das tabelas ou fazer cópias para
exportar a outro banco de dados ou utilizar eminformes que mostrem os dados de um período de
tempo concreto. Por exemplo, se poderiacriar um informe de Vendas mensais por região
executando a mesma consulta de criação de

Page 56 of 90Tutorial de SQL - Manual


completo11/07/2008http://www.criarweb.com/manuais/32/print.php

tabela a cada mês.


Para inserir Registros de outra Tabela:
Neste caso, a sintaxe é:INSERT INTO Tabela [IN base_externa] (campo1, campo2, ,
campoN)SELECT TabelaOrigem.campo1, TabelaOrigem.campo2,,TabelaOrigem.campoN
FROM TabelaOrigemNeste caso se selecionarão os campos 1,2,..., n da tabela origem e se
gravarão nos campos1,2,.., n da Tabela. A condição SELECT pode incluir a cláusula WHERE
para filtrar os registros acopiar. Se Tabela e Tabela Origem possuem a mesma estrutura
podemos simplificar a sintaxea:INSERT INTO Tabela SELECT Tabela Origem.* FROM Tabela
OrigemDesta forma os campos de Tabela Origem se gravarão em Tabela, para realizar esta
operação énecessário que todos os campos de Tabela Origem estejam contidos com igual nome
emTabela. Com outras palavras que Tabela possua todos os campos de Tabela Origem (igual
nomee igual tipo).Neste tipo de consulta há que ter especial atenção com os campos contadores
ou auto-numéricos visto que ao inserir um valor em um campo deste tipo se escreve o valor
quecontenha seu campo homólogo na tabela origem, não incrementando-se como lhe
corresponde.Pode-se utilizar a instrução INSERT INTO para agregar um registro único a uma
tabela,utilizando a sintaxe da consulta de adição de registro único tal e como se
mostrouanteriormente. Nesse caso, seu código especifica o nome e o valor de cada campo do
registro.Deve especificar cada um dos campos do registro ao que se vai atribuir um valor assim
como ovalor para tal campo. Quando não se especifica tal campo, se insere o valor pré-
determinado ouNull. Os registros se agregam no final da tabela.Também se pode utilizar
INSERT INTO para agregar um conjunto de registros pertencentes aoutra tabela ou consulta
utilizando a cláusula SELECT... FROM como se mostrou anteriormentena sintaxe da consulta de
adição de múltiplos registros. Neste caso, a cláusula SELECT especifica os campos que se vão
agregar na tabela destino especificada.A tabela destino ou origem pode especificar uma tabela
ou uma consulta. Se a tabela destinocontiver uma chave principal, há que certificar-se que é a
única, e com valores não nulos; senão for assim, não se agregarão os registros. Se se agregam
registros a uma tabela com umcampo Contador, não se deve incluir o campo Contador na
consulta. Pode-se empregar acláusula IN para agregar registros a uma tabela em outro banco de
dados.Pode-se averiguar os registros que se agregarão na consulta executando primeiro uma
consultade seleção que utilize o mesmo critério de seleção e ver o resultado. Uma consulta de
adiçãocopia os registros de uma ou mais tabelas em outra. As tabelas que contém os registros
que sevão agregar não se verão afetadas pela consulta de adição. Ao invés de agregar
registrosexistentes em outra tabela, pode-se especificar os valores de cada campo em um novo
registroutilizando a cláusula VALUES. Se se omite a lista de campos, a cláusula VALUES deve
incluir umvalor para cada campo da tabela, de outra forma falhará INSERT.
Exemplos
INSERT INTOClientesSELECT ClientesAntigos.*
Page 57 of 90Tutorial de SQL - Manual
completo11/07/2008http://www.criarweb.com/manuais/32/print.php

FROMClientesNovosSELECT Empregados.*INTO
ProgramadoresFROMEmpregadosWHERECategoria = 'Programador'Esta consulta cria uma
tabela nova chamada programadores com a mesma estrutura que atabela empregado e copia
aqueles registros cujo campo categoria seja programadorINSERT INTOEmpregados (Nome,
Sobrenome, Cargo)VALUES('Luis', 'Sánchez', 'Estagiario')INSERT INTOEmpregadosSELECT
Vendedores.*FROMVendedoresWHERECidade = 'Madri'
UPDATE
Cria uma consulta de atualização que muda os valores dos campos de uma tabela
especificadabaseando-se em um critério específico. Sua sintaxe é:UPDATE Tabela SET
Campo1=Valor1, Campo2=Valor2, CampoN=ValorNWHERE CriterioUPDATE é especialmente
útil quando se deseja mudar um grande número de registros ouquando estes se encontram em
múltiplas tabelas. Pode mudar vários campos de uma só vez. Oexemplo seguinte incrementa os
valores Quantidade pedidos em um 10 por cento e os valoresTransporte em um 3 por cento para
aqueles que se tiverem enviado ao Reino Unido.:UPDATEPedidosSET Pedido = Pedidos *
1.1,Transporte = Transporte * 1.03WHEREPaisEnvio = 'ES'UPDATE não gera nenhum
resultado. Para saber que registros mudarão, há que examinarprimeiro o resultado de uma
consulta de seleção que utilize o mesmo critério e depois executara consulta de
atualização.UPDATEEmpregadosSET Grau = 5
Page 58 of 90Tutorial de SQL - Manual
completo11/07/2008http://www.criarweb.com/manuais/32/print.php

WHEREGrau = 2UPDATEProdutosSET Preco = Preco * 1.1WHEREProvedor = 8ANDFamilia =


3Se em uma consulta de atualização suprimimos a cláusula WHERE todos os registros da
tabelaassinalada serão atualizados.UPDATEEmpregadosSET Salario = Salario * 1.1
Informe de
Claudio
Mail:
claudio@lobocom.es
URL:
http://personal.lobocom.es/claudio/

Tipos de dados SQL


Os tipos de dados SQL se classificam em 13 tipos de dados primários e de vários
sinônimosválidos reconhecidos por tais tipos de dados. Os tipos de dados primários são:
Tipo deDadosLongitude Descrição
BINARY 1 bytePara consultas sobre tabela anexa de produtos de banco de dadosque definem
um tipo de dados Binário.BIT 1 byte Valores Sim/Não ou True/FalseBYTE 1 byte Um valor inteiro
entre 0 e 255.COUNTER 4 bytes Um número incrementado automaticamente (de tipo
Long)CURRENCY 8 bytesUm inteiro escalável entre 922.337.203.685.477,5808
e922.337.203.685.477,5807.DATETIME 8 bytes Um valor de data ou hora entre os anos 100 e
9999.SINGLE 4 bytesUm valor em ponto flutuante de precisão simples com umaclassificação de
- 3.402823*1038 a -1.401298*10-45 paravalores negativos, 1.401298*10- 45 a 3.402823*1038
paravalores positivos, e 0.DOUBLE 8 bytesUm valor em ponto flutuante de dupla precisão com
umaclassificação de - 1.79769313486232*10308 a -4.94065645841247*10-324 para valores
negativos,4.94065645841247*10-324 a 1.79769313486232*10308 paravalores positivos, e 0.
Page 59 of 90Tutorial de SQL - Manual
completo11/07/2008http://www.criarweb.com/manuais/32/print.php

A seguinte tabela recolhe os sinônimos dos tipos de dados definidos:


Informe de
Claudio
Mail:
claudio@lobocom.es
URL:
http://personal.lobocom.es/claudio/

SHORT 2 bytes Um inteiro curto entre -32,768 e 32,767.LONG 4 bytes Um inteiro longo entre
-2,147,483,648 e 2,147,483,647.LONGTEXT 1 byte porcaractereDe zero a um máximo de 1.2
gigabytes.LONGBINARY Segundo senecessiteDe zero 1 gigabyte. Utilizado para objetos
OLE.TEXT 1 byte porcaractereDe zero a 255 caracteres.
Tipo de Dado Sinônimos
BINARY VARBINARY BIT BOOLEANLOGICALLOGICAL1YESNOBYTE INTEGER1COUNTER
AUTOINCREMENT CURRENCY MONEY
DATETIMEDATETIMETIMESTAMPSINGLEFLOAT4IEEESINGLEREALDOUBLEFLOAT
FLOAT8IEEEDOUBLENUMBERNUMERICSHORT INTEGER2SMALLINT LONGINT
INTEGERINTEGER4LONGBINARY GENERALOLEOBJECT LONGTEXT
LONGCHARMEMONOTETEXT ALPHANUMERICCHAR - CHARACTERSTRING -
VARCHARVARIANT (Não Admitido) VALUE
Page 60 of 90Tutorial de SQL - Manual
completo11/07/2008http://www.criarweb.com/manuais/32/print.php

Subconsultas em SQL
Uma subconsulta é uma instrução SELECT adicionada dentro de uma instrução
SELECT,SELECT...INTO, INSERT...INTO, DELETE, ou UPDATE ou dentro de outra
subconsulta. Podeutilizar três formas de sintaxe para criar uma subconsulta:
comparação [ANY | ALL | SOME] (instrução sql) expressão [NOT] IN (instrução sql) [NOT]
EXISTS (instrução sql)
Onde:Pode-se utilizar uma subconsulta no lugar de uma expressão na lista de campos de
umainstrução SELECT ou em uma cláusula WHERE ou HAVING. Em uma subconsulta, se
utiliza umainstrução SELECT para proporcionar um conjunto de um ou mais valores
especificados paraavaliar na expressão da cláusula WHERE ou HAVING.Pode-se utilizar o
predicado ANY ou SOME, os quais são sinônimos, para recuperar registros daconsulta principal,
que satisfaçam a comparação com qualquer outro registro recuperado nasubconsulta. O
exemplo seguinte devolve todos os produtos cujo preço unitário for maior que ode qualquer
produto vendido com um desconto igual ou maior ao 25 por cento:
SELECT
*FROMProdutosWHEREPrecoUnidadeANY(SELECTPrecoUnidadeFROMDetalhePedidoWHER
EDesconto = 0 .25)
O predicado ALL se utiliza para recuperar unicamente aqueles registros da consulta principalque
satisfazem a comparação com todos os registros recuperados na subconsulta. Se se mudaANY
por ALL no exemplo anterior, a consulta devolverá unicamente aqueles produtos cujo
preçounitário for maior que o de todos os produtos vendidos com um desconto igual ou maior ao
25por cento. Isto é muito mais restritivo.O predicado IN se emprega para recuperar unicamente
aqueles registros da consulta principalpara os que alguns registros da subconsulta contém um
valor igual. O exemplo seguintedevolve todos os produtos vendidos com um desconto igual ou
maior ao 25 por cento:
SELECT *FROMProdutosWHEREIDProdutoIN(SELECTIDProdutoFROM
comparaçãoÉ uma expressão e um operador de comparação que compara a expressão com
oresultado da subconsulta.expressão É uma expressão pela qual se busca o conjunto resultante
da subconsulta.instruçãoSQLÉ uma instrução SELECT, que segue o mesmo formato e regras
que qualqueroutra SELECT. Deve ir entre parênteses.
Page 61 of 90Tutorial de SQL - Manual
completo11/07/2008http://www.criarweb.com/manuais/32/print.php

DetalhePedidoWHEREDesconto = 0.25)
Inversamente, pode-se utilizar NOT IN para recuperar unicamente aqueles registros da
consultaprincipal para os que não têm nenhum registro da subconsulta que contenha um valor
igual.O predicado EXISTS (com palavra reservada NOT opcional) se utiliza em comparações
deverdade/falso para determinar se a subconsulta devolve algum registro. Suponhamos
quedesejamos recuperar todos aqueles clientes que tiverem realizado pelo menos um pedido:
SELECTClientes.Companhia, Clientes.TelefoneFROMClientesWHERE EXISTS
(SELECTFROMPedidosWHEREPedidos.IdPedido = Clientes.IdCliente)
Esta consulta é equivalente a esta outra:
SELECTClientes.Companhia,
Clientes.TelefoneFROMClientesWHEREIdClientesIN(SELECTPedidos.IdClienteFROMPedidos)
Pode-se utilizar também alias do nome da tabela em uma subconsulta para se referir às
tabelaslistadas na cláusula FROM fora da subconsulta. O exemplo seguinte devolve os nomes
dosempregados cujo salário for igual ou maior do que o salário médio de todos os empregados
como mesmo título. À tabela Empregados foi dado o alias T1:
SELECTSobrenome, Nome, Titulo, SalarioFROMEmpregados AS T1WHERESalario
=(SELECTAvg(Salario)FROMEmpregadosWHERET1.Titulo = Empregados.Titulo)ORDER BY
Titulo
No exemplo anterior, a palavra reservada AS é opcional.
SELECTSobrenomes, Nome, Cargo, SalarioFROMEmpregadosWHERECargo LIKE 'Agente
Ven*'
Page 62 of 90Tutorial de SQL - Manual
completo11/07/2008http://www.criarweb.com/manuais/32/print.php

ANDSalario ALL(SELECTSalarioFROMEmpregadosWHERECargo LIKE '*Chefe*'ORCargo LIKE


'*Diretor*')
(Obtém uma lista com o nome, cargo e salário de todos os agentes de ventas cujo salário
formaior que o de todos os chefes e diretores.)
SELECT DISTINCTNomeProduto, Preco_UnidadeFROMProdutosWHEREPrecoUnidade
=(SELECTPrecoUnidadeFROMProdutosWHERENomeProduto = 'Almíbar anisado')
(Obtém uma lista com o nome e o preço unitário de todos os produtos com o mesmo preço queo
almíbar anisado.)
SELECT DISTINCTNomeContato, NomeCompanhia, CargoContato,
TelefoneFROMClientesWHEREIdCliente IN (SELECT DISTINCT IdClienteFROM
PedidosWHERE DataPedido <#07/01/1993#)
(Obtém uma lista das companhias e dos contatos de todos os clientes que realizaram umpedido
no segundo trimestre de 1993.)
SELECTNome, SobrenomesFROMEmpregados AS EWHERE EXISTS(SELECT *FROMPedidos
AS OWHERE O.IdEmpregado = E.IdEmpregado)
(Seleciona o nome de todos os empregados que reservaram pelo menos um pedido.)
SELECT DISTINCTPedidos.Id_Produto, Pedidos.Quantidade,
(SELECTProdutos.NomeFROMProdutosWHERE
Page 63 of 90Tutorial de SQL - Manual
completo11/07/2008http://www.criarweb.com/manuais/32/print.php

Produtos.IdProduto = Pedidos.IdProduto) AS
ElProdutoFROMPedidosWHEREPedidos.Quantidade = 150ORDER BYPedidos.Id_Produto
(Recupera o Código do Produto e a Quantidade pedida da tabela pedidos, extraindo o nome
doproduto da tabela de produtos.)
SELECTNumVoo, LugaresFROMVoosWHEREOrigem = 'Madri'AND Exists (SELECT
T1.NumVoo FROM Voos AS T1WHERE T1.LuagaresLivres > 0 AND
T1.NumVuelo=Vuelos.NumVuelo)
(Recupera números de vôo e capacidades de aqueles vôos com destino Madri e lugares
livresSuponhamos agora que temos uma tabela com os identificadores de todos nossos produtos
e ostock de cada um deles. Em outra tabela se encontram todos os pedidos que temos
pendentesde servir. Trata-se de averiguar que produtos não se podem servir por falta de
estoque.
SELECTPedidosPendentes.NomeFROMPedidosPendentesGROUP
BYPedidosPendentes.NomeHAVINGSUM(PedidosPendentes.Quantidade
<(SELECTProdutos.EstoqueFROMProdutosWHEREProdutos.IdProduto =
PedidosPendentes.IdProduto))
Suponhamos que em nossa tabela de empregados desejamos buscar todas as mulheres
cujaidade seja maior da de qualquer homem:
SELECTEmpregados.NomeFROMEmpregadosWHERESexo = 'M' AND Idade > ANY(SELECT
Empregados.Idade FROM Empregados WHERE Sexo ='H')Ou o que seria o
mesmo:SELECTEmpregados.NomeFROMEmpregadosWHERESexo = 'M' AND Idade
>(SELECT Max( Empregados.Idade )FROM Empregados WHERE Sexo ='H')
A seguinte tabela mostra algum exemplo do operador ANY e ALL
Valor 1 Operador Valor 2 Resultado
Page 64 of 90Tutorial de SQL - Manual
completo11/07/2008http://www.criarweb.com/manuais/32/print.php

A operação =ANY é equivalente ao operador IN, ambos devolvem o mesmo resultado.


Informe de
Claudio
Mail:
claudio@lobocom.es
URL:
http://personal.lobocom.es/claudio/

Consultas SQL de União Internas

Consultas de Combinação entre tabelas


As vinculações entre tabelas se realizam mediante a cláusula INNER que combina registros
deduas tabelas sempre que tiver concordância de valores em um campo comum. Sua sintaxe é:
SELECT campos FROM tb1 INNER JOIN tb2 ONtb1.campo1 comp tb2.campo2
Onde:Pode-se utilizar uma operação INNER JOIN em qualquer cláusula FROM. Isto cria
umacombinação por equivalência, conhecida também como união interna. As
combinaçõesequivalentes são as mais comuns; estas combinam os registros de duas tabelas
sempre quetiver concordância de valores em um campo comum a ambas tabelas. Pode-se
utilizar INNERJOIN com as tabelas Departamentos e Empregados para selecionar todos os
empregados decada departamento. Do contrário, para selecionar todos os departamentos
(inclusive se algumdeles não tiver nenhum empregado atribuído) se emprega LEFT JOIN ou
todos os empregados(inclusive se algum não estiver atribuído a nenhum departamento), neste
caso RIGHT JOIN.Se se tenta combinar campos que contenham dados Memo ou Objeto OLE,
se produz um erro.Podem-se combinar dois campos numéricos quaisquer, inclusive se são de
diferentes tipos dedados. Por exemplo, pode combinar um campo Numérico para o que a
propriedade Size de seuobjeto Field está estabelecida como Inteiro, e um campo Contador.O
exemplo seguinte mostra como poderia combinar as tabelas Categorias e Produtos baseando-se
no campo IDCategoria:
SELECTNomeCategoria, NomeProdutoFROMCategoriasINNER
JOINProdutosONCategorias.IDCategoria = Produtos.IDCategoria
No exemplo anterior, IDCategoria é o campo combinado, porém não está incluído na saída da3 >
ANY (2,5,7) Certo3 = ANY (2,5,7) Falso3 = ANY (2,3,5,7) Certo3 > ALL (2,5,7) Falso3 < ALL
(5,6,7) Falsotb1, tb2 São os nomes das tabelas desde as que se combinam os
registros.campo1,campo2São os nomes dos campos que se combinam. Se não são numéricos,
os camposdevem ser do mesmo tipo de dados e conter o mesmo tipo de dados, porém nãotem
que ter o mesmo nome.comp É qualquer operador de comparação relacional: =, <,<>, <=, =>, ó
>.

Page 65 of 90Tutorial de SQL - Manual


completo11/07/2008http://www.criarweb.com/manuais/32/print.php

consulta já que não está incluído na instrução SELECT. Para incluir o campo combinado, incluiro
nome do campo na instrução SELECT, neste caso, Categorias.IDCategoria.Também se pode
linkar várias cláusulas ON em uma instrução JOIN, utilizando a seguintesintaxe:
SELECT campos FROM tabela1 INNER JOIN tabela2ON (tb1.campo1 comp tb2.campo1 AND
ON tb1.campo2 comp tb2.campo2)OR ON (tb1.campo3 comp tb2.campo3)
Também pode aninhar instruções JOIN utilizando a seguinte sintaxe:
SELECT campos FROM tb1 INNER JOIN (tb2 INNER JOIN [( ]tb3[INNER JOIN [( ]tablax [INNER
JOIN ...)]ON tb3.campo3 comp tbx.campox)]ON tb2.campo2 comp tb3.campo3)ON tb1.campo1
comp tb2.campo2
Um LEFT JOIN ou um RIGHT JOIN pode se aninhar dentro de um INNER JOIN, porém um
INNERJOIN não pode se aninhar dentro de um LEFT JOIN ou um RIGHT JOIN.Exemplo:
SELECT DISTINCTSum(PrecoUnitario * Quantidade) AS Sales,(Nome + ' ' + Sobrenome) AS
NameFROMEmpregadosINNER JOIN(PedidosINNER
JOINDetalhesPedidosONPedidos.IdPedido =
DetalhesPedidos.IdPedido)ONEmpregados.IdEmpregado = Pedidos.IdEmpregadoGROUP
BYNome + ' ' + Sobrenome
(Cria duas combinações equivalentes: uma entre as tabelas Detalhes de pedidos e Pedidos, e
aoutra entre as tabelas Pedidos e Empregados. Isto é necessário já que a tabela
Empregadosnão contem dados de vendas e a tabela Detalhes de pedidos não contem dados
dosempregados. A consulta produz uma lista de empregados e suas vendas totais.)Se
empregarmos a cláusula INNER na consulta se selecionarão só aqueles registros da tabelada
que tivermos escrito à esquerda de INNER JOIN que contenham ao menos um registro databela
que tivermos escrito à direita. Para solucionar isto temos duas cláusulas que substituema
palavra-chave INNER, estas cláusulas são LEFT e RIGHT. LEFT toma todos os registros
databela da esquerda embora não tenha nenhum registro na tabela da esquerda. RIGHT realiza
amesma operação, porém ao contrário, toma todos os registros da tabela da direita embora
nãotenha nenhum registro na tabela da esquerda.A sintaxe exposta anteriormente pertence a
ACCESS, onde todas as sentenças com a sintaxefuncionam corretamente. Os manuais de SQL-
SERVER dizem que esta sintaxe é incorreta e quehá que adicionar a palavra reservada OUTER:
LEFT OUTER JOIN e RIGHT OUTER JOIN. Naprática funciona corretamente de uma forma ou
de outra.Não obstante, os INNER JOIN ORACLE não é capaz de interpretá-los, mas existe uma
sintaxeem formato ANSI para os INNER JOIN que funcionam em todos os sistemas. Tomando
comoreferência a seguinte sentença:
SELECTFaturas.*,Alvaras.*FROM
Page 66 of 90Tutorial de SQL - Manual
completo11/07/2008http://www.criarweb.com/manuais/32/print.php

FaturasINNER JOINAlvarasONFaturas.IdAlvara = Alvaras.IdAlvaraWHEREFaturas.IdCliente =


325
A transformação desta sentença a formato ANSI seria a seguinte:
SELECTFaturas.*,Alvaras.*FROMFaturas, AlvarasWHEREFaturas.IdAlvara =
Alvaras.IdAlvaraANDFaturas.IdCliente = 325
Como se pode observar as mudanças realizadas foram as seguintes:1. Todas as tabelas que
intervêm na consulta se especificam na cláusula FROM.2. As condições que vinculam às tabelas
se especificam na cláusula WHERE e se vinculammediante o operador lógico AND.Referente
aos OUTER JOIN, não funcionam em ORACLE e ademais conheço uma sintaxe quefunciona
nos três sistemas. A sintaxe em ORACLE é igual à sentença anterior, porémadicionando os
caracteres (+) atrás do nome da tabela na qual desejamos aceitar valoresnulos, isto equivale a
um LEFT JOIN:
SELECTFaturas.*,Alvaras.*FROMFaturas, AlvarasWHEREFaturas.IdAlvara = Alvaras.IdAlvara
(+)ANDFaturas.IdCliente = 325
E isto a um RIGHT JOIN:
SELECTFaturas.*,Alvaras.*FROMFaturas, AlvarasWHEREFaturas.IdAlvara (+) =
Alvaras.IdAlvaraANDFaturas.IdCliente = 325
Em SQL-SERVER se pode utilizar uma sintaxe parecida, neste caso não se utiliza os
caracteres(+), e sim os caracteres =* para o LEFT JOIN e *= para o RIGHT JOIN.
Consultas de Auto-combinação
A auto-combinação se utiliza para unir uma tabela consigo mesma, comparando valores deduas
colunas com o mesmo tipo de dados. A sintaxe na seguinte:
SELECTalias1.coluna, alias2.coluna, ...FROMtabla1 as alias1, tabela2 as alias2WHERE
Page 67 of 90Tutorial de SQL - Manual
completo11/07/2008http://www.criarweb.com/manuais/32/print.php

alias1.coluna = alias2.colunaANDoutras condicoes


Por exemplo, para visualizar o número, nome e posto de cada empregado, junto com o
número,nome e posto do supervisor de cada um deles se utilizaria a seguinte sentença:
SELECTt.num_emp, t.nome, t.posto, t.num_sup,s.nome, s.postoFROMempregados AS t,
empregados AS sWHEREt.num_sup = s.num_emp
Consultas de Combinações não Comuns
A maioria das combinações está baseada na igualdade de valores das colunas que são o
critérioda combinação. As não comuns se baseiam em outros operadores de combinação, tais
comoNOT, BETWEEN, <>, etc.Por exemplo, para listar o grau salarial, nome, salário e posto de
cada empregado ordenando oresultado por grau e salário haveria que executar a seguinte
sentença:
SELECTgraus.grau,empregados.nome, empregados.salario,
empregados.postoFROMempregados, grausWHEREempregados.salario BETWEEN
grados.salarioinferior And grados.salariosuperiorORDER BYgrados.grado, empregados.salario
Para listar o salário médio dentro de cada grau salarial haveria que lançar esta outra sentença:
SELECTgraus.grau, AVG(empregados.salario)FROMempregados,
grausWHEREempregados.salario BETWEEN graus.salarioinferior And
graus.salariosuperiorGROUP BYgraus.grau
CROSS JOIN (SQL-SERVER)
Utiliza-se em SQL-SERVER para realizar consultas de união. Suponhamos que temos
umatabela com todos os autores e outra com todos os livros. Se desejássemos obter uma
listagemcombinando ambas tabelas de tal forma que cada autor aparecesse junto a cada
título,utilizaríamos a seguinte sintaxe:
SELECTAutores.Nome, Livros.TituloFROMAutores CROSS JOIN Livros
SELF JOIN
SELF JOIN é uma técnica empregada para conseguir o produto cartesiano de uma
tabelaconsigo mesma. Sua utilização não é muito freqüente, mas colocaremos algum exemplo
de suautilização.Suponhamos a seguinte tabela (O campo autor é numérico, embora para ilustrar
o exemploutilize o nome):
Autores
Page 68 of 90Tutorial de SQL - Manual
completo11/07/2008http://www.criarweb.com/manuais/32/print.php

Agora temos um conjunto de resultados em formato Autor - CoAutor.Se na tabela de


empregados quiséssemos extrair todos os possíveis pares que podemosrealizar, utilizaríamos a
seguinte sentença:
SELECTHomens.Nome, Mulheres.NomeFROMEmpregados Homem, Empregados
MulheresWHEREHomem.Sexo = 'Homem' ANDMulheres.Sexo = 'Mulher' ANDHomens.Id
<>Mulheres.Id
Para concluir suponhamos a seguinte tabela:Queremos obter um conjunto de resultados com o
nome do empregado e o nome de seu chefe:
SELECTEmpre.Nome, Chefes.NomeFROMEmpregados Empre, Empregados
ChefeWHEREEmpre.SeuChefe = Chefes.IdInforme de
Claudio
Mail:
claudio@lobocom.es
URL:
http://personal.lobocom.es/claudio/

Estruturas das tabelas em SQL


Na terminologia usada em SQL não se menciona às relações, do mesmo modo que não se usa
otermo atributo, porém sim a palavra coluna e linha.
Criação de Tabelas Novas

CREATE TABLE tabela (campo1 tipo (tamanho) índice1,campo2 tipo (tamanho) índice2,...
,índice multicampo , ... )
Código Autor Autor
B0012 1. Francisco López 2. Javier AlonsoB0012 1. Francisco López 3. Marta RebolledoC0014
1. Francisco López 2. Javier AlonsoD0120 2. Javier Alonso 3. Marta Rebolledo
Empregados
Id Nome SeuChefe1 Marcos 62 Lucas 13 Ana 24 Eva 15 Juan 66 Antonio
Page 70 of 90Tutorial de SQL - Manual
completo11/07/2008http://www.criarweb.com/manuais/32/print.php

Onde:
CREATE TABLEEmpregados (Nome TEXT (25),Sobrenomes TEXT (50))
(Cria uma nova tabela chamada Empregados com dois campos, um chamado Nome de tipotexto
e longitud 25 e outro chamado sobrenomes com longitude 50).
CREATE TABLEEmpregados (Nome TEXT (10),Sobrenomes TEXT,DataNascimento
DATETIME)CONSTRAINTIndiceGeralUNIQUE (Nome, Sobrenomes, DataNascimento)
(Cria uma nova tabela chamada Empregados com um campo Nome de tipo texto e longitude10,
outro chamado Sobrenomes de tipo texto e longitude pré-determinada (50) e um maischamado
DataNascimento de tipo Data/Hora. Também cria um índice único - não permitevalores repetidos
- formado pelos três campos.)
CREATE TABLEEmpregados (IdEmpregado INTEGER CONSTRAINT IndicePrimario
PRIMARY,Nome TEXT,Sobrenomes TEXT,DataNascimento DATETIME)
(Cria uma tabela chamada Empregados com um campo Texto de longitude pré-determinada(50)
chamado Nome e outro igual chamado Sobrenomes, cria outro campo chamadoDataNascimento
de tipo Data/Hora e o campo IdEmpregado de tipo inteiro o que estabelececomo chave
principal.)
A cláusula CONSTRAINT
Utiliza-se a cláusula CONSTRAINT nas instruções ALTER TABLE e CREATE TABLE para criar
oueliminar índices. Existem duas sintaxes para esta cláusula dependendo se deseja Criar
ouEliminar um índice de um único campo ou se se trata de um campo multi-índice. Se se utiliza
omotor de dados de Microsoft, só poderá utilizar esta cláusula com os bancos de dados
própriasde tal motor. Para os índices de campos únicos:
CONSTRAINT nome {PRIMARY KEY | UNIQUE | REFERENCES tabela externa
tabla É o nome da tabela que será criada.campo1campo2É o nome do campo ou dos campos
que serão criados na nova tabela. A novatabela deve conter, ao menos, um campo.tipo É o tipo
de dados de campo na nova tabela.tamanho É o tamanho do campo, só se aplica para campos
de tipo texto.índice1índice2É uma cláusula CONSTRAINT que define o tipo de índice a criar.
Esta cláusulaé opcional.índicemulticamposÉ uma cláusula CONSTRAINT que define o tipo de
índice multicampos a criar.Um índice multicampo é aquele que está indexado pelo conteúdo de
várioscampos. Esta cláusula é opcional.
Page 71 of 90Tutorial de SQL - Manual
completo11/07/2008http://www.criarweb.com/manuais/32/print.php

[(campo externo1, campo externo2)]}


Para os índices de campos múltiplos:CONSTRAINT nome {PRIMARY KEY (primario1[, primario2
[,...]]) |UNIQUE (único1[, único2 [, ...]]) |FOREIGN KEY (ref1[, ref2 [,...]]) REFERENCES tabela
externa[(campo externo1 ,campo externo2 [,...])]}Onde:Se se deseja criar um índice para um
campo quando se está utilizando as instruções ALTERTABLE ou CREATE TABLE a cláusula
CONTRAINT deve aparecer imediatamente depois daespecificação do campo indexado.Se se
deseja criar um índice com múltiples campos quando se está utilizando as instruçõesALTER
TABLE ou CREATE TABLE a cláusula CONSTRAINT deve aparecer fora da cláusula decriação
de tabela.
Criação de Índices
Se se utiliza o motor de dados Jet de Microsoft só se podem criar índices em banco ed dados
domesmo motor. A sintaxe para criar um índice em uma tabela já definida na seguinte:
CREATE [ UNIQUE ] INDEX índiceON Tabela (campo [ASC|DESC][, campo [ASC|DESC], ...])
[WITH { PRIMARY | DISALLOW NULL | IGNORE NULL }]
Onde:nome É o nome do índice que se criará.primarioN É o nome do campo ou dos campos que
formam o índice primário.únicoN É o nome do campo ou dos campos que formam o índice de
chave única.refNÉ o nome do campo ou dos campos que formam o índice externo
(fazemreferência a campos de outra tabela).tabela externa É o nome da tabela que contém o
campo ou os campos referenciados em refNcamposexternosÉ o nome do campo ou dos campos
da tabela externa especificados por ref1,ref2,... , refNIndice DescriçãoUNIQUEGera um índice de
chave única. O que implica que os registros da tabela não podemconter o mesmo valor nos
campos indexados.PRIMARY KEY Gera um índice primário o campo ou os campos
especificados. Todos os campos dachave principal devem ser únicos e não nulos, cada tabela só
pode conter umaúnica chave principal.FOREIGNKEY Gera um índice externo (toma como valor
do índice campos contidos em outrastabelas). Se a chave principal da tabela externa consta de
mais de um campo, sedeve utilizar uma definição de índice de múltiplos campos, listando todos
os camposde referência, o nome da tabela externa, e os nomes dos campos referenciados
natabela externa na mesma ordem que os campos de referência listados. Se oscampos
referenciados são a chave principal da tabela externa, não tem queespecificar os campos
referenciados, pré-determinado por valor, o motor Jet secomporta como se a chave principal da
tabela externa estivesse formada peloscampos referenciados.
Page 72 of 90Tutorial de SQL - Manual
completo11/07/2008http://www.criarweb.com/manuais/32/print.php

No caso de ACCESS, se pode utilizar CREATE INDEX para criar um pseudo índice sobre
umatabela adjunta em uma fonte de dados ODBC tal como SQL Server que não tenha ainda
umíndice. Não necessita permissão ou ter acesso a um servidor remoto para criar um
pseudoíndice, ademais o banco de dados remoto não é consciente e não é afetado pelo pseudo
índice.Utiliza-se a mesma sintaxe para as tabelas adjuntas que para as originais. Isto é
especialmenteútil para criar um índice em uma tabela que seria só de leitura devido à falta de um
índice.
CREATE INDEXMeuIndiceONEmpregados (Prefixo, Telefone)(Cria um índice chamado
MeuIndice na tabela empregados com os campos Prefixo e Telefone.)CREATE UNIQUE
INDEXMeuIndiceONEmpregados (IdEmpregado)WITH DISALLOW NULL
(Cria um índice na tabela Empregados utilizando o campo IdEmpregado, obrigando que ocampo
IdEmpregado não contenha valores nulos nem repetidos.)
Modificar o Desenho de uma Tabela
Modifica o desenho de uma tabela já existente, se podem modificar os campos ou os
índicesexistentes. Sua sintaxe é:
ALTER TABLE tabela {ADD {COLUMN tipo de campo[(tamanho)][CONSTRAINT
índice]CONSTRAINT índice multicampo} |DROP {COLUMN campo I CONSTRAINT nome do
índice}}
Onde:índice É o nome do índice a criar.tabla É o nome de uma tabela existente na que se criará
o índice.campo É o nome do campo ou lista de campos que constituem o índice.ASC|
DESCIndica a ordem dos valores dos campos ASC indica uma ordem ascendente(valor pré-
determinado) e DESC uma ordem descendente.UNIQUE Indica que o índice não pode conter
valores duplicados.DISALLOWNULLProíbe valores nulos no índiceIGNORENULLExclui do
índice os valores nulos incluídos nos campos que o compõem.PRIMARY Atribui ao índice a
categoria de chave principal, em cada tabela só pode existirum único índice que seja "Chave
Principal". Se um índice é chave principalimplica que não pode conter valores nulos nem
duplicados.tabla É o nome da tabela que se deseja modificar.campo É o nome do campo que se
adicionará ou eliminará.tipo É o tipo de campo que adicionará.tamanho É o tamanho do campo
que se adicionará (só para campos de texto).índiceÉ o nome do índice do campo (quando se
criam campos) ou o nome do índiceda tabela que se deseja eliminar.índicemulticampoÉ o nome
do índice do campo multicampo (quando se criam campos) ou onome do índice da tabela que se
deseja eliminar.
Page 73 of 90Tutorial de SQL - Manual
completo11/07/2008http://www.criarweb.com/manuais/32/print.php

ALTER TABLEEmpregadosADD COLUMNSalario CURRENCY(Agrega um campo Salario de


tipo Moeda a tabela Empregados.)ALTER TABLEEmpregadosDROP COLUMNSalario(Elimina o
campo Salario da tabela Empregados.)ALTER TABLEPedidosADD
CONSTRAINTRelacaoPedidosFOREIGN KEY(IdEmpregado)REFERENCESEmpregados
(IdEmpregado)(Agrega um índice externo à tabela Pedidos. O índice externo se baseia no
campo IdEmpregado e se refere ao campoIdEmpregado da tabela Empregados. Neste exemplo,
não é necessário indicar o campo junto ao nome da tabela nacláusula REFERENCES, pois
ID_Empregado é a chave principal da tabela Empregados.)ALTER TABLEPedidosDROP
CONSTRAINTRelacaoPedidos(Elimina o índice da tabela Pedidos.)Informe de
Claudio
Mail:
claudio@lobocom.es
URL:
http://personal.lobocom.es/claudio/

Cursores em SQL
Em alguns SGDB é possível a abertura de cursores de dados desde o próprio ambiente
detrabalho, para isso se utilizam, normalmente procedimentos armazenados. A sintaxe
paradefinir um cursor é a seguinte:DECLAREnome-cursorFORespecificacao-consulta[ORDER
BY]Por exemplo:DECLAREMeu_CursorFOROperação DescriçãoADDCOLUMNUtiliza-se para
adicionar um novo campo à tabela, indicando o nome, o tipo decampo e opcionalmente o
tamanho (para campos de tipo texto).ADD Utiliza-se para agregar um índice de multicampos ou
de um único campo.DROPCOLUMNUtiliza-se para apagar um campo. Especifica-se unicamente
o nome do campo.DROPUtiliza-se para eliminar um índice. Especifica-se unicamente o nome do
índice aseguir da palavra reservada CONSTRAINT.
Page 74 of 90Tutorial de SQL - Manual
completo11/07/2008http://www.criarweb.com/manuais/32/print.php

SELECT num_emp, nome, posto, salarioFROM empregadosWHERE num_dept =


'informatica'Este comando é meramente declarativo, simplesmente especifica as filas e colunas
que iremosrecuperar. A consulta se executa quando se abre ou se ativa o cursor. A cláusula
[ORDER BY] éopcional e especifica uma ordenação para as filas do cursor; se não se especifica,
a ordenaçãodas filas é definida pelo gerenciador de SGBD.Para abrir ou ativar um cursor se
utiliza o comando OPEN do SQL, a sintaxe é a seguinte:OPENnome-cursor[USING lista-
variaveis]Ao abrir o cursor, avalia-se a consulta que aparece em sua definição, utilizando os
valoresatuais de qualquer parâmetro referenciado na consulta, para produzir uma coleção de
filas. Oponteiro se posiciona diante da primeira fila de dados (registro atual), esta sentença
nãorecupera nenhuma fila.Uma vez aberto o cursor, utiliza-se a cláusula FETCH para recuperar
as filas do cursor, a sintaxeé a seguinte:FETCHnome-cursorINTOlista-variaveisLista - variaveis
são as variáveis que vão conter os dados recuperados da fila do cursor, nadefinição devem ir
separadas por vírgulas. Na lista de variáveis, deve-se definir tantas variáveiscomo colunas
quantas tiver a fila a recuperar.Para fechar um cursor, utiliza-se o comando CLOSE, este
comando faz desaparecer o ponteirosobre o registro atual. A sintaxe é:CLOSEnome-cursorPor
último, e para eliminar o cursor, utiliza-se o comando DROP CURSOR. Sua sintaxe é
aseguinte:DROP CURSORnome-cursorExemplo (sobre SQL-SERVER):
Abrir um cursor e percorrê-lo
DECLARE Employee_Cursor CURSOR FORSELECT LastName, FirstNameFROM
Northwind.dbo.EmployeesWHERE LastName like 'B%'OPEN Employee_CursorFETCH NEXT
FROM Employee_CursorWHILE @@FETCH_STATUS = 0BEGIN
Page 75 of 90Tutorial de SQL - Manual
completo11/07/2008http://www.criarweb.com/manuais/32/print.php

FETCH NEXT FROM Employee_CursorENDCLOSE Employee_CursorDEALLOCATE


Employee_Cursor
Abrir um cursor e imprimir seu conteúdo
SET NOCOUNT ONDECLARE@au_id varchar(11),@au_fname varchar(20),@au_lname
varchar(40),@message varchar(80),@title varchar(80)PRINT "-------- Utah Authors report
--------"DECLARE authors_cursor CURSOR FORSELECT au_id, au_fname, au_lnameFROM
authorsWHERE state = "UT"ORDER BY au_idOPEN authors_cursorFETCH NEXT FROM
authors_cursorINTO @au_id, @au_fname, @au_lnameWHILE @@FETCH_STATUS =
0BEGINPRINT " "SELECT @message = "----- Books by Author: " +@au_fname + " " +
@au_lnamePRINT @messageDECLARE titles_cursor CURSOR FORSELECT t.titleFROM
titleauthor ta, titles tWHERE ta.title_id = t.title_id AND ta.au_id = au_idOPEN titles_cursorFETCH
NEXT FROM titles_cursor INTO @titleIF @@FETCH_STATUS <> 0PRINT " <<No
Books>>"WHILE @@FETCH_STATUS = 0
Page 76 of 90Tutorial de SQL - Manual
completo11/07/2008http://www.criarweb.com/manuais/32/print.php

BEGINSELECT @message = " " + @titlePRINT @messageFETCH NEXT FROM titles_cursor


INTO @titleENDCLOSE titles_cursorDEALLOCATE titles_cursorFETCH NEXT FROM
authors_cursorINTO @au_id, @au_fname, @au_lnameENDCLOSE
authors_cursorDEALLOCATE authors_cursorGO
Percorrer um cursor
USE pubsGODECLARE authors_cursor CURSOR FORSELECT au_lnameFROM
authorsWHERE au_lname LIKE "B%"ORDER BY au_lnameOPEN authors_cursorFETCH NEXT
FROM authors_cursorWHILE @@FETCH_STATUS = 0BEGINFETCH NEXT FROM
authors_cursorENDCLOSE authors_cursorDEALLOCATE authors_cursor
Percorrer um cursor salvando os valores em variáveis
USE pubsGODECLARE @au_lname varchar(40)DECLARE @au_fname varchar(20)DECLARE
authors_cursor CURSOR FORSELECTau_lname, au_fnameFROM authorsWHERE au_lname
LIKE "B%"ORDER BY au_lname, au_fnameOPEN authors_cursorFETCH NEXT FROM
authors_cursor INTO @au_lname, @au_fnameWHILE @@FETCH_STATUS = 0
Page 77 of 90Tutorial de SQL - Manual
completo11/07/2008http://www.criarweb.com/manuais/32/print.php

BEGINPRINT "Author: " + @au_fname + " " + @au_lnameFETCH NEXT FROM


authors_cursorINTO @au_lname, @au_fnameENDCLOSE authors_cursorDEALLOCATE
authors_cursor
Informe de
Claudio
Mail:
claudio@lobocom.es
URL:
http://personal.lobocom.es/claudio/

Referências Cruzadas em SQL


Uma consulta de referências cruzadas é aquela que nos permite visualizar os dados em filas
eem colunas, estilo tabela, por exemplo:Se tivermos uma tabela de produtos e outra tabela de
pedidos, podemos visualizar em total deprodutos pedidos por ano para um artigo determinado,
tal e como se visualiza na tabelaanterior. A sintaxe para este tipo de consulta é a seguinte:
TRANSFORM função agregada instrução select PIVOT campo pivot[IN (valor1[, valor2[, ...]])]
Onde:Para resumir dados utilizando uma consulta de referência cruzada, se selecionam os
valores doscampos ou expressões especificadas como cabeçalhos de colunas de tal forma que
podem sever os dados em um formato mais compacto que com uma consulta de
seleção.TRANSFORM é opcional, porém se for incluída é a primeira instrução de uma cadeia
SQL.Precede à instrução SELECT que especifica os campos utilizados como cabeçalhos de fila
e umacláusula GROUP BY que especifica o agrupamento das filas. Opcionalmente pode incluir
outrascláusulas como, por exemplo, WHERE, que especifica uma seleção adicional ou um
critério deordenação.Produto / Ano 1996 1997Calças 1.250 3.000Camisas 8.560 1.253Sapatos
4.369 2.563função agregadaÉ uma função SQL agregada que opera sobre osdados
selecionados.instrução select É uma instrução SELECT.campo pivotÉ o campo ou expressão
que deseja utilizar para criaros cabeçalhos da coluna no resultado da consulta.valor1, valor2 São
valores fixosutilizados para criar os cabeçalhos dacoluna.

Page 78 of 90Tutorial de SQL - Manual


completo11/07/2008http://www.criarweb.com/manuais/32/print.php

Os valores devolvidos em campo pivot se utilizam como cabeçalhos de coluna no resultado


daconsulta. Por exemplo, ao utilizar as cifras de vendas no mês da venda como pivot em
umaconsulta de referência cruzada se criariam 12 colunas. Pode restringir o campo pivot para
criarcabeçalhos a partir dos valores fixos (valor1, valor2) listados na cláusula opcional
IN.Também pode incluir valores fixos, para os que não existem dados, para criar
colunasadicionais.Exemplos
TRANSFORMSum(Quantidade) AS VendasSELECTProduto,
QuantidadeFROMPedidosWHEREData Between #01-01-1998# And #12-31-1998#GROUP
BYProdutoORDER BYProdutoPIVOTDatePart("m", Data)(Cria uma consulta de tabela de
referências cruzadas que mostra as vendas de produtos por mês para um anoespecífico. Os
meses aparecem da esquerda à direita como colunas e os nomes dos produtos aparecem de
cima parabaixo como filas.)TRANSFORMSum(Quantidade) AS
VendasSELECTCompanhiaFROMPedidosWHEREData Between #01-01-1998# And #12-31-
1998#GROUP BYCompanhiaORDER BYCompanhiaPIVOT"Trimestre " & DatePart("q", Data)In
('Trimestre1', 'Trimestre2', 'Trimestre 3', 'Trimestre 4')(Cria uma consulta de tabela de referências
cruzadas que mostra as vendas de produtos por trimestre de cada provedorno ano indicado. Os
trimestres aparecem da esquerda à direta como colunas e os nomes dos provedores aparecem
decima para baixo como filas.)
Um caso prático:Trata-se de resolver o seguinte problema: temos uma tabela de produtos com
dois campos, ocódigo e o nome do produto. Temos outra tabela de pedidos na que anotamos o
código doproduto, a data do pedido e a quantidade pedida. Desejamos consultar os totais de
produto porano, calculando a média anual de vendas.Estrutura e dados das tabelas:
Page 79 of 90Tutorial de SQL - Manual
completo11/07/2008http://www.criarweb.com/manuais/32/print.php

Para resolver a consulta sondaremos a seguinte consulta:


TRANSFORMSum(Pedidos.Quantidade) AS ResultadoSELECTNombre AS Produto, Pedidos.Id
AS Código,Sum(Pedidos.Quantidade) AS TOTAL,Avg(Pedidos.Quantidade) AS
MediaFROMPedidos, ArtigosWHEREPedidos.Id = Artigos.IdGROUP BYPedidos.Id,
Artigos.NomePIVOTYear(Data)
E obtemos o seguinte resultado:Comentários à consulta:A cláusula TRANSFORM indica o valor
que desejamos visualizar nas colunas que realmentepertencem à consulta, neste caso 1996 e
1997, visto que ademais colunas são opcionais.SELECT especifica o nome das colunas
opcionais que desejamos visualizar, neste caso, Produto,Código, Total e Média, indicando o
nome do campo que desejamos mostrar em cada coluna ouo valor da mesma. Se incluirmos
uma função de cálculo o resultado se fará baseando-se nosdados da fila atual e não ao total dos
dados.FROM especifica a origem dos dados. A primeira tabela que deve figurar é aquela de
ondedesejamos extrair os dados, esta tabela deve conter ao menos três campos, um para os
títulosda fila, outros para os títulos da coluna e outro para calcular o valor das células.Neste caso
em concreto se desejava visualizar o nome do produto, como na tabela de pedidossó figurava o
código do mesmo se adicionou uma nova coluna na cláusula select chamadaProduto que se
corresponda com o campo Nome da tabela de artigos. Para vincular o código doartigo da tabela
de pedidos com o nome do mesmo da tabela artigos, foi inserido a cláusulaINNER JOIN.A
cláusula GROUP BY especifica o agrupamento dos registros, contrariamente aos manuais
deinstrução esta cláusula não é opcional já que deve figurar sempre e devemos agrupar
osProduto Código Total Media 1996 1997Sapatos 1 348 87 300 48Calças 2 955 238,75 375
580Blusas 3 1940 485 620 1320
Page 80 of 90Tutorial de SQL - Manual
completo11/07/2008http://www.criarweb.com/manuais/32/print.php

registros pelo campo do qual extrairemos a informação. Neste caso existem dois campos dosque
extraímos a informação: pedidos.quantidade e artigos.nome, por isso, agrupamos
peloscampos.Para finalizar, a cláusula PIVOT indica o nome das colunas não opcionais, neste
caso 1996 e1997 e como vamos ao dado que aparecerá nas colunas, neste caso empregamos o
ano em quese produziu o pedido, extraindo-o do campo pedidos.fecha.Outras possibilidades de
data da cláusula pivot são as seguintes:1. Para agrupamento por Trimestres:PIVOT "Tri " &
DatePart("q",[Data]);2. Para agrupamento por meses (sem ter em conta o ano)PIVOT
Format([Data],"mmm") In ("Jan", "Fev", "Mar", "Abr", "Maio", "Jun", "Jul", "Ago","Set", "Out",
"Nov", "Dez");3. Para agrupar por diasPIVOT Format([Data],"Short Date");
Informe de
Claudio
Mail:
claudio@lobocom.es
URL:
http://personal.lobocom.es/claudio/

Introdução a freetext e contains em SQL-Server

FULL TEXT SEARCH


Utiliza-se em campos de texto de grande tamanho utilizando uns índices
denominadoscatálogos. Estes catálogos só se podem utilizar com tabelas que contenham que
definidaschaves primárias e armazenam todas as palavras do conteúdo das tabelas com
execeção dosartigos, preposições, etc.Os catálogos não se atualizam automaticamente nem se
salvam junto com o banco de dados ecada tabela pode ter um único catálogo.Para a utilização
destes catálogos dentro de uma consulta, podemos utilizar dois métodos, oprimeiro consiste em
incluir os critérios dentro de uma cláusula WHERE (CONTAINS ouFREETEXT) e o segundo é
utilizando uma tabela temporária que contém o ratio de acerto naconsulta (CONTAINSTABLE ou
FREETEXTTABLE).
O predicado CONTAINS
Utiliza-se este predicado para buscar um texto específico em uma tabela. Seu funcionamento
ésimilar ao predicado LIKE, a diferença é que este não pode realizar buscas nos campos
grandesde texto. CONTAINS não diferencia entre maiúsculas e minúsculas.
Sintaxe:

SELECT <Campos> FROM <Tabela>WHERE CONTAINS(<Campo>,<Cadeia>) OR/AND


CONTAINS(<Campo>,<Cadeia>)
O predicado CONTAINS suporta sintaxe complexas para buscar:

Uma ou mais palavras utilizando os operadores lógicos AND/OR.

Famílias de palavras

Uma palavra ou uma frase que comecem por um determinado texto.
Page 81 of 90Tutorial de SQL - Manual
completo11/07/2008http://www.criarweb.com/manuais/32/print.php


Palavras ou frases que estejam umas próximas de outras.Para buscar uma palavra em um
campo:
SELECT title_id, title, notes FROM titlesWHERE CONTAINS(notes,'business')
Para localizar uma frase em um campo:
SELECT title_id, titles, notes FROM titlesWHERE CONTAINS(notes,' "common business
applications" ')
Para localizar uma frase em todos os campos habilitados:
SELECT title_id, titles, notes FROM titlesWHERE CONTAINS(*, ' "common business
applications" ')
Utilizando AND, OR e NOT
SELECT title, notes FROM titlesWHERE CONTAINS(notes, ' "favorite recipes" OR "gourmet
recipes" ')SELECT titles, notes FROM titlesWHERE CONTAINS(notes, ' cooking AND NOT
("computer*") ')SELECT titles, notes FROM titlesWHERE CONTAINS(notes, ' beer AND ales
')SELECT titles, notes FROM titlesWHERE CONTAINS(*, '("ice skating" OR hockey) AND NOT
olympics')
Utilizando caracteres curingas
SELECT titles, notes FROM titlesWHERE CONTAINS(notes,' "ice*" ')SELECT titles, notes FROM
titlesWHERE CONTAINS(notes, ' "light bread*" ')
Busca de palavras ou frases indicando a importância das palavras:Esta busca permite indicar o
peso que terá cada uma das palavras ou frases que se buscamsobre o resultado da busca, o
peso oscila entre o valor mais baixo 0.0 e o valor mais alto 1.0.
SELECT Cliente, Nome, Endereco FROM ClienteWHERE CONTAINS (Endereco, 'ISABOUT
( "Rua*", Velazquez WEIGHT(0.5), Serrano(0.9)')
(Serão encontrados todos aqueles registros que no campo endereço exista a cadeia rua
seguidade qualquer valor, ordenando primeiro os de "Rua Serrano", logo os de "Rua Velázquez"
edepois o resto.Busca de palavras próximas:Podemos realizar buscas por duas palavras e
indicar que se encontrem próximas uma da outra.A ordem das palavras não altera o resultado da
busca.
SELECT titulo, notas FROM livrosWHERE CONTAINS (notas, "usuario NEAR
computador")SELECT titulo, notas FROM livrosWHERE CONTAINS (notas, "usuario ~
computador")
Podem-se indicar três palavras, de tal forma que a segunda e a primeira devem estar
próximasao igual que a segunda e a terceira.
Page 82 of 90Tutorial de SQL - Manual
completo11/07/2008http://www.criarweb.com/manuais/32/print.php

SELECT titulo, notas FROM livrosWHERE CONTAINS (notas, "usuario ~ principiante ~


computador")
Buscas com frases:
... WHERE CONTAINS(Descricao, " salsas ~ "mezcl*" ")... WHERE CONTAINS(Descricao, "
"carne*" ~ "salsa empanada*" ")
O predicado FREETEXT
Ao utilizar este predicado se analisam todas as palavras das frases e nos devolve
comoresultado, aqueles registros que contém a frase completa ou algum fragmento da mesma.
Asintaxe é igual que o predicado CONTAINS.
... FREETEXT(descricao, ' "Em um lugar da mancha de cujo nome não quero me lembrar" ')
O predicado CONTAINSTABLE
Este predicado tem igual funcionamento e sintaxe que CONTAINS a diferença que neste
casodevolve uma tabela com duas colunas, a primeira chamada [KEY] contem o valor da
chaveprimária da tabela que a que buscamos, a segunda chamada RANK devolve um valor
indicandoa porcentagem de acerto na busca para cada registro.
SELECT Perguntas.Pergunta, Perguntas.Resposta, Resultado.RANKFROM Perguntas,
CONTAINSTABLE(Resposta, " SQL Server") AS ResultadoWHERE Perguntas.IdPergunta =
Resultado.[KEY]ORDER BY Resultado.RANK DescSELECT Perguntas.Pergunta,
Perguntas.Resposta, Resultado.RANKFROM Perguntas INNER JOIN CONTAINSTABLE
(Resposta, "SQL Server") AS ResultadoON Perguntas.IdPergunta = Resultados.KEY
O predicado FREETEXTTABLE
É o equivalente a CONTAINSTABLE porém realizando buscas de FREETEXT.
Informe de
Claudio
Mail:
claudio@lobocom.es
URL:
http://personal.lobocom.es/claudio/

Acesso ao banco de dados externos


Para o acesso a banco de dados externos se utiliza a cláusula IN. Pode-se acessar a banco
dedados dBase, Paradox ou Btrieve. Esta cláusula só permite a conexão de um banco de
dadosexterna por vez. Um banco de dados externo é um banco de dados que não seja o
ativo.Embora para melhorar os rendimentos é melhor anexá-los ao banco de dados atual e
trabalharcom eles.Para especificar um banco de dados que não pertence a Access Basic, se
agrega um ponto evírgula (;) ao nome e se fecha entre aspas simples. Também pode utilizar a
palavra reservadaDATABASE para especificar o banco de dados externo. Por exemplo, as linhas
seguintesespecificam a mesma tabela:
FROM Tabela IN '[dBASE IV; DATABASE=C: \DBANCO\DADOS\VENDAS;]';FROM Tabla IN
'C: \DBANCO\DADOS\VENDAS' 'dBASE IV;'
Acesso a um banco de dados externo de Microsoft Access:

SELECTIdCliente
Page 83 of 90Tutorial de SQL - Manual
completo11/07/2008http://www.criarweb.com/manuais/32/print.php

FROMClientesIN 'C:\MEUSDADOS.MDB'WHEREIDCliente Like 'A*'


(Onde MEUSDADOS.MDB é o nome de um banco e dados de Microsoft Access que contém
atabela Clientes.)
Acesso a um banco de dados externo de dBASE III ou IV:

SELECTIdClienteFROMClientesIN 'C:\DBANCO\DADOS\VENDAS' 'dBASE IV';WHEREIDCliente


Like 'A*'
(Para recuperar dados de uma tabela de dBASE III+ há que utilizar 'dBASE III+;' em lugar
de'dBASE IV;'.)
Acesso a um banco de dados de Paradox 3.x o 4.x:

SELECTIdClienteFROMClientesIN 'C:\PARADOX\DADOS\VENDAS' 'Paradox


4.x;'WHEREIDCliente Like 'A*'
(Para recuperar dados de uma tabela de Paradox versão 3.x, há que substituir 'Paradox 4.x;'por
'Paradox 3.x;'.)
Acesso a um banco de dados de Btrieve:

SELECTIdClienteFROMClientesIN 'C:\BTRIEVE\DADOS\VENDAS\FILE.DDF'
'Btrieve;'WHEREIDCliente Like 'A*'
(C:\BTRIEVE\DADOS\VENDAS\FILE.DDF é a rota de acesso e nome de arquivo do arquivo
dedefinição de dados de Btrieve.)
Informe de
Claudio
Mail:
claudio@lobocom.es
URL:
http://personal.lobocom.es/claudio/

Consultas com parâmetros e omissão de permissões

Consultas com parâmetros


As consultas com parâmetros são aquelas cujas condições de busca se definem
medianteparâmetros. Se se executam diretamente desde o banco de dados onde foram
definidasaparecerá uma mensagem solicitando o valor de cada um dos parâmetros. Se
desejarmosexecutá-las desde uma aplicação há que atribuir primeiro o valor dos parâmetros e
depoisexecutá-las. Sua sintaxe é a seguinte:PARAMETERS nome1 tipo1, nome2 tipo2, ... ,
nomeN tipoN Consulta
Page 84 of 90Tutorial de SQL - Manual
completo11/07/2008http://www.criarweb.com/manuais/32/print.php

Onde:Podem-se utilizar nomes, mas não tipos de dados em uma cláusula WHERE ou HAVING.
PARAMETERSPrecoMinimo Currency,DataInicio DateTime;SELECTIdPedido,
QuantidadeFROMPedidosWHEREPreco = PrecoMinimoANDDataPedido = DataInicio
Omitir as permissões de acesso
Em ambientes de bancos de dados com permissões de segurança para grupos de trabalho
sepode utilizar a cláusula WITH OWNERACCESS OPTION para que o usuário atual adquira
osdireitos de proprietário na hora de executar a consulta. Sua sintaxe é:instrução sql WITH
OWNERACCESS OPTION
SELECTSobrenome, Nome, SalarioFROMEmpregadosORDER BYSobrenomeWITH
OWNERACCESS OPTION
Esta opção requer que esteja declarado o acesso ao arquivo de grupo de trabalho
(geralmentesystem.mda ou system .mdw) do banco de dados atual.
Informe de
Claudio
Mail:
claudio@lobocom.es
URL:
http://personal.lobocom.es/claudio/

Procedures e busca de registros duplicados em SQL

Cláusula Procedure
Esta cláusula é pouco usual e se utiliza para criar uma consulta ao mesmo tempo que
seexecuta, opcionalmente define os parâmetros da mesma. Sua sintaxe é a seguinte:
PROCEDURE NomeConsulta ParÂmetro1 tipo1, .... ,ParâmetroN tipon ConsultaSQL
Onde:nome É o nome do parâmetrotipo É o tipo de dados do parâmetroconsulta Uma consulta
SQLNomeConsulta É o nome com o qual se salvará a consulta no banco de dados.Parâmetro É
o nome de parâmetro ou dos parâmetros de tal consulta.Tipo É o tipo de dados do parâmetro
Page 85 of 90Tutorial de SQL - Manual
completo11/07/2008http://www.criarweb.com/manuais/32/print.php

PROCEDUREListaCategorias;SELECT DISTINCTROWNomeCategoria,
IdCategoriaFROMCategoriasORDER BYNomeCategoria(Atribui o nome Lista_de_categorias à
consulta e a executa.)PROCEDUREResumoDataInicio DATETIME,DtaaFinal
DATETIME;SELECT DISTINCTROWDataEnvio, IdPedido, ImportePedido, Format(DataEnvio,
"yyyy") AS AnoFROMPedidosWHEREDataEnvio Between DataInicio And DataFinal(Atribui o
nome Resumo à consulta e inclui dois parâmetros.)
Busca de Registros Duplicados
Para gerar este tipo de consultas o mais simples é utilizar o assistente de consultas de
Access,editar a sentença SQL da consulta e colá-la em nosso código. Não obstante, este tipo
deconsulta se consegue da seguinte forma:
SELECT DISTINCT Lista de Campos a Visualizar FROM TabelaWHERE CampoDeBusca
In(SELECT CampoDeBusca FROM Tabela As pseudônimoGROUP BY CampoDeBusca
HAVING Count(*) > 1 )ORDER BY CampoDeBusca
Um caso prático, se desejarmos localizar aqueles empregados com nome igual e visualizar
seucódigo correspondente, a consulta seria a seguinte:
SELECT DISTINCTEmpregados.Nome,
Empregados.IdEmpregadoFROMEmpregadosWHEREEmpregados.NomeIn (SELECT Nome
FROM Empregados As Tmp GROUP BY Nome HAVING Count(*) > 1)ORDER
BYEmpregados.NomeInforme de
Claudio
Mail:
claudio@lobocom.es
URL:
http://personal.lobocom.es/claudio/

A função datepart() em Access


Há alguns dias tinha que fazer uma consulta sobre datas em Access: "Obter o nome
dasempresas cuja data de inscrição coincidia com "x" ano" e li um artigo publicado em uma
webcom o título: "Funções para buscas com datas em Access".Depois de ler este artigo soube
da existência da função DatePart(), porém a forma de colocá-laem prática tal como o problema
me enfocava, não é nada simples, ou nesse momento, não o viclaro. De fato, fazendo uma
busca, tudo era bastante confuso implementando programinhas emVBA (Visual Basic
Aplications). (Importante: O formato de data em Access é o formatoConsultaSQL É a consulta
que se deseja gravar e executar.
Page 86 of 90Tutorial de SQL - Manual
completo11/07/2008http://www.criarweb.com/manuais/32/print.php

americano: mm/dd/aaaa, porém neste caso o formato americano e o da tabela quanto ao anoque
se referem coincidem.)Se realizamos a seguinte consulta:
SELECT DatePart("yyyy",FECHA_ALTA) FROM table1;
Obtemos:Até tudo bem, o problema surge quando você quer obter só um tipo de data na qual o
anocoincida com um dado. Por exemplo, quero obter todas as empresas inscritas no ano 2003
evocê dispõe de 1000 empresas com 1000 datas de inscrição... Para isso, há que fazer
oseguinte:
SELECT *FROM Tabela1WHERE DatePart("yyyy",FECHA_ALTA)="2003";Informe de
Jonathan Soriano Folch
Mail:
jhonny_83_1@hotmail.com

Emular um Cursor SQL com um Loop


Graças a este truque de SQL Server 2000 você poderá emular o funcionamento de um cursor
Page 87 of 90Tutorial de SQL - Manual
completo11/07/2008http://www.criarweb.com/manuais/32/print.php

com um loop.Para isso criaremos uma tabela temporária onde colocaremos os elementos que
queremositerar no loop para poder tratá-los.
DECLARE@AnunciosTABLE(pk_id numeric(18, 0) NOT NULL IDENTITY (1, 1),Idtruco
numeric(18,0),IdUsuario numeric(18,0),Alias nvarchar(255),usuario nvarchar(255))Criamos duas
variáveis para poder iterar no loopDECLARE@Rows numeric,@i numeric(18,0)SET
@Rows=0SET @i=1Inserimos os dados na tabela temporária @anunciosINSERT
INTO@Anuncios(Idtruque,IdUsuario,Alias,Usuario)SELECTa.ARTID,a.ARTUSR,p.Alias,p.LonUsr
FROMTABELA_ANUNCIOS aINNER JOINTABELA_USUARIOS pON
a.ARTUSR=p.LONIDAtribuímos à variável contadora de filas totais o total da tabela
@anunciosSet @Rows=(SELECT TOP 1 PK_ID FROM @Anuncios order BY PK_ID
DESC)Iteramos com o while. Desta maneira podemos emular o funcionamento de um cursor
sem ser um cursor, podendoexecutá-lo as vezes que quisermos de uma só vez.WHILE @i <;=
@RowsBEGINDeclare@Idtruco numeric(18,0),@IdUsuario numeric(18,0),@Alias
nvarchar(255),@Usuario
nvarchar(255)SELECT@Idtruque=Idtruque,@IdUsuario=IdUsuario,@Alias=Alias,@Usuario=Usu
arioFROM@AnunciosWHEREpk_id=@iRealizar todas as ações!SET @i=@i + 1
Page 88 of 90Tutorial de SQL - Manual
completo11/07/2008http://www.criarweb.com/manuais/32/print.php

ENDInforme de
Pol Salvat
Mail:
dynk@telefonica.net
URL:
http://www.mistrucos.net

Tipos de instruções SQL e seus componentes sintáticos


Em SQL temos bastantes instruções que se podem utilizar para realizar diversas
tarefas.Dependendo das tarefas, estas sentenças se podem classificar em três grupos principais
(DML,DDL,DCL), embora nos restaria outro grupo que ao meu entender não está dentro
dalinguagem SQL, e sim da PLSQL.
Componentes sintáticos
A maioria de sentenças SQL tem a mesma estrutura.Todas começam por um verbo (select,
insert, update, create), a seguir continua com uma oumais cláusulas que nos dizem dados com
os que vamos operar (from, where), algumas destassão opcionais e outras obrigatórias como é o
caso do from.
INSTRUÇÃO DESCRIÇÃODML

Manipulação de dados
SELECTINSERTDELETEUPDATERecupera dados do banco de dados.Adiciona novas filas de
dados ao banco de dados.Suprime filas de dados do banco de dados.Modifica dados existentes
no banco de dados.
DDL

Definição de dados
CREATE TABLEDROP TABLEALTER TABLECREATE VIEWDROP VIEWCREATE
INDEXDROP INDEXCREATE SYNOYMDROP SYNONYMAdiciona uma nova tabela ao banco
de dados.Suprime uma tabela do banco de dados.Modifica a estrutura de uma tabela
existente.Adiciona uma nova vista ao banco de dados.Suprime uma vista do banco de
dados.Constrói um índice para uma coluna.Suprime o índice para uma coluna.Define um alias
para um nome de tabela.Suprime um alias para um nome de tabela.
DCL

Controle de acesso
GRANTREVOKE
Controle de transações
COMMITROLLBACKConcede privilégios de acesso a usuários.Suprime privilégios de acesso a
usuáriosFinaliza a transação atual.Aborta a transação atual.
PLSQL

SQL Programático
DECLAREOPENFETCHCLOSEDefine um cursor para uma consulta.Abre um cursor para
recuperar resultados de consulta.Recupera uma fila de resultados de consulta.Fecha um cursor.

Page 89 of 90Tutorial de SQL - Manual


completo11/07/2008http://www.criarweb.com/manuais/32/print.php
Informe de
Sara Alvarez Langa
Mail:
sara@desarrolloweb.com

Todos losdireitos de reprodução e difusãoreservados


Voltar

Page 90 of 90Tutorial de SQL - Manual


completo11/07/2008http://www.criarweb.com/manuais/32/print.php

Potrebbero piacerti anche