SQL Jacir de Oliveira , José Alencar Philereno Faculdade de Informática de Taquara Igrejinha - RS – Brazil [email protected] , [email protected] Resumo. Este artigo irá descrever a linguagem de programação SQL, dando-nos uma noção básica de seus comandos e suas utilidades que auxiliam na elaboração de tarefas, também demonstração de programas em algumas linhas de comando, na sua funcionalidade com comando de organização e busca em uma tabela de dados. Esta funcionalidade é fornecida por uma tabela que é executado em nossos programas. 1 Introdução Veremos um pouco sobre a linguagem SQL, ele foi desenvolvido para ser uma linguagem padrão para operações com Banco de Dados. A lingüagem SQL foi elaborada para ser independente de hardware ou do software. Ao usar o SQL, você não precisa saber a respeito do software de banco de dados ou do hardware envolvido em uma operação. Tudo o que você precisa conhecer são os comandos ou instruções SQL padrão para solicitar informações, que obrigatoriamente é o mesmo em todos os sistemas que utilizam o SQL. Tambem veremos aspectos atuais e apontar algumas tendências, estabelecer uma base para compreender detalhadamente como os comandos SQL são utilizados para definir e modificar os dados, pois existem várias regras e conceitos implementados pelos bancos de dados SQL de forma inconsistente. A linguagem está presente nos mais variados sistemas de informação, podendo ser encontrada, em aplicativo rodando sob um simples PDA ou em uma consulta complexa realizada sob um mainframe. Ou ainda, pode estar codificada em sistemas escritos com modernas linguagens de programação, como Java, ou mesmo em programas feitos em COBOL. Em se tratando de manipulação de dados, a SQL é quase onipresente hoje em todos os sistemas. 2 Conceitos básicos Uma entrada SQL é formada por uma seqüência de comandos. Um comando é composto por uma seqüência de termos (tokens) terminada por um ponto-e-vírgula (";"). O fim do fluxo de entrada também termina o comando.Os termos são válidos dependendo da sintaxe particular de cada comando. Um termo pode ser uma palavra chave, um identificador, um identificador entre aspas, um literal ou constante, ou um caractere especial. Geralmente os termos são separados por espaço em branco, tabulação ou nova-linha, mas não há necessidade se não houver ambigüidade, normalmente isto só acontece quando um caractere especial está adjacente a um termo de outro tipo. A SQL é uma linguagem padrão, padronizada pela ANSI (American National Standard Institute), para banco de dados . Conhecendo a Linguagem SQL é possível programar em qualquer SGBD (Sistema Gerenciador de Banco de Dados). 2.1.Paradigma da Linguagem SQL Ela possui uma Linguagem declarativa. 3 Funcionalidade Veja abaixo uma seqüência de três comandos, um por linha, embora isto não seja necessário, pode haver mais de um comando na mesma linha, assim como um único comando pode ocupar várias linhas. SELECT * FROM MINHA_TABELA; UPDATE MINHA_TABELA SET A = 5; INSERT INTO MINHA_TABELA VALUES (3, 'Ola pessoal'); A sintaxe do SQL não é muito consistente em relação a quais termos identificam comandos e quais são operandos ou parâmetros. Geralmente os primeiros termos são o nome do comando. Além disso, comentários podem estar presentes na entrada SQL os comentários, eles não são termos, pois são equivalentes a espaços em branco. 4 Identificação das palavras chave No exemplo acima o termo SELECT, e assim como outros termos, como UPDATE e VALUES são exemplos de palavras chave, são palavras que possuem um significado definido pela linguagem SQL. Os termos MINHA_TABELA e A são exemplos de identificadores, os quais identificam nomes de tabelas, colunas e outros objetos do banco de dados, Os identificadores e as palavras chave do SQL devem iniciar por uma letra (a-z e, também, letras com diacrítico - áéç... - e letras não latinas), ou o caractere sublinhado (_). Os demais caracteres de um identificador, ou da palavra chave, podem ser letras, sublinhados, dígitos (0-9) O padrão SQL não irá definir palavra chave contendo dígitos, começando ou terminando por sublinhado e, portanto, os identificadores com esta forma estão a salvo contra possíveis conflitos com extensões futuras do padrão. O sistema utiliza não mais que NAMEDATALEN-1 caracteres de um identificador; nomes maiores podem ser escritos nos comandos, mas são truncados. Por padrão NAMEDATALEN é 64 e, portanto, o comprimento máximo de um identificador é 63. Se este limite causar problema, pode ser aumentado modificando a constante NAMEDATALEN no arquivo. Os identificadores e as palavras chave não fazem distinção entre letras maiúsculas e minúsculas. Como exemplo. UPDATE MINHA_TABELA SET A = 5; pode ser escrito de forma equivalente como uPDaTE Minha_Tabela SeT a = 5; Normalmente utiliza-se a convenção de escrever as palavras chave em letras maiúsculas e os nomes em letras minúsculas. UPDATE minha_tabela SET a = 5; 5 Aplicabilidade da Linguagem SQL A linguagem SQL é uma linguagem de consulta a banco de dados. Ela é bem diferente das linguagens comuns de programação, a principal diferença é que a linguagem SQL não é uma linguagem procedural, na linguagem SQL não se especifica como, ou em que ordem, serão executados os processos que irão fornecer os resultados requeridos, informamos o que queremos e o sistema de banco de dados é o responsável por escolher adequadamente os procedimentos a serem executados, de forma que os resultados sejam obtidos com a maior eficiência possível. É Uma linguagem relacional, o ideal para o tratamento de dados relacionados, ou de manipulação de dados, isto é, com a SQL podemos tanto definir e construir relações (tabelas), como manipular diversas relações de forma a obter resultados desejados. A linguagem SQL está presente numa imensa quantidade de sistemas de banco de dados, ela pode estar visivel ou mascarada (embutida). Na forma visível o usuário digita os comandos na linguagem SQL diretamente em um prompt de comando, de onde também é possivel visualizar os resultados. Já na forma embutida a linguagem SQL não está visivel diretamente ao usuário, os programadores podem imbutir os comandos em SQL, dentro de um programa, e criar uma interface mais amigável com o usuário comum, este pode interagir mais facilmente com a interface do que com a própria linguagem SQL. Desta forma usuários comuns podem manipular um banco de dados sem mesmo ter um conhecimento de SQL. 6. Modelo básico SQL Nas tabelas abaixo alguns comandos da linguagem SQL, mostrando um pouco da sua sintaxe, uma pequena base de dados, as quais os comandos exemplificados abaixo farão referência. Contas numero_conta A-100 A-110 A-150 A-160 A-180 A-210 A-220 A-260 A-290 A-300 cidade_agencia Brasília São Paulo São Paulo Salvador Rio de Janeiro Brasília Salvador Salvador Rio de Janeiro São Paulo saldo_conta 200 540 1200 800 400 1700 1100 600 600 1560 Clientes cpf 748.894.548-28 684.521.141-95 784.222.536-47 547.246.899-65 447.548.623-65 244.652.334-95 845.214.345-84 641.324.485-64 nome_cliente Maurício Souza Sara Braga Arnaldo Silva Jaques Cruz Fernanda Mota Cláudia Melo Heirrique Soares Mônica Oliveira numero_conta A-100 A-110 A-150 A-160 A-180 A-210 A-220 A-160 214.257.300-07 451.670.014-34 João Matusalem Carlos Araujo A-260 A-290 Na sintaxe básica da linguagem SQL, no comando select, todas as operações são feitas sob tabelas ou relações e temos como resultado também uma tabela. select [coluna_1, ... , coluna_n] from [tabela_1, ... , tabela_m] where [condição_1 ...] order by [coluna_1, ... , coluna_t] [desc|asc]; Após o nome select deve ser informado uma lista com os nomes das colunas que deverão aparecer no resultado, caso seja desejado que todas as colunas da relação apareçam no resultado basta colocar um asterisco ( * ) no lugar da lista. Após o nome from deve ser fornecido uma lista com o nome das tabelas utilizadas na pesquisa. Caso haja mais de uma tabela nesta lista, e se houver um mesmo nome de uma coluna em duas ou mais tabelas devemos, em cada referência a esta coluna, informar de qual tabela esta coluna pertence, fazemos isto da seguinte forma: Nome_tabela.nome_coluna coloca-se o nome da tabela, seguido de( ; ). Após a palavra where segue uma condição, ou conjunto de condições que tem a funcionalidade de limitar as linhas a serem mostradas na tabela de saída. A utilização da cláusula where é optativa. Após a palavra order by segue uma lista de colunas (campos de dados) pelo qual se deseja ordenar as linhas da tabela de saída. Pode-se acrescentar ainda as palavras desc que indica ordem decrescente, ou a palavra asc que indica ordem crescente, caso seja omitida as duas opções, a ordem será por default crescente,e ao final do código da pesquisa, isto é, o conjunto de instruções discutido acima, deve-se acrescentar um sinal de ponto-e-virgula ( ; ), que indica o fim do comando. Exemplos de consultas. select * from contas where saldo_conta > 750; A consulta fica assim numero_conta A-150 A-160 A-210 A-220 A-300 cidade_agencia São Paulo Salvador Brasília Salvador São Paulo saldo_conta 1200 800 1700 1100 1560 Uma consuta por numero de conta Select *from contas, clientes where contas.numero_conta = 'A-180'; Os dados da coluna em comum as duas tabelas 'numero_conta' através da condição 'contas.numero_conta = clientes.numero_conta', concatenamos cada linha da tabela contas com apenas uma linha da tabela clientes , as que possuíam o mesmo número de conta. numero_conta cidade_agencia saldo_conta CPF nome_cliente numero_conta A-180 Rio de Janeiro 400 748.894.548-28 Maurício Souza A-100 A-180 Rio de Janeiro 400 684.521.141-95 Sara Braga A-110 A-180 Rio de Janeiro 400 784.222.536-47 Arnaldo Silva A-150 A-180 Rio de Janeiro 400 547.246.899-65 Jaques Cruz A-160 A-180 Rio de Janeiro 400 447.548.623-65 Fernanda Mota A-180 A-180 Rio de Janeiro 400 244.652.334-95 Cláudia Melo A-210 A-180 Rio de Janeiro 400 845.214.345-84 Heirrique Soares A-220 A-180 Rio de Janeiro 400 641.324.485-64 Mônica Oliveira A-160 A-180 Rio de Janeiro 400 214.257.300-07 João Matusalem A-260 A-180 Rio de Janeiro 400 451.670.014-34 Carlos Araujo A-290 Este trata duas tabelas. Quando isto acontesse, a pesquisa ocorrerá sob uma nova tabela, que é formada através do produto cartesiano das tabelas relacionadas, dito de outra forma, cada linha de uma tabela será concatenada (i.e. juntada, unida) com todas as linhas das outras tabelas que estiverem relacionadas. Portanto para uma relação de duas tabelas onde cada uma tem 10 linhas como no exemplo, a tabela resultante do produto cartesiano terá 10 x 10 = 100 linhas. Isto pode ser facilmente visto no nosso exemplo, já que apenas uma linha da tabela contas, se concatenou com as outras 10 linhas da tabela clientes, inclusive com a repetição da coluna 'numero_conta', que está presente nas duas tabelas originais. A nossa tabela de saída teve apenas 10 linhas devido ao fato de termos infromado uma cláusula where, do comando SQL, na qual a condição dizia que o campo 'numero_conta' da tabela contas deveria ser igual a 'A-180'. Quando fazemos a junção de duas tabelas podemos gerar linhas que não possuem um significado coerente como nesse exemplo acima. Para gerar uma relação entre tabelas de forma que não ocorra este problema, devemos unir as linhas pela igualdade dos dados das colunas que estão presentes nas tabelas relacionadas. Como o exemplo seguinte. select contas.numero_conta, nome_cliente, cidade_agencia, saldo_conta from contas, clientes where contas.numero_conta = clientes.numero_conta and saldo_conta > 1000 order by saldo_conta desc; Aqui igualamos os dados da coluna em comum as duas tabelas 'numero_conta' através da condição 'contas.numero_conta = clientes.numero_conta', concatenamos cada linha da tabela contas com apenas uma linha da tabela clientes , as que não possuíam o mesmo número de conta, mas com saldo maior que R$ 1000. dados mostrados numa única linha. numero_conta A-210 A-300 A-150 A-220 nome_cliente Cláudia Melo Carlos Araujo Arnaldo Silva Heirrique Soares cidade_agencia Brasília São Paulo São Paulo Salvador saldo_conta 1700 1560 1200 1100 6.1 Caracteres especiais Alguns caracteres não alfanuméricos possuem significado especial diferente de ser um operador. Os detalhes da utilização podem ser encontrados nos locais onde a sintaxe do respectivo elemento é descrita. Esta seção se destina apenas a informar a existência e fazer um resumo das finalidades destes caracteres. O caractere dólar ($) seguido por dígitos é utilizado para representar parâmetros posicionais no corpo da definição de uma função. Em outros contextos o caractere dólar pode ser parte de um identificador. Os parênteses (()) possuem seu significado usual de agrupar expressões e impor a precedência. Em alguns casos os parênteses são necessários como parte fixa da sintaxe de um determinado comando SQL. Os colchetes ([]) são utilizados para selecionar elementos da matriz. As vírgulas (,) são utilizadas em algumas construções sintáticas para separar elementos da lista. O ponto-e-vírgula (;) termina um comando SQL, não podendo estar em nenhum lugar dentro do comando, exceto dentro de constante do tipo cadeia de caracteres ou identificadores entre aspas. Os dois-pontos (:) são utilizados para selecionar "faixas" em matrizes. Em certos dialetos do SQL (como a linguagem SQL embutida), os dois-pontos são utilizados como prefixo dos nomes das variáveis. O asterisco (*) possui um significado especial quando utilizado no comando SELECT ou na função de agregação COUNT. O ponto (.) é utilizado nas constantes numéricas, e para separar os nomes de esquemas, tabelas e colunas. 7 Referencias www.microsoft.com/sql www.w3schools.com/sql/default.asp www.sqlmagazine.com.br www.devmedia.com.br/sqlmagazine