Esse artigo faz parte da revista Clube Delphi edição 2. Clique aqui para ler todos os artigos desta edição

img

Atenção: por essa edição ser muito antiga não há arquivo PDF para download. Os artigos dessa edição estão disponíveis somente através do formato HTML. 

 

Linguagem SQL

A linguagem padrão dos bancos de dados

 

Os nomes didáticos da informática, são hoje, sem dúvida, uma enchente de siglas e acrônimos de nomes tão técnicos e estranhos quanto suas origens, dificultando até mesmo a nossa capacidade de memorizar. Nomeio de tantos códigos e símbolos, como ADO, MFC,COM,OLE, entre outros, é necessário uma grande força de vontade para extrair o que realmente é útil e deixar o tempo necessário de estudo para cada uma delas. E certamente é o que tento fazer neste nosso novo encontro, onde escolhi uma sigla nem um pouco estranha, mas com uma fundamental importância na nossa aventura de desenvolver aplicações, e principalmente neste caso, aplicações de bancos de dados. Vou começar com uma breve introdução ao conceito:

SQL, acrônimo de STRUCTURED QUERY LANGUAGE, são comandos de manipulação ou modificação de dados e tabelas de bancos de dados (sendo por muitos chamados de DML). OSQL faz parte da ANSI/ISSO, um conjunto de nomes e padrões internacionais, e por conseqüência disto, praticamente todos os bancos de dados e seus front-ends suportam SQL.

 

O SQL E SUA SINTAXE

Mostrarei a seguir exemplos e definições de clausulas SQL, divididas em dois tópicos:

 

RECUPERAÇÃO DE DADOS

O comando usado para extração de dados é o SELECT. Sua sintaxe é muito simples. Vejamos por exemplo, uma instrução para recuperar todos os registros de uma suposta tabela chamada leitor:

 

SELECT *

FROM Leitor

 

No caso são usados dois comandos: o primeiro, SELECT, especifica quais campos aparecerão no resultado da consulta. No caso, o símbolo * representa todos os campos.

A segunda palavra FROM, específica a tabela onde vamos procurar os registros. A cláusula mostrará, então, o conteúdo da tabela Leitor.

Vejamos outro exemplo:

Neste caso, a consulta irá exibir apenas os campos Código e nome.

 

SELECT Codigo, Nome

FROM Leitor

 

Lembre-se: quanto menor a quantidade de campos, mais rápida será a execução da Query.

 

SELECT Codigo, Nome

FROM Leitor

WHERE codigo = 3

 

Aqui vemos mais um comando: WHERE. Este talvez seja o principal comando da clausula SELECT, pois é o responsável pela filtragem dos registros.

Neste exemplo, a consulta exibirá apenas o leitor cujo código seja;

Neste exemplo, serão mostrados todos os campos cujo nome seja

Igual q ‘’João Batista’’

 

SELECT Codigo, Nome

FROM Leitor

WHERE Nome = ‘João Batista’

 

Aqui mais uma novidade: o operador LIKE, Este operador permite selecionar os registros mais próximos do valor passado.

O operador Like trabalha em conjunto com o caracter de máscara’’%’’. Este caracter indica qual parte do valor será pesquisada. Por exemplo, se tivéssemos uma tabela com os seguintes registros:

 

Código | Nome

1       Jose da Silva

2       Carlos Jose

 

Ao executar a clausula Nome LIKE ‘’jose%’’, seriam exibidos os registros:

 

1       Jose da Silva

 

Mas poderíamos fazer uma pesquisa parcial tanto no fim como no início, da seguinte forma:

 

SELECT *

FROM Leitor

WHERE Nome LIKE ‘%Jose%’

 

Neste caso todos os registros do exemplo seriam exibidos.

Nota: O caracter ‘’%’’ é usado pelo Paradox. O caracter de máscara original usado no SQL é o ‘’*’’.

 

SELECT *

FROM Leitor

WHERE Cod>=1 AND Cod=<10

 

Aqui vemos que o SQL suporta operadores relacionais, como>=,<=, >,<, <> e operadores lógicos. Como AND, OR, NOT E XOR

 

SELECT *

FROM Leitor

WHERE CPF IS NULL

 

Acima, todos os leitores que não possuem CPF seriam exibidos.

 

SELECT Nome

FROM Leitor

WHERE UF IN(‘RJ’,’PB’,’MG’)

 

Aqui seriam exibidos leitores cariocas, paraibanos e mineiros.

 

SELECT Codigo, Nome

FROM Leitor

WHERE Codigo NOT IN

(SELECT CodLeitor

FROM Emprestimo

WHERE Devolvido=False)

 

Este exemplo é bastante curioso: ele exibe todos os leitores que não estão com livros emprestados. Vamos analisá-lo:

Primeiro temos um comando SQL pai será o resultado dado ao usuário:

 

SELECT Codigo, Nome

FROM Leitor

 

Em seguida, adicione um filtro de conjuntos ao comando:

 

SELECT Codigo, Nome

FROM Leitor

WHERE Codigo NOT IN

(‘1’, ‘2’, ‘4’)

 

Neste caso os leitores de código diferente a 1, 2 ou 4 seriam exibidos.Só que em vez de termos valores estáticos como 1, 2 ou 4, podemos ter um outro comando SQL, retornando um conjunto.

Neste tipo de ‘’subseleção’’ você só poderá selecionar um campo na clausula SELECT.

 

SELECT *

FROM Leitor, Emp

WHERE Leitor.Codigo=Emp.CodLeitor

 

Acima, mas um caso interessante:aqui trabalhamos com duas tabelas,leitores e empréstimos (Emp) – repare que está explicito na clausula FROM. E na clausula WHERE, juntamos as duas tabelas pelo seu campo relacionado: Leitor. Código =empréstimo. Codleitor. O resultado será um View com todos os empréstimos realizados, e respectivamente, os campos relacionados com a tabela Leitor. Uma variação mais elegante dessa consulta seria:

 

SELECT Leitor.Nome, Emp.Data

FROM Leitor, Emp

WHERE Leitor.Codigo=Emp.CodLeitor

 

Repare que é exibido o capo Data da tabela Emp (Empréstimos), juntamente com o campo nome, da tabela de Leitor. Neste caso o nome dos campos procedido do nome tabela, separados por ‘’ .‘’.É possível também criar um ‘’aliás’’ para o nome da tabela como mostra o exemplo abaixo:

 

SELECT A.Codigo,A.Nome,B.Data

FROM “Leitor”A,‘Emprestimo”B

WHERE A.Codigo = B.CodLeitor

VALUES (1, “Teste”, “A”)

 

Veja outro caso:

 

 

 

Aqui temos duas novidades: A palavra BETEWEEN, que neste caso representa exatamente seu literal: serão filtrados os códigos entre 1 e 10. E a segunda novidade: a palavra ORDERBY, de significado da consulta será ordenado pelo nome. Ordenações compostas também valem:

 

SELECT Cod, Nome

FROM Leitor

WHERE Cod BETWEEN 1 AND 10

ORDER BY Nome

 

E para a ordenação decrescente usa-se a palavra DESC no final da linha:

 

SELECT * FROM Leitor

ORDER BY Nome DESC

 

Os comandos SQL podem ser mesclados em diversas formas, formando complexas instruções que otimizarão seu código na hora de desenvolver e farão com que você execute procedimentos mais rapidamente.

OSQL, diferente dos métodos de pesquisa como FindKey ou FinsNearEst, funciona mesmo que não haja índice para o campo que está sendo usado.Mas é claro que, se existirem índices  para o campo, a consulta será muito mais rápida.

OSQL também permite fazer alterações em tabelas, através dos comandos INSERT, DELETE e UPDATE.Quando for utilizar algumas destas operações em batch ( várias operações de uma única vez) faça pelo SQL, pois haverá maior performance.

Veja alguns exemplos:

 

INSERT INTO Leitor

(Codigo, Nome, Status)

VALUES (1, “Teste”, “A”)

 

Acima, a inserção de um registro em Leitor veja agora o comando UPDATE:

 

UPDATE Leitor

SET Nome=“Clube Delphi”

WHERE Codigo=1

 

UPDATE Leitor

SET Vencido=True

WHERE Venc <:Data_Venc 

 

No primeiro vemos apenas uma simples alteração no campo Nome. No segundo caso, uma atualização em batch, ou seja, todos os livros com vencimento menor que data_venc

(representado como uma variável) terão o campo vencido alterado para True .

O comando DELETE é parecido com os demais, abaixo segue uma deleção simples e em batch , como em Update:

 

DELETE FROM Leitor

WHERE Codigo=1

 

DELETE FROM Leitor

WHERE Vencido=True

 

Este tópico não se destina a ser uma referência da linguagem SQL, já que esta é muito vasta. O objetivo é apenas dar uma introdução e mostrar alguns exemplos, para que o estudo e entendimentos desta linguagem sejam adquiridos de forma mais clara e rápida. Comentários sobre esta matéria podem ser enviados para admi@ clubedelphi.com.br.