Академический Документы
Профессиональный Документы
Культура Документы
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
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
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
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
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
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
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
Informe de
Rubén Alvarez
Mail:
ruben@desarrolloweb.com
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
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
/*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
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:
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/
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";".
* = 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:
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
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.
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/
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
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/
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
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 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)
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/
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:
Nota:
Não é possível inserir filas se as colunas da vista contém cálculos ou funções.
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
[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
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
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
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
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
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/
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
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
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
Informe de
Alfredo Lotar
Mail:
alfredo.programador@bol.com.br
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
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
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
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
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
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
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
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
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
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
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/
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
SELECTIdCliente
Page 83 of 90Tutorial de SQL - Manual
completo11/07/2008http://www.criarweb.com/manuais/32/print.php
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/
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/
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/
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
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
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.