O Que É SQL
O Que É SQL
O que é SQL
As aplicações em rede são cada dia mais numerosas e versáteis. Em muitos casos, o esquema básico de
operação é uma série 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 não ser pela existência de padrões que nos permite
realizar as operações básicas de una forma universal.
É justamente disso que se trata o Structured Query Language que não é mais do que uma linguagem padrão
de comunicação com base de dados. Falamos portanto, de uma linguagem normalizada que nos permite
trabalhar com qualquer tipo de linguagem (ASP ou PHP) em combinação com qualquer tipo de base de dados
(MS Access, SQL Server, MySQL...).
O fato de ser padrão não quer dizer que seja idêntico para cada base de dados. Na prática, determinadas
bases de dados implementam funções específicas que não têm necessariamente que funcionar em outras.
À parte desta universalidade, o SQL possui outras duas características muito apreciadas. Por uma parte,
apresenta potência e versatilidade notáveis que contrasta, por outra, com sua acessibilidade de
aprendizagem.
Tipos de campos
Como sabemos, um banco de dados é composto por tabelas onde armazenamos registros catalogados em função de
diferentes campos (características).
Um aspecto prévio a considerar é a natureza dos valores que introduzimos nesses campos. Visto que um banco de
dados trabalha com todo o tipo de informações, é importante especificar que tipo de valor estamos introduzindo de
maneira a, por um lado, facilitar a busca posteriormente e por outro, otimizar os recursos de memória.
Cada banco de dados introduz tipos de valores de campo que não necessariamente estão presentes em outros.
Entretanto, existe um conjunto de tipos que estão representados na totalidade destes bancos. Estes tipos comuns são
os seguintes:
Alfanuméricos Contém cifras e letras. Apresentam uma longitude limitada (255 caracteres)
Numéricos Existem de vários tipos, principalmente, inteiros (sem decimais) e reais (com decimais).
Booleanos Possuem duas formas: Verdadeiro e falso (Sim ou Não)
Armazenam datas facilitando posteriormente sua exploração. Armazenar datas desta
Datas forma possibilita ordenar os registros por datas ou calcular os dias entre uma data e
outra...
São campos alfanuméricos de longitude ilimitada. Apresentam o inconveniente de não
Memos
poder ser indexados (veremos mais adiante o que isto quer dizer).
São campos numéricos inteiros que incrementam em uma unidade seu valor para cada
Auto-
registro incorporado. Sua utilidade é mais que evidente: Servir de identificador já que são
incrementáveis
exclusivos de um registro.
Os registros podem ser introduzidos a partir de sentenças que empregam a instrução Insert.
Um exemplo simples a partir da nossa tabela modelo é a introdução de um novo cliente que seria feito com uma
instrução deste tipo:
Insert Into clientes (nome, sobrenomes, endereço, cidade, código postal, e-mail, pedidos) Values ('Pedro', 'Palotes',
'Percebe n°13', 'Londrina', '123456', 'pedro@[Link]', 33)
Como se pode ver, os campos não numéricos ou booleanos vão delimitados por apóstrofes: '. Também é
interessante ver que o código postal foi salvo como um campo não numérico. Isto é devido a que em determinados
países (Inglaterra,por exemplo) os códigos postais contém também letras.
Nota: Se desejarmos praticar com um banco de dados que está vazio, primeiro devemos criar as tabelas que vamos
preencher. As tabelas também se criam com sentenças SQL e aprendemos a fazer isso no último capítulo.
Embora, de qualquer forma, pode ser que seja mais cômodo utilizar um programa com interface gráfica, como Access, que
pode nos servir para criar as tabelas em banco de dados do próprio Access ou por 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, não é imprescindível preencher todos os campos do registro. Porém, poder ser que determinados
campos sejam necessários. Estes campos necessários podem ser definidos quando construirmos nossa tabela
mediante o banco de dados.
Nota: Se não inserirmos um dos campos no banco de dados se iniciará com o valor padrão que tivermos definido na hora
de criar a tabela. Se não houver um valor padrão, provavelmente se inicie como NULL (vazio), no caso de que este campo
permita valores nulos. Se esse campo não permitir valores nulos (isso se define também ao criar a tabela) o mais seguro é
que a execução da sentença SQL nos dê um erro.
É muito interessante, já veremos mais adiante o porquê, o introduzir durante a criação de nossa tabela um
campo auto-incrementável que nos permita atribuir um único número a cada um dos registros. Deste modo,
nossa tabela clientes apresentaría para cada registro um número exclusivo do cliente que será muito útil
quando consultarmos várias tabelas simultaneamente.
Apagar um registro
Para apagar um registro nos servimos da instrução Delete. Neste caso devemos especificar qual ou quais são os
registros que queremos apagar. Por isso, é necessário estabelecer uma seleção que se realize mediante a cláusula
Where.
A forma de selecionar será vista; detalhadamente em capítulos posteriores. Agora, nos contentaremos em mostrar
qual é o tipo de sintaxe utilizada para efetuar estas supressões:
Se quisermos, por exemplo, apagar todos os registros dos clientes que se chamarem Pedro, faríamos da
seguinte forma:
Temos que ter cuidado com esta instrução, pois se não especificarmos uma condição com Where, o que
estamos fazendo é apagar toda a tabela:
Atualizar um registro
Update é a instrução que nos serve para modificar nossos registros. Como para o caso de Delete,
necessitamos especificar por meio de Where quais são os registros que queremos fazer efetivas nossas
modificações. Ademais, obviamente, teremos que especificar quais são os novos valores dos campos que
desejamos atualizar. A sintaxe é deste tipo:
Um exemplo aplicado:
Mediante esta sentença mudamos o nome Pedro por José em todos os registros cujo nome seja Pedro.
Aqui também há que ser cuidadoso de não esquecer de usar Where, do contrário, modificaríamos todos os
registros de nossa tabela.
Seleção de tabelas I
A seleção total ou parcial de uma tabela se realiza mediante a instrução Select. Em tal seleção há que
especificar:
Em nossa tabela modelo de clientes poderíamos fazer, por exemplo, uma seleção do nome e endereço dos
clientes com uma instrução deste tipo:
Também é muito útil filtrar os registros mediante condições que vêem expressas depois da cláusula Where.
Se quiséssemos mostrar os clientes de uma determinada cidade usaríamos uma expressão como esta:
Ademais, poderíamos ordenar os resultados em função de um ou vários de seus campos. Para este último
exemplo poderíamos ordená-los por nome assim:
Select * From clientes Where cidade Like 'Rio de janeiro' Order By nome
Tendo em conta que pode haver mais de um cliente com o esmo nome, poderíamos dar um segundo critério
que poderia ser o sobrenome:
Select * From clientes Where cidade Like 'Rio de Janeiro' Order By nome, sobrenome
Se invertêssemos a ordem " nome,sobrenome " por " sobrenome, nome ", o resultado seria diferente.
Teríamos os clientes ordenados por sobrenome e aqueles que tivessem sobrenomes idênticos se sub-
classificariam pelo nome.
É possível também classificar por ordem inversa. Se por exemplo quiséssemos ver nossos clientes por
ordem de pedidos realizados tendo aos maiores em primeiro lugar escreveríamos algo assim:
Uma opção interessante é a de efetuar seleções sem coincidência. Se por exemplo, buscássemos saber em
que cidades se encontram nossos clientes sem a necessidade de que para isso apareça várias vezes a mesma
cidade, usaríamos uma sentença desta classe:
Assim evitaríamos ver repetido Rio de Janeiro tantas vezes quantos clientes tivermos nessa cidade.
Seleção de tabelas II
Quisemos compilar na forma de tabela certos operadores que podem ser úteis em determinados casos. Estes
operadores serão utilizados depois da cláusula Where e podem ser combinados habilmente mediante
parênteses para otimizar nossa seleção a níveis bastante altos.
Operadores matemáticos:
> Maior que
< Menor que
>= Maior ou igual que
<= Menor ou igual que
<> Diferente
= Igual
Operadores lógicos
And
Or
Not
Outros operadores
Seleciona os registros cujo valor de campo se assemelhe, não tendo em conta maiúsculas
Like
e minúsculas.
Dá um conjunto de valores para um campo para os quais a condição de seleção é (ou não)
In e Not In
válida
Is Null e Is Not Null Seleciona aqueles registros onde o campo especificado está (ou não) vazio.
Between...And Seleciona os registros compreendidos em um intervalo
Distinct Seleciona os registros não coincidentes
Desc 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
Nesta sentença selecionamos todos os clientes de Salvador cujo nome não seja Jose. Como se pode ver,
empregamos Like ao invés de = simplesmente para evitar inconvenientes devido ao emprego ou não de
maiúsculas.
Select * From clientes Where cidade Like 'salvador' And Not nome Like 'Jose'
Se quiséssemos recolher em uma seleção aos clientes de nossa tabela cujo sobrenome começa por A e
cujo número de pedidos esteja compreendido entre 20 e 40:
Select * From clientes Where sobrenomes like 'A%' And pedidos Between 20 And 40
O operador In, será visto mais adiante, é muito prático para consultas em várias tabelas. Para casos em uma
única tabela é empregada da seguinte forma:
Desta forma selecionamos aqueles clientes que vivem nessas três cidades.
Um banco de dados pode ser considerado como um conjunto de tabelas. Estas tabelas, em muitos casos, estão
relacionadas entre elas e se complementam unas com outras.
Fazendo referência ao nosso clássico exemplo de um banco de dados para uma aplicação de e-comercio, a tabela
clientes que estivemos falando pode estar perfeitamente coordenada 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 inventário.
Deste modo poderíamos facilmente obter informações contidas nessas três tabelas como pode ser a designação do
artigo mais popular em uma determinada região onde a designação 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 região estaria
compreendida obviamente na tabela clientes.
Este tipo de organização baseada em múltiplas tabelas conectadas nos permite trabalhar com tabelas muito mais
manejáveis e ao mesmo tempo, nos evita copiar o mesmo campo em vários lugares já que podemos acessa-lo a
partir de uma simples chamada à tabela que o contém.
Neste capítulo veremos como, usando o que foi aprendido até agora, podemos realizar facilmente seleções sobre
várias tabelas. Definiremos antes de nada as diferentes tabelas e campos que vamos utilizar em nossos exemplos:
Tabela de clientes
Nome campo Tipo campo
id_cliente Numérico inteiro
nome Texto
sobrenomes Texto
endereço Texto
cidade Texto
cep Texto
telefone Numérico inteiro
email Texto
Tabela de pedidos
Nome campo Tipo campo
id_pedido Numérico inteiro
id_cliente Numérico inteiro
id_artigo Numérico inteiro
data Data
quantidade Numérico inteiro
Tabela de artigos
Nome campo Tipo campo
id_artigo Numérico inteiro
titulo Alfanumérico
autor Alfanumérico
editorial Alfanumérico
preço Numérico real
Estas tabelas podem ser utilizadas simultaneamente para extrair informações de todo tipo. Suponhamos que
queremos enviar um mailing a todos aqueles que tiverem realizado um pedido nesse mesmo dia. Poderíamos
escrever algo assim:
Vejamos outro exemplo mais para consolidar estes novos conceitos. Desta vez queremos ver o título do livro
correspondente a cada um dos pedidos realizados:
Na verdade a filosofia continua sendo a mesma que para a consulta de uma única tabela.
Seleção de tabelas IV
Além dos critérios até agora explicados para realizar as consultas em tabelas, SQL permite também aplicar um
conjunto de funções pré-definidas. Estas funções, embora sejam básicas, podem nos ajudar em alguns momentos a
expressar nossa seleção de uma maneira mais simples sem ter que recorrer a operações adicionais por parte do
script que estivermos executando.
Função Descrição
Soma(campo) Calcula a soma dos registros do campo especificado
Avg(Campo) Calcula a média dos registros do campo especificado
Count(*) Proporciona o valor do número de registros que foram selecionados
Max(Campo) Indica qual é o valor máximo do campo
Min(Campo) Indica qual é o valor mínimo do campo
Dado que o campo da função não 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 função tem que ser recuperada a partir de um apelido que
nós especificaremos na sentença SQL a partir da instrução AS. A coisa poderia ficar assim:
A partir desta sentença 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 páginas dinâmicas.
Obviamente, tudo que foi visto até agora pode ser aplicado neste tipo de funções de modo que, por exemplo,
podemos estabelecer condições com a cláusula Where construindo sentenças como esta:
Isto nos proporcionaria a quantidade de exemplares de um determinado livro que foram vendidos.
Outra propriedade interessante destas funções é que permitem realizar operações com vários campos
dentro de um mesmo parênteses:
Select Avg(total/quantidade) From pedidos
Esta sentença dá como resultado o preço médio que estão sendo vendidos os livros. Este resultado não
tem porquê coincidir com o do preço médio dos livros presentes no inventário, já que, pode ser que as
pessoas tenham tendência a comprar os livros caros ou os baratos:
Uma cláusula interessante no uso das funções é Group By. Esta cláusula nos permite agrupar registros aos
quais vamos aplicar a função. Podemos por exemplo calcular o dinheiro gastado por cada cliente:
As possibilidades como vemos são numerosas e pode ser práticas. Agora tudo fica à disposição de nossas
ocorrências e imaginação.
Mas o banco de dados por sí não opera milagres. É necessária a presença de um profissional conhecedor de
suas ferramentas e entranhas para tirar dele tudo aquilo que é possível. Este profissional normalmente
conhecido por DBA (Database Administrator) é a peça fundamental neste processo.
Por outro lado, os desenvolvedores de software mesmo não sendo especialistas em bancos de dados como os
DBA's, podem (e devem) aproveitar um pouco do que é oferecido por estas ferramentas para criar aplicações
mais rápidas, mais enxutas e mais “limpas”, aproveitando funções existentes mas que na maioria das vezes
são esquecidas no momento do desenvolvimento. Sobre isso que vamos falar hoje: aproveitamento de
funções 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 também com outras bases e linguagens de forma semelheante.
Com uma frequência impressionante, precisamos somar valores vindos de uma base de dados. Para fazer isso
dentro do código do programa, podemos ter:
O “segredo” está na função SUM usada na segunda instrução. Ela simplesmente soma os valores do campo e
reduz um laço dentro do código. Com isso temos mais eficiência, velocidade e código limpo.
Um outro exemplo interessante pode ser visto quando, por exemplo, precisamos concatenar (unir) dois
campos. Para criar uma tabela no código, faríamos assim:
Observe que não temos redução de linhas mas de caracteres que deixam o código mais limpo e aproveitamos
o processamento do banco ao invés do servidor web. A concatenação é feita pela função CONCAT no segundo
exemplo e depois somente precisamos imprimir uma variável, ao invés de duas, evitando assim problemas de
interpretação.
Muitas vezes o trabalho com datas é um pesadelo para o programador. Soma de dias, meses, em que dia da
semana caiu tal data e assim por diante.
Como para strings, bancos de dados também possuem um conjunto interessante de funções para a
manipulação de datas. Vamos ver algumas.
A data atual
Já vi muito programador criar função para a inserção de datas dentro de registros em bases de dados. Acredito que
isso seja por não conhecer uma pequena mas muito útil função chamada now(). Com ela, a data e/ou hora atual são
armazenadas em campos que necessitam este valor.
Esta função simplesmente pega a informação 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 também
estará errado. Assim é interessante manter o servidor com horário sempre sincronizado com time servers existentes
na Internet.
Além disso, em alguns momentos precisamos saber em que semana estamos do ano ou ainda quantas semanas
faltam para o fim do ano. Ao invés de complexos códigos de linguagem, podemos usar a base de dados para nos
informar este resultado rapidamente. Por exemplo, em que semana do mês estamos agora?
print mysql_result(mysql_query("SELECT WEEK(now())",$conexao),0);
// resultado: 18
Aqui foi usada a função WEEK que retorna o número da semana de uma determinada data. Neste caso, a data
informada é “hoje” pois usamos como parâmetro de data a função now() que, como já apresentado anteriormente, é
a data atual do servidor.
Outra tarefa comum com datas é a soma de dias em uma data específica. Pode parecer simples mas como o formato
de data é diferente de formatos numéricos e strings, muitas vezes o resultado está errado e não sabemos porquê.
A forma mais simples é novamente deixar o banco de dados trabalhar por você. Então para acrescentar, por
exemplo, dez dias à data atual, fazemos:
Com isso temos, em uma única linha, o valor que precisamos com a certeza que se trata de uma data válida,
inclusive contando meses que possuem somente 28,29 ou 30 dias (experimente fazer a soma de 10 dias à
data de 25/02/2006 e verá o resultado).
Conclusão
Pequenas e simples funções quando bem utilizadas facilitam a vida de qualquer desenvolvedor. Assim, antes
de “quebrar a cabeça” com dezenas de linhas de código para resolver um problema ou demanda, procure
saber se as ferramentas que está utilizando não dispõem de formas mais simples para a solução deste
problema. Muitas vezes a solução mais simples está diante dos olhos e perdemos tempo tentando algo
diferente.
Estes exemplos são pequenos e simples se comparados a enorme gama de opções existentes nas bases de
dados. Funções para data, strings, funções matemáticas e outras tantas estão disponíveis na maioria das
bases de dados relacionais existentes hoje em dia. Para o MySQL, acesse
[Link] Já para o PostgreSQL, acesse
[Link]
Abraços!
Sintaxe:
Tabelas temporárias são muito utilizadas quando precisamos reunir vários registros de várias tabelas em uma
única seleção e exibi-las em uma aplicação qualquer ([Link].: Delphi, Visual Studio, [Link], etc.). .
É fundamental para aplicações cliente/servidor onde vários usuários estão acessando aquela procedure ao
mesmo tempo.
Aqui vai um exemplo prático da utilização de tabelas temporárias.É importante saber que a tabela temporária
só existe enquanto a procedure está sendo executada, após a execução da mesma ela é automaticamente
excluída. Aproveitei para colocar um exemplo utilizando o CASE do Sql Server
as
Segue um exemplo:
Veja a saída:
Usuário: GLAUCIO
Sistema Operacional: WINDOWS XP
[Link]
Código da JSP:
Saída:
Esse tipo de função permite que, por exemplo, quando um usuário 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 usuário possui uma conta na Intranet.
Em páginas do tipo portal nas que nas laterais se encontram links que são impressos a partir de bancos de
dados (distintas seções, serviços,...) existe sempre um efeito lentalizador devido a que se trata de páginas
altamente visitadas que efetuam múltiplas chamadas a BD sistematicamente em cada uma de suas páginas.
Uma forma de agilizar a visualização destas páginas é textualizando estes links a partir de scripts internos.
Colocamos o exemplo de Criarweb:
Como se pode ver, na lateral existem seções como "Suas Páginas", "Manuais" cujos links estão armazenados
no banco de dados. Entretanto, os links que se visualizam na página não foram obtidos por chamadas a banco
de dados e sim que, cada vez que um novo elemento da seção é adicionado, isto se atualiza
automaticamente, por meio de um script, um arquivo texto no qual o novo link é incluído e o mais antigo é
eliminado. De fato, este arquivo de texto é o que é inserido no código fonte da página. Deste modo, evitamos
meia dúzia de chamadas a bancos de dados cada vez que uma página é vista, o qual permite otimizar
recursos de servidor de uma maneira significativa.
Em situações na qual nosso banco de dados tem que armazenar campos de texto extremamente longos, e
tais campos são requeridos para realizar seleções 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 incluiríamos o texto
original, do qual teremos eliminado palavras triviais como artigos, preposições ou possessivos. Além 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 capítulos que os campos de texto de mais de 255 caracteres denominados memo não
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 pedaços de 255 caracteres de maneira que o
armazenemos em diferentes campos que poderão ser indexados e portanto, consultados com maior rapidez.
Criação de tabelas
Em geral, a maioria dos bancos de dados possui potentes editores de bancos que permitem a criação rápida e
simples de qualquer tipo de tabela com qualquer tipo de formato.
Entretanto, uma vez que o banco de dados esteja hospedado no servidor, pode acontecer o caso de que
queiramos introduzir uma nova tabela já seja com caráter temporário (para gerenciar um carrinho de compra,
por exemplo) ou permanente, por necessidades concretas de nossa aplicação.
Nestes casos, podemos, a partir de uma sentença SQL, criar a tabela com o formato que desejarmos, o qual
pode nos poupar mais que um quebra-cabeça.
Estes tipos de sentenças são especialmente úteis para bancos de dados como Mysql, os quais trabalham
diretamente com comandos SQL e não por meio de editores.
Para criar uma tabela devemos especificar diversos dados: O nome que queremos atribuir, os nomes dos
campos e suas características. Ademais, pode ser necessário especificar quais destes campos vão ser índices
e de que tipo serão.
A sintaxe de criação pode variar ligeiramente de um banco de dados para outro já que os tipos de campos
aceitos, não estarão completamente padronizados.
A seguir explicamos meramente a sintaxe desta sentença e lhes propomos uma série de exemplos:
Sintaxe
Ponhamos agora como exemplo a criação da tabela pedidos que empregamos em capítulos anteriores:
Neste caso criamos os campos id os quais são considerados de tipo inteiro de uma longitude especificada pelo
número entre parênteses. Para id_pedido requeremos que tal campo se incremente automaticamente
(AUTO_INCREMENT) de uma unidade a cada introdução a um novo registro para, desta forma, automatizar sua
criação. Por outro lado, para evitar uma mensagem de erro, é necessário requerer que os campos que vão ser
definidos como índices não possam ser nulos (NOT NULL).
O campo data é armazenado com formato de data (DATE) para permitir sua correta exploração a partir das
funções previstas a tal efeito.
Finalmente, definimos os índices numerando-os entre parênteses precedidos da palavra KEY ou INDEX.
Da mesma forma poderíamos criar a tabela de artigos com uma sentença como esta:
Neste caso pode-se ver que os campos alfanuméricos são introduzidos da mesma forma que os numéricos.
Voltemos a recordar que em tabelas que têm campos comuns é de vital importância definir estes campos da mesma
forma para o bom funcionamento da base.
Muitas são as opções que se oferecem ao gerar tabelas. Não vamos a trata-las detalhadamente, pois sai do
estritamente prático. Mostraremos somente alguns dos tipos de campos que podem ser empregados na criação de
tabelas com suas características:
Minha experiência maior tem sido desenvolvida junto ao banco de dados Oracle, mas a padronização do
comando SQL e pelo fato de os conceitos de programação de um banco de dados serem facilmente aplicados
a qualquer outro banco de dados, faz com que possamos tratar destes assuntos quase que universalmente.
SQL
A linguagem SQL (Structured Query Language) é a base para utilização de bancos de dados relacionais. Com a
utilização dos comandos básicos (INSERT, DELETE, UPDATE e SELECT) pode-se resolver a maior parte dos
problemas relacionados a manutenção e extração de dados no banco de dados. Com o SQL é possível criar as
estruturas básicas de armazenamento, como tabelas e índices. Também há comandos específicos da
linguagem para o controle e segurança relacionado a um banco de dados. Em princípio, os comandos SQL são
divididos em:
O SQL tem sido aprimorado ao longo do tempo. Duas entidades (ANSI – American National Standards Institute
e ISO – International Standards Organization) vêm, desde 1986, publicando padrões de especificação da
linguagem SQL.
Vamos discutir como abordar e tirar o máximo de proveito desta linguagem que é extremamente importante
para todos os profissionais de banco de dados. Os principais tópicos que serão de interesse envolvem:
Naturalmente a idéia é ter uma visão prática, com exemplos e com a abertura de uma discussão entre todos
os leitores.
Os comandos da linguagem SQL são muito poderosos, mas normalmente consegue-se melhorar o
desempenho das aplicações através da programação do banco de dados. Ao desenvolver módulos que sejam
executados diretamente no servidor diminui-se o tráfego de informações 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 programação com os
comandos SQL.
O banco de dados possui mecanismos próprios que podem ser utilizados em favor do desenvolvedor. Cada
banco de dados possui um conjunto específico de comandos que definem a linguagem de programação do
banco de dados. No caso do Oracle, a linguagem é o PL/SQL, o SQL Server possui o Transact-SQL, o DB2
possui sua própria linguagem de programação, o PostGreSQL possui diversas extensões que podem ser
utilizadas como linguagem de programação e o MySQL lançou sua mais recente versão com a possibilidade de
programar o servidor. Cada banco de dados é único sob este aspecto, mas todos trabalham sobre os mesmos
conceitos. É possível criar módulos programáveis, como funções, procedimentos, objetos, pacotes, gatilhos,
etc. Em todos os casos, há um engine responsável pela integração e execução dos módulos no servidor de
banco de dados.
Como se pode notar, os tópicos são quase os mesmos da linguagem SQL. Também teremos artigos que
poderão ser implementados, testados e melhorados por todos os leitores.
Informe de Eber M. Duarte
URL: [Link]
Tenho uma tabela com vários campos. Dois deles são datas, que correspondem com um intervalo. Um deles é
a data de início do intervalo (datadesde) e outro a de final do intervalo (dataate)
Queria saber como se pode fazer uma consulta SQL em Access para obter os registros 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 aritméticos. Em
alguns casos obtivemos a resposta esperada, porém nem sempre funcionavam as sentenças e tínhamos
problemas ao executa-las desde Access ou desde o servidor web, porque não devolviam os mesmos
resultados.
Função DateDiff()
Afinal, a resposta que propusemos passou por utilizar a função DateDiff, que serve para obter a diferença
entre duas datas. Por exemplo:
Nós podemos utiliza-la como condição em um where de uma sentença SQL. Por exemplo, para uma sentença
como esta:
DateDiff("y",A,B)
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 sentença:
Nota: Há que ter cuidado com o idioma das datas, pois em português se escrevem de maneira diferente que em inglês.
Access tenta interpretar a data corretamente, por exemplo, se introduzimos 02/26/04 pensará que está trabalhando em
datas em inglês e se introduzimos 26/02/04 pensará que estamos escrevendo as datas em português. O problema é com
uma data como 02/02/04 que seu valor dependerá de como esteja configurado o Access, em português ou em inglês.
Função DatePart
Serve para extrair parte de uma data. Recebe dois parâmetros, o primeiro indica mediante um string a parte a
obter. O outro parâmetro é a data com a que se deseja trabalhar.
DatePart("m",data)
Neste caso está sendo indicado que se deseja obter o mês do ano. Outro valor possível para o primeiro
parágrafo é, por exemplo "yyyy", que se utiliza para obter o ano com quatro dígitos. Um exemplo de sentença
SQL que utiliza esta função pode ser a seguinte:
Função DateAdd
Esta última função que vamos ver no presente artigo serve para acrescentar à data, algo como dias, meses ou
anos. Para isso a função recebe três parâmetros, o primeiro corresponde com um string para indicar as
unidades do que desejamos acrescentar, por exemplo, dias, meses ou anos. O segundo parâmetro é o número
de dias, meses ou anos a adicionar e o terceiro parâmetro é a data a qual somar esses valores. Vemos um
exemplo de sua sintaxe:
DateAdd("yyyy",10,validadedesde)
Neste exemplo a função DateAdd devolveria uma data dez anos posterior a validadedesde. Outros valores
para o string do primeiro parâmetro são "d", para acrescentar dias, ou "m", para acrescentar meses.
//Com esta variavel calculamos quantos dias "normais" existem na classe de datas
//esta variavel nos serve de contador para saber quando chegarmos ao ultimo dia da classe
/*esta variavel eh a que comparamos para saber se o dia que esta calculando eh sabado ou domingo*/
/*Estas duas variaveis servem para comparar as duas datas, se sao iguais, a funcao nos regressa um 0*/
SELECT @DaysBetween = 0
SELECT @BusinessDays = 0
SELECT @Cnt=0
/*Ordenamos o formato das datas para que não 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)))
IF @ini <>@fin
BEGIN
/*Se a diferenca de datas for igual a dois, eh porque so foi transcorrido um dia, portanto somente se valida de que nao vai marcar dias de
mais*/
IF @DaysBetween = 2
BEGIN
SELECT @BusinessDays = 1
END
ELSE
BEGIN
WHILE @Cnt < @DaysBetween
BEGIN
/*Iguala-se a data que vamos calcular para saber se eh sabado ou domingo na variavel @EvalDate somando os dias que marque o
contador, o qual nao deve ser maior que o numero total de dias que existem na classe de datas*/
/*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)*/
/*Se nao eh sabado ou domingo, entao se soma um ao total de dias que queremos desdobrar*/
SELECT @BusinessDays = 0
END
return (@BusinessDays)
END
Antes de começar, 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 começar com MYSQL, já que, embora existam algumas mudanças insignificantes, sabendo manejar SQL
você saberá manejar MYSQL.
Algumas características:
Tipos de dados:
CHAR:
VARCHAR:
NUMBER:
X=number (7,2)
X=155'862 à Erro já que só pode tomar 2 decimais
X= 155'86 à Bem
LONG:
DATE:
Seculo/Ano/Mes/Dia/Hora/Minutos/Segundos
RAW:
ROWID:
Select:
Select [ALL | Distinct] [expresao_coluna1, expresao_coluna2, …., | *]
From [nome1, nome_tabela1, …, nome_tabelan]
{[Where condicao]
[Order By expresao_coluna [Desc | Asc]…]};
Vamos explicar como ler a consulta anterior e assim seguir a pauta para todas as demais. Quando compomos []
significa que a que vai dentro deve existir, e sim, além disso, colocamos | significa que deveremos escolher um
valor dos que colocamos e não mais de um. Em troca se colocarmos {} significa que o que vai dentro das chaves
pode ir ou não, 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 são distintas.
Desc Emple; = Dá um resumo da tabela e suas colunas. Neste caso da tabela Emple.
Not Null= Se aparecer em uma lista de uma coluna significa que a coluna não pode ter valores nulos.
Null= Se estiver nulo.
Nota: Note que cada consulta de SQL que fazemos temos de termina-la com um ponto e vírgula";".
Este exemplo mostra o número do jogador (jogador_no) o sobrenome (Sobrenome), a posição na que joga
(Posição), e o time (Time) ao que pertence.
Selecionará todos os dados da tabela jogadores onde (Where) o nome do time (Time_No) for igual que a
palavra 'Flamengo' e se ordenará (order by) sobrenome. Observe também que não põe nem 'Distinct' nem
'All'. Por padrão, gerará a sentença com ALL.
SELECT *
FROM JOGADORES
WHERE POSICAO = 'ATACANTE'
ORDER BY JOGADOR_NO;
Este exemplo mostra todos os campos da tabela jogadores onde (Where) a posição for igual que 'Atacante' e o
ordena por número de jogador. Ao não colocar nada se supõe que é ascendentemente (Asc).
SELECT *
FROM JOGADORES
WHERE TIME_NAO = 'FLAMENGO' AND POSICAO = 'ATACANTE'
ORDER BY SOBRENOME DESC, JOGADOR_NAO ASC;
Neste exemplo seleciona todos os campos da tabela jogadores onde (Where) o nome do time for igual a
'Flamengo' e a posição dos jogadores for igual a 'Atacante'. Por ultimo os ordena por 'Sobrenome'
descendentemente e por número de jogador ascendentemente.
Informe de Agustin Jareño
Mail: agustin@[Link]
URL: [Link]
+ = Soma
- = Subtração
* = Multiplicação
/ = Divisião
!> = 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 = Negação
And = e
a and b
Certo se são certas a e b.
Or = o
a or b
Certo se a ou b são certas
Obtemos os dados dos jogadores cujos sobrenomes comecem com a letra "S":
SELECT SOBRENOMES
FROM JOGADORES
WHERE SOBRENOMES LIKE 'S%';
SELECT SOBRENOMES
FROM JOGADORES
WHERE SOBRENOMES LIKE '_R*';
Obtemos aqueles sobrenomes que começam por "A" e tem uma "o" em seu interior:
SELECT SOBRENOMES
FROM JOGADORES
WHERE SOBRENOMES LIKE 'A%O%';
Exemplo:
SELECT SOBRENOMES
FROM JOGADORES
WHERE JOGADOR_NUM IN (10, 20);
Seleciona os sobrenomes dos jogadores onde o número 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 salário destes não esteja entre (Not Between) 15000000 e
20000000.
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:
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');
Funções SQL
Funções de valores simples:
Funções de conversão:
Para saber qual é o salário médio de cada departamento da tabela Jogadores seria:
A sentença "Select" possibilita agrupar um ou mais conjuntos de filas. O agrupamento se realiza mediante a
cláusula "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 sentença "Select" que leva o "Group By" devem ser:
Uma constante.
A cláusula 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 temporário.
A cláusula Having se emprega para controlar qual dos conjuntos de filas se visualiza. Avalia-se sobre a tabela
que devolve o Group By. Não pode existir sem Group By.
Having é parecido ao Where, porém trabalha com grupos de filas; pergunta por uma característica de grupo,
ou seja, pergunta pelos resultados das funções de grupo, o qual Where não pode fazer.
Permite-nos selecionar algumas filas de uma tabela embora estas não tenham correspondência com as filas
da outra tabela com a que se combina. Formato:
Isto seleciona todas as filas da tabela "tabela1" embora não tenham correspondência com as filas da tabela
"tabela2", se utiliza o símbolo +.
O resto de colunas da tabela "tabela2" se preenche com NULL.
Permite combinar os resultados de vários "Select" para obter um único resultado. Formato:
UNION= Combina os resultados de duas consultas. As filas duplicadas que aparecem se reduzem a uma fila
única.
UNION ALL= Como a anterior, porém aparecerão nomes duplicados.
INTERSEC= Devolve as filas que são iguais em ambas consultas. Todas as filas duplicadas serão eliminadas.
MINUS= Devolve aquelas filas que estão na primeira "Select" e não estão na segunda "Select". As filas
duplicadas do primeiro conjunto se reduzirão a uma fila única antes que comece a comparação com o outro
conjunto.
Insert:
Propriedades:
Se as colunas não se especificam na cláusula Insert se consideram, por padrão, todas as colunas da
tabela.
As colunas às quais damos valores se identificam pelo seu nome.
A associação coluna valor é posicional.
Os valores que se dão às colunas devem coincidir com o tipo de dado definido na coluna.
Os valores constantes de tipo caractere tem de ir fechados entre aspas simples (' ') (os de tipo data
também).
Com Select:
Update:
Atualiza os valores das colunas para uma ou várias filas de uma tabela:
UPDATE NOMETABELA
SET COLUNA1= VALOR1, …, COLUNAN= VALORN
WHERE CONDICAO;
Com Select:
Quando a subconsulta (orden select) forma parte de SET, deve selecionar o mesmo número de colunas, (com
tipos de dados adequados) que os que existem entre parênteses ao lado de SET.
UPDATE NOMETABELA
SET COLUNA= VALOR1, COLUNA2= VALOR2, …
WHERE COLUNA3= (SELECT…)
OU
UPDATE NOMETABELA
SET (COLUNA1, COLUNA2, …)= (SELECT …)
WHERE CONDICAO;
Delete:
Elimina uma ou várias filas de uma tabela:
Permite ir até o último COMMIT feito ou em seu padrão até o começo das ordens com o que estas não se
executam.
Commit:
Quando executamos ordens, estas não são criadas na tabela até que coloquemos esta ordem, portanto as
mudanças realizadas se perderão se ao sair do programa não realizarmos esta ação. Pode se programar para
que seja feito automaticamente.
QUIT
EXIT
CONNECT
DISCONNECT
CREATE TABLE
CREATE VIEW
GRANT
REVOQUE
DROP TABLE
DROP VIEW
ALTER
AUDIT
NO AUDIT
Seu primeiro caractere deve ser alfabético e o resto pode ser letras, números e o caractere sublinhado.
Características:
Integridade de dados:
A integridade faz referência ao fato de que os dados do banco de dados têm que se ajustar às restrições antes
de se armazenar nele. Uma restrição de integridade será:
Uma regra que restringe classe de valores para uma ou mais colunas na tabela.
Usamos a cláusula CONSTRAINT, que pode restringir uma só coluna ou um grupo de colunas de uma mesma
tabela.
Existem dois modos de especificar restrições:
Como parte da definição de colunas.
Afinal, uma vez especificadas todas as colunas.
Formato:
É uma coluna ou um conjunto de colunas que identificam univocamente a cada fila. Deve ser única, não nula e
obrigatória. Como máximo, podemos definir uma chave primária por tabela.
Esta chave pode ser referenciada por uma coluna ou colunas. Quando se cria uma chave primária,
automaticamente se cria um índice que facilita o acesso à tabela.
Está formada por uma ou várias colunas que estão associadas a uma chave primária de outra ou da mesma
tabela. Pode-se definir tantas chaves alheias quantas se necessite, e podem estar ou não na mesma tabela
que a chave primária. O valor da coluna ou colunas que são chaves alheias deve ser: NULL ou igual a um valor
da chave referenciada (regra de integridade referencial).
Notas:
NOT NULL: Significa que a coluna não pode ter valores nulos.
DEFAULT: Proporcionamos a uma coluna um valor padrão quando o valor da coluna não se especifica na cláusula
INSERT. Na especificação DEFAULT é possível incluir várias expressões: constantes, funções SQL e variáveis
UID e SYSDATE.
Verificação de restrições: CHECK: Atua como uma cláusula where. Pode fazer referência a uma ou mais colunas,
porém não a valores de outras filas. Em uma cláusula CHECK não se podem incluir sub-consultas nem as pseudo-
consultas SYSDATE, UID e USER.
Nota: A restrição NOT NULL é similar a CHECK (NOME_COLUNA IS NOT NULL)
UNIQUE: Evita valores repetidos na mesma coluna. Pode conter uma ou várias colunas. É similar à restrição
PRIMARY KEY, salvo que são possíveis várias colunas UNIQUE definidas em uma tabela. Admite valores NULL.
Assim como em PRIMARY KEY, quando se define uma restrição UNIQUE se cria um índice automaticamente.
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 ação com a cláusula AS colocada ao final da ordem
CREATE TABLE.
Não é necessário especificar tipos nem tamanho das consultas, já que vêm determinadas pelos tipos e os
tamanhos das recuperadas na consulta.
A consulta pode ter uma sub-consulta, uma combinação de tabelas ou qualquer sentença select válida.
As restrições COM NOME não se criam em uma tabela desde a outra, só se criam aquelas restrições que
carecem de nome.
DROP TABLE: suprime uma tabela do banco de dados. Cada usuário pode eliminar suas próprias tabelas,
porém só o administrador ou algum usuário com o privilégio "DROP ANY TABLE" pode eliminar as tabelas de
outro usuário. Ao suprimir uma tabela também se suprimem os índices e os privilégios associados a ela. As
vistas e os sinônimos criados a partir desta tabela deixam de funcionar, mas continuam existindo no banco de
dados, portanto deveríamos elimina-los.
Exemplo:
TRUNCATE: permite suprimir todas as filas de uma tabela e liberar o espaço ocupado para outros usos sem
que reapareça a definição da tabela do banco de dados. Uma ordem TRUNCATE não se pode anular, assim
como também não ativa os disparadores DELETE.
Modificação de tabelas:
Modificam-se as tabelas de duas formas: Mudando a definição de uma coluna (MODIFY) ou acrescentando
uma coluna a uma tabela existente (ADD):
Formato:
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.
É possível aumentar ou diminuir o número de posições decimais em uma coluna de tipo NUMBER.
Se a coluna for NULL em todas as filas da tabela, pode-se diminuir a longitude e modificar o tipo de
dado.
A opção MODIFY… NOT NULL só será possível quando a tabela não contiver nenhuma fila com valor
nulo na coluna que se modifica.
Adição de restrições:
Eliminação de restrições:
A ordem ALTER TABLE com a cláusula DROP CONSTRAINT; com a que se eliminam as restrições com nome e
as atribuídas pelo sistema. Formato:
Não contém informação por si mesmas, e sim, estão baseadas nas que contém outras tabelas e reflete os
dados destas.
Se suprime uma tabela a vista associada se invalida. Formato:
Nota: ao eliminar as tabelas, as vistas dessas tabelas não se eliminam e ficam inutilizadas.
Eliminação de vistas
Atualização. Se uma vista está baseada em uma só tabela, pode-se modificar as filas da vista.
A modificação da vista muda a tabela sobre a qual está definida.
Eliminação de filas através de uma vista= Para eliminar filas de uma tabela através de uma vista, esta
se deve criar:
o Com filas de uma só tabela.
o Sem utilizar a cláusula GROUP BY nem DISTINCT.
o Sem usar funções de grupo ou referências a pseudo-colunas.
Atualização de filas através de uma vista: Para atualizar filas em uma tabela através de uma vista, esta
tem que estar definida segundo as restrições anteriores e, ademais, nenhuma das colunas que vai se
atualizar terá definido como uma expressão.
Inserção de filas através de uma vista: Para inserir filas em uma tabela através de uma vista, há que
ter em conta todas as restrições anteriores e, ademais, todas as colunas obrigatórias da tabela
associada devem estar presentes na vista.
Manejo de expressões e de funções em vistas: Pode-se criar vistas usando funções, expressões em colunas e
consultas avançadas, porém unicamente se emparelham consultar estas vistas. Também podemos modificar
filas sempre e quando a coluna que vai se modificar não for a coluna expressada em forma de cálculo ou
com funções.
Nota: Não é possível inserir filas se as colunas da vista contém cálculos ou funções.
Mudanças de nome
RENAME muda o nome de uma tabela, vista ou sinônimo. O novo nome não pode ser uma palavra reservada
no nome de um objeto que o usuário tiver criado. As restrições de integridade, os índices e as permissões
dadas ao objeto se transferem automaticamente ao novo objeto.
Com esta ordem não podemos re-nomear colunas de uma tabela, estas se re-nomeiam mediante CREATE
TABLE AS…
Usuários em Oracle
É um nome definido no banco de dados que se pode conecta-lo e acessar a determinados objetos segundo
certas condições que o administrador estabelece.
Os objetos do dicionário de dados aos que um usuário pode acessar, encontram-se na vista DICTIONARY, que
é propriedade do usuário SYS.
DESC DICTIONARY;
Com a ordem:
Criação de usuários:
DEFAULT TABLESPACE= Atribui a um usuário o tablespace padrão para armazenar os objetos que crie. Se não
se atribui nenhum, o tablespace padrão é SYSTEM.
TEMPORARY TABLESPACE= Especifica o nome do tablespace para trabalhar temporais. Se não se especifica
nenhum, o tablespace padrão é SYSTEM.
QUOTA= Atribui um espaço em megabites ou kilobites no tablespace atribuído. Se não se especifica esta
cláusula, o usuário não tem cota atribuída e não poderá criar objetos no tablespace. Para ter espaço e acesso
ilimitado a um tablespace é:
Modificação de usuários:
Eliminação de usuarios:
Privilégios
Permite-nos acessar e realizar mudanças nos dados de outros usuários. Exemplo: O privilégio de consultar a
tabela de outro usuário é um privilégio sobre objetos.
Privilégios de sistema
Dão direito a executar um tipo de comando SQL ou a realçar alguma ação sobre objetos de um tipo
especificado. Por exemplo, o privilégio para criar TABLESPACES é um privilégio de sistema. Formato:
WITH ADMIN OPTION= Permite que o receptor do privilégio ou rol possa conceder esses mesmos privilégios a
outros usuários ou rols.
Roles
Nota: Um rol pode decidir o acesso de um usuário a um objeto, mas não pode permitir a criação de objetos.
Supressão de um rol
Perfis:
Eliminação de um perfil:
Gerenciamento de tablespaces
Um tablespace é uma unidade lógica de armazenamento de dados representada fisicamente por um ou mais
arquivos de dados. Recomenda-se não misturar dados de diferentes aplicações em um mesmo tablespace.
Modificação de tablespaces
Eliminação de tablespaces
INCLUDING CONTENTS= Permite eliminar um tablespace que tenha dados. Sem esta opção só se pode
suprimir um tablespace vazio.
Recomenda-se colocar o talespace offline antes de elimina-lo para certificarmos de que não haja sentenças
SQL que estejam acessando dados do tablespace, em cujo caso não seria possível elimina-lo.
Quando se elimina um tablespace os arquivos associados não se apagam do sistema operacional, portanto
teremos que elimina-los de forma manual.
Portanto, muitas vezes não basta com especificar uma sentença SQL correta, e sim que além disso, há que
indicar como tem que fazer se quisermos que o tempo de resposta seja o mínimo. Nesta seção, veremos como
melhorar o tempo de resposta de nosso intérprete ante umas determinadas situações:
Design de tabelas
Normalize as tabelas, pelo menos até a terceira forma normal, para garantir que não haja duplicidade
de dados e aproveitar o máximo de armazenamento nas tabelas. Se tiver que desnormalizar alguma
tabela pense na ocupação e no rendimento antes de proceder.
Os primeiros campos de cada tabela devem ser aqueles campos requeridos e dentro dos requeridos
primeiro se definem os de longitude fixa e depois os de longitude variável.
Ajuste ao máximo o tamanho dos campos para não desperdiçar espaço.
É normal deixar um campo de texto para observações nas tabelas. Se este campo for utilizado com
pouca freqüência ou se for definido com grande tamanho, por via das dúvidas, é melhor criar uma
nova tabela que contenha a chave primária da primeira e o campo para observações.
Os índices são 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 memória (o dobro mais ou menos) e de requerer para sua inserção e
atualização um tempo de processo superior.
Evidentemente, não podemos indexar todos os campos de uma tabela extensa já que dobramos o tamanho do
banco de dados. Igualmente, tampouco serve muito indexar todos os campos em uma tabela pequena já que
as seleções podem se efetuar rapidamente de qualquer forma.
Um caso em que os índices podem ser muito úteis é quando realizamos petições simultâneas sobre várias
tabelas. Neste caso, o processo de seleção 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 não se
realiza nenhum tipo de petição já que, além do problema de memória já mencionado, estamos lentificando
outras tarefas do banco de dados como são a edição, inserção e eliminação. É por isso que vale a pena pensar
duas vezes antes de indexar um campo que não serve de critério para buscas ou que é usado com muita
freqüência por razões de manutenção.
Campos a Selecionar
Na medida do possível há que evitar que as sentenças SQL estejam embebidas dentro do código da
aplicação. É muito mais eficaz usar vistas ou procedimentos armazenados por que o gerenciador os
salva compilados. Se se trata de uma sentença embebida o gerenciador deve compila-la antes de
executa-la.
Selecionar exclusivamente aqueles que se necessitem
Não utilizar nunca SELECT * porque o gerenciador deve ler primeiro a estrutura da tabela antes de
executar a sentença
Se utilizar várias 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 invés de SELECT
Nome, Fatura FROM Clientes, Faturamento WHERE IdCliente = IdClienteFaturado, use: SELECT
[Link], [Link] WHERE [Link] = [Link].
Campos de Filtro
Procuraremos escolher na cláusula WHERE aqueles campos que fazem parte da chave do arquivo pelo
qual interrogamos. Ademais se especificarão na mesma ordem na qual estiverem definidas na chave.
Interrogar sempre por campos que sejam chave.
Se desejarmos interrogar por campos pertencentes a índices compostos é melhor utilizar todos os
campos de todos os índices. Suponhamos que temos um índice formado pelo campo NOME e o campo
SOBRENOME e outro índice formado pelo campo IDADE. A sentença WHERE NOME='Jose' AND
SOBRENOME Like '%' AND IDADE = 20 seria melhor que WHERE NOME = 'Jose' AND IDADE = 20 porque
o gerenciador, neste segundo caso, não pode usar o primeiro índice e ambas sentenças são
equivalentes porque a condição SOBRENOME Like '%' devolveria todos os registros.
Quando se utilizam várias tabelas dentro da consulta há que ter cuidado com a ordem empregada na cláusula
FROM. Se desejarmos saber quantos alunos se matricularam no ano 1996 e escrevermos: FROM Alunos,
Matriculas WHERE [Link] = [Link] AND [Link] = 1996 o gerenciador percorrerá
todos os alunos para buscar suas matrículas e devolver as correspondentes. Se escrevermos FROM Matriculas,
Alunos WHERE [Link] = 1996 AND [Link] = [Link], o gerenciador filtra as
matrículas e depois seleciona os alunos, desta forma tem que percorrer menos registros.
Informe de Claudio
Mail: claudio@[Link]
URL: [Link]