Sie sind auf Seite 1von 109

Manuais e recursos para desenvolvimento web www.criarweb.

com

Tutorial de SQL

Autores do manual Este manual foi criado pelos seguintes colaboradores de Criarweb.com: Rubn Alvarez
(11 captulos)

Paulino Michelazzo

http://www.devmedia.com.br (1 captulo)

Fabio Correa

http://www.devmedia.com.br (1 captulo)

Glaucio Guerra

http://www.devmedia.com.br (1 captulo)

Eber M. Duarte

http://www.devmedia.com.br (1 captulo)

Miguel Angel Alvarez Traduo de JML


(1 captulo)

Rosendo Lopez Robles


(1 captulo)

Agustin Jareo
(12 captulos)

Claudio

http://personal.lobocom.es/claudio/ (15 captulos)

Alfredo Lotar
(1 captulo)

Jonathan Soriano Folch


(1 captulo)

Pol Salvat

http://www.mistrucos.net (1 captulo)

Sara Alvarez Langa


(1 captulo)

Manual Tutorial de SQL: http://www.criarweb.com/sql/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.

Manuais e recursos para desenvolvimento web www.criarweb.com

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. Artigo por Rubn Alvarez

Tipos de campos
Como sabemos, um banco de dados composto por tabelas onde armazenamos registros catalogados em funo de diferentes campos (caractersticas). 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 Contm cifras e letras. Apresentam uma longitude limitada (255 caracteres) Existem de vrios tipos, principalmente, inteiros (sem decimais) e reais (com decimais). Possuem duas formas: Verdadeiro e falso (Sim ou No)

Numricos

Booleanos

Manual Tutorial de SQL: http://www.criarweb.com/sql/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.

Manuais e recursos para desenvolvimento web www.criarweb.com

Datas

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.

Memos

Autoincrementveis

Artigo por Rubn Alvarez

Adicionar um novo registro


Os registros podem ser introduzidos a partir de sentenas que empregam a instruo Insert. A sintaxe utilizada a seguinte: Insert Into nome_tabela (nome_campo1, nome_campo2,...) Values (valor_campo1, valor_campo2...) Um exemplo simples a partir da nossa tabela modelo a 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.
Manual Tutorial de SQL: http://www.criarweb.com/sql/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao. 3

Manuais e recursos para desenvolvimento web www.criarweb.com

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 nmero exclusivo do cliente que ser muito til quando consultarmos vrias tabelas simultaneamente. Artigo por Rubn Alvarez

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 Artigo por Rubn Alvarez

Atualizar um registro
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

Manual Tutorial de SQL: http://www.criarweb.com/sql/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.

Manuais e recursos para desenvolvimento web www.criarweb.com

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' 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. Artigo por Rubn Alvarez

Seleo de tabelas I
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 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: Select * From clientes 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: Select * From clientes Where cidade Like 'Rio de janeiro' Order By nome 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
Manual Tutorial de SQL: http://www.criarweb.com/sql/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao. 5

Manuais e recursos para desenvolvimento web www.criarweb.com

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. 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: Select * From clientes Order By pedidos Decres 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. Artigo por Rubn Alvarez

Seleo de tabelas II
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. Operadores matemticos: > < Maior que Menor que

>= Maior ou igual que <= Menor ou igual que <> Diferente = Igual

Manual Tutorial de SQL: http://www.criarweb.com/sql/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.

Manuais e recursos para desenvolvimento web www.criarweb.com

Operadores lgicos And Or Not

Outros operadores 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

Like

In e Not In

Is Null e Is Not Null

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

Between...A Seleciona os registros compreendidos em um intervalo nd Distinct Desc Seleciona os registros no coincidentes Classifica os registros por ordem inversa

Curingas * Substitui a todos os campos

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

Vejamos a seguir aplicaes prticas destes operadores. Nesta sentena selecionamos todos os clientes de Salvador cujo nome no seja Jose. Como se

Manual Tutorial de SQL: http://www.criarweb.com/sql/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.

Manuais e recursos para desenvolvimento web www.criarweb.com

pode ver, empregamos Like ao invs de = simplesmente para evitar inconvenientes devido ao emprego ou no de maisculas. 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: Select * From clientes Where sobrenomes like 'A%' And pedidos Between 20 And 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. Artigo por Rubn Alvarez

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

Manual Tutorial de SQL: http://www.criarweb.com/sql/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.

Manuais e recursos para desenvolvimento web www.criarweb.com

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: Tabela de clientes Nome campo id_cliente nome sobrenomes endereo cidade cep telefone email Tipo campo Numrico inteiro Texto Texto Texto Texto Texto Numrico inteiro Texto

Tabela de pedidos Nome campo id_pedido id_cliente id_artigo data quantidade Tipo campo Numrico inteiro Numrico inteiro Numrico inteiro Data Numrico inteiro

Manual Tutorial de SQL: http://www.criarweb.com/sql/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.

Manuais e recursos para desenvolvimento web www.criarweb.com

Tabela de artigos Nome campo id_artigo titulo autor editorial preo Tipo campo Numrico inteiro Alfanumrico Alfanumrico Alfanumrico Numrico real

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. Artigo por Rubn Alvarez

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,
Manual Tutorial de SQL: http://www.criarweb.com/sql/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao. 10

Manuais e recursos para desenvolvimento web www.criarweb.com

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: Funo Descrio

Soma(campo) Calcula a soma dos registros do campo especificado Avg(Campo) Calcula a mdia dos registros do campo especificado Proporciona o valor do nmero de registros que foram selecionados

Count(*)

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

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: Select Soma(quantidade) as soma_artigos From pedidos Where id_artigo=6 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 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
Manual Tutorial de SQL: http://www.criarweb.com/sql/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao. 11

Manuais e recursos para desenvolvimento web www.criarweb.com

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 Ou saber o nmero de pedidos que foram realizados: Select id_cliente, Count(*) as numero_pedidos From pedidos Group By id_cliente As possibilidades como vemos so numerosas e pode ser prticas. Agora tudo fica disposio de nossas ocorrncias e imaginao. Artigo por Rubn Alvarez

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:

Manual Tutorial de SQL: http://www.criarweb.com/sql/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.

12

Manuais e recursos para desenvolvimento web www.criarweb.com

$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 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.

Manual Tutorial de SQL: http://www.criarweb.com/sql/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.

13

Manuais e recursos para desenvolvimento web www.criarweb.com

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

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

Manual Tutorial de SQL: http://www.criarweb.com/sql/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.

14

Manuais e recursos para desenvolvimento web www.criarweb.com

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! Obs: Os cdigos deste artigo podem ser encontrados em http://www.michelazzo.com.br na seo de downloads. Copyright 2006 Paulino Michelazzo - http://www.michelazzo.com.br Obra licenciada sob Creative Commons Developing Nations 2.0 Artigo por Paulino Michelazzo

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: 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
Manual Tutorial de SQL: http://www.criarweb.com/sql/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao. 15

Manuais e recursos para desenvolvimento web www.criarweb.com

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! Artigo por Fabio Correa

Adquirindo informaes do Usurio com a classe System


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()); } }

Manual Tutorial de SQL: http://www.criarweb.com/sql/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.

16

Manuais e recursos para desenvolvimento web www.criarweb.com

Veja a sada:
Usurio: GLAUCIO Sistema Operacional: WINDOWS XP

Abaixo seguem alguns parmetros para a funo getProperty(): 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: http://java.sun.com/j2se/1.4.2/docs/api/java/lang/System.html#getProperties() Essa recurso tambm pode ser usado em JSPs: Cdigo da JSP:

Manual Tutorial de SQL: http://www.criarweb.com/sql/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.

17

Manuais e recursos para desenvolvimento web www.criarweb.com

Sada:

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. Artigo por Glaucio Guerra

Alguns truques prticos


Eliminar chamadas aos bancos de dados 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: 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
Manual Tutorial de SQL: http://www.criarweb.com/sql/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao. 18

Manuais e recursos para desenvolvimento web www.criarweb.com

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 '%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. Artigo por Rubn Alvarez

Criao de tabelas
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. 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. 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

Manual Tutorial de SQL: http://www.criarweb.com/sql/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.

19

Manuais e recursos para desenvolvimento web www.criarweb.com

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: 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

Manual Tutorial de SQL: http://www.criarweb.com/sql/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.

20

Manuais e recursos para desenvolvimento web www.criarweb.com

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: Tipo INT ou INTEGER DOUBLE ou REAL CHAR Bytes Descrio Nmeros inteiros. Existem outros tipos de maior ou menor longitude especficos de cada banco de dados. Nmeros reais (grandes e com decimais). Permitem armazenar todo tipo de nmero no inteiro.

1/caractere Alfanumricos de longitude fixa pr-definida 1/caractere+ Alfanumricos de longitude varivel 1 Datas, existem mltiplos formatos especficos de cada banco de dados

VARCHAR

DATE

BLOB

1/caractere+ Grandes textos no indexveis 2

BIT ou BOOLEAN

Armazenam um bit de informao (verdadeiro ou falso)

Artigo por Rubn Alvarez

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.

Manual Tutorial de SQL: http://www.criarweb.com/sql/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.

21

Manuais e recursos para desenvolvimento web www.criarweb.com

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) pode-se 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. 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.

Manual Tutorial de SQL: http://www.criarweb.com/sql/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.

22

Manuais e recursos para desenvolvimento web www.criarweb.com

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. Artigo por Eber M. Duarte

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()) 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)

Manual Tutorial de SQL: http://www.criarweb.com/sql/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.

23

Manuais e recursos para desenvolvimento web www.criarweb.com

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

Artigo por Miguel Angel Alvarez - Traduo de JML

Manual Tutorial de SQL: http://www.criarweb.com/sql/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.

24

Manuais e recursos para desenvolvimento web www.criarweb.com

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

Manual Tutorial de SQL: http://www.criarweb.com/sql/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.

25

Manuais e recursos para desenvolvimento web www.criarweb.com

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 /*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

Artigo por Rosendo Lopez Robles

SQL com Oracle


Introduo: 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: 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.

Manual Tutorial de SQL: http://www.criarweb.com/sql/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.

26

Manuais e recursos para desenvolvimento web www.criarweb.com

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.

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: DATE: Armazena a data. Armazena da seguinte forma: No armazena nmeros de tamanho grande, e sim cadeias de caracteres de at 2 GB

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
27

Manual Tutorial de SQL: http://www.criarweb.com/sql/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.

Manuais e recursos para desenvolvimento web www.criarweb.com

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

Manual Tutorial de SQL: http://www.criarweb.com/sql/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.

28

Manuais e recursos para desenvolvimento web www.criarweb.com

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. Artigo por Agustin Jareo

SQL com Oracle. Operadores


Operadores aritmticos: + = Soma - = Subtrao * = 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%';

Manual Tutorial de SQL: http://www.criarweb.com/sql/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.

29

Manuais e recursos para desenvolvimento web www.criarweb.com

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. Artigo por Agustin Jareo

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');

Manual Tutorial de SQL: http://www.criarweb.com/sql/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.

30

Manuais e recursos para desenvolvimento web www.criarweb.com

Artigo por Agustin Jareo

Funes SQL
Funes de valores simples: 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.
ABS(n)= CEIL(n)=Obtm

Funes de grupos de valores: 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. MAX (expresso)= Calcula o mximo. MIN (expresso)= 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.
AVG(n)= COUNT (* | Expresso)=

Funes que devolvem valores de caracteres: 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)=

Manual Tutorial de SQL: http://www.criarweb.com/sql/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.

31

Manuais e recursos para desenvolvimento web www.criarweb.com

Funes que devolvem valores numricos: 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 para o manejo de datas: 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 de converso: 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=

Artigo por Agustin Jareo

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 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.
32

Manual Tutorial de SQL: http://www.criarweb.com/sql/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.

Manuais e recursos para desenvolvimento web www.criarweb.com

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

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.
UNION=

Regras para a utilizao de operadores de conjunto: > Artigo por Agustin Jareo 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.

Manual Tutorial de SQL: http://www.criarweb.com/sql/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.

33

Manuais e recursos para desenvolvimento web www.criarweb.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;

Set= Indica as colunas que vo se atualizar e seus valores. Com Select: Quando a subconsulta (orden select) forma parte de SET, deve selecionar o mesmo nmero de 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

Manual Tutorial de SQL: http://www.criarweb.com/sql/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.

34

Manuais e recursos para desenvolvimento web www.criarweb.com

SET (COLUNA1, COLUNA2, )= (SELECT ) WHERE CONDICAO;

Delete: Elimina uma ou vrias filas de uma tabela:


DELETE [FROM] NOMETABELA WHERE CONDICAO;

Artigo por Agustin Jareo

Chaves primrias com SQL com Oracle


Rollback: 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}, COLUNA2 TIPO_DADO {NOT NULL}, ) TABLESPACE ESPACO_DE_TABELA;

Manual Tutorial de SQL: http://www.criarweb.com/sql/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.

35

Manuais e recursos para desenvolvimento web www.criarweb.com

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. Restries em create table: 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];

Artigo por Agustin Jareo

Manual Tutorial de SQL: http://www.criarweb.com/sql/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.

36

Manuais e recursos para desenvolvimento web www.criarweb.com

Definio de chaves para tabelas e restries


Chave primria: Primary key 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:
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];

Chaves alheias: Foreign Key: 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:
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];

Manual Tutorial de SQL: http://www.criarweb.com/sql/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.

37

Manuais e recursos para desenvolvimento web www.criarweb.com

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

Manual Tutorial de SQL: http://www.criarweb.com/sql/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.

38

Manuais e recursos para desenvolvimento web www.criarweb.com

Artigo por Agustin Jareo

Supresso e modificao de tabelas com SQL


Supresso de tabelas: 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 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 coluna estiver definida como NOT NULL pode-se seguir estes passos: 1. Adiciona-se uma coluna sem especificar NOT NULL. 2. D-se valor coluna para cada uma das filas. 3. Modifica-se a coluna NOT NULL. 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
39

Ao modificar uma coluna de uma tabela, h que ter em conta:

Manual Tutorial de SQL: http://www.criarweb.com/sql/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.

Manuais e recursos para desenvolvimento web www.criarweb.com

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: 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:

Artigo por Agustin Jareo

Gerenciamento de vistas em SQL


Criao e uso de vistas 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;

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; Manual Tutorial de SQL: http://www.criarweb.com/sql/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao. 40

Manuais e recursos para desenvolvimento web www.criarweb.com

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 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 Artigo por Agustin Jareo

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:
Manual Tutorial de SQL: http://www.criarweb.com/sql/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao. 41

Manuais e recursos para desenvolvimento web www.criarweb.com

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:


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. Artigo por Agustin Jareo

Gerenciamento em Oracle com SQL


Privilgios 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

Manual Tutorial de SQL: http://www.criarweb.com/sql/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.

42

Manuais e recursos para desenvolvimento web www.criarweb.com

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 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; Manual Tutorial de SQL: http://www.criarweb.com/sql/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao. 43

Manuais e recursos para desenvolvimento web www.criarweb.com

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];

Gerenciamento de tablespaces 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
CREATE TABLESPACE NOMETABLESPACE DATAFILE 'NOMEARQUIVO' [SIZE INTEIRO [K | M] [REUSE] [DEFAULT STORAGE (INITIAL TAMANHO MINEXTENTS TAMANHO MAXEXTENTS TAMANHO PCTINCREASE VALOR )] [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

Manual Tutorial de SQL: http://www.criarweb.com/sql/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.

44

Manuais e recursos para desenvolvimento web www.criarweb.com

{[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. Artigo por Agustin Jareo

Otimizar consultas SQL


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

Manual Tutorial de SQL: http://www.criarweb.com/sql/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.

45

Manuais e recursos para desenvolvimento web www.criarweb.com

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 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. 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 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. 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
46

Campos de Filtro

Manual Tutorial de SQL: http://www.criarweb.com/sql/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.

Manuais e recursos para desenvolvimento web www.criarweb.com

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. 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. Artigo por Claudio

Consultas de seleo
Este conjunto de registros pode ser modificvel. Consultas bsicas 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

Manual Tutorial de SQL: http://www.criarweb.com/sql/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.

47

Manuais e recursos para desenvolvimento web www.criarweb.com

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 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) ...

Manual Tutorial de SQL: http://www.criarweb.com/sql/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.

48

Manuais e recursos para desenvolvimento web www.criarweb.com

Consultas com Predicado O predicado se inclui entre a clusula e o primeiro nome do campo a recuperar, os possveis predicados so: Predicado Descrio ALL TOP DISTINCT Devolve todos os campos da tabela Devolve um determinado nmero de registros da tabela Omite os registros cujos campos selecionados coincidam totalmente

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

ALL 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 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:

Manual Tutorial de SQL: http://www.criarweb.com/sql/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.

49

Manuais e recursos para desenvolvimento web www.criarweb.com

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.
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. ALIAS 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
Manual Tutorial de SQL: http://www.criarweb.com/sql/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao. 50

Manuais e recursos para desenvolvimento web www.criarweb.com

chame Empregado. Neste caso procederamos da seguinte forma:


SELECT DISTINCTROW Sobrenome AS Empregado FROM Empregados

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 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
Manual Tutorial de SQL: http://www.criarweb.com/sql/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao. 51

Manuais e recursos para desenvolvimento web www.criarweb.com

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

Artigo por 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 Sintaxe Data = #mm-dd-aaaa# Data = to_date('YYYYDDMM','aaaammdd',) Fecha = #mm-dd-aaaa# Exemplo Banco de Dados Exemplo (para gravar a data 18 de maio de 1969) SQLSERVER ORACLE ACCESS Data = #05-18-1969# Data = 19690518 Data = to_date('YYYYDDMM', '19690518') Data = #05-18-1969#

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
Manual Tutorial de SQL: http://www.criarweb.com/sql/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao. 52

Manuais e recursos para desenvolvimento web www.criarweb.com

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". 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: <expressao1 > Verdadeiro Verdadeiro Falso Falso Verdadeiro Verdadeiro Falso Falso Verdadeiro Verdadeiro Falso Falso Verdadeiro Verdadeiro Operador AND AND AND AND OR OR OR OR XOR XOR XOR XOR Eqv Eqv <expressao2> Falso Verdadeiro Verdadeiro Falso Falso Verdadeiro Verdadeiro Falso Verdadeiro Falso Verdadeiro Falso Verdadeiro Falso Resultado Falso Verdadeiro Falso Falso Verdadeiro Verdadeiro Verdadeiro Falso Falso Verdadeiro Verdadeiro Falso Verdadeiro Falso

Manual Tutorial de SQL: http://www.criarweb.com/sql/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.

53

Manuais e recursos para desenvolvimento web www.criarweb.com

Falso Falso Verdadeiro Verdadeiro Verdadeiro Falso Falso Falso Null Null Null

Eqv Eqv Imp Imp Imp Imp Imp Imp Imp Imp Imp

Verdadeiro Falso Verdadeiro Falso Null Verdadeiro Falso Null Verdadeiro Falso Null

Falso Verdadeiro Verdadeiro Falso Null Verdadeiro Verdadeiro Verdadeiro Verdadeiro 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 Salario = 100 SELECT * FROM Empregados WHERE NOT Estado = 'Solteiro' SELECT * FROM Empregados WHERE (Salario >100 AND Salario < 500) OR Manual Tutorial de SQL: http://www.criarweb.com/sql/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao. 54

Manuais e recursos para desenvolvimento web www.criarweb.com

(Cidade = 'Madri' AND Estado = 'Casado')

Intervalos de Valores 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)

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

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*). 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]###'

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. ACCESS '
Manual Tutorial de SQL: http://www.criarweb.com/sql/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao. 55

Manuais e recursos para desenvolvimento web www.criarweb.com

Tipo de coincidncia Varios caracteres Caractere especial Varios caracteres Um so caractere Um so digito Categoria de caracteres

Modelo Planejado 'a*a' 'a[*]a' 'ab*' 'a?a' 'a#a' '[a-z]'

Coincidee

Nao coincide

aa', 'aBa', 'aBBBa' 'aBC' 'a*a' 'abcdefg', 'abc' 'aaa' 'cab', 'aab'

'aaa', 'a3a', 'aBa' 'aBBBa' 'a0a', 'a1a', 'a2a' 'aaa', 'a10a' 'f', 'p', 'j' '9', '&', '%' 'A', 'a', '&', '~' '2', '&' 'b', 'a' '0', '1', '9'

Fora de uma categoria '[!a-z]' Diferente de um digito '[!0-9]' Combinada 'a[!b-m]#'

'An9', 'az0', 'a99' 'abc', 'aj0'

SQL-SERVER Exemplo LIKE 'A%' LIKE '_NG' Descrio Tudo que comecar por A Tudo que comece por qualquer caractere e logo siga NG

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

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 :
Manual Tutorial de SQL: http://www.criarweb.com/sql/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao. 56

Manuais e recursos para desenvolvimento web www.criarweb.com

expressao [Not] In(valor1, valor2, . . .) SELECT * FROM Pedidos WHERE Cidade In ('Madri', 'Barcelona', 'Sevilha')

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 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' Manual Tutorial de SQL: http://www.criarweb.com/sql/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao. 57

Manuais e recursos para desenvolvimento web www.criarweb.com

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')

Artigo por Claudio

Como exibir informaes com mltiplas instrues SQL


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. 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";

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;

Manual Tutorial de SQL: http://www.criarweb.com/sql/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.

58

Manuais e recursos para desenvolvimento web www.criarweb.com

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:


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.


Manual Tutorial de SQL: http://www.criarweb.com/sql/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao. 59

Manuais e recursos para desenvolvimento web www.criarweb.com

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 using System; System.Web.UI; System.Web.UI.WebControls; System.Data; System.Data.SqlClient; 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";

Manual Tutorial de SQL: http://www.criarweb.com/sql/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.

60

Manuais e recursos para desenvolvimento web www.criarweb.com

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 Manual Tutorial de SQL: http://www.criarweb.com/sql/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao. 61

Manuais e recursos para desenvolvimento web www.criarweb.com

SELECT Count(*) AS Total FROM Products 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.

Artigo por Alfredo Lotar

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

Manual Tutorial de SQL: http://www.criarweb.com/sql/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.

62

Manuais e recursos para desenvolvimento web www.criarweb.com

GROUP BY IdFamilia HAVING StockAtual > 100 AND NomeProduto Like BOS*

AVG 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

Manual Tutorial de SQL: http://www.criarweb.com/sql/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.

63

Manuais e recursos para desenvolvimento web www.criarweb.com

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)

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 Manual Tutorial de SQL: http://www.criarweb.com/sql/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao. 64

Manuais e recursos para desenvolvimento web www.criarweb.com

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

Manual Tutorial de SQL: http://www.criarweb.com/sql/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.

65

Manuais e recursos para desenvolvimento web www.criarweb.com

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

Artigo por 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 : DELETE FROM Tabela WHERE criterio 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
Manual Tutorial de SQL: http://www.criarweb.com/sql/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao. 66

Manuais e recursos para desenvolvimento web www.criarweb.com

eliminar os registros errados poder recuper-los a travs das cpias de segurana. DELETE FROM Empregados WHERE Cargo = 'Vendedor' INSERT INTO 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: INSERT INTO Tabela (campo1, campo2, ..., campoN) VALUES (valor1, valor2, ..., valorN) Esta consulta grana no campo1 o valor1, no campo2 e valor2 e assim, sucessivamente. Para selecionar registros e inseri-los em uma tabela nova Neste caso, a sintaxe a seguinte: SELECT campo1, campo2, ..., campoN INTO novatabela FROM tabelaorigem [WHERE criterios] 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 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: INSERT INTO Tabela SELECT Tabela Origem.* FROM Tabela Origem Desta forma os campos de Tabela Origem se gravaro em Tabela, para realizar esta operao

Manual Tutorial de SQL: http://www.criarweb.com/sql/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.

67

Manuais e recursos para desenvolvimento web www.criarweb.com

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. 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.* FROM ClientesNovos SELECT Empregados.* INTO Programadores FROM Empregados WHERE Categoria = 'Programador'

Manual Tutorial de SQL: http://www.criarweb.com/sql/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.

68

Manuais e recursos para desenvolvimento web www.criarweb.com

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 WHERE Grau = 2 UPDATE

Manual Tutorial de SQL: http://www.criarweb.com/sql/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.

69

Manuais e recursos para desenvolvimento web www.criarweb.com

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 Artigo por 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

Longitude

Descrio

BINARY

1 byte

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

BIT BYTE COUNTER

1 byte 1 byte 4 bytes

CURRENCY

8 bytes

DATETIME

8 bytes

Manual Tutorial de SQL: http://www.criarweb.com/sql/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.

70

Manuais e recursos para desenvolvimento web www.criarweb.com

SINGLE

4 bytes

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. 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. Um inteiro curto entre -32,768 e 32,767. Um inteiro longo entre -2,147,483,648 e 2,147,483,647.

DOUBLE

8 bytes

SHORT LONG

2 bytes 4 bytes 1 byte por caractere

LONGTEXT

De zero a um mximo de 1.2 gigabytes.

LONGBINAR Segundo se Y necessite 1 byte por caractere

De zero 1 gigabyte. Utilizado para objetos OLE.

TEXT

De zero a 255 caracteres.

A seguinte tabela recolhe os sinnimos dos tipos de dados definidos: Tipo de Dado BINARY Sinnimos VARBINARY BOOLEAN LOGICAL LOGICAL1 YESNO INTEGER1 AUTOINCREMENT MONEY DATE TIME
71

BIT

BYTE COUNTER CURRENCY DATETIME

Manual Tutorial de SQL: http://www.criarweb.com/sql/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.

Manuais e recursos para desenvolvimento web www.criarweb.com

TIMESTAMP FLOAT4 IEEESINGLE REAL FLOAT FLOAT8 IEEEDOUBLE NUMBER NUMERIC INTEGER2 SMALLINT INT INTEGER INTEGER4 GENERAL OLEOBJECT LONGCHAR MEMO NOTE ALPHANUMERIC CHAR - CHARACTER STRING - VARCHAR

SINGLE

DOUBLE

SHORT

LONG

LONGBINARY

LONGTEXT

TEXT

VARIANT (No Admitido)

VALUE

Artigo por Claudio

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) sql) expresso [NOT] IN (instruo sql) [NOT] EXISTS (instruo

Manual Tutorial de SQL: http://www.criarweb.com/sql/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.

72

Manuais e recursos para desenvolvimento web www.criarweb.com

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

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 DetalhePedido Manual Tutorial de SQL: http://www.criarweb.com/sql/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao. 73

Manuais e recursos para desenvolvimento web www.criarweb.com

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

Manual Tutorial de SQL: http://www.criarweb.com/sql/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.

74

Manuais e recursos para desenvolvimento web www.criarweb.com

No exemplo anterior, a palavra reservada AS opcional.


SELECT Sobrenomes, Nome, Cargo, Salario FROM Empregados WHERE Cargo LIKE 'Agente Ven*' 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 ( Manual Tutorial de SQL: http://www.criarweb.com/sql/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao. 75

Manuais e recursos para desenvolvimento web www.criarweb.com

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 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 ) )

Manual Tutorial de SQL: http://www.criarweb.com/sql/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.

76

Manuais e recursos para desenvolvimento web www.criarweb.com

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 Operador Valor 2 Resultado 1 3 3 3 3 3 > ANY = ANY = ANY > ALL < ALL (2,5,7) (2,5,7) Certo Falso

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

A operao =ANY equivalente ao operador IN, ambos devolvem o mesmo resultado. Artigo por 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

Manual Tutorial de SQL: http://www.criarweb.com/sql/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.

77

Manuais e recursos para desenvolvimento web www.criarweb.com

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 baseando-se 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 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 ...)]

Manual Tutorial de SQL: http://www.criarweb.com/sql/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.

78

Manuais e recursos para desenvolvimento web www.criarweb.com

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 Faturas INNER JOIN Alvaras ON Faturas.IdAlvara = Alvaras.IdAlvara WHERE Faturas.IdCliente = 325

Manual Tutorial de SQL: http://www.criarweb.com/sql/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.

79

Manuais e recursos para desenvolvimento web www.criarweb.com

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

Manual Tutorial de SQL: http://www.criarweb.com/sql/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.

80

Manuais e recursos para desenvolvimento web www.criarweb.com

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

Consultas de Combinaes no Comuns 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

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

Manual Tutorial de SQL: http://www.criarweb.com/sql/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.

81

Manuais e recursos para desenvolvimento web www.criarweb.com

SELF JOIN 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 Cdigo (Cdigo do livro) B0012 B0012 B0012 C0014 C0014 D0120 D0120

Autor (Nome do Autor)

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: Cdig Autor o B001 1. Francisco Lpez 2 B001 1. Francisco Lpez Autor

1. Francisco Lpez

2. Javier Alonso
82

Manual Tutorial de SQL: http://www.criarweb.com/sql/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.

Manuais e recursos para desenvolvimento web www.criarweb.com

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

3. Marta Rebolledo

2. Javier Alonso

1. Francisco Lpez

3. Marta Rebolledo

B001 3. Marta Rebolledo 3. Marta Rebolledo 2 B001 3. Marta Rebolledo 2. Javier Alonso 2 B001 3. Marta Rebolledo 1. Francisco Lpez 2 C001 1. Francisco Lpez 4 C001 1. Francisco Lpez 4 C001 2. Javier Alonso 4 C001 2. Javier Alonso 4 D012 2. Javier Alonso 0 D012 2. Javier Alonso 0

1. Francisco Lpez

2. Javier Alonso

2. Javier Alonso

1. Francisco Lpez

2. Javier Alonso

3. Marta Rebolledo

Manual Tutorial de SQL: http://www.criarweb.com/sql/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.

83

Manuais e recursos para desenvolvimento web www.criarweb.com

D012 3. Marta Rebolledo 3. Marta Rebolledo 0 D012 3. Marta Rebolledo 2. Javier Alonso 0

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: Cdig Autor o B0012 1. Francisco Lpez B0012 1. Francisco Lpez C0014 1. Francisco Lpez D0120 2. Javier Alonso Autor

2. Javier Alonso 3. Marta Rebolledo 2. Javier Alonso 3. Marta Rebolledo

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

Manual Tutorial de SQL: http://www.criarweb.com/sql/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.

84

Manuais e recursos para desenvolvimento web www.criarweb.com

Para concluir suponhamos a seguinte tabela: Empregados I Nome d

SeuChefe

1 Marcos 6 2 Lucas 3 Ana 4 Eva 5 Juan 6 Antonio 1 2 1 6

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

Artigo por 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 , ... )

Manual Tutorial de SQL: http://www.criarweb.com/sql/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.

85

Manuais e recursos para desenvolvimento web www.criarweb.com

Onde: tabla campo1 campo2 tipo 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. uma clusula CONSTRAINT que define o tipo de ndice a criar. Esta clusula opcional.

ndice uma clusula CONSTRAINT que define o tipo de ndice multicampos a criar. multicamp Um ndice multicampo aquele que est indexado pelo contedo de vrios os 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 )

Manual Tutorial de SQL: http://www.criarweb.com/sql/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.

86

Manuais e recursos para desenvolvimento web www.criarweb.com

(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 [(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 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).

refN

tabela externa campos externos

o nome da tabela que contm o campo ou os campos referenciados em refN

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.

Manual Tutorial de SQL: http://www.criarweb.com/sql/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.

87

Manuais e recursos para desenvolvimento web www.criarweb.com

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. Indic Descrio e UNIQ Gera um ndice de chave nica. O que implica que os registros da tabela no podem UE conter o mesmo valor nos campos indexados. PRIM Gera um ndice primrio o campo ou os campos especificados. Todos os campos da ARY chave principal devem ser nicos e no nulos, cada tabela s pode conter uma nica KEY chave principal. 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 FORE de referncia, o nome da tabela externa, e os nomes dos campos referenciados na IGN 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: ndice tabla campo ASC| DESC o nome do ndice a criar. o nome de uma tabela existente na que se criar o ndice. o nome do campo ou lista de campos que constituem o ndice. Indica a ordem dos valores dos campos ASC indica uma ordem ascendente (valor pr-determinado) e DESC uma ordem descendente.

UNIQUE Indica que o ndice no pode conter valores duplicados.

Manual Tutorial de SQL: http://www.criarweb.com/sql/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.

88

Manuais e recursos para desenvolvimento web www.criarweb.com

DISALL OW Probe valores nulos no ndice NULL IGNORE Exclui do ndice os valores nulos includos nos campos que o compem. NULL Atribui ao ndice a categoria de chave principal, em cada tabela s pode existir PRIMAR um nico ndice que seja "Chave Principal". Se um ndice chave principal implica Y 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}}

Manual Tutorial de SQL: http://www.criarweb.com/sql/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.

89

Manuais e recursos para desenvolvimento web www.criarweb.com

Onde: tabla campo tipo tamanho o nome da tabela que se deseja modificar. o nome do campo que se adicionar ou eliminar. o tipo de campo que adicionar. 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.

ndice

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

Opera Descrio o ADD COLU MN ADD DROP COLU MN

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.

DROP

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.)

Manual Tutorial de SQL: http://www.criarweb.com/sql/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.

90

Manuais e recursos para desenvolvimento web www.criarweb.com

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.)

Artigo por 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 SELECT num_emp, nome, posto, salario FROM empregados WHERE num_dept = 'informatica' 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] Ao abrir o cursor, avalia-se a consulta que aparece em sua definio, utilizando os valores

Manual Tutorial de SQL: http://www.criarweb.com/sql/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.

91

Manuais e recursos para desenvolvimento web www.criarweb.com

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 FETCH NEXT FROM Employee_Cursor END CLOSE Employee_Cursor DEALLOCATE Employee_Cursor Abrir um cursor e imprimir seu contedo SET NOCOUNT ON

Manual Tutorial de SQL: http://www.criarweb.com/sql/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.

92

Manuais e recursos para desenvolvimento web www.criarweb.com

DECLARE @au_id varchar(11), @au_fname varchar(20), @au_lname varchar(40), @message varchar(80), @title varchar(80) PRINT "-------- Utah Authors report --------" DECLARE authors_cursor CURSOR 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 DECLARE titles_cursor CURSOR FOR SELECT t.title FROM titleauthor ta, titles t WHERE ta.title_id = t.title_id AND ta.au_id = au_id OPEN titles_cursor FETCH NEXT FROM titles_cursor INTO @title IF @@FETCH_STATUS <> 0 PRINT " <<No Books>>" WHILE @@FETCH_STATUS = 0 BEGIN

Manual Tutorial de SQL: http://www.criarweb.com/sql/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.

93

Manuais e recursos para desenvolvimento web www.criarweb.com

SELECT @message = " " + @title PRINT @message FETCH NEXT FROM titles_cursor INTO @title END 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%"

Manual Tutorial de SQL: http://www.criarweb.com/sql/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.

94

Manuais e recursos para desenvolvimento web www.criarweb.com

ORDER BY au_lname, au_fname OPEN authors_cursor FETCH NEXT FROM authors_cursor INTO @au_lname, @au_fname WHILE @@FETCH_STATUS = 0 BEGIN PRINT "Author: " + @au_fname + " " + @au_lname FETCH NEXT FROM authors_cursor INTO @au_lname, @au_fname END CLOSE authors_cursor DEALLOCATE authors_cursor Artigo por 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 Calas Camisas Sapatos 1996 1997

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[, ...]])]

Manual Tutorial de SQL: http://www.criarweb.com/sql/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.

95

Manuais e recursos para desenvolvimento web www.criarweb.com

Onde: funo agregada 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.

instruo select

campo pivot

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

Manual Tutorial de SQL: http://www.criarweb.com/sql/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.

96

Manuais e recursos para desenvolvimento web www.criarweb.com

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:

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)

Manual Tutorial de SQL: http://www.criarweb.com/sql/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.

97

Manuais e recursos para desenvolvimento web www.criarweb.com

E obtemos o seguinte resultado: Produt Cdigo Total Media o Sapato 1 s Calas 2 Blusas 3 1996 1997

348

87

300

48

955

238,75 375 620

580 1320

1940 485

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 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
Manual Tutorial de SQL: http://www.criarweb.com/sql/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao. 98

Manuais e recursos para desenvolvimento web www.criarweb.com

PIVOT Format([Data],"Short Date"); Artigo por Claudio

Introduo a freetext e contains em SQL-Server


FULL TEXT SEARCH 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. 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:

Manual Tutorial de SQL: http://www.criarweb.com/sql/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.

99

Manuais e recursos para desenvolvimento web www.criarweb.com

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.
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*" ")

Manual Tutorial de SQL: http://www.criarweb.com/sql/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.

100

Manuais e recursos para desenvolvimento web www.criarweb.com

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. Artigo por 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 FROM Clientes Manual Tutorial de SQL: http://www.criarweb.com/sql/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao. 101

Manuais e recursos para desenvolvimento web www.criarweb.com

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.) Artigo por 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
Manual Tutorial de SQL: http://www.criarweb.com/sql/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao. 102

Manuais e recursos para desenvolvimento web www.criarweb.com

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 Onde: nome tipo o nome do parmetro o tipo de dados do parmetro

consult Uma consulta SQL a

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. Artigo por Claudio

Manual Tutorial de SQL: http://www.criarweb.com/sql/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.

103

Manuais e recursos para desenvolvimento web www.criarweb.com

Procedures e busca de registros duplicados em SQL


Clusula Procedure 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: NomeConsult o nome com o qual se salvar a consulta no banco de dados. a Parmetro Tipo o nome de parmetro ou dos parmetros de tal consulta. o tipo de dados do parmetro

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

Manual Tutorial de SQL: http://www.criarweb.com/sql/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.

104

Manuais e recursos para desenvolvimento web www.criarweb.com

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

Artigo por Claudio

A funo datepart() em Access


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". 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 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:

Manual Tutorial de SQL: http://www.criarweb.com/sql/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.

105

Manuais e recursos para desenvolvimento web www.criarweb.com

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";

Artigo por Jonathan Soriano Folch

Emular um Cursor SQL com um Loop


Graas a este truque de SQL Server 2000 voc poder emular o funcionamento de um cursor 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

Manual Tutorial de SQL: http://www.criarweb.com/sql/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.

106

Manuais e recursos para desenvolvimento web www.criarweb.com

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 END

Artigo por Pol Salvat

Manual Tutorial de SQL: http://www.criarweb.com/sql/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.

107

Manuais e recursos para desenvolvimento web www.criarweb.com

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 INSTRUO DESCRIO Manipulao de dados SELECT INSERT DELETE UPDATE

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. DDL Definio de dados CREATE TABLE DROP TABLE ALTER TABLE CREATE VIEW DROP VIEW CREATE INDEX DROP INDEX CREATE SYNOYM DROP SYNONYM

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. DCL Controle de acesso GRANT REVOKE Controle de transaes COMMIT ROLLBACK

Concede privilgios de acesso a usurios. Suprime privilgios de acesso a usurios

Manual Tutorial de SQL: http://www.criarweb.com/sql/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.

108

Manuais e recursos para desenvolvimento web www.criarweb.com

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.

Artigo por Sara Alvarez Langa

Manual Tutorial de SQL: http://www.criarweb.com/sql/ Os manuais de CriarWeb.com tm copyright dos autores. No reproduzir sem autorizao.

109

Das könnte Ihnen auch gefallen