Você está na página 1de 90

Tutorial de SQL - Manual completo

Page 1 of 90

Tutorial de SQL
Manual por: Criar Web, manuais e recursos para desenvolvimento web Verso on-line: http://www.criarweb.com/manuais/32

O que SQL

As aplicaes em rede so cada dia mais numerosas e versteis. Em muitos casos, o esquema bsico de operao uma srie de scripts que dirigem o comportamento de uma base de dados. Devido diversidade de linguagens e de base de dados existentes, a maneira de comunicar entre umas e outras seria realmente complicado de providenciar, a no ser pela existncia de padres que nos permite realizar as operaes bsicas de una forma universal. justamente disso que se trata o Structured Query Language que no mais do que uma linguagem padro de comunicao com base de dados. Falamos portanto, de uma linguagem normalizada que nos permite trabalhar com qualquer tipo de linguagem (ASP ou PHP) em combinao com qualquer tipo de base de dados (MS Access, SQL Server, MySQL...).

O fato de ser padro no quer dizer que seja idntico para cada base de dados. Na prtica, determinadas bases de dados implementam funes especficas que no tm necessariamente que funcionar em outras. parte desta universalidade, o SQL possui outras duas caractersticas muito apreciadas. Por uma parte, apresenta potncia e versatilidade notveis que contrasta, por outra, com sua acessibilidade de aprendizagem.
Informe de Rubn Alvarez Mail: ruben@desarrolloweb.com

Tipos de campos

Um aspecto prvio a considerar a natureza dos valores que introduzimos nesses campos. Visto que um banco de dados trabalha com todo o tipo de informaes, importante especificar que tipo de valor estamos introduzindo de maneira a, por um lado, facilitar a busca posteriormente e por outro, otimizar os recursos de memria. Cada banco de dados introduz tipos de valores de campo que no necessariamente esto presentes em outros. Entretanto, existe um conjunto de tipos que esto representados na totalidade destes bancos. Estes tipos comuns so os seguintes: Alfanumricos Numricos Booleanos Contm cifras e letras. Apresentam uma longitude limitada (255 caracteres) Possuem duas formas: Verdadeiro e falso (Sim ou No)

Como sabemos, um banco de dados composto por tabelas onde armazenamos registros catalogados em funo de diferentes campos (caractersticas).

Existem de vrios tipos, principalmente, inteiros (sem decimais) e reais (com decimais).

http://www.criarweb.com/manuais/32/print.php

11/07/2008

Tutorial de SQL - Manual completo

Page 2 of 90

Datas Memos Autoincrementveis

Armazenam datas facilitando posteriormente sua explorao. Armazenar datas desta forma possibilita ordenar os registros por datas ou calcular os dias entre uma data e outra... So campos alfanumricos de longitude ilimitada. Apresentam o inconveniente de no poder ser indexados (veremos mais adiante o que isto quer dizer).

So campos numricos inteiros que incrementam em uma unidade seu valor para cada registro incorporado. Sua utilidade mais que evidente: Servir de identificador j que so exclusivos de um registro.

Informe de Rubn Alvarez Mail: ruben@desarrolloweb.com

Adicionar um novo registro


A sintaxe utilizada a seguinte:

Os registros podem ser introduzidos a partir de sentenas que empregam a instruo Insert. Insert Into nome_tabela (nome_campo1, nome_campo2,...) Values (valor_campo1, valor_campo2...)

Um exemplo simples a partir da nossa tabela modelo a introduo de um novo cliente que seria feito com uma instruo deste tipo: Insert Into clientes (nome, sobrenomes, endereo, cidade, cdigo postal, e-mail, pedidos) Values ('Pedro', 'Palotes', 'Percebe n13', 'Londrina', '123456', 'pedro@criarweb.com', 33)

Como se pode ver, os campos no numricos ou booleanos vo delimitados por apstrofes: '. Tambm interessante ver que o cdigo postal foi salvo como um campo no numrico. Isto devido a que em determinados pases (Inglaterra,por exemplo) os cdigos postais contm tambm letras.
Nota: Se desejarmos praticar com um banco de dados que est vazio, primeiro devemos criar as tabelas que vamos preencher. As tabelas tambm se criam com sentenas SQL e aprendemos a fazer isso no ltimo captulo. Embora, de qualquer forma, pode ser que seja mais cmodo utilizar um programa com interface grfica, como Access, que pode nos servir para criar as tabelas em banco de dados do prprio Access ou por ODBC a outros bancos de dados como SQL Server ou MySQL, por dar dois exemplos. Outra possibilidade em um banco de dados como MySQL, seria criar as tabelas utilizando um software como PhpMyAdmin.

Obviamente, no imprescindvel preencher todos os campos do registro. Porm, poder ser que determinados campos sejam necessrios. Estes campos necessrios podem ser definidos quando construirmos nossa tabela mediante o banco de dados.
Nota: Se no inserirmos um dos campos no banco de dados se iniciar com o valor padro que tivermos definido na hora de criar a tabela. Se no houver um valor padro, provavelmente se inicie como NULL (vazio), no caso de que este campo permita valores nulos. Se esse campo no permitir valores nulos (isso se define tambm ao criar a tabela) o mais seguro que a execuo da sentena SQL nos d um erro.

muito interessante, j veremos mais adiante o porqu, o introduzir durante a criao de nossa tabela um campo auto-incrementvel que nos permita atribuir um nico nmero a cada um dos registros. Deste modo, nossa tabela clientes apresentara para cada registro um

http://www.criarweb.com/manuais/32/print.php

11/07/2008

Tutorial de SQL - Manual completo

Page 3 of 90

nmero exclusivo do cliente que ser muito til quando consultarmos vrias tabelas simultaneamente.
Informe de Rubn Alvarez Mail: ruben@desarrolloweb.com

Apagar um registro

Para apagar um registro nos servimos da instruo Delete. Neste caso devemos especificar qual ou quais so os registros que queremos apagar. Por isso, necessrio estabelecer uma seleo que se realize mediante a clusula Where. A forma de selecionar ser vista; detalhadamente em captulos posteriores. Agora, nos contentaremos em mostrar qual o tipo de sintaxe utilizada para efetuar estas supresses: Delete From nome_tabela Where condicoes_de_selecao

Nota: Se desejarmos praticar com um banco de dados que estiver vazio, primeiro devemos criar as tabelas que vamos preencher. As tabelas tambm se criam com sentenas SQL que aprendemos a fazer no ltimo captulo.

Se quisermos, por exemplo, apagar todos os registros dos clientes que se chamarem Pedro, faramos da seguinte forma: Delete From clientes Where nome='Pedro' Temos que ter cuidado com esta instruo, pois se no especificarmos uma condio com Where, o que estamos fazendo apagar toda a tabela: Delete From clientes

Informe de Rubn Alvarez Mail: ruben@desarrolloweb.com

Update a instruo que nos serve para modificar nossos registros. Como para o caso de Delete, necessitamos especificar por meio de Where quais so os registros que queremos fazer efetivas nossas modificaes. Ademais, obviamente, teremos que especificar quais so os novos valores dos campos que desejamos atualizar. A sintaxe deste tipo: Update nome_tabela Set nome_campo1 = valor_campo1, nome_campo2 = valor_campo2,... Where condicoes_de_selecao Um exemplo aplicado: Update clientes Set nome='Jos' Where nome='Pedro'

Atualizar um registro

Mediante esta sentena mudamos o nome Pedro por Jos em todos os registros cujo nome seja Pedro. Aqui tambm h que ser cuidadoso de no esquecer de usar Where, do contrrio, modificaramos todos os registros de nossa tabela.
Informe de Rubn Alvarez Mail: ruben@desarrolloweb.com

http://www.criarweb.com/manuais/32/print.php

11/07/2008

Tutorial de SQL - Manual completo

Page 4 of 90

A seleo total ou parcial de uma tabela se realiza mediante a instruo Select. Em tal seleo h que especificar: -Os campos que queremos selecionar -A tabela na qual fazemos a seleo

Seleo de tabelas I

Em nossa tabela modelo de clientes poderamos fazer, por exemplo, uma seleo do nome e endereo dos clientes com uma instruo deste tipo: Select nome, endereo From clientes Se quisssemos selecionar todos os campos, ou seja, toda a tabela, poderamos utilizar o asterisco * da seguinte forma: Tambm muito til filtrar os registros mediante condies que vem expressas depois da clusula Where. Se quisssemos mostrar os clientes de uma determinada cidade usaramos uma expresso como esta: Select * From clientes Where cidade Like 'Rio de janeiro' Ademais, poderamos ordenar os resultados em funo de um ou vrios de seus campos. Para este ltimo exemplo poderamos orden-los por nome assim: Tendo em conta que pode haver mais de um cliente com o esmo nome, poderamos dar um segundo critrio que poderia ser o sobrenome: Select * From clientes Where cidade Like 'Rio de Janeiro' Order By nome, sobrenome Se invertssemos a ordem " nome,sobrenome " por " sobrenome, nome ", o resultado seria diferente. Teramos os clientes ordenados por sobrenome e aqueles que tivessem sobrenomes idnticos se sub-classificariam pelo nome. Select * From clientes Where cidade Like 'Rio de janeiro' Order By nome Select * From clientes

possvel tambm classificar por ordem inversa. Se por exemplo quisssemos ver nossos clientes por ordem de pedidos realizados tendo aos maiores em primeiro lugar escreveramos algo assim: Uma opo interessante a de efetuar selees sem coincidncia. Se por exemplo, buscssemos saber em que cidades se encontram nossos clientes sem a necessidade de que para isso aparea vrias vezes a mesma cidade, usaramos uma sentena desta classe: Select Distinct cidade From clientes Order By cidade Assim evitaramos ver repetido Rio de Janeiro tantas vezes quantos clientes tivermos nessa cidade. Select * From clientes Order By pedidos Decres

Informe de Rubn Alvarez

http://www.criarweb.com/manuais/32/print.php

11/07/2008

Tutorial de SQL - Manual completo

Page 5 of 90

Mail: ruben@desarrolloweb.com

Quisemos compilar na forma de tabela certos operadores que podem ser teis em determinados casos. Estes operadores sero utilizados depois da clusula Where e podem ser combinados habilmente mediante parnteses para otimizar nossa seleo a nveis bastante altos.

Seleo de tabelas II

Operadores matemticos:
> < Maior que >= <= <> = Menor que Maior ou igual que Diferente Igual

Menor ou igual que

Operadores lgicos
And Not Or

Like In e Not In

Seleciona os registros cujo valor de campo se assemelhe, no tendo em conta maisculas e minsculas. D um conjunto de valores para um campo para os quais a condio de seleo (ou no) vlida Seleciona os registros compreendidos em um intervalo Seleciona os registros no coincidentes Classifica os registros por ordem inversa

Outros operadores

Is Null e Is Not Null Between...And Distinct Desc

Seleciona aqueles registros onde o campo especificado est (ou no) vazio.

* _

% Substitui a qualquer coisa ou nada dentro de uma cadeia Substitui s um caractere dentro de uma cadeia

Substitui a todos os campos

Curingas

Vejamos a seguir aplicaes prticas destes operadores.

Nesta sentena selecionamos todos os clientes de Salvador cujo nome no seja Jose. Como se pode ver, empregamos Like ao invs de = simplesmente para evitar inconvenientes devido ao emprego ou no de maisculas.

http://www.criarweb.com/manuais/32/print.php

11/07/2008

Tutorial de SQL - Manual completo

Page 6 of 90

Select * From clientes Where cidade Like 'salvador' And Not nome Like 'Jose'

Se quisssemos recolher em uma seleo aos clientes de nossa tabela cujo sobrenome comea por A e cujo nmero de pedidos esteja compreendido entre 20 e 40: O operador In, ser visto mais adiante, muito prtico para consultas em vrias tabelas. Para casos 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 trs cidades. Select * From clientes Where sobrenomes like 'A%' And pedidos Between 20 And 40

Informe de Rubn Alvarez Mail: ruben@desarrolloweb.com

Seleo de tabelas III

Um banco de dados pode ser considerado como um conjunto de tabelas. Estas tabelas, em muitos casos, esto relacionadas entre elas e se complementam unas com outras.

Deste modo poderamos facilmente obter informaes contidas nessas trs tabelas como pode ser a designao do artigo mais popular em uma determinada regio onde a designao do artigo seria obtida na tabela de artigos, a popularidade (quantidade de vezes que esse artigo foi vendido) viria da tabela de pedidos e a regio estaria compreendida obviamente na tabela clientes. Este tipo de organizao baseada em mltiplas tabelas conectadas nos permite trabalhar com tabelas muito mais manejveis e ao mesmo tempo, nos evita copiar o mesmo campo em vrios lugares j que podemos acessa-lo a partir de uma simples chamada tabela que o contm. Neste captulo veremos como, usando o que foi aprendido at agora, podemos realizar facilmente selees sobre vrias tabelas. Definiremos antes de nada as diferentes tabelas e campos que vamos utilizar em nossos exemplos: Nome campo id_cliente nome

Fazendo referncia ao nosso clssico exemplo de um banco de dados para uma aplicao de ecomercio, a tabela clientes que estivemos falando pode estar perfeitamente coordenada com uma tabela onde armazenamos os pedidos realizados por cada cliente. Esta tabela de pedidos pode por sua vez, estar conectada com uma tabela onde armazenamos os dados correspondentes a cada artigo do inventrio.

Tabela de clientes
Texto Texto Texto Texto Texto Texto

Numrico inteiro

Tipo campo

sobrenomes endereo cidade cep

telefone email

Numrico inteiro

http://www.criarweb.com/manuais/32/print.php

11/07/2008

Tutorial de SQL - Manual completo

Page 7 of 90

Nome campo id_pedido id_cliente id_artigo data

Tabela de pedidos

Numrico inteiro Numrico inteiro Numrico inteiro Numrico inteiro Data

Tipo campo

quantidade

Nome campo id_artigo autor titulo

Tabela de artigos

Numrico inteiro Alfanumrico Alfanumrico Numrico real Alfanumrico

Tipo campo

editorial preo

Estas tabelas podem ser utilizadas simultaneamente para extrair informaes de todo tipo. Suponhamos que queremos enviar um mailing a todos aqueles que tiverem realizado um pedido nesse mesmo dia. Poderamos escrever algo assim: Select clientes.sobrenomes, clientes.email From clientes,pedidos Where pedidos.data like '25/02/00' And pedidos.id_cliente= clientes.id_cliente

Como pode ser visto desta vez, depois da clusula From, introduzimos o nome das duas tabelas de onde tiramos as informaes. Ademais, o nome de cada campo vai precedido da tabela de provenincia separado ambos por um ponto. Nos campos que possuem um nome que s aparece em uma das tabelas, no necessrio especificar sua origem embora na hora de ler sua sentena possa ser mais claro tendo esta informao mais precisa. Neste caso, o campo data poderia ter sido designado como "data" ao invs de "pedidos.data". Vejamos outro exemplo mais para consolidar estes novos conceitos. Desta vez queremos ver o ttulo do livro correspondente a cada um dos pedidos realizados: Select pedidos.id_pedido, artigos.titulo From pedidos, artigos Where pedidos.id_artigo=artigos.id_artigo

Na verdade a filosofia continua sendo a mesma que para a consulta de uma nica tabela.
Informe de Rubn Alvarez Mail: ruben@desarrolloweb.com

Seleo de tabelas IV

Alm dos critrios at agora explicados para realizar as consultas em tabelas, SQL permite tambm aplicar um conjunto de funes pr-definidas. Estas funes, embora sejam bsicas,

http://www.criarweb.com/manuais/32/print.php

11/07/2008

Tutorial de SQL - Manual completo

Page 8 of 90

podem nos ajudar em alguns momentos a expressar nossa seleo de uma maneira mais simples sem ter que recorrer a operaes adicionais por parte do script que estivermos executando. Algumas destas funes so representadas na seguinte tabela:

Soma(campo) Calcula a soma dos registros do campo especificado Count(*)

Funo

Descrio

Avg(Campo) Calcula a mdia dos registros do campo especificado

Max(Campo) Indica qual o valor mximo do campo Min(Campo) Indica qual o valor mnimo do campo

Proporciona o valor do nmero de registros que foram selecionados

Dado que o campo da funo no existe no banco de dados, pois o estamos gerando virtualmente, isto pode criar inconvenientes quando estivermos trabalhando com nossos scripts na hora de tratar seu valor e seu nome de campo. por isso que o valor da funo tem que ser recuperada a partir de um apelido que ns especificaremos na sentena SQL a partir da instruo AS. A coisa poderia ficar assim: Select Soma(total) As soma_pedidos From pedidos A partir desta sentena calculamos a soma dos valores de todos os pedidos realizados e armazenamos esse valor em um campo virtual chamado soma_pedidos que poder ser utilizado como qualquer outro campo por nossas pginas dinmicas. Obviamente, tudo que foi visto at agora pode ser aplicado neste tipo de funes de modo que, por exemplo, podemos estabelecer condies com a clusula Where construindo sentenas como esta: Isto nos proporcionaria a quantidade de exemplares de um determinado livro que foram vendidos. Outra propriedade interessante destas funes que permitem realizar operaes com vrios campos dentro de um mesmo parnteses: Select Avg(total/quantidade) From pedidos Select Soma(quantidade) as soma_artigos From pedidos Where id_artigo=6

Esta sentena d como resultado o preo mdio que esto sendo vendidos os livros. Este resultado no tem porqu coincidir com o do preo mdio dos livros presentes no inventrio, j que, pode ser que as pessoas tenham tendncia a comprar os livros caros ou os baratos: Select Avg(precio) as preco_venda From artigos Uma clusula interessante no uso das funes Group By. Esta clusula nos permite agrupar registros aos quais vamos aplicar a funo. Podemos por exemplo calcular o dinheiro gastado por cada cliente: Select id_cliente, Soma(total) as soma_pedidos From pedidos Group By id_cliente Select id_cliente, Count(*) as numero_pedidos From pedidos Group By id_cliente Ou saber o nmero de pedidos que foram realizados:

http://www.criarweb.com/manuais/32/print.php

11/07/2008

Tutorial de SQL - Manual completo

Page 9 of 90

As possibilidades como vemos so numerosas e pode ser prticas. Agora tudo fica disposio de nossas ocorrncias e imaginao.
Informe de Rubn Alvarez Mail: ruben@desarrolloweb.com

Aproveite seu banco de dados

Bancos de dados deixaram h muito de ser simplesmente um repositrio de informaes usados para, no mximo, organizar registros de tal forma que posteriormente pudessem ser indexados e/ou recuperados de alguma forma. Hoje eles so ferramentas poderosas nas tomadas de decises dentro das empresas que, aproveitando-se da grande quantidade de dados l existentes, extraem anlises de vrios tipos para executarem os prximos movimentos e aes em seus mercados. Mas o banco de dados por s no opera milagres. necessria a presena de um profissional conhecedor de suas ferramentas e entranhas para tirar dele tudo aquilo que possvel. Este profissional normalmente conhecido por DBA (Database Administrator) a pea fundamental neste processo.

Por outro lado, os desenvolvedores de software mesmo no sendo especialistas em bancos de dados como os DBA's, podem (e devem) aproveitar um pouco do que oferecido por estas ferramentas para criar aplicaes mais rpidas, mais enxutas e mais limpas, aproveitando funes existentes mas que na maioria das vezes so esquecidas no momento do desenvolvimento. Sobre isso que vamos falar hoje: aproveitamento de funes de bancos de dados.

Obs: neste artigo usarei exemplos com o banco de dados MySQL e a linguagem PHP. Entretanto com toda a certeza eles podem ser usados tambm com outras bases e linguagens de forma semelheante. Somando valores, e concatenando campos Com uma frequncia impressionante, precisamos somar valores vindos de uma base de dados. Para fazer isso dentro do cdigo do programa, podemos ter: $Rst = mysql_query("SELECT valor FROM tabela",$conexao); while($valor=mysql_fetch_row($Rst)){ $resultado = $resultado + $valor[0]; } print $resultado; Mas, que tal assim: $Rst = mysql_fetch_row(mysql_query("SELECT SUM(valor) FROM tabela", $conexao)); print $Rst[0]; Hmmm... de 5 linhas para duas? Mas como?

O segredo est na funo SUM usada na segunda instruo. Ela simplesmente soma os valores do campo e reduz um lao dentro do cdigo. Com isso temos mais eficincia, velocidade

http://www.criarweb.com/manuais/32/print.php

11/07/2008

Tutorial de SQL - Manual completo

Page 10 of 90

e cdigo limpo.

Um outro exemplo interessante pode ser visto quando, por exemplo, precisamos concatenar (unir) dois campos. Para criar uma tabela no cdigo, faramos assim: $Rst = mysql_query("SELECT nome, sobrenome FROM tabela",$conexao); while($valor=mysql_fetch_row($Rst)){ echo 'Nome Completo: '.$valor[0].$valor[1].'<br>'; } Mas tambm pode ser feito assim: $Rst = mysql_query("SELECT CONCAT(nome, sobrenome) FROM tabela",$conexao); while($valor=mysql_fetch_row($Rst)){ echo 'Nome Completo: '.$valor[0].'<br>'; } Observe que no temos reduo de linhas mas de caracteres que deixam o cdigo mais limpo e aproveitamos o processamento do banco ao invs do servidor web. A concatenao feita pela funo CONCAT no segundo exemplo e depois somente precisamos imprimir uma varivel, ao invs de duas, evitando assim problemas de interpretao. Datas? No 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 tambm possuem um conjunto interessante de funes para a manipulao de datas. Vamos ver algumas. A data atual

J vi muito programador criar funo para a insero de datas dentro de registros em bases de dados. Acredito que isso seja por no conhecer uma pequena mas muito til funo chamada now(). Com ela, a data e/ou hora atual so armazenadas em campos que necessitam este valor. mysql_query("INSERT INTO tabela (data) VALUES (now())",$conexao); Esta funo simplesmente pega a informao de data e hora do servidor e insere no campo que deseja (neste exemplo, em data). Mas cuidado; se o servidor est com a data/hora erradas, o valor que ser inserido tambm estar errado. Assim interessante manter o servidor com horrio sempre sincronizado com time servers existentes na Internet.

Alm disso, em alguns momentos precisamos saber em que semana estamos do ano ou ainda quantas semanas faltam para o fim do ano. Ao invs de complexos cdigos de linguagem, podemos usar a base de dados para nos informar este resultado rapidamente. Por exemplo, em que semana do ms estamos agora? print mysql_result(mysql_query("SELECT WEEK(now())",$conexao),0); // resultado: 18

http://www.criarweb.com/manuais/32/print.php

11/07/2008

Tutorial de SQL - Manual completo

Page 11 of 90

Aqui foi usada a funo WEEK que retorna o nmero da semana de uma determinada data. Neste caso, a data informada hoje pois usamos como parmetro de data a funo now() que, como j apresentado anteriormente, a data atual do servidor.

Outra tarefa comum com datas a soma de dias em uma data especfica. Pode parecer simples mas como o formato de data diferente de formatos numricos e strings, muitas vezes o resultado est errado e no sabemos porqu. A forma mais simples novamente deixar o banco de dados trabalhar por voc. Ento para acrescentar, por exemplo, dez dias data atual, fazemos: print mysql_result(mysql_query("SELECT DATE_ADD(now(),INTERVAL 10 DAY)",$conexao),0); // resultado: 2006-05-16 Com isso temos, em uma nica linha, o valor que precisamos com a certeza que se trata de uma data vlida, 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). Concluso Pequenas e simples funes quando bem utilizadas facilitam a vida de qualquer desenvolvedor. Assim, antes de quebrar a cabea com dezenas de linhas de cdigo para resolver um problema ou demanda, procure saber se as ferramentas que est utilizando no dispem de formas mais simples para a soluo deste problema. Muitas vezes a soluo mais simples est diante dos olhos e perdemos tempo tentando algo diferente. Estes exemplos so pequenos e simples se comparados a enorme gama de opes existentes nas bases de dados. Funes para data, strings, funes matemticas e outras tantas esto disponveis na maioria das bases de dados relacionais existentes hoje em dia. Para o MySQL, acesse http://dev.mysql.com/doc/refman/4.1/pt/functions.html. J para o PostgreSQL, acesse http://www.postgresql.org/docs/8.1/static/functions.html Espero que tenha gostado e aprendido um pouco mais. Abraos!

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

Obs: Os cdigos deste artigo podem ser encontrados em http://www.michelazzo.com.br na seo de downloads.

Tabelas temporrias no Sql Server

A sintaxe para criar uma tabela temporria no Sql Server bastante simples, basta acrescentar o # antes do nome da mesma. Sintaxe:

http://www.criarweb.com/manuais/32/print.php

11/07/2008

Tutorial de SQL - Manual completo

Page 12 of 90

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

Tabelas temporrias so muito utilizadas quando precisamos reunir vrios registros de vrias tabelas em uma nica seleo e exibi-las em uma aplicao qualquer (p.ex.: Delphi, Visual Studio, ASP.NET, etc.). . fundamental para aplicaes cliente/servidor onde vrios usurios esto acessando aquela procedure ao mesmo tempo.

Aqui vai um exemplo prtico da utilizao de tabelas temporrias. importante saber que a tabela temporria s existe enquanto a procedure est sendo executada, aps a execuo da mesma ela automaticamente excluda. Aproveitei para colocar um exemplo utilizando o CASE do Sql Server CREATE PROCEDURE TesteTabelaTemporaria as

create 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, null from Acessos AS AC INNER JOIN CadastroTB AS C ON AC.idcad = C.idCad group by DATEPART(MONTH,data)) select mes, totalmes, media = case when mes = 1 then totalmes / 31 when mes = 2 then totalmes / 28 when mes = 3 then totalmes / 30 when mes = 4 then totalmes / 31 when mes = 5 then totalmes / 30 when mes = 6 then totalmes / 31 when mes = 7 then totalmes / 30 when mes = 8 then totalmes / 31 when mes = 9 then totalmes / 30 when mes = 10 then totalmes / 31 when mes = 11 then totalmes / 30 when mes = 12 then totalmes / 31 end from #tmpTotalPage

Por enquanto s, at a prxima pessoal!


Informe de Fabio Correa URL: http://www.devmedia.com.br

Adquirindo informaes do Usurio com a classe System

http://www.criarweb.com/manuais/32/print.php

11/07/2008

Tutorial de SQL - Manual completo

Page 13 of 90

Acredito que muitas pessoas j tiveram a necessidade de saber qual o nome do sistema operacional de um usurio, o seu login do Windows, o diretrio home etc. em suas aplicaes. Se voc um dos que se enquadram nessa situao, saiba que existe uma forma de adquirir essas informaes: atravs da funo 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 sada:

Usurio: GLAUCIO Sistema Operacional: WINDOWS XP

os.arch Retorna a arquitetura do Sistema operacional os.version Retorna a verso do Sistema operacional os.name Nome do Sistema Operacional java.version Retorna a verso da JRE java.home Diretrio de Instalao Java java.class.path Retorna o Class Path user.home Diretrio home do usurio user.name Nome da conta do usurio A lista completa encontra-se neste endereo:

Abaixo seguem alguns parmetros para a funo getProperty():

Essa recurso tambm pode ser usado em JSPs: Cdigo da JSP:

http://java.sun.com/j2se/1.4.2/docs/api/java/lang/System.html#getProperties()

Sada:

http://www.criarweb.com/manuais/32/print.php

11/07/2008

Tutorial de SQL - Manual completo

Page 14 of 90

Esse tipo de funo permite que, por exemplo, quando um usurio acessar o sistema, seu login seja obrigatoriamente o mesmo do Sistema Operacional. Isso oferece ao administrador do sistema total controle de quem est usando a ferramenta, garantindo que o usurio possui uma conta na Intranet.
Informe de Glaucio Guerra URL: http://www.devmedia.com.br

Alguns truques prticos

Em pginas do tipo portal nas que nas laterais se encontram links que so impressos a partir de bancos de dados (distintas sees, servios,...) existe sempre um efeito lentalizador devido a que se trata de pginas altamente visitadas que efetuam mltiplas chamadas a BD sistematicamente em cada uma de suas pginas. Uma forma de agilizar a visualizao destas pginas textualizando estes links a partir de scripts internos. Colocamos o exemplo de Criarweb:

Eliminar chamadas aos bancos de dados

Como se pode ver, na lateral existem sees como "Suas Pginas", "Manuais" cujos links esto armazenados no banco de dados. Entretanto, os links que se visualizam na pgina no foram obtidos por chamadas a banco de dados e sim que, cada vez que um novo elemento da seo adicionado, isto se atualiza automaticamente, por meio de um script, um arquivo texto no qual o novo link includo e o mais antigo eliminado. De fato, este arquivo de texto o que inserido no cdigo fonte da pgina. Deste modo, evitamos meia dzia de chamadas a bancos de dados cada vez que uma pgina vista, o qual permite otimizar recursos de servidor de uma maneira significativa. Eliminar palavras curtas e repeties Em situaes na qual nosso banco de dados tem que armazenar campos de texto extremamente longos, e tais campos so requeridos para realizar selees do tipo LIKE '%

http://www.criarweb.com/manuais/32/print.php

11/07/2008

Tutorial de SQL - Manual completo

Page 15 of 90

algo%', os recursos do BD podem se ver sensivelmente minguados Uma forma de ajudar a gerenciar este tipo de buscas incluindo um campo adicional.

Este campo adicional pode ser criado automaticamente por meio de scripts e nele incluiramos o texto original, do qual teremos eliminado palavras triviais como artigos, preposies ou possessivos. Alm disso, nos encarregaremos de eliminar as palavras que estiverem repetidas. Desta forma poderemos diminuir sensivelmente o tamanho do campo que vai ser realmente consultado. Comentamos em outros captulos que os campos de texto de mais de 255 caracteres denominados memo no podem ser indexados. Se ainda depois desta primeira filtragem nosso campo continuar sendo longo demais para ser indexado, o que se pode fazer corta-lo em pedaos de 255 caracteres de maneira que o armazenemos em diferentes campos que podero ser indexados e portanto, consultados com maior rapidez.
Informe de Rubn Alvarez Mail: ruben@desarrolloweb.com

Criao de tabelas

Entretanto, uma vez que o banco de dados esteja hospedado no servidor, pode acontecer o caso de que queiramos introduzir uma nova tabela j seja com carter temporrio (para gerenciar um carrinho de compra, por exemplo) ou permanente, por necessidades concretas de nossa aplicao. Nestes casos, podemos, a partir de uma sentena SQL, criar a tabela com o formato que desejarmos, o qual pode nos poupar mais que um quebra-cabea.

Em geral, a maioria dos bancos de dados possui potentes editores de bancos que permitem a criao rpida e simples de qualquer tipo de tabela com qualquer tipo de formato.

Estes tipos de sentenas so especialmente teis para bancos de dados como Mysql, os quais trabalham diretamente com comandos SQL e no por meio de editores.

Para criar uma tabela devemos especificar diversos dados: O nome que queremos atribuir, os nomes dos campos e suas caractersticas. Ademais, pode ser necessrio especificar quais destes campos vo ser ndices e de que tipo sero.

A sintaxe de criao pode variar ligeiramente de um banco de dados para outro j que os tipos de campos aceitos, no estaro completamente padronizados. A seguir explicamos meramente a sintaxe desta sentena e lhes propomos uma srie de exemplos: Sintaxe Create Table nome_tabela ( nome_campo_1 tipo_1 nome_campo_2 tipo_2 nome_campo_n tipo_n Key(campo_x,...) )

Ponhamos agora como exemplo a criao da tabela pedidos que empregamos em captulos anteriores:

http://www.criarweb.com/manuais/32/print.php

11/07/2008

Tutorial de SQL - Manual completo

Page 16 of 90

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 so considerados de tipo inteiro de uma longitude especificada pelo nmero entre parnteses. Para id_pedido requeremos que tal campo se incremente automaticamente (AUTO_INCREMENT) de uma unidade a cada introduo a um novo registro para, desta forma, automatizar sua criao. Por outro lado, para evitar uma mensagem de erro, necessrio requerer que os campos que vo ser definidos como ndices no possam ser nulos (NOT NULL).

O campo data armazenado com formato de data (DATE) para permitir sua correta explorao a partir das funes previstas a tal efeito.

Finalmente, definimos os ndices numerando-os entre parnteses precedidos da palavra KEY ou INDEX. Da mesma forma poderamos criar a tabela de artigos com uma sentena 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 alfanumricos so introduzidos da mesma forma que os numricos. Voltemos a recordar que em tabelas que tm campos comuns de vital importncia definir estes campos da mesma forma para o bom funcionamento da base.

Muitas so as opes que se oferecem ao gerar tabelas. No vamos a trata-las detalhadamente, pois sai do estritamente prtico. Mostraremos somente alguns dos tipos de campos que podem ser empregados na criao de tabelas com suas caractersticas: INT ou INTEGER CHAR DATE

Tipo

Bytes
4 8

Descrio

DOUBLE ou REAL VARCHAR BLOB

Nmeros inteiros. Existem outros tipos de maior ou menor longitude especficos de cada banco de dados. Alfanumricos de longitude fixa pr-definida

1/caractere+1 Alfanumricos de longitude varivel 1/caractere+2 Grandes textos no indexveis 1 3

1/caractere

Nmeros reais (grandes e com decimais). Permitem armazenar todo tipo de nmero no inteiro.

Datas, existem mltiplos formatos especficos de cada banco de dados Armazenam um bit de informao (verdadeiro ou falso)

BIT ou BOOLEAN

http://www.criarweb.com/manuais/32/print.php

11/07/2008

Tutorial de SQL - Manual completo

Page 17 of 90

Informe de Rubn Alvarez Mail: ruben@desarrolloweb.com

SQL e Programao de Banco de Dados

Quero me apresentar a voc e iniciar um contato peridico para tratarmos assuntos relacionados linguagem SQL e programao de banco de dados. Trabalho com banco de dados h algum tempo e sei o quanto importante trocar experincias com outros profissionais. Ningum capaz de extrair o mximo de um banco de dados, mas, juntos, podemos realizar mais e de uma maneira cada vez melhor. Minha experincia maior tem sido desenvolvida junto ao banco de dados Oracle, mas a padronizao do comando SQL e pelo fato de os conceitos de programao de um banco de dados serem facilmente aplicados a qualquer outro banco de dados, faz com que possamos tratar destes assuntos quase que universalmente. SQL

A linguagem SQL (Structured Query Language) a base para utilizao de bancos de dados relacionais. Com a utilizao dos comandos bsicos (INSERT, DELETE, UPDATE e SELECT) podese resolver a maior parte dos problemas relacionados a manuteno e extrao de dados no banco de dados. Com o SQL possvel criar as estruturas bsicas de armazenamento, como tabelas e ndices. Tambm h comandos especficos da linguagem para o controle e segurana relacionado a um banco de dados. Em princpio, os comandos SQL so divididos em: DDL (Data Definition Language) ou Linguagem de definio de dados DML (Data Manipulation Language) ou Linguagem de manipulao de dados DQL (Data Query Language) ou Linguagem de recuperao de dados DCL (Data Control Language) ou Linguagem de controle de dados

O SQL tem sido aprimorado ao longo do tempo. Duas entidades (ANSI American National Standards Institute e ISO International Standards Organization) vm, desde 1986, publicando padres de especificao da linguagem SQL. Vamos discutir como abordar e tirar o mximo de proveito desta linguagem que extremamente importante para todos os profissionais de banco de dados. Os principais tpicos que sero de interesse envolvem: Fundamentos da linguagem SQL Extenses e particularidades de cada banco de dados Melhoria no desempenho de consultas Utilizao de funes analticas em banco de dados Tendncias do uso da linguagem

Naturalmente a idia ter uma viso prtica, com exemplos e com a abertura de uma discusso entre todos os leitores. Programao de Banco de Dados Os comandos da linguagem SQL so muito poderosos, mas normalmente consegue-se melhorar o desempenho das aplicaes atravs da programao do banco de dados. Ao desenvolver mdulos que sejam executados diretamente no servidor diminui-se o trfego de informaes na rede, esconde-se boa parte das estruturas das tabelas e agiliza-se o processamento e retorno das mensagens. Internamento o banco de dados possui mecanismos integrados que permitem unir as estruturas tradicionais de programao com os comandos SQL.

http://www.criarweb.com/manuais/32/print.php

11/07/2008

Tutorial de SQL - Manual completo

Page 18 of 90

O banco de dados possui mecanismos prprios que podem ser utilizados em favor do desenvolvedor. Cada banco de dados possui um conjunto especfico de comandos que definem a linguagem de programao do banco de dados. No caso do Oracle, a linguagem o PL/SQL, o SQL Server possui o Transact-SQL, o DB2 possui sua prpria linguagem de programao, o PostGreSQL possui diversas extenses que podem ser utilizadas como linguagem de programao e o MySQL lanou sua mais recente verso com a possibilidade de programar o servidor. Cada banco de dados nico sob este aspecto, mas todos trabalham sobre os mesmos conceitos. possvel criar mdulos programveis, como funes, procedimentos, objetos, pacotes, gatilhos, etc. Em todos os casos, h um engine responsvel pela integrao e execuo dos mdulos no servidor de banco de dados. Desta forma, os tpicos que sero trabalhados sero: Fundamentos de programao de banco de dados Aspectos avanados da programao Desempenho dos mdulos Programao aliada extrao de dados gerenciais Tendncias em programao de banco de dados

Como se pode notar, os tpicos so quase os mesmos da linguagem SQL. Tambm teremos artigos que podero ser implementados, testados e melhorados por todos os leitores.
Informe de Eber M. Duarte URL: http://www.devmedia.com.br

Funes para buscas com datas em Access

Buscas com datas em Access Recebemos uma pergunta recentemente de um amigo que desejava realizar buscas em Access utilizando, nas condies do Where, campos do tipo data. Depois de vrias tentativas resgatamos umas anotaes que podem ser interessantes para publicar. Seguro que servem de ajuda a outras pessoas que tenham que trabalhar com datas em consultas de Access. A consulta era a seguinte:

Tenho uma tabela com vrios campos. Dois deles so datas, que correspondem com um intervalo. Um deles a data de incio 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 cujo intervalo 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 operadores aritmticos. Em alguns casos obtivemos a resposta esperada, porm nem sempre funcionavam as sentenas e tnhamos problemas ao executa-las desde Access ou desde o servidor web, porque no devolviam os mesmos resultados. Funo DateDiff()

Afinal, a resposta que propusemos passou por utilizar a funo DateDiff, que serve para obter a diferena entre duas datas. Por exemplo: DateDiff("y", #06/10/2004#, Now())

http://www.criarweb.com/manuais/32/print.php

11/07/2008

Tutorial de SQL - Manual completo

Page 19 of 90

Conta-nos os dias que passaram desde seis de outubro de 2004.

Ns podemos utiliza-la como condio em um where de uma sentena SQL. Por exemplo, para uma sentena como esta: DateDiff("y",A,B)

Se so iguais, a funo devolver zero. Se A uma data anterior a B, ento a funo devolver um nmero de dias que ser maior que zero. Se A uma data posterior a B, ento devolver um nmero de dias que ser menor que zero. Temos que comparar o dia de hoje com as datas desde e ate. Hoje tem que ser maior que desde e menor que ate. Fica como resultado esta sentena:
SELECT * FROM vuelos WHERE DateDiff('y',datadesde,now())>=0 and DateDiff('y',dataate,nom())<=0 Nota: H que ter cuidado com o idioma das datas, pois em portugus se escrevem de maneira diferente que em ingls. Access tenta interpretar a data corretamente, por exemplo, se introduzimos 02/26/04 pensar que est trabalhando em datas em ingls e se introduzimos 26/02/04 pensar que estamos escrevendo as datas em portugus. O problema com uma data como 02/02/04 que seu valor depender de como esteja configurado o Access, em portugus ou em ingls.

Funo DatePart Serve para extrair parte de uma data. Recebe dois parmetros, o primeiro indica mediante um string a parte a obter. O outro parmetro a data com a que se deseja trabalhar. DatePart("m",data) Neste caso est sendo indicado que se deseja obter o ms do ano. Outro valor possvel para o primeiro pargrafo , por exemplo "yyyy", que se utiliza para obter o ano com quatro dgitos. Um exemplo de sentena SQL que utiliza esta funo pode ser a seguinte:
SELECT DatePart("yyyy",validadedesde) FROM voos

Funo DateAdd

Esta ltima funo que vamos ver no presente artigo serve para acrescentar data, algo como dias, meses ou anos. Para isso a funo recebe trs parmetros, o primeiro corresponde com um string para indicar as unidades do que desejamos acrescentar, por exemplo, dias, meses ou anos. O segundo parmetro o nmero de dias, meses ou anos a adicionar e o terceiro parmetro a data a qual somar esses valores. Vemos um exemplo de sua sintaxe: DateAdd("yyyy",10,validadedesde) Neste exemplo a funo DateAdd devolveria uma data dez anos posterior a validadedesde. Outros valores para o string do primeiro parmetro so "d", para acrescentar dias, ou "m", para acrescentar meses. Um exemplo do funcionamento desta funo em uma sentena SQL a seguinte:
SELECT DateAdd("yyyy",10,validadedesde) FROM voos Informe de M. A. A. Traduo Juliana Monteiro Mail: juliana@criarweb.com

http://www.criarweb.com/manuais/32/print.php

11/07/2008

Tutorial de SQL - Manual completo

Page 20 of 90

Funo em SQL para o clculo de dias de trabalho


/*Primeiramente declaramos que vamos criar uma funo, neste caso se chama Dif Dias e recebe dois parmetros, a data inicial do perodo e a final*/ CREATE FUNCTION DifDias(@StartDate DATETIME,@EndDate DATETIME) RETURNS integer AS Begin //Com esta variavel calculamos quantos dias "normais" existem na classe de datas DECLARE @DaysBetween INT //Com esta variavel acumulamos os dias totais DECLARE @BusinessDays INT //esta variavel nos serve de contador para saber quando chegarmos ao ultimo dia da classe DECLARE @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 variaveis SELECT @DaysBetween = 0 SELECT @BusinessDays = 0 SELECT @Cnt=0 //Calculamos quantos dias normais existem na classe de datas SELECT @DaysBetween = DATEDIFF(DAY,@StartDate,@EndDate) + 1 /*Ordenamos o formato das datas para que no importando como se proporcionem se comparem igual*/ SELECT @ini = (SELECT CAST((CAST(datepart(dd,@StartDate)AS VARCHAR(2))+'/'+ CAST(datepart(mm,@StartDate)AS VARCHAR(2))+'/'+CAST(datepart(yy,@StartDate)AS VARCHAR(4))) as varchar(10))) SELECT @fin = (SELECT CAST((CAST(datepart(dd,@EndDate)AS VARCHAR(2))+'/'+ CAST(datepart(mm,@EndDate)AS VARCHAR(2))+'/'+ CAST(datepart(yy,@EndDate)AS VARCHAR(4)))as varchar(10))) //Comparam-se as duas datas IF @ini <>@fin BEGIN /*Se a diferenca de datas for igual a dois, eh porque so foi transcorrido um dia, portanto somente se valida de que nao vai marcar dias de mais*/ IF @DaysBetween = 2 BEGIN SELECT @BusinessDays = 1 END ELSE BEGIN WHILE @Cnt < @DaysBetween BEGIN /*Iguala-se a data que vamos calcular para saber se eh sabado ou domingo na variavel @EvalDate somando os dias que 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

http://www.criarweb.com/manuais/32/print.php

11/07/2008

Tutorial de SQL - Manual completo

Page 21 of 90

/*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 + 1 END //Soma-se um dia a mais ao contador SELECT @Cnt = @Cnt + 1 END END END ELSE BEGIN //Se fosse certo que as datas eram iguales se desdobraria em zero SELECT @BusinessDays = 0 END //Ao finalizar o ciclo, a funcao regressa o numero total de dias return (@BusinessDays) END Informe de Rosendo Lopez Robles Mail: soulus@gmail.com

SQL com Oracle


Antes de comear, gostaria de dizer que este curso est baseado em Oracle, ou seja, os exemplos expostos e o material foram atualizados sobre Oracle. Por outro lado dizer que acho interessante saber algo de SQL antes de comear com MYSQL, j que, embora existam algumas mudanas insignificantes, sabendo manejar SQL voc saber manejar MYSQL. Algumas caractersticas: Introduo:

SQL: Structured query language.

Permite a comunicao com o sistema administrador de banco de dados. Em seu uso pode-se especificar o que quer o usurio. Permite fazer consulta de dados.

Tipos de dados: CHAR:

Tm uma longitude fixa. Armazena de 1 a 255. Se introduzimos uma cadeia de menos longitude que a definida se preencher com brancos direita at ficar completa. Se introduzirmos uma cadeia de maior longitude que a fixada nos dar um erro.

http://www.criarweb.com/manuais/32/print.php

11/07/2008

Tutorial de SQL - Manual completo

Page 22 of 90

VARCHAR: Armazena cadeias de longitude varivel. A longitude mxima de 2000 caracteres. Se introduzimos uma cadeia de menor longitude que a que est definida, se armazena com essa longitude e no 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 (preciso, escala) Exemplo:
X=number (7,2) X=155'862 Erro j que s pode tomar 2 decimais X= 155'86 Bem Nota: A categoria mxima vai de 1 a 38.

LONG: No armazena nmeros 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 (grficos, udio) LONGRAW: Como o anterior, mas com maior capacidade. ROWID: Posio interna de cada uma das colunas das tabelas. Sentenas 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, alm disso, colocamos |

http://www.criarweb.com/manuais/32/print.php

11/07/2008

Tutorial de SQL - Manual completo

Page 23 of 90

significa que deveremos escolher um valor dos que colocamos e no mais de um. Em troca se colocarmos {} significa que o que vai dentro das chaves pode ir ou no, ou seja, opcional e se colocar segundo a consulta.
Nota: No select o valor por default entre ALL e DISTINCT ALL.

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 so 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 no pode ter valores nulos. Null= Se estiver nulo.
Nota: Note que cada consulta de SQL que fazemos temos de termina-la com um ponto e vrgula";".

Vrios exemplos para v-lo mais claro:


SELECT JOGADOR_NO, SOBRENOME, POSICAO, TIME FROM JOGADORES WHERE TIME_NO = 'FLAMENGO' ORDER BY SOBRENOME;

Este exemplo mostra o nmero do jogador (jogador_no) o sobrenome (Sobrenome), a posio na que joga (Posio), e o time (Time) ao que pertence. Selecionar todos os dados da tabela jogadores onde (Where) o nome do time (Time_No) for igual que a palavra 'Flamengo' e se ordenar (order by) sobrenome. Observe tambm que no pe nem 'Distinct' nem 'All'. Por padro, gerar a sentena com ALL.
SELECT * FROM JOGADORES WHERE POSICAO = 'ATACANTE' ORDER BY JOGADOR_NO;

Este exemplo mostra todos os campos da tabela jogadores onde (Where) a posio for igual que 'Atacante' e o ordena por nmero de jogador. Ao no colocar nada se supe que ascendentemente (Asc).
SELECT * FROM JOGADORES WHERE 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 time for igual a 'Flamengo' e a posio dos jogadores for igual a 'Atacante'. Por ultimo os ordena por 'Sobrenome' descendentemente e por nmero de jogador ascendentemente.
Informe de Agustin Jareo Mail: agustin@levanteweb.com URL: http://www.levanteweb.com/

SQL com Oracle. Operadores


Operadores aritmticos: + = Soma - = Subtrao

http://www.criarweb.com/manuais/32/print.php

11/07/2008

Tutorial de SQL - Manual completo

Page 24 of 90

* = Multiplicao / = Divisio

Operadores de comparao e lgicos:

!> = Diferente >= = Maior ou igual que <= = Menor ou igual que = = Igual que Like = Utiliza para unir cadeias de caracteres. Propriedades: % = representa qualquer cadeia de caracteres de 0 ou mais caracteres. _= representa um nico caractere qualquer. Not = Negao And = e a and b Certo se so certas a e b. Or = o a or b Certo se a ou b so certas Vejamos dois exemplos: Obtemos os dados dos jogadores cujos sobrenomes comecem com a letra "S":
SELECT SOBRENOMES FROM JOGADORES WHERE SOBRENOMES LIKE 'S%'; Obtemos aqueles sobrenomes que tiverem uma "R" na segunda posio: SELECT SOBRENOMES FROM JOGADORES WHERE SOBRENOMES LIKE '_R*';

Obtemos aqueles sobrenomes que comeam por "A" e tem uma "o" em seu interior:
SELECT SOBRENOMES FROM JOGADORES WHERE SOBRENOMES LIKE 'A%O%';

Comprovao com conjuntos de valores: In= permite saber se uma expresso pertence ou no a um conjunto de valores. Between= permite saber se uma expresso est ou no entre esses valores: Exemplo:
SELECT SOBRENOMES FROM JOGADORES WHERE JOGADOR_NUM IN (10, 20);

Seleciona os sobrenomes dos jogadores onde o nmero de jogador (Jogador_num) seja (In) ou 10 ou 20
SELECT SOBRENOMES FROM JOGADORES WHERE SALARIO NOT BETWEEN 15000000 AND 20000000;

Seleciona os sobrenomes dos jogadores onde o salrio destes no esteja entre (Not Between) 15000000 e 20000000.
Informe de Agustin Jareo Mail: agustin@levanteweb.com URL: http://www.levanteweb.com/

http://www.criarweb.com/manuais/32/print.php

11/07/2008

Tutorial de SQL - Manual completo

Page 25 of 90

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 posio que "Sanchez":


SELECT SOBRENOME FORM EMPLE WHERE POSICAO = (SELECT OFICIO FROM EMPLE WHERE SOBRENOME LIKE 'GIL');

Selecionamos em todos os campos da tabela Jogadores cuja sede est em Madrid ou Barcelona:
SELECT * FROM JOGADORES WHERE EQUIPE_NOM IN (SELECT EQUIPE_NOM FROM SEDE WHERE LOC IN ('MADRID', 'BARCELONA'); FROM SEDE WHERE LOC IN ('MADRID', 'BARCELONA'); Informe de Agustin Jareo Mail: agustin@levanteweb.com URL: http://www.levanteweb.com/

Funes SQL
ABS(n)=

Devolve o valor absoluto de (n). 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, expresso)= Substitui um valor nulo por outro valor. POWER (m, exponente)= Calcula a potncia de um nmero. ROUND (numero [, m])= Arredonda nmeros com o nmero de dgitos de preciso indicados. SIGN (valor)= Indica o signo do "valor". SQRT(n)= Devolve a raiz quadrada de "n". TRUNC (numero, [m])= Trunca nmeros para que tenham uma certa quantidade de dgitos de preciso. VAIRANCE (valor)= Devolve a mdia de um conjunto de valores.
CEIL(n)=Obtm

Funes de valores simples:

AVG(n)=

COUNT (* | Expresso)=

Calcula o valor mdio de "n" ignorando os valores nulos. Conta o nmero de vezes que a expresso avalia algum dado com valor no nulo. A opo "*" conta todas as filas selecionadas.

Funes de grupos de valores:

http://www.criarweb.com/manuais/32/print.php

11/07/2008

Tutorial de SQL - Manual completo

Page 26 of 90

Calcula o mximo. Calcula o mnimo. SUM (expresso)= Obtm a soma dos valores da expresso. GREATEST (valor1, valor2)= Obtm o maior valor da lista. LEAST (valor1, valor2)= Obtm o menor valor da lista.
MAX (expresso)= MIN (expresso)=

Devolve o caractere cujo valor em binrio equivalente a "n". Devolve "cad1" concatenada com "cad2". LOWER (cad)= Devolve a cadeia "cad" em minsculas. UPPER (cad)= Devolve a cadeia "cad" em maisculas. INITCAP (cad)= Converte a cadeia "cad" a tipo ttulo. LPAD (cad1, n[,cad2])= Adiciona caracteres esquerda da cadeia at que tenha uma certa longitude. 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 cadeia com 0 ou mais caracteres. SUBSTR (cad, m [,n])= Obtm parte de uma cadeia. TRANSLATE (cad1, cad2, cad3)= Converte caracteres de uma cadeia em caracteres diferentes, segundo um plano de substituio marcado pelo usurio.
CHR(n) = CONCAT (cad1, cad2)=

Funes que devolvem valores de caracteres:

Devolve o valor ASCII da primeira letra da cadeia "cad". Permite uma busca de um conjunto de caracteres em uma cadeia, mas no suprime nenhum caractere depois. LENGTH (cad)= Devolve o nmero de caracteres de cad.
ASCII(cad)= INSTR (cad1, cad2 [, comeco [,m]])=

Funes que devolvem valores numricos:

Devolve a data do sistema. Devolve a data "data" incrementada em "n" meses. LASTDAY (data)= Devolve a data do ltimo dia do ms que contm "data". MONTHS_BETWEEN (data1, data2)= Devolve a diferena em meses entre as datas "data1" e "data2". NEXT_DAY (data, cad)= Devolve a data do primeiro dia da semana indicado por "cad" depois da data indicada por "data".
SYSDATE= ADD_MONTHS (data, n)=

Funes para o manejo de datas:

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

Funes de converso:

Agrupamento e combinao de elementos com SQL


Agrupamento de elementos. Group by e Having: Para saber qual o salrio mdio de cada departamento da tabela Jogadores seria:
SELECT TIME_NO, AVG (SALARIO) "SALARIO MEDIO" FROM JOGADORES

http://www.criarweb.com/manuais/32/print.php

11/07/2008

Tutorial de SQL - Manual completo

Page 27 of 90

GROUP BY DEPT_NO;

A sentena "Select" possibilita agrupar um ou mais conjuntos de filas. O agrupamento se realiza mediante a clusula "GROUP BY" pelas comunas especificadas e na ordem especificada. Formato:
SELECT FROM GROUP BY COLUNA1, COLUNA2, COLUNAN HAVING CONDICAO GROUP BY

Os dados selecionados na sentena "Select" que leva o "Group By" devem ser: Uma constante.

Uma funo de grupo (SUM, COUNT, AVG) Uma coluna expressa no Group By.

A clusula Group By serve para calcular propriedades de um ou mais conjuntos de filas. Se se seleciona mais de um conjunto de filas, Group By controla que as filas da tabela original sejam agrupadas em um temporrio. A clusula Having se emprega para controlar qual dos conjuntos de filas se visualiza. Avalia-se sobre a tabela que devolve o Group By. No pode existir sem Group By.

Having parecido ao Where, porm trabalha com grupos de filas; pergunta por uma caracterstica de grupo, ou seja, pergunta pelos resultados das funes de grupo, o qual Where no pode fazer. Combinao externa (outer joins): Permite-nos selecionar algumas filas de uma tabela embora estas no tenham correspondncia com as filas da outra tabela com a que se combina. Formato:
SELECT TABELA1.COLUNA1, TABELA1.COLUNA2, TABELA2.COLUNA1, TABELA2.COLUNA2 FROM TABELA1, TABELA2 WHERE TABELA1.COLUNA1 = TABELA2.COLUNA1 (+);

Isto seleciona todas as filas da tabela "tabela1" embora no tenham correspondncia com as filas da tabela "tabela2", se utiliza o smbolo +. O resto de colunas da tabela "tabela2" se preenche com NULL. Union, intersec e minus: Permite combinar os resultados de vrios "Select" para obter um nico resultado. Formato:
SELECT FROM WHERE OPERADOR_DE_CONJUNTO SELECTFROMWHERE UNION= Combina os resultados de duas consultas. As filas duplicadas que aparecem se reduzem a uma fila nica. UNION ALL= Como a anterior, porm aparecero nomes duplicados. INTERSEC= Devolve as filas que so iguais em ambas consultas. Todas as filas duplicadas sero eliminadas. MINUS= Devolve aquelas filas que esto na primeira "Select" e no esto na segunda "Select". As filas duplicadas do primeiro conjunto se reduziro a uma fila nica antes que comece a comparao com o outro conjunto.

http://www.criarweb.com/manuais/32/print.php

11/07/2008

Tutorial de SQL - Manual completo

Page 28 of 90

Regras para a utilizao de operadores de conjunto: As colunas das duas consultas se relacionam em ordem, da esquerda direita. Os nomes de coluna da primeira sentena "Select" no tem porque ser os mesmos que os nomes da segunda. Os "Select" necessitam ter o mesmo nmero de colunas. Os tipos de dados devem coincidir, embora a longitude no tem que ser a mesma. >
Informe de Agustin Jareo Mail: agustin@levanteweb.com URL: http://www.levanteweb.com/

Manipulao 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 vo inserir as filas. Propriedades:

Se as colunas no se especificam na clusula Insert se consideram, por padro, todas as colunas da tabela. As colunas s quais damos valores se identificam pelo seu nome. A associao coluna valor posicional. Os valores que se do 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 de tipo data tambm). 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 vrias filas de uma tabela:
UPDATE NOMETABELA SET COLUNA1= VALOR1, , COLUNAN= VALORN WHERE CONDICAO;

Com Select:

Set= Indica as colunas que vo se atualizar e seus valores.

Quando a subconsulta (orden select) forma parte de SET, deve selecionar o mesmo nmero de

http://www.criarweb.com/manuais/32/print.php

11/07/2008

Tutorial de SQL - Manual completo

Page 29 of 90

colunas, (com tipos de dados adequados) que os que existem entre parnteses ao lado de SET.
UPDATE NOMETABELA SET COLUNA= VALOR1, COLUNA2= VALOR2, WHERE COLUNA3= (SELECT)

OU
UPDATE NOMETABELA SET (COLUNA1, COLUNA2, )= (SELECT ) WHERE CONDICAO;

Delete:

Elimina uma ou vrias filas de uma tabela:


DELETE [FROM] NOMETABELA WHERE CONDICAO; Informe de Agustin Jareo Mail: agustin@levanteweb.com URL: http://www.levanteweb.com/

Rollback:

Chaves primrias com SQL com Oracle

Permite ir at o ltimo COMMIT feito ou em seu padro at o comeo das ordens com o que estas no se executam. Commit: Quando executamos ordens, estas no so criadas na tabela at que coloquemos esta ordem, portanto as mudanas realizadas se perdero se ao sair do programa no realizarmos esta ao. Pode se programar para que seja feito automaticamente. Algumas ordens que levam COMMIT implcito: QUIT EXIT CONNECT DISCONNECT CREATE TABLE CREATE VIEW GRANT REVOQUE DROP TABLE DROP VIEW ALTER AUDIT NO AUDIT Criao de uma tabela:

Seu primeiro caractere deve ser alfabtico e o resto pode ser letras, nmeros e o caractere sublinhado.
CREATE TABLE NOMETABELA (COLUNA1 TIPO_DADO {NOT NULL},

http://www.criarweb.com/manuais/32/print.php

11/07/2008

Tutorial de SQL - Manual completo

Page 30 of 90

COLUNA2 TIPO_DADO {NOT NULL}, ) TABLESPACE ESPACO_DE_TABELA;

Caractersticas: As definies individuais de colunas se separam mediante vrgulas. No se coloca vrgula depois da ltima definio de coluna. As maisculas e minsculas so indiferentes. Os usurios podem consultar as tabelas criadas por meio da vista USER_TABLES. Integridade de dados: A integridade faz referncia ao fato de que os dados do banco de dados tm que se ajustar s restries antes de se armazenar nele. Uma restrio de integridade ser: Uma regra que restringe classe de valores para uma ou mais colunas na tabela. Usamos a clusula CONSTRAINT, que pode restringir uma s coluna ou um grupo de colunas de uma mesma tabela. Existem dois modos de especificar restries: Como parte da definio 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 Jareo Mail: agustin@levanteweb.com URL: http://www.levanteweb.com/

Restries em create table:

http://www.criarweb.com/manuais/32/print.php

11/07/2008

Tutorial de SQL - Manual completo

Page 31 of 90

Definio de chaves para tabelas e restries


uma coluna ou um conjunto de colunas que identificam univocamente a cada fila. Deve ser nica, no nula e obrigatria. Como mximo, podemos definir uma chave primria por tabela. Esta chave pode ser referenciada por uma coluna ou colunas. Quando se cria uma chave primria, automaticamente se cria um ndice que facilita o acesso tabela. Formato de restrio de coluna: Chave primria: Primary key

CREATE TABLE NOME_TABELA (COL1 TIPO_DADO [CONSTRAINT NOME_RESTRICAO] PRIMARY KEY COL2 TIPO_DADO )[TABLESPACE ESPACO_DE_TABELA];

Formato de restrio de tabela:


CREATE TABLE NOME_TABELA (COL1 TIPO_DADO, COL2 TIPO_DADO,

[CONSTRAINT NOMERESTRICAO] PRIMARY KEY (COLUNA [,COLUNA]), )[TABLESPACE ESPACO_DE_TABELA];

Est formada por uma ou vrias colunas que esto associadas a uma chave primria de outra ou da mesma tabela. Pode-se definir tantas chaves alheias quantas se necessite, e podem estar ou no na mesma tabela que a chave primria. O valor da coluna ou colunas que so chaves alheias deve ser: NULL ou igual a um valor da chave referenciada (regra de integridade referencial). Formato de restrio de coluna:

Chaves alheias: Foreign Key:

CREATE TABLE NOME_TABELA (COLUNA1 TIPO_DADO [CONSTRAINT NOMERESTRICAO] REFERENCES NOMETABELA [(COLUNA)] [ON DELETE CASCADE] )[TABLESPACE ESPACO_DE_TABELA];

Formato de restrio 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 clusula REFERENCES indicamos a tabela a qual remite a chave alheia. H que criar primeiro uma tabela e depois aquela que lhe faz referncia. H que apagar primeiro a tabela que faz referncia a outra tabela e depois a tabela que no faz referncia. Eliminado em cascata (ON DELETE CASCADE): Se eliminarmos uma fila de uma tabela

http://www.criarweb.com/manuais/32/print.php

11/07/2008

Tutorial de SQL - Manual completo

Page 32 of 90

me, todas as filas da tabela detalhe cuja chave alheia seja referenciada se eliminaro automaticamente. A restrio se declara na tabela detalhe. A mensagem "n filas eliminadas" s indica as filas eliminadas da tabela me. NOT NULL: Significa que a coluna no pode ter valores nulos. DEFAULT: Proporcionamos a uma coluna um valor padro quando o valor da coluna no se especifica na clusula INSERT. Na especificao DEFAULT possvel incluir vrias expresses: constantes, funes SQL e variveis UID e SYSDATE. Verificao de restries: CHECK: Atua como uma clusula where. Pode fazer referncia a uma ou mais colunas, porm no a valores de outras filas. Em uma clusula CHECK no se podem incluir sub-consultas nem as pseudo-consultas SYSDATE, UID e USER.
Nota: A restrio NOT NULL similar a CHECK (NOME_COLUNA IS NOT NULL)

UNIQUE: Evita valores repetidos na mesma coluna. Pode conter uma ou vrias colunas. similar restrio PRIMARY KEY, salvo que so possveis vrias colunas UNIQUE definidas em uma tabela. Admite valores NULL. Assim como em PRIMARY KEY, quando se define uma restrio UNIQUE se cria um ndice automaticamente. Vistas do dicionrio de dados para as restries: Contm informao geral as seguintes:

USER_CONSTRAINTS: Definies de restries de tabelas propriedade do usurio. ALL_CONSTRAINTS: Definies de restries sobre tabelas as quais pode acessar o usurio. DBA_CONSTRAINTS: Todas as definies de restries sobre todas as tabelas. Criao de uma tabela com dados recuperados em uma consulta: CREATE TABLE: permite criar uma tabela a partir da consulta de outra tabela j existente. A nova tabela conter os dados obtidos na consulta. Realiza-se esta ao com a clusula AS colocada ao final da ordem CREATE TABLE.
CREATE TABLE NOMETABELA (COLUNA [,COLUNA] )[TABLESPACE ESPACO_DE_TABELA] AS CONSULTA;

No necessrio especificar tipos nem tamanho das consultas, j que vm determinadas pelos tipos e os tamanhos das recuperadas na consulta. A consulta pode ter uma sub-consulta, uma combinao de tabelas ou qualquer sentena select vlida. As restries COM NOME no se criam em uma tabela desde a outra, s se criam aquelas restries que carecem de nome.
Informe de Agustin Jareo Mail: agustin@levanteweb.com URL: http://www.levanteweb.com/

Supresso e modificao de tabelas com SQL


DROP TABLE: suprime uma tabela do banco de dados. Cada usurio pode eliminar suas prprias tabelas, porm s o administrador ou algum usurio com o privilgio "DROP ANY TABLE" pode eliminar as tabelas de outro usurio. Ao suprimir uma tabela tambm se suprimem os ndices e os privilgios associados a ela. As vistas e os sinnimos criados a partir desta tabela deixam de Supresso de tabelas:

http://www.criarweb.com/manuais/32/print.php

11/07/2008

Tutorial de SQL - Manual completo

Page 33 of 90

funcionar, mas continuam existindo no banco de dados, portanto deveramos elimina-los. Exemplo:
DROP TABLE [USUARIO].NOMETABELA [CASCADE CONSTRAINTS];

TRUNCATE: permite suprimir todas as filas de uma tabela e liberar o espao ocupado para outros usos sem que reaparea a definio da tabela do banco de dados. Uma ordem TRUNCATE no se pode anular, assim como tambm no ativa os disparadores DELETE.
TRUNCATE TABLE [USUARIO.]NOMETABELA [{DROP | REUSE} STORAGE];

Modificao de tabelas:

Modificam-se as tabelas de duas formas: Mudando a definio de uma coluna (MODIFY) ou acrescentando 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 restrio definio da tabela. DROP CONSTRAINT= Elimina uma restrio da tabela.

Na hora de adicionar uma coluna a uma tabela h que ter em conta: Se a coluna no estiver definida como NOT NULL pode-se adicionar em qualquer momento. Se a 1. 2. 3. coluna estiver definida como NOT NULL pode-se seguir estes passos: Adiciona-se uma coluna sem especificar NOT NULL. D-se valor coluna para cada uma das filas. 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.

possvel aumentar ou diminuir o nmero de posies decimais em uma coluna de tipo NUMBER.

Se a coluna for NULL em todas as filas da tabela, pode-se diminuir a longitude e modificar o tipo de dado. A opo MODIFY NOT NULL s ser possvel quando a tabela no contiver nenhuma fila com valor nulo na coluna que se modifica. Adio de restries:

Com a ordem ALTER TABLE se acrescentam restries a uma tabela. Formato:


ALTER TABLE NOMETABELA ADD CONSTRAINT NOMECONSTRAINT

Eliminao de restries:

http://www.criarweb.com/manuais/32/print.php

11/07/2008

Tutorial de SQL - Manual completo

Page 34 of 90

A ordem ALTER TABLE com a clusula DROP CONSTRAINT; com a que se eliminam as restries com nome e as atribudas pelo sistema. Formato:
ALTER TABLE NOMETABELA DROP CONSTRAINT NOME_CONSTRAINT, NOME_RESTRICAO: Informe de Agustin Jareo Mail: agustin@levanteweb.com URL: http://www.levanteweb.com/

Gerenciamento de vistas em SQL


No contm informao por si mesmas, e sim, esto baseadas nas que contm outras tabelas e reflete os dados destas. Se se suprime uma tabela a vista associada se invalida. Formato:
CREATE [OR REPLACE] VIEW NOMEVISTA [(COLUNA [,COLUNA])] AS CONSULTA;

Criao e uso de vistas

AS CONSULTA= Determina as colunas e as tabelas que aparecero na vista. [OR REPLACE]= Cria de novo a vista se j existia. Para consultar a vista criada, USER_VIEWS:
SELECT VIEW_NAME FROM Nota: ao eliminar as tabelas, as vistas dessas tabelas no se eliminam e ficam inutilizadas.

Eliminao de vistas

Faz-se com DROP VIEW. Formato:


DROP VIEW NOMEVISTA;

Operaes sobre vistas

Pode-se realizar as mesmas operaes que se fazem sobre as tabelas. Restries: Atualizao. Se uma vista est baseada em uma s tabela, pode-se modificar as filas da vista. A modificao da vista muda a tabela sobre a qual est definida. Eliminao de filas atravs de uma vista= Para eliminar filas de uma tabela atravs de uma vista, esta se deve criar: Com filas de uma s tabela. Sem utilizar a clusula GROUP BY nem DISTINCT. Sem usar funes de grupo ou referncias a pseudo-colunas. Atualizao de filas atravs de uma vista: Para atualizar filas em uma tabela atravs de uma vista, esta tem que estar definida segundo as restries anteriores e, ademais, nenhuma das colunas que vai se atualizar ter definido como uma expresso. Insero de filas atravs de uma vista: Para inserir filas em uma tabela atravs de uma vista, h que ter em conta todas as restries anteriores e, ademais, todas as colunas obrigatrias da tabela associada devem estar presentes na vista. Manejo de expresses e de funes em vistas: Pode-se criar vistas usando funes, expresses em colunas e consultas avanadas, porm unicamente se emparelham

http://www.criarweb.com/manuais/32/print.php

11/07/2008

Tutorial de SQL - Manual completo

Page 35 of 90

consultar estas vistas. Tambm podemos modificar filas sempre e quando a coluna que vai se modificar no for a coluna expressada em forma de clculo ou com funes.
Nota: No possvel inserir filas se as colunas da vista contm clculos ou funes.

Mudanas de nome

RENAME muda o nome de uma tabela, vista ou sinnimo. O novo nome no pode ser uma palavra reservada no nome de um objeto que o usurio tiver criado. As restries de integridade, os ndices e as permisses dadas ao objeto se transferem automaticamente ao novo objeto.
REANME NOME_ANTERIOR TO NOME_NOVO;

Com esta ordem no podemos re-nomear colunas de uma tabela, estas se re-nomeiam mediante CREATE TABLE AS
Informe de Agustin Jareo Mail: agustin@levanteweb.com URL: http://www.levanteweb.com/

Usurios em Oracle

um nome definido no banco de dados que se pode conecta-lo e acessar a determinados objetos segundo certas condies que o administrador estabelece. Os objetos do dicionrio de dados aos que um usurio pode acessar, encontram-se na vista DICTIONARY, que propriedade do usurio SYS.
DESC DICTIONARY;

Com a ordem:
SELECT TABLENAME FROM DICTIONARY;

Visualizam-se os objetos do dicionrio de dados aos que se pode acessar. Criao de usurios:

CREATE USER NOME_USUARIO IDENTIFIED 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 usurio o tablespace padro para armazenar os objetos que crie. Se no se atribui nenhum, o tablespace padro SYSTEM. TEMPORARY TABLESPACE= Especifica o nome do tablespace para trabalhar temporais. Se no se especifica nenhum, o tablespace padro SYSTEM. QUOTA= Atribui um espao em megabites ou kilobites no tablespace atribudo. Se no se especifica esta clusula, o usurio no tem cota atribuda e no poder criar objetos no tablespace. Para ter espao e acesso ilimitado a um tablespace :
GRANT UNLIMITED TABLESPACE NOME_TABLESPACE;

PROFILE= Atribui um perfil a um usurio. Modificao de usurios:

http://www.criarweb.com/manuais/32/print.php

11/07/2008

Tutorial de SQL - Manual completo

Page 36 of 90

ALTER USER NOME_USUARIO IDENTIFIED BY SENHA _ACESSO [DEFAULT TABLESPACE ESPACO_TABELA] [TEMPORARY TABLESPACE ESPACO_TABELA] [COTA {INTEIRO {K | M } | UNLIMITED } ON ESPACO_TABELA [PROFILE PERFIL];

Eliminao de usuarios:
DROP USER USUARIO [CASCADE];

CASCADE= Suprime todos os objetos do usurio antes de elimina-lo.


Informe de Agustin Jareo Mail: agustin@levanteweb.com URL: http://www.levanteweb.com/

Privilgios

Gerenciamento em Oracle com SQL

a capacidade de um usurio dentro do banco de dados a realizar determinadas operaes ou acessar a determinados objetos de outros usurios. Privilgios sobre os objetos Permite-nos acessar e realizar mudanas nos dados de outros usurios. Exemplo: O privilgio de consultar a tabela de outro usurio um privilgio sobre objetos.
GRANT {PRIV_OBJETO [, PRIV_OBJETO] | ALL [PRIVILEGES]} [(COL [,COL])] ON [USUARIO] OBJETO TO {USUARIO | ROL | PUBLIC} [,{USUARIO | ROL | PUBLIC}] [WITH GRANT OPTION];

ON= Especifica o objeto sobre o qual se do os privilgios. TO= Identifica aos usurios ou rols aos quais se concedem os privilgios. ALL= Concede todos os privilgios sobre o objeto especificado. WITCH GRANT OPTION= Permite que o receptor do privilgio ou rol se atribua a outros usurios ou rols. PUBLIC= Atribui os privilgios a todos os usurios atuais e futuros: O propsito principal do grupo PUBLIC garantir o acesso a determinados objetos a todos os usurios do banco de dados. Privilgios de sistema Do direito a executar um tipo de comando SQL ou a realar alguma ao sobre objetos de um tipo especificado. Por exemplo, o privilgio para criar TABLESPACES um privilgio 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 privilgio ou rol possa conceder esses mesmos privilgios a outros usurios ou rols. Retirada de privilgios de objetos aos usurios

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

http://www.criarweb.com/manuais/32/print.php

11/07/2008

Tutorial de SQL - Manual completo

Page 37 of 90

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

Retirada de privilgios de sistema ou rols aos usurios


REVOKE {PRIV_SISTEMA | ROL} [,{PRIV_SISTEMA | ROL}] FROM {USUARIO | ROL | PUBLIC} [,{USUARIO | ROL | PUBLIC}];

Roles

Conjunto de privilgios agrupados. Formato:


CREATE ROLE NOMEROL [IDENTIFIED BY SENHA]; Nota: Um rol pode decidir o acesso de um usurio a um objeto, mas no pode permitir a criao de objetos.

Supresso de privilgios nos roles


REVOKE NOMEPRIVILEGIO ON NOMETABELA FROM NOMEROL; REVOKE NOMEPRIVILEGIO FROM NOMEROL;

Supresso de um rol
DROP ROLE NOMEROL;

Estabelecer um rol padro


ALTER USER NOMEUSUARIO DEFAULT {[ROLE NOME_ROL] | [NONE]};

NONE= Faz com que o usurio no tenha rol padro. Perfis: Conjunto de limites aos recursos do banco de dados:
CREATE PROFILE NOMEPERFIL LIMIT {NOME DOS LIMITES} {INTEIRO [K | M] | UNLIMITED | DEFAULT };

UNLIMITED= No h limites sobre um recurso em particular. DEFAULT= Pega o limite do perfil default. Eliminao de um perfil:

DROP FILE NOMEPERFIL [CASCADE];

Um tablespace uma unidade lgica de armazenamento de dados representada fisicamente por um ou mais arquivos de dados. Recomenda-se no misturar dados de diferentes aplicaes em um mesmo tablespace. Para criar um tablespace

Gerenciamento de tablespaces

CREATE TABLESPACE NOMETABLESPACE DATAFILE 'NOMEARQUIVO' [SIZE INTEIRO [K | M] [REUSE] [DEFAULT STORAGE (INITIAL TAMANHO MINEXTENTS TAMANHO MAXEXTENTS TAMANHO PCTINCREASE VALOR )]

http://www.criarweb.com/manuais/32/print.php

11/07/2008

Tutorial de SQL - Manual completo

Page 38 of 90

[ONLINE | OFFLINE];

REUSE= Reutiliza o arquivo se j existe ou o cria se no existe. DEFAULT STORAGE= Define o armazenamento por omisso para todos os objetos que se criam neste espao da tabela. Observe a quantidade de espao se no se especifica na sentena CREATE TABLE. Modificao 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 vrios arquivos. AUTOEXTEND= Ativa ou desativa o crescimento automtico dos arquivos de dados do tablespace. Quando um tablespace se enche podemos usar esta opo para que o tamanho do arquivo ou arquivos de dados associados cresa automaticamente. Autoextend off: desativa o crescimento automtico. RENAME_DATAFILE= Muda o nome de um arquivoe existente do tablespace. Esta mudana tem que ser feita atravs do sistema operacional e, depois, executar a ordem SQL. Eliminao de tablespaces

DROP TABLESPACE NOMETABLESPACE [INCLUDING CONTENTS];

INCLUDING CONTENTS= Permite eliminar um tablespace que tenha dados. Sem esta opo s se pode suprimir um tablespace vazio. Recomenda-se colocar o talespace offline antes de elimina-lo para certificarmos de que no haja sentenas SQL que estejam acessando dados do tablespace, em cujo caso no seria possvel elimina-lo. Quando se elimina um tablespace os arquivos associados no se apagam do sistema operacional, portanto teremos que elimina-los de forma manual.
Informe de Agustin Jareo Mail: agustin@levanteweb.com URL: http://www.levanteweb.com/

Otimizar consultas SQL

Portanto, muitas vezes no basta com especificar uma sentena SQL correta, e sim que alm disso, h que indicar como tem que fazer se quisermos que o tempo de resposta seja o mnimo. Nesta seo, veremos como melhorar o tempo de resposta de nosso intrprete ante umas determinadas situaes: Design de tabelas

A linguagem SQL no procedimental, ou seja, nas sentenas se indica o que queremos conseguir e no como tem que fazer o intrprete para consegui-lo. Isto pura teoria, pois na prtica todos os gerenciadores de SQL tm que especificar seus prprios truques para otimizar o rendimento.

Normalize as tabelas, pelo menos at a terceira forma normal, para garantir que no haja duplicidade de dados e aproveitar o mximo de armazenamento nas tabelas. Se tiver que

http://www.criarweb.com/manuais/32/print.php

11/07/2008

Tutorial de SQL - Manual completo

Page 39 of 90

desnormalizar alguma tabela pense na ocupao e no rendimento antes de proceder. Os primeiros campos de cada tabela devem ser aqueles campos requeridos e dentro dos requeridos primeiro se definem os de longitude fixa e depois os de longitude varivel. Ajuste ao mximo o tamanho dos campos para no desperdiar espao. normal deixar um campo de texto para observaes nas tabelas. Se este campo for utilizado com pouca freqncia ou se for definido com grande tamanho, por via das dvidas, melhor criar uma nova tabela que contenha a chave primria da primeira e o campo para observaes. Gerenciamento e escolha dos ndices

Evidentemente, no podemos indexar todos os campos de uma tabela extensa j que dobramos o tamanho do banco de dados. Igualmente, tampouco serve muito indexar todos os campos em uma tabela pequena j que as selees podem se efetuar rapidamente de qualquer forma. Um caso em que os ndices podem ser muito teis quando realizamos peties simultneas sobre vrias tabelas. Neste caso, o processo de seleo pode se acelerar sensivelmente se indexamos os campos que servem de nexo entre as duas tabelas.

Os ndices so campos escolhidos arbitrariamente pelo construtor do banco de dados que permitem 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 memria (o dobro mais ou menos) e de requerer para sua insero e atualizao um tempo de processo superior.

Os ndices podem ser contraproducentes se os introduzimos sobre campos triviais a partir dos quais no se realiza nenhum tipo de petio j que, alm do problema de memria j mencionado, estamos lentificando outras tarefas do banco de dados como so a edio, insero e eliminao. por isso que vale a pena pensar duas vezes antes de indexar um campo que no serve de critrio para buscas ou que usado com muita freqncia por razes de manuteno. Campos a Selecionar

Na medida do possvel h que evitar que as sentenas SQL estejam embebidas dentro do cdigo da aplicao. muito mais eficaz usar vistas ou procedimentos armazenados por que o gerenciador os salva compilados. Se se trata de uma sentena embebida o gerenciador deve compila-la antes de executa-la. Selecionar exclusivamente aqueles que se necessitem No utilizar nunca SELECT * porque o gerenciador deve ler primeiro a estrutura da tabela antes de executar a sentena Se utilizar vrias tabelas na consulta, especifique sempre a que tabela pertence cada campo, isso economizar tempo ao gerenciador de localizar a que tabela pertence o campo. Ao invs de SELECT Nome, Fatura FROM Clientes, Faturamento WHERE IdCliente = IdClienteFaturado, use: SELECT Clientes.Nome, Faturamento.Fatura WHERE Clientes.IdCliente = Faturamento.IdClienteFaturado. Campos de Filtro Procuraremos escolher na clusula WHERE aqueles campos que fazem parte da chave do arquivo pelo qual interrogamos. Ademais se especificaro na mesma ordem na qual estiverem definidas na chave. Interrogar sempre por campos que sejam chave. Se desejarmos interrogar por campos pertencentes a ndices compostos melhor utilizar todos os campos de todos os ndices. Suponhamos que temos um ndice formado pelo campo NOME e o campo SOBRENOME e outro ndice formado pelo campo IDADE. A sentena WHERE NOME='Jose' AND SOBRENOME Like '%' AND IDADE = 20 seria melhor que WHERE NOME = 'Jose' AND IDADE = 20 porque o gerenciador, neste segundo caso, no pode usar o primeiro ndice e ambas sentenas so equivalentes porque a condio SOBRENOME Like '%' devolveria todos os registros.

http://www.criarweb.com/manuais/32/print.php

11/07/2008

Tutorial de SQL - Manual completo

Page 40 of 90

Ordem das Tabelas

Quando se utilizam vrias tabelas dentro da consulta h que ter cuidado com a ordem empregada na clusula FROM. Se desejarmos saber quantos alunos se matricularam no ano 1996 e escrevermos: FROM Alunos, Matriculas WHERE Aluno.IdAluno = Matriculas.IdAluno AND Matriculas.Ano = 1996 o gerenciador percorrer todos os alunos para buscar suas matrculas e devolver as correspondentes. Se escrevermos FROM Matriculas, Alunos WHERE Matriculas.Ano = 1996 AND Matriculas.IdAluno = Alunos.IdAlunos, o gerenciador filtra as matrculas e depois seleciona os alunos, desta forma tem que percorrer menos registros.
Informe de Claudio Mail: claudio@lobocom.es URL: http://personal.lobocom.es/claudio/

Consultas de seleo
Consultas bsicas

Este conjunto de registros pode ser modificvel. A sintaxe bsica de uma consulta de seleo a seguinte:

SELECT Campos FROM Tabela

Onde "campos" a lista de campos que se deseja recuperar e "tabela" a origem dos mesmos, por exemplo:
SELECT Nombre, Telefone FROM Clientes

Esta sentena devolve um conjunto de resultados com o campo nome e telefone da tabela clientes. Devolver Literais Em determinadas ocasies pode nos interessar incluir uma coluna com um texto fixo em uma consulta de seleo, por exemplo, suponhamos que temos uma tabela de empregados e desejamos recuperar as tarifas semanais dos eletricistas, poderamos realizar a seguinte consulta:
SELECT Empregados.Nome, 'Tarifa semanal: ', Empregados.TarifaHora * 40 FROM Empregados WHERE Empleados.Cargo = 'Eletricista'

Ordenar los registros

Adicionalmente pode se especificar a ordem em que se deseja recuperar os registros das tabelas mediante a clusula ORDER BY Lista de Campos. Em onde Lista de campos representa os campos a ordenar. Exemplo:
SELECT CodigoPostal, Nome, Telefone FROM

http://www.criarweb.com/manuais/32/print.php

11/07/2008

Tutorial de SQL - Manual completo

Page 41 of 90

Clientes ORDER BY Nome

Esta consulta devolve os campos CodigoPostal, Nome, Telefone da tabela Clientes ordenados pelo campo Nome. Pode-se ordenar os registros por mais de um campo, como por exemplo:
SELECT CodigoPostal, Nome, Telefone FROM Clientes ORDER BY CodigoPostal, Nome

Inclusive pode-se especificar a ordem dos registros: ascendente mediante a clusula (ASC toma-se este valor padro) ou descendente (DESC)
SELECT CodigoPostal, Nome, Telefone FROM Clientes ORDER BY CodigoPostal DESC , Nome ASC

Uso de ndices das tabelas

Se desejarmos que a sentena SQL utilize um ndice para mostrar os resultados se pode utilizar a 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 a consulta, para isso utilizam critrios de rendimento e sobretudo, os campos de busca especificados na clusula WHERE. Se se deseja forar a no utilizar nenhum ndice utilizaremos a seguinte sintaxe:
SELECT ... FROM Tabela (INDEX=0) ...

Consultas com Predicado

O predicado se inclui entre a clusula e o primeiro nome do campo a recuperar, os possveis predicados so: Predicado ALL TOP DISTINCT Descrio Devolve todos os campos da tabela

DISTINCTOW ALL

Omite os registros duplicados baseando-se na totalidade do registro e no s nos campos selecionados.

Omite os registros cujos campos selecionados coincidam totalmente

Devolve um determinado nmero de registros da tabela

Se no se inclui nenhum dos predicados se assume ALL. O Motor de banco de dados seleciona todos os registros que cumprem as condies da instruo SQL e devolve todos e cada um de seus campos. No conveniente abusar deste predicado j que obrigamos ao motor do banco de dados a analisar a estrutura da tabela para averiguar os campos que contm, muito mais rpido indicar a lista de campos desejados.
SELECT ALL FROM

http://www.criarweb.com/manuais/32/print.php

11/07/2008

Tutorial de SQL - Manual completo

Page 42 of 90

Empregados SELECT * FROM Empregados

TOP

Devolve um certo nmero de registros que entram entre ao princpio ou ao final de uma categoria especificada por uma clusula ORDER BY. Suponhamos que queremos recuperar os nomes dos 25 primeiros estudantes do curso 1994:
SELECT TOP 25 Nome, Sobrenome FROM Estudantes ORDER BY Nota DESC

Se no se inclui a clusula ORDER BY, a consulta devolver um conjunto arbitrrio de 25 registros da tabela de Estudantes. O predicado TOP no escolhe entre valores iguais. No exemplo anterior, se a nota mdia nmero 25 e a 26 so iguais, a consulta devolver 26 registros. Pode-se utilizar a palavra reservada PERCENT para devolver uma certa porcentagem de registros que caem ao princpio ou ao final de uma categoria especificada pela clusula ORDER BY. Suponhamos que no lugar dos 25 primeiros estudantes desejamos o 10 por cento do curso:
SELECT TOP 10 PERCENT Nome, Sobrenome FROM Estudantes ORDER BY Nota DESC

O valor que vai a seguir de TOP deve ser um inteiro sem signo. TOP no afeta possvel atualizao da consulta. DISTINCT Omite os registros que contm dados duplicados nos campos selecionados. Para que os valores de cada campo listado na instruo SELECT se incluam na consulta devem ser nicos. Por exemplo, vrios empregados listados na tabela Empregados podem ter o mesmo sobrenome. Se dois registros contm Lopez no campo Sobrenome, a seguinte instruo SQL devolve um nico registro:
SELECT DISTINCT Sobrenome FROM Empregados

Com outras palavras o predicado DISTINCT devolve aqueles registros cujos campos indicados na clusula SELECT possuam um contedo diferente. O resultado de uma consulta que utiliza DISTINCT no atualizvel e no reflete as mudanas subseqentes realizadas por outros usurios. DISTINCTROW Este predicado no compatvel com ANSI. Que eu saiba no dia de hoje s funciona com ACCESS.

Devolve os registros diferentes de uma tabela; a diferena do predicado anterior que s se fixava no contedo dos campos selecionados, este o faz no contedo do registro completo independentemente dos campos indicados na clusula SELECT.

http://www.criarweb.com/manuais/32/print.php

11/07/2008

Tutorial de SQL - Manual completo

Page 43 of 90

SELECT DISTINCTROW Sobrenome FROM Empregados

Se a tabela empregados contm dois registros: Antonio Lopez e Marta Lopez o exemplo do predicado DISTINCT devolve um nico registro com o valor Lopez no campo Sobrenome j que busca no duplicados em tal campo. Este ltimo exemplo devolve dois registros com o valor Lopez no sobrenome j que se buscam no duplicados no registro completo. Em determinadas circunstncias necessrio atribuir um nome a alguma coluna determinada de um conjunto devolvido, outras vezes por simples capricho ou porque estamos recuperando dados de diferentes tabelas e acabam tendo um campo com igual nome. Para resolver todas elas, temos a palavra reservada AS que se encarrega de atribuir o nome que desejamos coluna desejada. Tomado como referncia o exemplo anterior podemos fazer a coluna devolvida pela consulta, ao invs de se chamar sobrenome (assim como o campo devolvido) se chame Empregado. Neste caso procederamos da seguinte forma:
SELECT DISTINCTROW Sobrenome AS Empregado FROM Empregados

ALIAS

AS no uma palavra reservada de ANSI, existem diferentes sistemas de atribuir os alias em funo do motor de banco de dados. Em ORACLE para atribuir um alias a um campo h que fazer da seguinte forma:
SELECT Sobrenome AS "Empregado" FROM Empregados

Tambm podemos atribuir alias s tabelas dentro da consulta de seleo, neste caso h que ter em conta que em todas as referncias que desejarmos fazer a tal tabela h que utilizar o alias ao invs do nome. Esta tcnica ser de grande utilidade mais adiante quando se estudarem as vinculaes entre tabelas. Por exemplo:
SELECT Apellido AS Empregado FROM Empregados AS Trabalhadores

Para atribuir alias s tabelas em ORACLE e SQL-SERVER os alias se atribuem escrevendo o nome da tabela, deixando um espao em branco e escrevendo o Alias (se atribuem dentro da clusula FROM).
SELECT Trabalhadores.Sobrenome (1) AS Empregado FROM Empregadore Trabalhadores

(1)Esta nomenclatura [Tabela].[Campo] deve-se utilizar quando se est recuperando um campo cujo nome se repete em vrias das tabelas que se utilizam na sentena. No obstante quando na sentena se empregam vrias tabelas aconselhvel utilizar esta nomenclatura para evitar o trabalho que supem ao motor de dados averiguar em que tabela est cada um dos campos indicados na clusula SELECT. Recuperar Informao de um banco de Dados Externo Para concluir este captulo se deve fazer referncia recuperao de registros de banco de dados externos. Em ocasies necessrio a recuperao de informao que se encontra contida em uma tabela que no se encontra no banco de dados que executar a consulta ou que nesse momento no se encontra aberta, esta situao podemos salva-la com a palavra reservada IN

http://www.criarweb.com/manuais/32/print.php

11/07/2008

Tutorial de SQL - Manual completo

Page 44 of 90

da seguinte forma:
SELECT Sobrenome AS Empregado FROM Empleados IN'c: \databases\gerenciamento.mdb'

Em onde c: \databases\gerenciamento.mdb o banco de dados que contm a tabela Empregados. Esta tcnica muito simples e comum em banco de dados do tipo ACCESS em outros sistemas como SQL-SERVER ou ORACLE, a cosa mais complicada por ter que existir relaes de confiana entre os servidores ou ao ser necessria a vinculao entre os banco de dados. Este exemplo recupera a informao de um banco de dados de SQL-SERVER localizado em outro servidor (obviamente que os servidores esto linkados):
SELECT Sobrenome FROM Servidor1.BancoDados1.dbo.Empregados Informe de Claudio Mail: claudio@lobocom.es URL: http://personal.lobocom.es/claudio/

Critrios de seleo em SQL

Na seo anterior vimos a forma de recuperar os registros das tabelas, as formas empregadas devolviam todos os registros da mencionada tabela. Ao longo deste manual se estudaro as possibilidades de filtrar os registros com o fim de recuperar somente aqueles que cumpram umas condies pr-estabelecidas.

Antes de comear o desenvolvimento deste artigo, h que ressaltar trs detalhes de vital importncia. O primeiro deles que cada vez que se deseja estabelecer uma condio referida a um campo de texto a condio de busca deve ir fechada entre aspas simples; a segunda que no possvel estabelecer condies de busca nos campos memo e; a terceira e ltima faz referncia s datas. Ate hoje no fui capaz de encontrar uma sintaxe que funcione em todos os sistemas, por isso se faz necessrio particulariza-las segundo o banco de dados: Banco de Datos SQL-SERVER ORACLE ACCESS Data = #mm-dd-aaaa# Sintaxe

Banco de Dados Exemplo (para gravar a data 18 de maio de 1969) SQL-SERVER ORACLE ACCESS Data = #05-18-1969# Data = 19690518 Data = #05-18-1969#

Fecha = #mm-dd-aaaa# Exemplo

Data = to_date('YYYYDDMM','aaaammdd',)

Data = to_date('YYYYDDMM', '19690518')

Referente aos valores lgicos True ou False cabe destacar que no so reconhecidos em ORACLE, nem nesse sistema de banco de dados, nem em SQL-SERVER existem os campos de tipo "SIM/NAO" de ACCESS; nesses sistemas se utilizam os campos BIT que permitem armazenar valores de 0 ou 1. Internamente, ACCESS, armazena neste campos valores de 0 ou -1, por tanto tudo se complica bastante, porm, aproveitando a coincidncia do 0 para os valores FALSE, pode-se utilizar a sintaxe seguinte que funciona em todos os casos: se se deseja saber se o campo falso "... CAMPO = 0" e para saber os verdadeiros "CAMPO <> 0".

http://www.criarweb.com/manuais/32/print.php

11/07/2008

Tutorial de SQL - Manual completo

Page 45 of 90

Operadores Lgicos

Os operadores lgicos suportados por SQL so: AND, OR, XOR, Eqv, Imp, Is e Not. Com exceo dos dois ltimos, todos possuem a seguinte sintaxe:
<expressao1> operador <expressao2>

Onde expressao1 e expressao2 so as condies a avaliar, o resultado da operao varia em funo do operador lgico. A tabela anexa mostra os diferentes possveis resultados: Verdadeiro Verdadeiro Falso Falso Falso Falso Falso Falso Falso Falso Verdadeiro Verdadeiro Verdadeiro Verdadeiro Verdadeiro Verdadeiro Verdadeiro Verdadeiro Verdadeiro Falso Falso Falso Null Null <expressao1> AND AND OR OR Operador Falso <expressao2> Falso Resultado

AND AND OR OR

Verdadeiro Falso Falso

Verdadeiro Verdadeiro

Verdadeiro Falso Falso Verdadeiro Verdadeiro Falso

Verdadeiro Falso

Verdadeiro Falso

XOR XOR Eqv Eqv XOR XOR Eqv Eqv

Verdadeiro Falso Verdadeiro Falso Verdadeiro Falso Verdadeiro Falso Null Verdadeiro Falso Verdadeiro Falso Null Falso

Verdadeiro Falso

Verdadeiro Verdadeiro Falso Falso Verdadeiro Falso

Imp Imp Imp Imp Imp Imp Imp Imp

Verdadeiro Verdadeiro

Null

Verdadeiro

Verdadeiro Null

Verdadeiro

Verdadeiro

Null Imp Null Null Se a qualquer das anteriores condies lhe ante-pusermos o operador NOT o resultado da operao ser o contrrio ao devolvido sem o operador NOT.

O ltimo operador denominado Is se emprega para comparar duas variveis de tipo objeto <Objeto1> Is <Objeto2>. este operador devolve verdadeiro se os dois objetos forem iguais.
SELECT * FROM Empregados WHERE Idade > 25 AND Idade < 50 SELECT * FROM Empregados WHERE (Idade > 25 AND Idade < 50) OR

http://www.criarweb.com/manuais/32/print.php

11/07/2008

Tutorial de SQL - Manual completo

Page 46 of 90

Salario = 100 SELECT * FROM Empregados WHERE NOT Estado = 'Solteiro' SELECT * FROM Empregados WHERE (Salario >100 AND Salario < 500) OR (Cidade = 'Madri' AND Estado = 'Casado')

Para indicar que desejamos recuperar os registros segundo o intervalo de valores de um campo empregaremos o operador Between cuja sintaxe :
campo [Not] Between valor1 And valor2 (a condio Not opcional)

Intervalos de Valores

Neste caso a consulta devolveria os registros que contiverem em "campo" um valor includo no intervalo valor1, valor2 (ambos inclusive). Se ante-pusermos a condio Not devolver aquelos valores no includos no intervalo.
SELECT * FROM Pedidos WHERE CodPostal Between 28000 And 28999 (Devolve os pedidos realizados na cidade de Madrid)

O Operador Like

Utiliza-se para comparar uma expresso de cadeia com um modelo em uma expresso SQL. Sua sintaxe :
expresso Like modelo

O operador Like pode ser utilizado em uma expresso para comparar um valor de um campo com uma expresso de cadeia. Por exemplo, se introduzirmos Like C* em uma consulta SQL, a consulta devolve todos os valores de campo que comearem pela letra C. Em uma consulta com parmetros, pode fazer com que o usurio escreva o modelo que ser utilizado. O exemplo seguinte devolve os dados que comeam com a letra P seguido de qualquer letra entre A e F e de trs dgitos:
Like 'P[A-F]###'

Onde expresso uma cadeia modelo ou campo contra o que se compara expresso. Pode-se utilizar o operador Like para encontrar valores nos campos que coincidam com o modelo especificado. Por modelo pode especificar um valor completo (Ana Maria), ou se pode utilizar uma cadeia de caracteres asterisco como os reconhecidos pelo sistema operacional para encontrar uma classificao de valores (Like An*).

Este exemplo devolve os campos cujo contedo comece com uma letra da A D seguidas de qualquer cadeia.
Like '[A-D]*'

Na tabela seguinte se mostra como utilizar o operador Like para comprovar expresses com diferentes modelos.

http://www.criarweb.com/manuais/32/print.php

11/07/2008

Tutorial de SQL - Manual completo

Page 47 of 90

' Tipo de coincidncia Modelo Planejado Coincidee Caractere especial Varios caracteres Um so caractere Um so digito Varios caracteres 'a[*]a' 'a#a' 'a?a' 'ab*' 'a*a' 'a*a'

ACCESS

aa', 'aBa', 'aBBBa' 'aBC' 'abcdefg', 'abc' 'f', 'p', 'j' 'aaa'

Nao coincide 'cab', 'aab'

Categoria de caracteres '[a-z]' Combinada

'a0a', 'a1a', 'a2a' 'aaa', 'a10a' 'A', 'a', '&', '~' '9', '&', '%' '0', '1', '9' 'b', 'a' '2', '&'

'aaa', 'a3a', 'aBa' 'aBBBa'

Fora de uma categoria '[!a-z]'

Diferente de um digito '[!0-9]'

'a[!b-m]#'

'An9', 'az0', 'a99' 'abc', 'aj0' SQL-SERVER

Exemplo

LIKE 'A%'

Descrio

LIKE '_NG'

LIKE '[AF]%'

Tudo que comece por qualquer caractere e logo siga NG Tudo que comecar por A ou F

Tudo que comecar por A

LIKE '[A^B]%' Tudo que comecar por A e a segunda letra nao for uma B Em determinado motores de banco de dados, esta clusula, no reconhece o asterisco como caractere 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 uma lista. Sua sintaxe :
expressao [Not] In(valor1, valor2, . . .) SELECT * FROM Pedidos WHERE Cidade In ('Madri', 'Barcelona', 'Sevilha')

LIKE '[A-F]%' Tudo que comece por qualquer letra compreendida entre a A e a F

A clusula WHERE

A clusula WHERE pode ser usada para determinar que registros das tabelas enumeradas na clusula FROM aparecero nos resultados da instruo SELECT. Depois de escrever esta clusula deve-se especificar as condies expostas nas sees anteriores. Se no se emprega esta clusula, a consulta devolver todas as filas da tabela. WHERE opcional, mas quando aparece deve ir a seguir de FROM.
SELECT Sobrenome, Salario FROM Empregados WHERE Salario = 21000 SELECT IdProduto, Existencias FROM Produtos WHERE Existencias <= NovoPedido

http://www.criarweb.com/manuais/32/print.php

11/07/2008

Tutorial de SQL - Manual completo

Page 48 of 90

SELECT * FROM Pedidos WHERE DataEnvio = #05-30-1994# SELECT Sobrenomes, Nome FROM Empregados WHERE Sobrenomes = 'King' SELECT Sobrenomes, Nome FROM Empregados WHERE Sobrenomes Like 'S*' SELECT Sobrenomes, Salario FROM Empregados WHERE Salario Between 200 And 300 SELECT Sobrenomes, Salario FROM Empregados WHERE Sobrenomes Between 'Lon' And 'Tol' SELECT IdPedido, DataPedido FROM Pedidos WHERE DataPedido Between #01-01-1994# And #12-31-1994# SELECT Sobrenomes, Nome, Cidade FROM Empregados WHERE Cidade In ('Sevilha', 'Los Angeles', 'Barcelona') Informe de Claudio Mail: claudio@lobocom.es URL: http://personal.lobocom.es/claudio/

Ao utilizar mltiplas instrues SQL economizamos os recursos compartilhados da rede e servidor, como largura de banda, memria, CPU, pois reduzimos o nmero de acessos ao servidor web.

Como exibir informaes com mltiplas instrues SQL

Neste artigo, veremos como retornar registros com uma stored procedure com duas instrues SQL. Inicialmente, declaramos a string de conexo 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";

http://www.criarweb.com/manuais/32/print.php

11/07/2008

Tutorial de SQL - Manual completo

Page 49 of 90

Se preferir utilize instrues SQL separadas por ponto-e-vrgula:


string sSql = " SELECT Count(*) AS Total FROM Products; SELECT ProductName, UnitPrice FROM Products";

Com a instruo using criamos uma nova instncia da classe SqlConnection e passamos a string de conexo:
using (SqlConnection conn = new SqlConnection(strConexao))

Criamos e definimos um objeto SqlDataReader como null.


SqlDataReader r = null;

Em seguida, criamos uma nova instncia da classe SqlCommand e passamos ao construtor o objeto 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 instrues 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 excees que podem ocorrer e fechamos a conexo 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 mtodo NextResult para exibir os registros do prximo conjunto de registros.


r.NextResult();

Verificamos se h registros para exibir:


if (r.HasRows)

Neste caso especifico, podemos usar tambm:

http://www.criarweb.com/manuais/32/print.php

11/07/2008

Tutorial de SQL - Manual completo

Page 50 of 90

if (r.GetInt32(t) > 0)

Em seguida, extramos 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 unitrio</b></td></tr>");

Percorremos todos os registros do segundo conjunto de registros.


while (r.Read()) {

Exibimos o nome do produto com o mtodo GetString


Response.Write("<tr><td style=\"width: 150px\">" + r.GetString(produto) + "</td>");

e o valor unitrio de cada produto com o mtodo GetDecimal:


Response.Write("<td style=\"width: 100px\">" + string.Format(ci,"{0:c}", r.GetDecimal(valor)) + "</td></tr>");

O mtodo Format da classe String formata a sada como um valor monetrio


string.Format(ci,"{0:c}", r.GetDecimal(valor))

e define a cultura como pt-BR - Portugus Brasil. Desta forma, a sada ser sempre em reais, independente do idioma usado pelo computador do usurio.
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 conexo com o banco de dados.


finally { } if (!r.IsClosed) r.Close();

A seguir, temos os arquivos e cdigos que compe este exemplo. //Arquivo de exemplo: Default.aspx.cs
using using using using using System; System.Web.UI; System.Web.UI.WebControls; System.Data; System.Data.SqlClient;

http://www.criarweb.com/manuais/32/print.php

11/07/2008

Tutorial de SQL - Manual completo

Page 51 of 90

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 unitrio</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 mtodo NextResult</title> </head> <body> <form id="form1" runat="server"> <div> </div> </form> </body> </html>

e a stored procedure GetTotalAndProdutos usada no exemplo:


CREATE PROCEDURE GetTotalAndProdutos AS SET NOCOUNT ON SELECT Count(*) AS Total FROM Products

http://www.criarweb.com/manuais/32/print.php

11/07/2008

Tutorial de SQL - Manual completo

Page 52 of 90

SELECT ProductName, UnitPrice FROM Products GO Sobre o autor: Alfredo Lotar consultor, programador, escritor. Desenvolve aplicaes com ASP.NET, JavaScript, XML, C#, Visual Basic e SQL Server. autor do livro XML para Programadores ASP, da editora Axcel Books, e dos livros ASP.NET com C# ? Curso Prtico, e Como programar com ASP.NET e C#, ambos publicados pela Novatec Editora. Atualmente, passa a maior parte do tempo desenvolvendo aplicaes, escrevendo livros ou artigos, testando cdigos e analisando falhas de segurana em web sites de clientes. O autor pode ser contactado pelo e-mail: alfredo.programador@bol.com.br. Informe de Alfredo Lotar Mail: alfredo.programador@bol.com.br

Critrios de seleo em SQL II

Combine os registros com valores idnticos, na lista de campos especificados, em um nico registro. Para cada registro se cria um valor sumrio se se inclui uma funo SQL agregada, como por exemplo, Sum ou Count, na instruo SELECT. Sua sintaxe :

SELECT campos FROM tabela WHERE criterio GROUP BY campos do grupo

GROUP BY opcional. Os valores de resumo se omitem se no existe uma funo SQL agregada na instruo SELECT. Os valores Null nos campos GROUP BY se agrupam e no se omitem. No obstante, os valores Null no se avaliam em nenhuma das funes SQL agregadas.

Utiliza-se a clusula WHERE para excluir aquelas filas que no deseja agrupar, e a clusula HAVING para filtrar os registros uma vez agrupados. Ao menos que contenha um dado Memo ou Objeto OLE, um campo da lista de campos GROUP BY pode se referir a qualquer campo das tabelas que aparecem na clusula FROM, inclusive se o campo no estiver includo na instruo SELECT, sempre e quando a instruo SELECT incluir pelo menos uma funo SQL agregada. Todos os campos da lista de campos de SELECT devem ou se incluir na clusula GROUP BY, ou como argumentos de uma funo SQL agregada.
SELECT IdFamilia, Sum(Stock) AS StockAtual FROM Produtos GROUP BY IdFamilia

Uma vez que GROUP BY combinou os registros, HAVING mostra qualquer registro agrupado pela clusula GROUP BY que satisfaa as condies da clusula HAVING.

HAVING similar a WHERE, determina que registros se selecionam. Uma vez que os registros se agruparam utilizando GROUP BY, HAVING determina quais deles sero mostrados.
SELECT IdFamilia, Sum(Stock) AS StockAtual FROM Produtos GROUP BY IdFamilia HAVING StockAtual > 100 AND NomeProduto Like BOS*

AVG

http://www.criarweb.com/manuais/32/print.php

11/07/2008

Tutorial de SQL - Manual completo

Page 53 of 90

Calcula a mdia aritmtica de um conjunto de valores contidos em um campo especificado de uma consulta. Sua sintaxe a seguinte:
Avg(expr)

Onde expr representa o campo que contm os dados numricos para os que se deseja calcular a mdia ou uma expresso que realiza um clculo utilizando os dados de tal campo. A mdia calculada por Avg a mdia aritmtica (a soma dos valores dividido pelo nmero de valores). A funo Avg no inclui nenhum campo Null no clculo.
SELECT Avg(Gastos) AS Promedio FROM Pedidos WHERE Gastos > 100

Count

Calcula o nmero de registros devolvidos por uma consulta. Sua sintaxe a seguinte
Count(expr)

Onde expr contm o nome do campo que se deseja contar. Os operandos de expr podem incluir o nome de um campo de uma tabela, uma constante ou uma funo (a qual pode ser intrnseca ou definida pelo usurio, mas no outras das funes agregadas de SQL). Pode contar com qualquer tipo de dados inclusive texto. Embora expr possa realizar um clculo sobre um campo, Count simplesmente conta o nmero de registros sem ter em conta que valores se armazenam nos registros. A funo Count no conta os registros que tm campos null a no ser que expr seja o caractere asterisco (*). Se utilizar um asterisco, Count calcula o nmero total de registros, incluindo aqueles que contm campos null. Count(*) consideravelmente mais rpida que Count(Campo). No se deve colocar o asterisco entre aspas duplas ('*').
SELECT Count(*) AS Total FROM Pedidos

Se expr identifica a mltiplos campos, a funo Count conta um registro s se ao menos um dos campos no for Null. Se todos os campos especificados forem Null, no se contar o registro. H que separar os nomes dos campos com ampersand (&).
SELECT Count(DataEnvio & Transporte) AS Total FROM Pedidos

Podemos fazer com que o gestor conte os dados diferentes de um determinado campo
SELECT Count(DISTINCT Localidade) AS Total FROM Pedidos

Max, Min

Devolvem o mnimo ou o mximo de um conjunto de valores contidos em um campo especifico de uma consulta. Sua sintaxe :
Min(expr) Max(expr)

http://www.criarweb.com/manuais/32/print.php

11/07/2008

Tutorial de SQL - Manual completo

Page 54 of 90

Onde expr o campo sobre o qual se deseja realizar o clculo. Expr pode incluir o nome de um campo de uma tabela, uma constante ou uma funo (a qual pode ser intrnseca ou definida pelo usurio, porm no outras das funes agregadas de SQL).
SELECT Min(Gastos) AS ElMin FROM Pedidos WHERE Pais = 'Espanha' SELECT Max(Gastos) AS ElMax FROM Pedidos WHERE Pais = 'Espanha'

StDev, StDevP

Devolve estimaes do desvio padro para a povoao (o total dos registros da tabela) ou uma mostra da povoao representada (mostra aleatria). Sua sintaxe :
StDev(expr) StDevP(expr)

Onde expr representa o nome do campo que contm os dados que desejam avaliar ou uma expresso que realiza um clculo utilizando os dados de tais campos. Os operandos de expr podem incluir o nome de um campo de uma tabela, uma constante ou uma funo (a qual pode ser intrnseca ou definida pelo usurio, porm no outras das funes agregadas de SQL). StDevP avalia uma povoao, e StDev avalia uma mostra da povoao. Se a consulta contm menos de dois registros (ou nenhum registro para StDevP), estas funes devolvem um valor Null (o qual indica que o desvio padro no pode se calcular).
SELECT StDev(Gastos) AS Desvio FROM Pedidos WHERE Pas = 'Espanha' SELECT StDevP(Gastos) AS Desvio FROM Pedidos WHERE Pas = 'Espanha'

Sum

Devolve a soma do conjunto de valores contido em um campo especifico de uma consulta. Sua sintaxe :
Sum(expr)

Onde expr representa o nome do campo que contm os dados que se desejam somar ou uma expresso que realiza um clculo utilizando os dados de tais campos. Os operandos de expr podem incluir o nome de um campo de uma tabela, uma constante ou uma funo (a qual pode ser intrnseca ou definida pelo usurio, mas no outras das funes agregadas de SQL).
SELECT Sum(PrecoUnidade * Quantidad) AS Total

http://www.criarweb.com/manuais/32/print.php

11/07/2008

Tutorial de SQL - Manual completo

Page 55 of 90

FROM DetalhePedido

Var, VarP

Devolve uma estimao da variabilidade de uma povoao (sobre o total dos registros) ou uma mostra da povoao (mostra aleatria de registros) sobre os valores de um campo. Sua sintaxe :
Var(expr) VarP(expr)

VarP avalia uma povoao, e Var avalia uma mostra da povoao. Expr o nome do campo que contm os dados que se desejam avaliar ou uma expresso que realiza um clculo utilizando os dados de tais campos. Os operandos de expr podem incluir o nome de um campo de uma tabela, uma constante ou uma funo (a qual pode ser intrnseca ou definida pelo usurio, mas no outras das funes agregadas de SQL) Se a consulta contiver menos de dois registros, Var e VarP devolvem Null (isto indica que a variabilidade no pode ser calculada). Pode utilizar Var e VarP em uma expresso de consulta ou em uma Instruo SQL.
SELECT Var(Gastos) AS Variabilidade FROM Pedidos WHERE Pas = 'Espanha' SELECT VarP(Gastos) AS Variabilidade FROM Pedidos WHERE Pas = 'Espanha'

COMPUTE de SQL-SERVER

Esta clusula acrescenta uma fila no conjunto de dados que se est recuperando, se utiliza para realizar clculos em campos numricos. COMPUTE age sempre sobre um campo ou expresso do conjunto de resultados e esta expresso deve figurar exatamente igual na clusula SELECT e sempre se deve ordenar o resultado pela mesma ou ao memos agrupar o resultado. Esta expresso no pode utilizar nenhum ALIAS.
SELECT IdCliente, Count(IdPedido) FROM Pedidos GROUP BY IdPedido HAVING Count(IdPedido) > 20 COMPUTE Sum(Count(IdPedido)) SELECT IdPedido, (PrecoUnidade * Quantidade - Desconto) FROM [Detalhes de Pedidos] ORDER BY IdPedido COMPUTE Sum((PrecoUnidade * Quantidade - Desconto)) // Calcula o Total BY IdPedido // Calcula o Subtotal Informe de Claudio

http://www.criarweb.com/manuais/32/print.php

11/07/2008

Tutorial de SQL - Manual completo

Page 56 of 90

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

Consultas de ao

As consultas de ao so aquelas que no devolvem nenhum registro, so as encarregadas de aes como adicionar, excluir e modificar registros. Tanto as sentenas de atualizao como as de excluso desencadeiaro (segundo o motor de dados) as atualizaes em cascata, excluses em cascata, restries e valores padres definidos para os diferentes campos ou tabelas afetadas pela consulta. DELETE Cria uma consulta de eliminao que elimina os registros de uma ou mais das tabelas listadas na clusula FROM que satisfaam a clusula WHERE. Esta consulta elimina os registros completos, no possvel eliminar o contedo de algum campo em concreto. Sua sintaxe : Uma vez eliminados os registros utilizando uma consulta de excluso, no se poder desfazer a operao. Se desejar saber que registros foram eliminados, primeiro examine os resultados de uma consulta de seleo que utilize o mesmo critrio e depois execute a consulta de excluso. Mantenha cpias de segurana (back ups) de seus dados em todo momento. Se eliminar os registros errados poder recuper-los a travs das cpias de segurana. DELETE FROM Empregados WHERE Cargo = 'Vendedor' INSERT INTO DELETE FROM Tabela WHERE criterio

Agrega um registro em uma tabela. conhecida como uma consulta de dados adicionados. Esta consulta pode ser de dois tipos: Inserir um nico registro ou Inserir em uma tabela os registros contidos em outra tabela. Para inserir um nico Registro: Neste caso a sintaxe a seguinte:

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 novatabela FROM tabelaorigem [WHERE criterios]

INSERT INTO Tabela (campo1, campo2, ..., campoN) VALUES (valor1, valor2, ..., valorN)

Pode-se utilizar as consultas de criao de tabela para arquivar registros, fazer cpias de segurana das tabelas ou fazer cpias para exportar a outro banco de dados ou utilizar em informes que mostrem os dados de um perodo de tempo concreto. Por exemplo, se poderia criar um informe de Vendas mensais por regio executando a mesma consulta de criao de

http://www.criarweb.com/manuais/32/print.php

11/07/2008

Tutorial de SQL - Manual completo

Page 57 of 90

tabela a cada ms.

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 Tabela Origem

Neste caso se selecionaro os campos 1,2,..., n da tabela origem e se gravaro nos campos 1,2,.., n da Tabela. A condio SELECT pode incluir a clusula WHERE para filtrar os registros a copiar. Se Tabela e Tabela Origem possuem a mesma estrutura podemos simplificar a sintaxe a: Desta forma os campos de Tabela Origem se gravaro em Tabela, para realizar esta operao necessrio que todos os campos de Tabela Origem estejam contidos com igual nome em Tabela. Com outras palavras que Tabela possua todos os campos de Tabela Origem (igual nome e igual tipo). Neste tipo de consulta h que ter especial ateno com os campos contadores ou autonumricos visto que ao inserir um valor em um campo deste tipo se escreve o valor que contenha seu campo homlogo na tabela origem, no incrementando-se como lhe corresponde. INSERT INTO Tabela SELECT Tabela Origem.* FROM Tabela Origem

Pode-se utilizar a instruo INSERT INTO para agregar um registro nico a uma tabela, utilizando a sintaxe da consulta de adio de registro nico tal e como se mostrou anteriormente. Nesse caso, seu cdigo 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 o valor para tal campo. Quando no se especifica tal campo, se insere o valor pr-determinado ou Null. Os registros se agregam no final da tabela. Tambm se pode utilizar INSERT INTO para agregar um conjunto de registros pertencentes a outra tabela ou consulta utilizando a clusula SELECT... FROM como se mostrou anteriormente na sintaxe da consulta de adio de mltiplos registros. Neste caso, a clusula SELECT especifica os campos que se vo agregar na tabela destino especificada. A tabela destino ou origem pode especificar uma tabela ou uma consulta. Se a tabela destino contiver uma chave principal, h que certificar-se que a nica, e com valores no nulos; se no for assim, no se agregaro os registros. Se se agregam registros a uma tabela com um campo Contador, no se deve incluir o campo Contador na consulta. Pode-se empregar a clusula IN para agregar registros a uma tabela em outro banco de dados.

Pode-se averiguar os registros que se agregaro na consulta executando primeiro uma consulta de seleo que utilize o mesmo critrio de seleo e ver o resultado. Uma consulta de adio copia os registros de uma ou mais tabelas em outra. As tabelas que contm os registros que se vo agregar no se vero afetadas pela consulta de adio. Ao invs de agregar registros existentes em outra tabela, pode-se especificar os valores de cada campo em um novo registro utilizando a clusula VALUES. Se se omite a lista de campos, a clusula VALUES deve incluir um valor para cada campo da tabela, de outra forma falhar INSERT. Exemplos INSERT INTO Clientes SELECT ClientesAntigos.*

http://www.criarweb.com/manuais/32/print.php

11/07/2008

Tutorial de SQL - Manual completo

Page 58 of 90

FROM ClientesNovos

SELECT Empregados.* INTO Programadores FROM Empregados WHERE Categoria = 'Programador'

Esta consulta cria uma tabela nova chamada programadores com a mesma estrutura que a tabela empregado e copia aqueles registros cujo campo categoria seja programador INSERT INTO Empregados (Nome, Sobrenome, Cargo) VALUES ( 'Luis', 'Snchez', 'Estagiario' ) INSERT INTO Empregados SELECT Vendedores.* FROM Vendedores WHERE Cidade = 'Madri' UPDATE

Cria uma consulta de atualizao que muda os valores dos campos de uma tabela especificada baseando-se em um critrio especfico. Sua sintaxe : UPDATE Tabela SET Campo1=Valor1, Campo2=Valor2, CampoN=ValorN WHERE Criterio

UPDATE especialmente til quando se deseja mudar um grande nmero de registros ou quando estes se encontram em mltiplas tabelas. Pode mudar vrios campos de uma s vez. O exemplo seguinte incrementa os valores Quantidade pedidos em um 10 por cento e os valores Transporte em um 3 por cento para aqueles que se tiverem enviado ao Reino Unido.: UPDATE Pedidos SET Pedido = Pedidos * 1.1, Transporte = Transporte * 1.03 WHERE PaisEnvio = 'ES'

UPDATE no gera nenhum resultado. Para saber que registros mudaro, h que examinar primeiro o resultado de uma consulta de seleo que utilize o mesmo critrio e depois executar a consulta de atualizao. UPDATE Empregados SET Grau = 5

http://www.criarweb.com/manuais/32/print.php

11/07/2008

Tutorial de SQL - Manual completo

Page 59 of 90

WHERE Grau = 2

UPDATE Produtos SET Preco = Preco * 1.1 WHERE Provedor = 8 AND Familia = 3

Se em uma consulta de atualizao suprimimos a clusula WHERE todos os registros da tabela assinalada sero atualizados. UPDATE Empregados SET 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 primrios e de vrios sinnimos vlidos reconhecidos por tais tipos de dados. Os tipos de dados primrios so:

Tipo de Dados BINARY BIT BYTE

Longitude 1 byte 1 byte 1 byte 4 bytes 8 bytes 8 bytes 4 bytes

Descrio

Para consultas sobre tabela anexa de produtos de banco de dados que definem um tipo de dados Binrio. Valores Sim/No ou True/False Um valor inteiro entre 0 e 255.

COUNTER

CURRENCY DATETIME SINGLE

Um nmero incrementado automaticamente (de tipo Long) Um inteiro escalvel entre 922.337.203.685.477,5808 e 922.337.203.685.477,5807. Um valor de data ou hora entre os anos 100 e 9999.

Um valor em ponto flutuante de preciso simples com uma classificao de - 3.402823*1038 a -1.401298*10-45 para valores negativos, 1.401298*10- 45 a 3.402823*1038 para valores positivos, e 0.

DOUBLE

8 bytes

Um valor em ponto flutuante de dupla preciso com uma classificao de - 1.79769313486232*10308 a 4.94065645841247*10-324 para valores negativos, 4.94065645841247*10-324 a 1.79769313486232*10308 para valores positivos, e 0.

http://www.criarweb.com/manuais/32/print.php

11/07/2008

Tutorial de SQL - Manual completo

Page 60 of 90

SHORT LONG LONGTEXT LONGBINARY TEXT

2 bytes 4 bytes 1 byte por caractere 1 byte por caractere

Um inteiro curto entre -32,768 e 32,767. De zero a um mximo de 1.2 gigabytes.

Um inteiro longo entre -2,147,483,648 e 2,147,483,647.

Segundo se necessite

De zero 1 gigabyte. Utilizado para objetos OLE. De zero a 255 caracteres.

A seguinte tabela recolhe os sinnimos dos tipos de dados definidos: Tipo de Dado BINARY BIT BYTE Sinnimos BOOLEAN LOGICAL LOGICAL1 YESNO VARBINARY

COUNTER

INTEGER1 MONEY

CURRENCY DATETIME SINGLE

AUTOINCREMENT DATE TIME TIMESTAMP

FLOAT4 IEEESINGLE REAL

DOUBLE SHORT LONG LONGBINARY LONGTEXT TEXT

FLOAT FLOAT8 IEEEDOUBLE NUMBER NUMERIC INTEGER2 SMALLINT INT INTEGER INTEGER4

GENERAL OLEOBJECT LONGCHAR MEMO NOTE

ALPHANUMERIC CHAR - CHARACTER STRING - VARCHAR

VARIANT (No Admitido) VALUE

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

http://www.criarweb.com/manuais/32/print.php

11/07/2008

Tutorial de SQL - Manual completo

Page 61 of 90

Subconsultas em SQL

Uma subconsulta uma instruo SELECT adicionada dentro de uma instruo SELECT, SELECT...INTO, INSERT...INTO, DELETE, ou UPDATE ou dentro de outra subconsulta. Pode utilizar trs formas de sintaxe para criar uma subconsulta:
comparao [ANY | ALL | SOME] (instruo sql) expresso [NOT] IN (instruo sql) [NOT] EXISTS (instruo sql)

Onde: comparao expresso instruo SQL uma expresso e um operador de comparao que compara a expresso com o resultado da subconsulta. uma instruo SELECT, que segue o mesmo formato e regras que qualquer outra SELECT. Deve ir entre parnteses. uma expresso pela qual se busca o conjunto resultante da subconsulta.

Pode-se utilizar uma subconsulta no lugar de uma expresso na lista de campos de uma instruo SELECT ou em uma clusula WHERE ou HAVING. Em uma subconsulta, se utiliza uma instruo SELECT para proporcionar um conjunto de um ou mais valores especificados para avaliar na expresso da clusula WHERE ou HAVING. Pode-se utilizar o predicado ANY ou SOME, os quais so sinnimos, para recuperar registros da consulta principal, que satisfaam a comparao com qualquer outro registro recuperado na subconsulta. O exemplo seguinte devolve todos os produtos cujo preo unitrio for maior que o de qualquer produto vendido com um desconto igual ou maior ao 25 por cento:
SELECT * FROM Produtos WHERE PrecoUnidade ANY ( SELECT PrecoUnidade FROM DetalhePedido WHERE Desconto = 0 .25 )

O predicado ALL se utiliza para recuperar unicamente aqueles registros da consulta principal que satisfazem a comparao com todos os registros recuperados na subconsulta. Se se muda ANY por ALL no exemplo anterior, a consulta devolver unicamente aqueles produtos cujo preo unitrio for maior que o de todos os produtos vendidos com um desconto igual ou maior ao 25 por cento. Isto muito mais restritivo. O predicado IN se emprega para recuperar unicamente aqueles registros da consulta principal para os que alguns registros da subconsulta contm um valor igual. O exemplo seguinte devolve todos os produtos vendidos com um desconto igual ou maior ao 25 por cento:
SELECT * FROM Produtos WHERE IDProduto IN ( SELECT IDProduto FROM

http://www.criarweb.com/manuais/32/print.php

11/07/2008

Tutorial de SQL - Manual completo

Page 62 of 90

DetalhePedido WHERE Desconto = 0.25

Inversamente, pode-se utilizar NOT IN para recuperar unicamente aqueles registros da consulta principal para os que no tm nenhum registro da subconsulta que contenha um valor igual. O predicado EXISTS (com palavra reservada NOT opcional) se utiliza em comparaes de verdade/falso para determinar se a subconsulta devolve algum registro. Suponhamos que desejamos recuperar todos aqueles clientes que tiverem realizado pelo menos um pedido:
SELECT Clientes.Companhia, Clientes.Telefone FROM Clientes WHERE EXISTS ( SELECT FROM Pedidos WHERE Pedidos.IdPedido = Clientes.IdCliente )

Esta consulta equivalente a esta outra:


SELECT Clientes.Companhia, Clientes.Telefone FROM Clientes WHERE IdClientes IN ( SELECT Pedidos.IdCliente FROM Pedidos )

Pode-se utilizar tambm alias do nome da tabela em uma subconsulta para se referir s tabelas listadas na clusula FROM fora da subconsulta. O exemplo seguinte devolve os nomes dos empregados cujo salrio for igual ou maior do que o salrio mdio de todos os empregados com o mesmo ttulo. tabela Empregados foi dado o alias T1:
SELECT Sobrenome, Nome, Titulo, Salario FROM Empregados AS T1 WHERE Salario = ( SELECT Avg(Salario) FROM Empregados WHERE T1.Titulo = Empregados.Titulo ) ORDER BY Titulo

No exemplo anterior, a palavra reservada AS opcional.


SELECT Sobrenomes, Nome, Cargo, Salario FROM Empregados WHERE Cargo LIKE 'Agente Ven*'

http://www.criarweb.com/manuais/32/print.php

11/07/2008

Tutorial de SQL - Manual completo

Page 63 of 90

AND Salario ALL ( SELECT Salario FROM Empregados WHERE Cargo LIKE '*Chefe*' OR Cargo LIKE '*Diretor*'

(Obtm uma lista com o nome, cargo e salrio de todos os agentes de ventas cujo salrio for maior que o de todos os chefes e diretores.)
SELECT DISTINCT NomeProduto, Preco_Unidade FROM Produtos WHERE PrecoUnidade = ( SELECT PrecoUnidade FROM Produtos WHERE NomeProduto = 'Almbar anisado' )

(Obtm uma lista com o nome e o preo unitrio de todos os produtos com o mesmo preo que o almbar anisado.)
SELECT DISTINCT NomeContato, NomeCompanhia, CargoContato, Telefone FROM Clientes WHERE IdCliente IN ( SELECT DISTINCT IdCliente FROM Pedidos WHERE DataPedido <#07/01/1993# )

(Obtm uma lista das companhias e dos contatos de todos os clientes que realizaram um pedido no segundo trimestre de 1993.)
SELECT Nome, Sobrenomes FROM Empregados AS E WHERE EXISTS ( SELECT * FROM Pedidos AS O WHERE O.IdEmpregado = E.IdEmpregado )

(Seleciona o nome de todos os empregados que reservaram pelo menos um pedido.)


SELECT DISTINCT Pedidos.Id_Produto, Pedidos.Quantidade, ( SELECT Produtos.Nome FROM Produtos WHERE

http://www.criarweb.com/manuais/32/print.php

11/07/2008

Tutorial de SQL - Manual completo

Page 64 of 90

Produtos.IdProduto = Pedidos.IdProduto ) AS ElProduto FROM Pedidos WHERE Pedidos.Quantidade = 150 ORDER BY Pedidos.Id_Produto

(Recupera o Cdigo do Produto e a Quantidade pedida da tabela pedidos, extraindo o nome do produto da tabela de produtos.)
SELECT NumVoo, Lugares FROM Voos WHERE Origem = 'Madri' AND Exists ( SELECT T1.NumVoo FROM Voos AS T1 WHERE T1.LuagaresLivres > 0 AND T1.NumVuelo=Vuelos.NumVuelo)

(Recupera nmeros de vo e capacidades de aqueles vos com destino Madri e lugares livres

Suponhamos agora que temos uma tabela com os identificadores de todos nossos produtos e o stock de cada um deles. Em outra tabela se encontram todos os pedidos que temos pendentes de servir. Trata-se de averiguar que produtos no se podem servir por falta de estoque.
SELECT PedidosPendentes.Nome FROM PedidosPendentes GROUP BY PedidosPendentes.Nome HAVING SUM(PedidosPendentes.Quantidade < ( SELECT Produtos.Estoque FROM Produtos WHERE Produtos.IdProduto = PedidosPendentes.IdProduto ) )

Suponhamos que em nossa tabela de empregados desejamos buscar todas as mulheres cuja idade seja maior da de qualquer homem:
SELECT Empregados.Nome FROM Empregados WHERE Sexo = 'M' AND Idade > ANY (SELECT Empregados.Idade FROM Empregados WHERE Sexo ='H') Ou o que seria o mesmo: SELECT Empregados.Nome FROM Empregados WHERE Sexo = '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

http://www.criarweb.com/manuais/32/print.php

11/07/2008

Tutorial de SQL - Manual completo

Page 65 of 90

3 3 3 3 3

> ANY > ALL

= ANY = ANY

(2,5,7) (2,5,7)

(2,5,7)

(2,3,5,7) Certo Falso Falso

Falso

Certo

< ALL

(5,6,7)

A operao =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 Unio Internas


Consultas de Combinao entre tabelas As vinculaes entre tabelas se realizam mediante a clusula INNER que combina registros de duas tabelas sempre que tiver concordncia de valores em um campo comum. Sua sintaxe :
SELECT campos FROM tb1 INNER JOIN tb2 ON tb1.campo1 comp tb2.campo2

Onde: tb1, tb2 So os nomes das tabelas desde as que se combinam os registros. So os nomes dos campos que se combinam. Se no so numricos, os campos devem ser do mesmo tipo de dados e conter o mesmo tipo de dados, porm no tem que ter o mesmo nome. qualquer operador de comparao relacional: =, <,<>, <=, =>, >.

campo1, campo2 comp

Pode-se utilizar uma operao INNER JOIN em qualquer clusula FROM. Isto cria uma combinao por equivalncia, conhecida tambm como unio interna. As combinaes equivalentes so as mais comuns; estas combinam os registros de duas tabelas sempre que tiver concordncia de valores em um campo comum a ambas tabelas. Pode-se utilizar INNER JOIN com as tabelas Departamentos e Empregados para selecionar todos os empregados de cada departamento. Do contrrio, para selecionar todos os departamentos (inclusive se algum deles no tiver nenhum empregado atribudo) se emprega LEFT JOIN ou todos os empregados (inclusive se algum no estiver atribudo 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 numricos quaisquer, inclusive se so de diferentes tipos de dados. Por exemplo, pode combinar um campo Numrico para o que a propriedade Size de seu objeto Field est estabelecida como Inteiro, e um campo Contador.

O exemplo seguinte mostra como poderia combinar as tabelas Categorias e Produtos baseandose no campo IDCategoria:
SELECT NomeCategoria, NomeProduto FROM Categorias INNER JOIN Produtos ON Categorias.IDCategoria = Produtos.IDCategoria

No exemplo anterior, IDCategoria o campo combinado, porm no est includo na sada da

http://www.criarweb.com/manuais/32/print.php

11/07/2008

Tutorial de SQL - Manual completo

Page 66 of 90

consulta j que no est includo na instruo SELECT. Para incluir o campo combinado, incluir o nome do campo na instruo SELECT, neste caso, Categorias.IDCategoria. Tambm se pode linkar vrias clusulas ON em uma instruo JOIN, utilizando a seguinte sintaxe:
SELECT campos FROM tabela1 INNER JOIN tabela2 ON (tb1.campo1 comp tb2.campo1 AND ON tb1.campo2 comp tb2.campo2) OR ON (tb1.campo3 comp tb2.campo3)

Tambm pode aninhar instrues 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, porm um INNER JOIN no pode se aninhar dentro de um LEFT JOIN ou um RIGHT JOIN. Exemplo:

SELECT DISTINCT Sum(PrecoUnitario * Quantidade) AS Sales, (Nome + ' ' + Sobrenome) AS Name FROM Empregados INNER JOIN( Pedidos INNER JOIN DetalhesPedidos ON Pedidos.IdPedido = DetalhesPedidos.IdPedido) ON Empregados.IdEmpregado = Pedidos.IdEmpregado GROUP BY Nome + ' ' + Sobrenome

(Cria duas combinaes equivalentes: uma entre as tabelas Detalhes de pedidos e Pedidos, e a outra entre as tabelas Pedidos e Empregados. Isto necessrio j que a tabela Empregados no contem dados de vendas e a tabela Detalhes de pedidos no contem dados dos empregados. A consulta produz uma lista de empregados e suas vendas totais.) Se empregarmos a clusula INNER na consulta se selecionaro s aqueles registros da tabela da que tivermos escrito esquerda de INNER JOIN que contenham ao menos um registro da tabela que tivermos escrito direita. Para solucionar isto temos duas clusulas que substituem a palavra-chave INNER, estas clusulas so LEFT e RIGHT. LEFT toma todos os registros da tabela da esquerda embora no tenha nenhum registro na tabela da esquerda. RIGHT realiza a mesma operao, porm ao contrrio, toma todos os registros da tabela da direita embora no tenha nenhum registro na tabela da esquerda.

A sintaxe exposta anteriormente pertence a ACCESS, onde todas as sentenas com a sintaxe funcionam corretamente. Os manuais de SQL-SERVER dizem que esta sintaxe incorreta e que h que adicionar a palavra reservada OUTER: LEFT OUTER JOIN e RIGHT OUTER JOIN. Na prtica funciona corretamente de uma forma ou de outra. No obstante, os INNER JOIN ORACLE no capaz de interpret-los, mas existe uma sintaxe em formato ANSI para os INNER JOIN que funcionam em todos os sistemas. Tomando como referncia a seguinte sentena:
SELECT Faturas.*, Alvaras.* FROM

http://www.criarweb.com/manuais/32/print.php

11/07/2008

Tutorial de SQL - Manual completo

Page 67 of 90

Faturas INNER JOIN Alvaras ON Faturas.IdAlvara = Alvaras.IdAlvara WHERE Faturas.IdCliente = 325

A transformao desta sentena a formato ANSI seria a seguinte:


SELECT Faturas.*, Alvaras.* FROM Faturas, Alvaras WHERE Faturas.IdAlvara = Alvaras.IdAlvara AND Faturas.IdCliente = 325

Como se pode observar as mudanas realizadas foram as seguintes: 1. Todas as tabelas que intervm na consulta se especificam na clusula FROM. 2. As condies que vinculam s tabelas se especificam na clusula WHERE e se vinculam mediante o operador lgico AND. Referente aos OUTER JOIN, no funcionam em ORACLE e ademais conheo uma sintaxe que funciona nos trs sistemas. A sintaxe em ORACLE igual sentena anterior, porm adicionando os caracteres (+) atrs do nome da tabela na qual desejamos aceitar valores nulos, isto equivale a um LEFT JOIN:
SELECT Faturas.*, Alvaras.* FROM Faturas, Alvaras WHERE Faturas.IdAlvara = Alvaras.IdAlvara (+) AND Faturas.IdCliente = 325

E isto a um RIGHT JOIN:


SELECT Faturas.*, Alvaras.* FROM Faturas, Alvaras WHERE Faturas.IdAlvara (+) = Alvaras.IdAlvara AND Faturas.IdCliente = 325

Em SQL-SERVER se pode utilizar uma sintaxe parecida, neste caso no se utiliza os caracteres (+), e sim os caracteres =* para o LEFT JOIN e *= para o RIGHT JOIN. Consultas de Auto-combinao A auto-combinao se utiliza para unir uma tabela consigo mesma, comparando valores de duas colunas com o mesmo tipo de dados. A sintaxe na seguinte:
SELECT alias1.coluna, alias2.coluna, ... FROM tabla1 as alias1, tabela2 as alias2 WHERE

http://www.criarweb.com/manuais/32/print.php

11/07/2008

Tutorial de SQL - Manual completo

Page 68 of 90

alias1.coluna = alias2.coluna AND outras condicoes

Por exemplo, para visualizar o nmero, nome e posto de cada empregado, junto com o nmero, nome e posto do supervisor de cada um deles se utilizaria a seguinte sentena:
SELECT t.num_emp, t.nome, t.posto, t.num_sup,s.nome, s.posto FROM empregados AS t, empregados AS s WHERE t.num_sup = s.num_emp

A maioria das combinaes est baseada na igualdade de valores das colunas que so o critrio da combinao. As no comuns se baseiam em outros operadores de combinao, tais como NOT, BETWEEN, <>, etc. Por exemplo, para listar o grau salarial, nome, salrio e posto de cada empregado ordenando o resultado por grau e salrio haveria que executar a seguinte sentena:
SELECT graus.grau,empregados.nome, empregados.salario, empregados.posto FROM empregados, graus WHERE empregados.salario BETWEEN grados.salarioinferior And grados.salariosuperior ORDER BY grados.grado, empregados.salario

Consultas de Combinaes no Comuns

Para listar o salrio mdio dentro de cada grau salarial haveria que lanar esta outra sentena:
SELECT graus.grau, AVG(empregados.salario) FROM empregados, graus WHERE empregados.salario BETWEEN graus.salarioinferior And graus.salariosuperior GROUP BY graus.grau

CROSS JOIN (SQL-SERVER)

Utiliza-se em SQL-SERVER para realizar consultas de unio. Suponhamos que temos uma tabela com todos os autores e outra com todos os livros. Se desejssemos obter uma listagem combinando ambas tabelas de tal forma que cada autor aparecesse junto a cada ttulo, utilizaramos a seguinte sintaxe:
SELECT Autores.Nome, Livros.Titulo FROM Autores CROSS JOIN Livros

SELF JOIN uma tcnica empregada para conseguir o produto cartesiano de uma tabela consigo mesma. Sua utilizao no muito freqente, mas colocaremos algum exemplo de sua utilizao. Suponhamos a seguinte tabela (O campo autor numrico, embora para ilustrar o exemplo utilize o nome): Autores

SELF JOIN

http://www.criarweb.com/manuais/32/print.php

11/07/2008

Tutorial de SQL - Manual completo

Page 69 of 90

Cdigo (Cdigo do livro) Autor (Nome do Autor) B0012 B0012 B0012 C0014 C0014 D0120 D0120 1. Francisco Lpez 2. Javier Alonso

3. Marta Rebolledo 1. Francisco Lpez 2. Javier Alonso 2. Javier Alonso

3. Marta Rebolledo

Queremos obter, para cada livro, pares de autores:


SELECT A.Codigo, A.Autor, B.Autor FROM Autores A, Autores B WHERE A.Codigo = B.Codigo

O resultado o seguinte: Cdigo Autor B0012 1. Francisco Lpez 1. Francisco Lpez B0012 1. Francisco Lpez 2. Javier Alonso B0012 2. Javier Alonso B0012 2. Javier Alonso B0012 2. Javier Alonso 2. Javier Alonso B0012 1. Francisco Lpez 3. Marta Rebolledo 1. Francisco Lpez Autor

B0012 3. Marta Rebolledo 3. Marta Rebolledo B0012 3. Marta Rebolledo 2. Javier Alonso B0012 3. Marta Rebolledo 1. Francisco Lpez C0014 1. Francisco Lpez 1. Francisco Lpez C0014 1. Francisco Lpez 2. Javier Alonso C0014 2. Javier Alonso C0014 2. Javier Alonso D0120 2. Javier Alonso D0120 2. Javier Alonso 2. Javier Alonso 2. Javier Alonso

3. Marta Rebolledo

1. Francisco Lpez 3. Marta Rebolledo

D0120 3. Marta Rebolledo 3. Marta Rebolledo D0120 3. Marta Rebolledo 2. Javier Alonso Como podemos observar, os pares de autores se repetem em cada um dos livros, podemos omitir estas repeties da seguinte forma:
SELECT A.Codigo, A.Autor, B.Autor FROM Autores A, Autores B WHERE A.Codigo = B.Codigo AND A.Autor < B.Autor

O resultado agora o seguinte:

http://www.criarweb.com/manuais/32/print.php

11/07/2008

Tutorial de SQL - Manual completo

Page 70 of 90

Cdigo Autor B0012 B0012

1. Francisco Lpez 2. Javier Alonso 1. Francisco Lpez 2. Javier Alonso

Autor

C0014

1. Francisco Lpez 3. Marta Rebolledo 3. Marta Rebolledo

D0120 2. Javier Alonso

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

Se na tabela de empregados quisssemos extrair todos os possveis pares que podemos realizar, utilizaramos a seguinte sentena:
SELECT Homens.Nome, Mulheres.Nome FROM Empregados Homem, Empregados Mulheres WHERE Homem.Sexo = 'Homem' AND Mulheres.Sexo = 'Mulher' AND Homens.Id <>Mulheres.Id

Para concluir suponhamos a seguinte tabela: Id Nome 2 Lucas 3 Ana 4 Eva Empregados SeuChefe 1 2 1 6

1 Marcos 6

5 Juan

6 Antonio

Queremos obter um conjunto de resultados com o nome do empregado e o nome de seu chefe:
SELECT Empre.Nome, Chefes.Nome FROM Empregados Empre, Empregados Chefe WHERE Empre.SeuChefe = Chefes.Id Informe de Claudio Mail: claudio@lobocom.es URL: http://personal.lobocom.es/claudio/

Estruturas das tabelas em SQL

Na terminologia usada em SQL no se menciona s relaes, do mesmo modo que no se usa o termo atributo, porm sim a palavra coluna e linha. Criao de Tabelas Novas

CREATE TABLE tabela ( campo1 tipo (tamanho) ndice1, campo2 tipo (tamanho) ndice2,... , ndice multicampo , ... )

http://www.criarweb.com/manuais/32/print.php

11/07/2008

Tutorial de SQL - Manual completo

Page 71 of 90

Onde: tabla tipo campo1 campo2 tamanho ndice1 ndice2 o nome da tabela que ser criada. o nome do campo ou dos campos que sero criados na nova tabela. A nova tabela deve conter, ao menos, um campo. o tipo de dados de campo na nova tabela. o tamanho do campo, s se aplica para campos de tipo texto.

ndice multicampos

uma clusula CONSTRAINT que define o tipo de ndice a criar. Esta clusula opcional. uma clusula CONSTRAINT que define o tipo de ndice multicampos a criar. Um ndice multicampo aquele que est indexado pelo contedo de vrios campos. Esta clusula opcional.

CREATE TABLE Empregados ( Nome TEXT (25), Sobrenomes TEXT (50) )

(Cria uma nova tabela chamada Empregados com dois campos, um chamado Nome de tipo texto e longitud 25 e outro chamado sobrenomes com longitude 50).
CREATE TABLE Empregados ( Nome TEXT (10), Sobrenomes TEXT, DataNascimento DATETIME ) CONSTRAINT IndiceGeral UNIQUE ( Nome, Sobrenomes, DataNascimento )

(Cria uma nova tabela chamada Empregados com um campo Nome de tipo texto e longitude 10, outro chamado Sobrenomes de tipo texto e longitude pr-determinada (50) e um mais chamado DataNascimento de tipo Data/Hora. Tambm cria um ndice nico - no permite valores repetidos - formado pelos trs campos.)
CREATE TABLE Empregados ( 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 chamado DataNascimento de tipo Data/Hora e o campo IdEmpregado de tipo inteiro o que estabelece como chave principal.) A clusula CONSTRAINT Utiliza-se a clusula CONSTRAINT nas instrues ALTER TABLE e CREATE TABLE para criar ou eliminar ndices. Existem duas sintaxes para esta clusula dependendo se deseja Criar ou Eliminar um ndice de um nico campo ou se se trata de um campo multi-ndice. Se se utiliza o motor de dados de Microsoft, s poder utilizar esta clusula com os bancos de dados prprias de tal motor. Para os ndices de campos nicos:
CONSTRAINT nome {PRIMARY KEY | UNIQUE | REFERENCES tabela externa

http://www.criarweb.com/manuais/32/print.php

11/07/2008

Tutorial de SQL - Manual completo

Page 72 of 90

[(campo externo1, campo externo2)]}

Para os ndices de campos mltiplos:

CONSTRAINT nome {PRIMARY KEY (primario1[, primario2 [,...]]) | UNIQUE (nico1[, nico2 [, ...]]) | FOREIGN KEY (ref1[, ref2 [,...]]) REFERENCES tabela externa [(campo externo1 ,campo externo2 [,...])]} Onde:

nome

primarioN nicoN refN

o nome do ndice que se criar.

o nome do campo ou dos campos que formam o ndice primrio.

o nome do campo ou dos campos que formam o ndice de chave nica. o nome do campo ou dos campos que formam o ndice externo (fazem referncia a campos de outra tabela).

tabela externa o nome da tabela que contm o campo ou os campos referenciados em refN campos externos o nome do campo ou dos campos da tabela externa especificados por ref1, ref2,... , refN

Se se deseja criar um ndice para um campo quando se est utilizando as instrues ALTER TABLE ou CREATE TABLE a clusula CONTRAINT deve aparecer imediatamente depois da especificao do campo indexado. Se se deseja criar um ndice com mltiples campos quando se est utilizando as instrues ALTER TABLE ou CREATE TABLE a clusula CONSTRAINT deve aparecer fora da clusula de criao de tabela. Indice Descrio

UNIQUE

Gera um ndice primrio o campo ou os campos especificados. Todos os campos da PRIMARY chave principal devem ser nicos e no nulos, cada tabela s pode conter uma KEY nica chave principal.

Gera um ndice de chave nica. O que implica que os registros da tabela no podem conter o mesmo valor nos campos indexados.

Gera um ndice externo (toma como valor do ndice campos contidos em outras tabelas). Se a chave principal da tabela externa consta de mais de um campo, se deve utilizar uma definio de ndice de mltiplos campos, listando todos os campos de referncia, o nome da tabela externa, e os nomes dos campos referenciados na FOREIGN tabela externa na mesma ordem que os campos de referncia listados. Se os KEY campos referenciados so a chave principal da tabela externa, no tem que especificar os campos referenciados, pr-determinado por valor, o motor Jet se comporta como se a chave principal da tabela externa estivesse formada pelos campos referenciados. Criao de ndices

Se se utiliza o motor de dados Jet de Microsoft s se podem criar ndices em banco ed dados do mesmo motor. A sintaxe para criar um ndice em uma tabela j definida na seguinte:
CREATE [ UNIQUE ] INDEX ndice ON Tabela (campo [ASC|DESC][, campo [ASC|DESC], ...]) [WITH { PRIMARY | DISALLOW NULL | IGNORE NULL }]

Onde:

http://www.criarweb.com/manuais/32/print.php

11/07/2008

Tutorial de SQL - Manual completo

Page 73 of 90

ndice tabla campo

o nome do ndice a criar.

o nome de uma tabela existente na que se criar o ndice.

ASC|DESC UNIQUE DISALLOW NULL IGNORE NULL

o nome do campo ou lista de campos que constituem o ndice. Indica que o ndice no pode conter valores duplicados. Probe valores nulos no ndice

Indica a ordem dos valores dos campos ASC indica uma ordem ascendente (valor pr-determinado) e DESC uma ordem descendente.

Exclui do ndice os valores nulos includos nos campos que o compem.

PRIMARY

Atribui ao ndice a categoria de chave principal, em cada tabela s pode existir um nico ndice que seja "Chave Principal". Se um ndice chave principal implica que no pode conter valores nulos nem duplicados.

No caso de ACCESS, se pode utilizar CREATE INDEX para criar um pseudo ndice sobre uma tabela adjunta em uma fonte de dados ODBC tal como SQL Server que no tenha ainda um ndice. No necessita permisso ou ter acesso a um servidor remoto para criar um pseudo ndice, ademais o banco de dados remoto no consciente e no 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 INDEX MeuIndice ON Empregados (Prefixo, Telefone) (Cria um ndice chamado MeuIndice na tabela empregados com os campos Prefixo e Telefone.) CREATE UNIQUE INDEX MeuIndice ON Empregados (IdEmpregado) WITH DISALLOW NULL

(Cria um ndice na tabela Empregados utilizando o campo IdEmpregado, obrigando que o campo IdEmpregado no 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 ndices existentes. 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: tabla tipo

campo tamanho ndice ndice multicampo

o nome da tabela que se deseja modificar. o tipo de campo que adicionar.

o nome do campo que se adicionar ou eliminar. o tamanho do campo que se adicionar (s para campos de texto).

o nome do ndice do campo (quando se criam campos) ou o nome do ndice da tabela que se deseja eliminar. o nome do ndice do campo multicampo (quando se criam campos) ou o nome do ndice da tabela que se deseja eliminar.

http://www.criarweb.com/manuais/32/print.php

11/07/2008

Tutorial de SQL - Manual completo

Page 74 of 90

Operao ADD COLUMN ADD DROP COLUMN DROP

Descrio

Utiliza-se para adicionar um novo campo tabela, indicando o nome, o tipo de campo e opcionalmente o tamanho (para campos de tipo texto). Utiliza-se para agregar um ndice de multicampos ou de um nico campo. Utiliza-se para apagar um campo. Especifica-se unicamente o nome do campo.

Utiliza-se para eliminar um ndice. Especifica-se unicamente o nome do ndice a seguir da palavra reservada CONSTRAINT.

ALTER TABLE Empregados ADD COLUMN Salario CURRENCY (Agrega um campo Salario de tipo Moeda a tabela Empregados.) ALTER TABLE Empregados DROP COLUMN Salario (Elimina o campo Salario da tabela Empregados.) ALTER TABLE Pedidos ADD CONSTRAINT RelacaoPedidos FOREIGN KEY (IdEmpregado) REFERENCES Empregados (IdEmpregado) (Agrega um ndice externo tabela Pedidos. O ndice externo se baseia no campo IdEmpregado e se refere ao campo IdEmpregado da tabela Empregados. Neste exemplo, no necessrio indicar o campo junto ao nome da tabela na clusula REFERENCES, pois ID_Empregado a chave principal da tabela Empregados.) ALTER TABLE Pedidos DROP CONSTRAINT RelacaoPedidos (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 possvel a abertura de cursores de dados desde o prprio ambiente de trabalho, para isso se utilizam, normalmente procedimentos armazenados. A sintaxe para definir um cursor a seguinte: DECLARE nome-cursor FOR especificacao-consulta [ORDER BY] Por exemplo: DECLARE Meu_Cursor FOR

http://www.criarweb.com/manuais/32/print.php

11/07/2008

Tutorial de SQL - Manual completo

Page 75 of 90

Este comando meramente declarativo, simplesmente especifica as filas e colunas que iremos recuperar. A consulta se executa quando se abre ou se ativa o cursor. A clusula [ORDER BY] opcional e especifica uma ordenao para as filas do cursor; se no se especifica, a ordenao das filas definida pelo gerenciador de SGBD. Para abrir ou ativar um cursor se utiliza o comando OPEN do SQL, a sintaxe a seguinte: OPEN nome-cursor [USING lista-variaveis]

SELECT num_emp, nome, posto, salario FROM empregados WHERE num_dept = 'informatica'

Ao abrir o cursor, avalia-se a consulta que aparece em sua definio, utilizando os valores atuais de qualquer parmetro referenciado na consulta, para produzir uma coleo de filas. O ponteiro se posiciona diante da primeira fila de dados (registro atual), esta sentena no recupera nenhuma fila.

Uma vez aberto o cursor, utiliza-se a clusula FETCH para recuperar as filas do cursor, a sintaxe a seguinte: FETCH nome-cursor INTO lista-variaveis

Lista - variaveis so as variveis que vo conter os dados recuperados da fila do cursor, na definio devem ir separadas por vrgulas. Na lista de variveis, deve-se definir tantas variveis como colunas quantas tiver a fila a recuperar. Para fechar um cursor, utiliza-se o comando CLOSE, este comando faz desaparecer o ponteiro sobre o registro atual. A sintaxe : CLOSE nome-cursor

Por ltimo, e para eliminar o cursor, utiliza-se o comando DROP CURSOR. Sua sintaxe a seguinte: DROP CURSOR nome-cursor

Exemplo (sobre SQL-SERVER):

Abrir um cursor e percorr-lo

DECLARE Employee_Cursor CURSOR FOR SELECT LastName, FirstName FROM Northwind.dbo.Employees WHERE LastName like 'B%' OPEN Employee_Cursor FETCH NEXT FROM Employee_Cursor WHILE @@FETCH_STATUS = 0 BEGIN

http://www.criarweb.com/manuais/32/print.php

11/07/2008

Tutorial de SQL - Manual completo

Page 76 of 90

FETCH NEXT FROM Employee_Cursor END CLOSE Employee_Cursor DEALLOCATE Employee_Cursor SET NOCOUNT ON DECLARE @au_id varchar(11), @au_fname varchar(20), @au_lname varchar(40), @message varchar(80), @title varchar(80)

Abrir um cursor e imprimir seu contedo

PRINT "-------- Utah Authors report --------" DECLARE authors_cursor CURSOR FOR SELECT au_id, au_fname, au_lname FROM authors WHERE state = "UT" ORDER BY au_id

OPEN authors_cursor FETCH NEXT FROM authors_cursor INTO @au_id, @au_fname, @au_lname WHILE @@FETCH_STATUS = 0 BEGIN PRINT " " SELECT

@message = "----- Books by Author: " + @au_fname + " " + @au_lname PRINT @message SELECT t.title

DECLARE titles_cursor CURSOR FOR FROM titleauthor ta, titles t OPEN titles_cursor

WHERE ta.title_id = t.title_id AND ta.au_id = au_id FETCH NEXT FROM titles_cursor INTO @title IF @@FETCH_STATUS <> 0 PRINT " <<No Books>>"

WHILE @@FETCH_STATUS = 0

http://www.criarweb.com/manuais/32/print.php

11/07/2008

Tutorial de SQL - Manual completo

Page 77 of 90

BEGIN

SELECT @message = " " + @title PRINT @message END FETCH NEXT FROM titles_cursor INTO @title CLOSE titles_cursor

DEALLOCATE titles_cursor

FETCH NEXT FROM authors_cursor

INTO @au_id, @au_fname, @au_lname END CLOSE authors_cursor DEALLOCATE authors_cursor GO Percorrer um cursor USE pubs GO DECLARE authors_cursor CURSOR FOR SELECT au_lname FROM authors WHERE au_lname LIKE "B%" ORDER BY au_lname OPEN authors_cursor FETCH NEXT FROM authors_cursor WHILE @@FETCH_STATUS = 0 BEGIN FETCH NEXT FROM authors_cursor END CLOSE authors_cursor DEALLOCATE authors_cursor

Percorrer um cursor salvando os valores em variveis USE pubs GO DECLARE @au_lname varchar(40) DECLARE @au_fname varchar(20)

DECLARE authors_cursor CURSOR FOR SELECTau_lname, au_fname FROM authors WHERE au_lname LIKE "B%" ORDER BY au_lname, au_fname

OPEN authors_cursor FETCH NEXT FROM authors_cursor INTO @au_lname, @au_fname WHILE @@FETCH_STATUS = 0

http://www.criarweb.com/manuais/32/print.php

11/07/2008

Tutorial de SQL - Manual completo

Page 78 of 90

BEGIN

PRINT "Author: " + @au_fname + " " + @au_lname FETCH NEXT FROM authors_cursor INTO @au_lname, @au_fname END CLOSE authors_cursor DEALLOCATE authors_cursor

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

Referncias Cruzadas em SQL

Uma consulta de referncias cruzadas aquela que nos permite visualizar os dados em filas e em colunas, estilo tabela, por exemplo: Produto / Ano 1996 1997 Calas Camisas Sapatos 1.250 3.000 8.560 1.253 4.369 2.563

Se tivermos uma tabela de produtos e outra tabela de pedidos, podemos visualizar em total de produtos pedidos por ano para um artigo determinado, tal e como se visualiza na tabela anterior. A sintaxe para este tipo de consulta a seguinte:
TRANSFORM funo agregada instruo select PIVOT campo pivot [IN (valor1[, valor2[, ...]])]

Onde: funo agregada instruo select campo pivot uma funo SQL agregada que opera sobre os dados selecionados. uma instruo SELECT. o campo ou expresso que deseja utilizar para criar os cabealhos da coluna no resultado da consulta.

valor1, valor2 So valores fixos utilizados para criar os cabealhos da coluna.

Para resumir dados utilizando uma consulta de referncia cruzada, se selecionam os valores dos campos ou expresses especificadas como cabealhos de colunas de tal forma que podem se ver os dados em um formato mais compacto que com uma consulta de seleo. TRANSFORM opcional, porm se for includa a primeira instruo de uma cadeia SQL. Precede instruo SELECT que especifica os campos utilizados como cabealhos de fila e uma clusula GROUP BY que especifica o agrupamento das filas. Opcionalmente pode incluir outras clusulas como, por exemplo, WHERE, que especifica uma seleo adicional ou um critrio de ordenao.

http://www.criarweb.com/manuais/32/print.php

11/07/2008

Tutorial de SQL - Manual completo

Page 79 of 90

Os valores devolvidos em campo pivot se utilizam como cabealhos de coluna no resultado da consulta. Por exemplo, ao utilizar as cifras de vendas no ms da venda como pivot em uma consulta de referncia cruzada se criariam 12 colunas. Pode restringir o campo pivot para criar cabealhos a partir dos valores fixos (valor1, valor2) listados na clusula opcional IN. Tambm pode incluir valores fixos, para os que no existem dados, para criar colunas adicionais. Exemplos

TRANSFORM Sum(Quantidade) AS Vendas SELECT Produto, Quantidade FROM Pedidos WHERE Data Between #01-01-1998# And #12-31-1998# GROUP BY Produto ORDER BY Produto PIVOT DatePart("m", Data) (Cria uma consulta de tabela de referncias cruzadas que mostra as vendas de produtos por ms para um ano especfico. Os meses aparecem da esquerda direita como colunas e os nomes dos produtos aparecem de cima para baixo como filas.) TRANSFORM Sum(Quantidade) AS Vendas SELECT Companhia FROM Pedidos WHERE Data Between #01-01-1998# And #12-31-1998# GROUP BY Companhia ORDER BY Companhia PIVOT "Trimestre " & DatePart("q", Data) In ('Trimestre1', 'Trimestre2', 'Trimestre 3', 'Trimestre 4') (Cria uma consulta de tabela de referncias cruzadas que mostra as vendas de produtos por trimestre de cada provedor no ano indicado. Os trimestres aparecem da esquerda direta como colunas e os nomes dos provedores aparecem de cima para baixo como filas.)

Um caso prtico:

Trata-se de resolver o seguinte problema: temos uma tabela de produtos com dois campos, o cdigo e o nome do produto. Temos outra tabela de pedidos na que anotamos o cdigo do produto, a data do pedido e a quantidade pedida. Desejamos consultar os totais de produto por ano, calculando a mdia anual de vendas. Estrutura e dados das tabelas:

http://www.criarweb.com/manuais/32/print.php

11/07/2008

Tutorial de SQL - Manual completo

Page 80 of 90

Para resolver a consulta sondaremos a seguinte consulta:


TRANSFORM Sum(Pedidos.Quantidade) AS Resultado SELECT Nombre AS Produto, Pedidos.Id AS Cdigo, Sum(Pedidos.Quantidade) AS TOTAL, Avg(Pedidos.Quantidade) AS Media FROM Pedidos, Artigos WHERE Pedidos.Id = Artigos.Id GROUP BY Pedidos.Id, Artigos.Nome PIVOT Year(Data)

E obtemos o seguinte resultado: Produto Cdigo Total Media Sapatos 1 Calas Blusas 2 3 348 955 87 1996 1997 300 620 48 580

1940 485

238,75 375

1320

Comentrios consulta:

A clusula TRANSFORM indica o valor que desejamos visualizar nas colunas que realmente pertencem consulta, neste caso 1996 e 1997, visto que ademais colunas so opcionais. SELECT especifica o nome das colunas opcionais que desejamos visualizar, neste caso, Produto, Cdigo, Total e Mdia, indicando o nome do campo que desejamos mostrar em cada coluna ou o valor da mesma. Se incluirmos uma funo de clculo o resultado se far baseando-se nos dados da fila atual e no ao total dos dados. FROM especifica a origem dos dados. A primeira tabela que deve figurar aquela de onde desejamos extrair os dados, esta tabela deve conter ao menos trs campos, um para os ttulos da fila, outros para os ttulos da coluna e outro para calcular o valor das clulas.

Neste caso em concreto se desejava visualizar o nome do produto, como na tabela de pedidos s figurava o cdigo do mesmo se adicionou uma nova coluna na clusula select chamada Produto que se corresponda com o campo Nome da tabela de artigos. Para vincular o cdigo do artigo da tabela de pedidos com o nome do mesmo da tabela artigos, foi inserido a clusula INNER JOIN. A clusula GROUP BY especifica o agrupamento dos registros, contrariamente aos manuais de instruo esta clusula no opcional j que deve figurar sempre e devemos agrupar os

http://www.criarweb.com/manuais/32/print.php

11/07/2008

Tutorial de SQL - Manual completo

Page 81 of 90

registros pelo campo do qual extrairemos a informao. Neste caso existem dois campos dos que extramos a informao: pedidos.quantidade e artigos.nome, por isso, agrupamos pelos campos.

Para finalizar, a clusula PIVOT indica o nome das colunas no opcionais, neste caso 1996 e 1997 e como vamos ao dado que aparecer nas colunas, neste caso empregamos o ano em que se produziu o pedido, extraindo-o do campo pedidos.fecha. Outras possibilidades de data da clusula pivot so 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 dias PIVOT Format([Data],"Short Date");

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

FULL TEXT SEARCH

Introduo a freetext e contains em SQL-Server

Utiliza-se em campos de texto de grande tamanho utilizando uns ndices denominados catlogos. Estes catlogos s se podem utilizar com tabelas que contenham que definidas chaves primrias e armazenam todas as palavras do contedo das tabelas com execeo dos artigos, preposies, etc.

Os catlogos no se atualizam automaticamente nem se salvam junto com o banco de dados e cada tabela pode ter um nico catlogo. Para a utilizao destes catlogos dentro de uma consulta, podemos utilizar dois mtodos, o primeiro consiste em incluir os critrios dentro de uma clusula WHERE (CONTAINS ou FREETEXT) e o segundo utilizando uma tabela temporria que contm o ratio de acerto na consulta (CONTAINSTABLE ou FREETEXTTABLE). O predicado CONTAINS

Utiliza-se este predicado para buscar um texto especfico em uma tabela. Seu funcionamento similar ao predicado LIKE, a diferena que este no pode realizar buscas nos campos grandes de texto. CONTAINS no diferencia entre maisculas e minsculas. 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 lgicos AND/OR. Famlias de palavras Uma palavra ou uma frase que comecem por um determinado texto.

http://www.criarweb.com/manuais/32/print.php

11/07/2008

Tutorial de SQL - Manual completo

Page 82 of 90

Palavras ou frases que estejam umas prximas de outras. Para buscar uma palavra em um campo:
SELECT title_id, title, notes FROM titles WHERE CONTAINS(notes,'business')

Para localizar uma frase em um campo:


SELECT title_id, titles, notes FROM titles WHERE CONTAINS(notes,' "common business applications" ')

Para localizar uma frase em todos os campos habilitados:


SELECT title_id, titles, notes FROM titles WHERE CONTAINS(*, ' "common business applications" ')

Utilizando AND, OR e NOT


SELECT title, notes FROM titles WHERE CONTAINS(notes, ' "favorite recipes" OR "gourmet recipes" ') SELECT titles, notes FROM titles WHERE CONTAINS(notes, ' cooking AND NOT ("computer*") ') SELECT titles, notes FROM titles WHERE CONTAINS(notes, ' beer AND ales ') SELECT titles, notes FROM titles WHERE CONTAINS(*, '("ice skating" OR hockey) AND NOT olympics')

Utilizando caracteres curingas


SELECT titles, notes FROM titles WHERE CONTAINS(notes,' "ice*" ') SELECT titles, notes FROM titles WHERE CONTAINS(notes, ' "light bread*" ')

Busca de palavras ou frases indicando a importncia das palavras:

Esta busca permite indicar o peso que ter cada uma das palavras ou frases que se buscam sobre 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 Cliente WHERE CONTAINS (Endereco, 'ISABOUT ( "Rua*", Velazquez WEIGHT(0.5), Serrano(0.9)')

(Sero encontrados todos aqueles registros que no campo endereo exista a cadeia rua seguida de qualquer valor, ordenando primeiro os de "Rua Serrano", logo os de "Rua Velzquez" e depois o resto. Busca de palavras prximas: Podemos realizar buscas por duas palavras e indicar que se encontrem prximas uma da outra. A ordem das palavras no altera o resultado da busca.
SELECT titulo, notas FROM livros WHERE CONTAINS (notas, "usuario NEAR computador") SELECT titulo, notas FROM livros WHERE CONTAINS (notas, "usuario ~ computador")

Podem-se indicar trs palavras, de tal forma que a segunda e a primeira devem estar prximas ao igual que a segunda e a terceira.

http://www.criarweb.com/manuais/32/print.php

11/07/2008

Tutorial de SQL - Manual completo

Page 83 of 90

SELECT titulo, notas FROM livros WHERE 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 como resultado, aqueles registros que contm a frase completa ou algum fragmento da mesma. A sintaxe igual que o predicado CONTAINS.
... FREETEXT(descricao, ' "Em um lugar da mancha de cujo nome no quero me lembrar" ')

O predicado CONTAINSTABLE

Este predicado tem igual funcionamento e sintaxe que CONTAINS a diferena que neste caso devolve uma tabela com duas colunas, a primeira chamada [KEY] contem o valor da chave primria da tabela que a que buscamos, a segunda chamada RANK devolve um valor indicando a porcentagem de acerto na busca para cada registro.
SELECT Perguntas.Pergunta, Perguntas.Resposta, Resultado.RANK FROM Perguntas, CONTAINSTABLE(Resposta, " SQL Server") AS Resultado WHERE Perguntas.IdPergunta = Resultado.[KEY] ORDER BY Resultado.RANK Desc SELECT Perguntas.Pergunta, Perguntas.Resposta, Resultado.RANK FROM Perguntas INNER JOIN CONTAINSTABLE (Resposta, "SQL Server") AS Resultado ON Perguntas.IdPergunta = Resultados.KEY

O predicado FREETEXTTABLE

o equivalente a CONTAINSTABLE porm 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 clusula IN. Pode-se acessar a banco de dados dBase, Paradox ou Btrieve. Esta clusula s permite a conexo de um banco de dados externa por vez. Um banco de dados externo um banco de dados que no seja o ativo. Embora para melhorar os rendimentos melhor anex-los ao banco de dados atual e trabalhar com eles. Para especificar um banco de dados que no pertence a Access Basic, se agrega um ponto e vrgula (;) ao nome e se fecha entre aspas simples. Tambm pode utilizar a palavra reservada DATABASE para especificar o banco de dados externo. Por exemplo, as linhas seguintes especificam 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:


SELECT IdCliente

http://www.criarweb.com/manuais/32/print.php

11/07/2008

Tutorial de SQL - Manual completo

Page 84 of 90

FROM Clientes IN 'C:\MEUSDADOS.MDB' WHERE IDCliente Like 'A*'

(Onde MEUSDADOS.MDB o nome de um banco e dados de Microsoft Access que contm a tabela Clientes.) Acesso a um banco de dados externo de dBASE III ou IV:
SELECT IdCliente FROM Clientes IN 'C:\DBANCO\DADOS\VENDAS' 'dBASE IV'; WHERE IDCliente 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:
SELECT IdCliente FROM Clientes IN 'C:\PARADOX\DADOS\VENDAS' 'Paradox 4.x;' WHERE IDCliente Like 'A*'

(Para recuperar dados de uma tabela de Paradox verso 3.x, h que substituir 'Paradox 4.x;' por 'Paradox 3.x;'.) Acesso a um banco de dados de Btrieve:
SELECT IdCliente FROM Clientes IN 'C:\BTRIEVE\DADOS\VENDAS\FILE.DDF' 'Btrieve;' WHERE IDCliente Like 'A*'

(C:\BTRIEVE\DADOS\VENDAS\FILE.DDF a rota de acesso e nome de arquivo do arquivo de definio de dados de Btrieve.)


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

Consultas com parmetros e omisso de permisses


Consultas com parmetros As consultas com parmetros so aquelas cujas condies de busca se definem mediante parmetros. Se se executam diretamente desde o banco de dados onde foram definidas aparecer uma mensagem solicitando o valor de cada um dos parmetros. Se desejarmos execut-las desde uma aplicao h que atribuir primeiro o valor dos parmetros e depois execut-las. Sua sintaxe a seguinte: PARAMETERS nome1 tipo1, nome2 tipo2, ... , nomeN tipoN Consulta

http://www.criarweb.com/manuais/32/print.php

11/07/2008

Tutorial de SQL - Manual completo

Page 85 of 90

Onde: nome tipo o nome do parmetro o tipo de dados do parmetro

consulta Uma consulta SQL

Podem-se utilizar nomes, mas no tipos de dados em uma clusula WHERE ou HAVING.
PARAMETERS PrecoMinimo Currency, DataInicio DateTime; SELECT IdPedido, Quantidade FROM Pedidos WHERE Preco = PrecoMinimo AND DataPedido = DataInicio

Omitir as permisses de acesso

Em ambientes de bancos de dados com permisses de segurana para grupos de trabalho se pode utilizar a clusula WITH OWNERACCESS OPTION para que o usurio atual adquira os direitos de proprietrio na hora de executar a consulta. Sua sintaxe : instruo sql WITH OWNERACCESS OPTION
SELECT Sobrenome, Nome, Salario FROM Empregados ORDER BY Sobrenome WITH OWNERACCESS OPTION

Esta opo requer que esteja declarado o acesso ao arquivo de grupo de trabalho (geralmente system.mda ou system .mdw) do banco de dados atual.
Informe de Claudio Mail: claudio@lobocom.es URL: http://personal.lobocom.es/claudio/

Clusula Procedure

Procedures e busca de registros duplicados em SQL

Esta clusula pouco usual e se utiliza para criar uma consulta ao mesmo tempo que se executa, opcionalmente define os parmetros da mesma. Sua sintaxe a seguinte:
PROCEDURE NomeConsulta Parmetro1 tipo1, .... , ParmetroN tipon ConsultaSQL

Onde: NomeConsulta o nome com o qual se salvar a consulta no banco de dados. Parmetro Tipo o nome de parmetro ou dos parmetros de tal consulta. o tipo de dados do parmetro

http://www.criarweb.com/manuais/32/print.php

11/07/2008

Tutorial de SQL - Manual completo

Page 86 of 90

ConsultaSQL

a consulta que se deseja gravar e executar.

PROCEDURE ListaCategorias; SELECT DISTINCTROW NomeCategoria, IdCategoria FROM Categorias ORDER BY NomeCategoria (Atribui o nome Lista_de_categorias consulta e a executa.) PROCEDURE Resumo DataInicio DATETIME, DtaaFinal DATETIME; SELECT DISTINCTROW DataEnvio, IdPedido, ImportePedido, Format(DataEnvio, "yyyy") AS Ano FROM Pedidos WHERE DataEnvio Between DataInicio And DataFinal (Atribui o nome Resumo consulta e inclui dois parmetros.)

Busca de Registros Duplicados

Para gerar este tipo de consultas o mais simples utilizar o assistente de consultas de Access, editar a sentena SQL da consulta e col-la em nosso cdigo. No obstante, este tipo de consulta se consegue da seguinte forma:
SELECT DISTINCT Lista de Campos a Visualizar FROM Tabela WHERE CampoDeBusca In (SELECT CampoDeBusca FROM Tabela As pseudnimo GROUP BY CampoDeBusca HAVING Count(*) > 1 ) ORDER BY CampoDeBusca

Um caso prtico, se desejarmos localizar aqueles empregados com nome igual e visualizar seu cdigo correspondente, a consulta seria a seguinte:
SELECT DISTINCT Empregados.Nome, Empregados.IdEmpregado FROM Empregados WHERE Empregados.Nome In ( SELECT Nome FROM Empregados As Tmp GROUP BY Nome HAVING Count(*) > 1) ORDER BY Empregados.Nome Informe de Claudio Mail: claudio@lobocom.es URL: http://personal.lobocom.es/claudio/

H alguns dias tinha que fazer uma consulta sobre datas em Access: "Obter o nome das empresas cuja data de inscrio coincidia com "x" ano" e li um artigo publicado em uma web com o ttulo: "Funes para buscas com datas em Access".

A funo datepart() em Access

Depois de ler este artigo soube da existncia da funo DatePart(), porm a forma de coloc-la em prtica tal como o problema me enfocava, no nada simples, ou nesse momento, no o vi claro. De fato, fazendo uma busca, tudo era bastante confuso implementando programinhas em VBA (Visual Basic Aplications). (Importante: O formato de data em Access o formato

http://www.criarweb.com/manuais/32/print.php

11/07/2008

Tutorial de SQL - Manual completo

Page 87 of 90

americano: mm/dd/aaaa, porm neste caso o formato americano e o da tabela quanto ao ano que 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 ano coincida com um dado. Por exemplo, quero obter todas as empresas inscritas no ano 2003 e voc dispe de 1000 empresas com 1000 datas de inscrio... Para isso, h que fazer o seguinte:
SELECT * FROM Tabela1 WHERE DatePart("yyyy",FECHA_ALTA)="2003";

Informe de Jonathan Soriano Folch Mail: jhonny_83_1@hotmail.com

Emular um Cursor SQL com um Loop

Graas a este truque de SQL Server 2000 voc poder emular o funcionamento de um cursor

http://www.criarweb.com/manuais/32/print.php

11/07/2008

Tutorial de SQL - Manual completo

Page 88 of 90

com um loop.

Para isso criaremos uma tabela temporria onde colocaremos os elementos que queremos iterar no loop para poder trat-los.
DECLARE @Anuncios TABLE ( 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 variveis para poder iterar no loop DECLARE @Rows numeric, @i numeric(18,0) SET @Rows=0 SET @i=1 Inserimos os dados na tabela temporria @anuncios INSERT INTO @Anuncios ( Idtruque, IdUsuario, Alias, Usuario ) SELECT a.ARTID, a.ARTUSR, p.Alias, p.LonUsr FROM TABELA_ANUNCIOS a INNER JOIN TABELA_USUARIOS p ON a.ARTUSR=p.LONID Atribumos varivel contadora de filas totais o total da tabela @anuncios Set @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, podendo execut-lo as vezes que quisermos de uma s vez. WHILE @i <;= @Rows BEGIN Declare @Idtruco numeric(18,0), @IdUsuario numeric(18,0), @Alias nvarchar(255), @Usuario nvarchar(255) SELECT @Idtruque=Idtruque, @IdUsuario=IdUsuario, @Alias=Alias, @Usuario=Usuario FROM @Anuncios WHERE pk_id=@i Realizar todas as aes! SET @i=@i + 1

http://www.criarweb.com/manuais/32/print.php

11/07/2008

Tutorial de SQL - Manual completo

Page 89 of 90

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

Tipos de instrues SQL e seus componentes sintticos

Em SQL temos bastantes instrues que se podem utilizar para realizar diversas tarefas.

Dependendo das tarefas, estas sentenas se podem classificar em trs grupos principais (DML, DDL,DCL), embora nos restaria outro grupo que ao meu entender no est dentro da linguagem SQL, e sim da PLSQL.
DML Manipulao de dados SELECT INSERT DELETE UPDATE Definio de dados CREATE TABLE DROP TABLE ALTER TABLE CREATE VIEW DROP VIEW CREATE INDEX DROP INDEX CREATE SYNOYM DROP SYNONYM INSTRUO DESCRIO Recupera 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. Adiciona 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. Constri 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.

DDL

DCL

Controle de acesso GRANT Concede privilgios de acesso a usurios. REVOKE Controle de transaes Suprime privilgios de acesso a usurios COMMIT ROLLBACK Finaliza a transao atual. Aborta a transao atual.

PLSQL

SQL Programtico DECLARE OPEN FETCH CLOSE

Define um cursor para uma consulta. Abre um cursor para recuperar resultados de consulta. Recupera uma fila de resultados de consulta. Fecha um cursor.

Componentes sintticos

A maioria de sentenas SQL tem a mesma estrutura.

Todas comeam por um verbo (select, insert, update, create), a seguir continua com uma ou mais clusulas que nos dizem dados com os que vamos operar (from, where), algumas destas so opcionais e outras obrigatrias como o caso do from.

http://www.criarweb.com/manuais/32/print.php

11/07/2008

Tutorial de SQL - Manual completo

Page 90 of 90

Informe de Sara Alvarez Langa Mail: sara@desarrolloweb.com

Todos los direitos de reproduo e difuso reservados

Voltar

http://www.criarweb.com/manuais/32/print.php

11/07/2008

Você também pode gostar