Saltar para o conteúdo

SQL: diferenças entre revisões

Origem: Wikipédia, a enciclopédia livre.
Conteúdo apagado Conteúdo adicionado
Linha 112: Linha 112:
===DDL - Linguagem de Definição de Dados===
===DDL - Linguagem de Definição de Dados===


O segundo grupo é a DDL (Data Definition Language - Linguagem de Definição de Dados). Uma DDL permite ao usuário definir tabelas novas e elementos associados. A maioria dos bancos de dados de SQL comerciais tem extensões proprietárias no DDL.
O segundo grupo é a Cheiras a Leitinho (Data Definition Language - Linguagem de Definição de Dados). Uma DDL permite ao usuário definir tabelas novas e elementos associados. A maioria dos bancos de dados de SQL comerciais tem extensões proprietárias no DDL.


Os comandos básicos da DDL são poucos
Os comandos básicos da DDL são poucos

Revisão das 11h05min de 11 de novembro de 2008

Structured Query Language, ou Linguagem de Consulta Estruturada ou SQL, é uma linguagem de pesquisa declarativa para banco de dados relacional (base de dados relacional). Muitas das características originais do SQL foram inspiradas na álgebra relacional.

O SQL foi desenvolvido originalmente no início dos anos 70 nos laboratórios da IBM em San Jose, dentro do projeto System R, que tinha por objetivo demonstrar a viabilidade da implementação do modelo relacional proposto por E. F. Codd. O nome original da linguagem era SEQUEL, acrônimo para "Structured English Query Language" (Linguagem de Consulta Estruturada em Inglês) [1], vindo daí o fato de, até hoje, a sigla, em inglês, ser comumente pronunciada "síquel" ao invés de "és-kiú-él", letra a letra. No entanto, em português, a pronúncia mais corrente é a letra a letra: "ése-quê-éle".

A linguagem SQL é um grande padrão de banco de dados. Isto decorre da sua simplicidade e facilidade de uso. Ela se diferencia de outras linguagens de consulta a banco de dados no sentido em que uma consulta SQL especifica a forma do resultado e não o caminho para chegar a ele. Ela é uma linguagem declarativa em oposição a outras linguagens procedurais. Isto reduz o ciclo de aprendizado daqueles que se iniciam na linguagem.

Embora o SQL tenha sido originalmente criado pela IBM, rapidamente surgiram vários "dialectos" desenvolvidos por outros produtores. Essa expansão levou à necessidade de ser criado e adaptado um padrão para a linguagem. Esta tarefa foi realizada pela American National Standards Institute (ANSI) em 1986 e ISO em 1987.

O SQL foi revisto em 1992 e a esta versão foi dado o nome de SQL-92. Foi revisto novamente em 1999 e 2003 para se tornar SQL:1999 (SQL3) e SQL:2003, respectivamente. O SQL:1999 usa expressões regulares de emparelhamento, queries recursivas e gatilhos (triggers). Também foi feita uma adição controversa de tipos não-escalados e algumas características de orientação a objeto. O SQL:2003 introduz características relacionadas ao XML, seqüências padronizadas e colunas com valores de auto-generalização (inclusive colunas-identidade).

Tal como dito anteriormente, o SQL, embora padronizado pela ANSI e ISO, possui muitas variações e extensões produzidos pelos diferentes fabricantes de sistemas gerenciadores de bases de dados. Tipicamente a linguagem pode ser migrada de plataforma para plataforma sem mudanças estruturais principais.

Outra aproximação é permitir para código de idioma procedural ser embutido e interagir com o banco de dados. Por exemplo, o Oracle e outros incluem Java na base de dados, enquanto o PostgreSQL permite que funções sejam escritas em Perl, Tcl, ou C, entre outras linguagens.

Exemplo

Table 'T' Query Result
C1 C2
1 a
2 b
Select * from T
C1 C2
1 a
2 b
C1 C2
1 a
2 b
Select C1 from T
C1
1
2
C1 C2
1 a
2 b
Select * from T where C1=1
C1 C2
1 a

Inserindo dados numa tabela T, a pesquisa Select * from T terá como resultado todos os elementos de todas as linhas da tabela.

Partindo da mesma tabela, a pesquisa Select C1 from T terá como resultado todos os elementos da coluna C1.

O resultado da pesquisa Select * from T where C1=1 será todos os elementos de todas as filas onde o valor de coluna C1 é '1'.

Palavras-chaves em SQL

DML - Linguagem de Manipulação de Dados

Primeiro há os elementos da DML (Data Manipulation Language - Linguagem de Manipulação de Dados). A DML é um subconjunto da linguagem usada para selecionar, inserir, atualizar e apagar dados.

  • SELECT é o mais usado do DML, comanda e permite ao usuário especificar uma query como uma descrição do resultado desejado. A questão não especifica como os resultados deveriam ser localizados.
  • INSERT é usada para somar uma fila (formalmente uma tupla) a uma tabela existente.
   INSERT INTO tabela 
   VALUES (Valores de cada campo, pré-definidos na criação);
  • UPDATE para mudar os valores de dados em uma fila de tabela existente.
   UPDATE tabela 
   SET (Campo=valor a ser ALTERADO) 
   WHERE (Campo=Valor existente);
  • DELETE permite remover filas existentes de uma tabela.
  DELETE FROM tabela 
  WHERE (Campo=(Valor a ser deletado));

DDL - Linguagem de Definição de Dados

O segundo grupo é a Cheiras a Leitinho (Data Definition Language - Linguagem de Definição de Dados). Uma DDL permite ao usuário definir tabelas novas e elementos associados. A maioria dos bancos de dados de SQL comerciais tem extensões proprietárias no DDL.

Os comandos básicos da DDL são poucos

  • CREATE cria um objeto (uma Tabela, por exemplo) dentro da base de dados.
 CREATE TABLE tabela (
 my_field1   INT,
 my_field2   VARCHAR (50),
 my_field3   DATE         NOT NULL,
 PRIMARY KEY (my_field1, my_field2) 
 );
  • DROP apaga um objeto do banco de dados.
 DROP TABLE tabela;

Alguns sistemas de banco de dados usam o comando ALTER, que permite ao usuário alterar um objeto, por exemplo, adicionando uma coluna a uma tabela existente.

outros comandos DDL:

  • ALTER TABLE
  • CREATE INDEX
  • ALTER INDEX
  • DROP INDEX
  • CREATE VIEW
  • DROP VIEW

DCL - Linguagem de Controle de Dados

O terceiro grupo é o DCL (Data Control Language - Linguagem de Controle de Dados). DCL controla os aspectos de autorização de dados e licenças de usuários para controlar quem tem acesso para ver ou manipular dados dentro do banco de dados.

Duas palavras-chaves da DCL:

  • GRANT - autoriza ao usuário executar ou setar operações.

Exemplo do comando GRANT:

 GRANT SELECT, UPDATE ON My_table TO some_user, another_user;
  • REVOKE - remove ou restringe a capacidade de um usuário de executar operações.

Exemplo do comando REVOKE:

 REVOKE SELECT, UPDATE ON My_table TO some_user, another_user;

outros comandos DCL:

  • ALTER PASSWORD
  • CREATE SYNONYM

DTL - Linguagem de Transação de Dados

  • BEGIN WORK (ou START TRANSACTION, dependendo do dialeto SQL) pode ser usado para marcar o começo de uma transação de banco de dados que pode ser completada ou não.
  • COMMIT envia todos os dados das mudanças permanentemente.
  • ROLLBACK faz com que as mudanças nos dados existentes desde que o último COMMIT ou ROLLBACK sejam descartadas.

COMMIT e ROLLBACK interagem com áreas de controle como transação e locação. Ambos terminam qualquer transação aberta e liberam qualquer cadeado ligado a dados. Na ausência de um BEGIN WORK ou uma declaração semelhante, a semântica de SQL é dependente da implementação.

Devemos observar algumas operações relacionadas, ao qual, se a declaração COMMIT for executada, não tem como desfazer as mudanças realizadas. Em outras palavras, o seu sentido de ter executado rollback após a declaração COMMIT e vice-versa.

Na ausência de um START TRANSACTION ou declaração semelhante, a semântica SQL é dependente da implementação utilizada. Esta podendo ser representada através do exemplo de uma clássica transferência bancária de fundos de transação, sendo demonstrada através dos comandos:

 START TRANSACTION;
 UPDATE Account SET amount=amount-200 WHERE account_number=1234;
 UPDATE Account SET amount=amount+200 WHERE account_number=2345;
 IF ERRORS=0 COMMIT;
 IF ERRORS<>0 ROLLBACK;

DQL - Linguagem de Consulta de Dados

Embora tenha apenas um comando, a DQL é a parte da SQL mais utilizada. O comando SELECT é composto de várias cláusulas e opções, possibilitando elaborar consultas das mais simples as mais elaboradas. Exemplos:

SELECT 
  nome
FROM
  pessoas;

SELECT 
  aP.
  aP.nome,
  aP.data_nascimento,
  aO.nome,
  aO.local
FROM
 pessoas aP,
 objetos aO,
WHERE
 aP.codigo = aO.codigo_pessoa and
 aP.codigo = (
   SELECT
     codigo_pessoa
   FROM
     catalogo
   WHERE
    cod_catalogo = 5
 ); 

Obs.: O SELECT também é considerado um comando DML.

Cláusulas

As cláusulas são condições de modificação utilizadas para definir os dados que deseja selecionar ou modificar em uma consulta.

FROM

Descrição – Utilizada para especificar a tabela que se vai selecionar os registros.

WHERE

Descrição – Utilizada para especificar as condições que devem reunir os registros que serão selecionados.

GROUP BY

Descrição – Utilizada para separar os registros selecionados em grupos específicos.

HAVING

Descrição – Utilizada para expressar a condição que deve satisfazer cada grupo.

ORDER BY

Descrição – Utilizada para ordenar os registros selecionados com uma ordem especifica.

DISTINCT

Descrição – Utilizada para selecionar dados sem repetição.

Operadores Lógicos

AND

Descrição – E lógico. Avalia as condições e devolve um valor verdadeiro caso ambos sejam corretos.

OR

Descrição – OU lógico. Avalia as condições e devolve um valor verdadeiro se algum for correto.

NOT

Descrição – Negação lógica. Devolve o valor contrário da expressão.

Operadores Relacionais

< Descrição – Menor que

> Descrição – Maior que

<> Descrição – Diferente de

<= Descrição – Menor ou Igual que

>= Descrição – Maior ou Igual que

= Descrição – Igual a

BETWEEN

Descrição – Utilizado para especificar um intervalo de valores.

LIKE

Descrição – Utilizado na comparação de um modelo e para especificar registros de um banco de dados."Like" + extensão % vai significar buscar todos resultados com o mesmo início da extensão.

Funções de Agregação

As funções de soma se usam dentro de uma cláusula SELECT em grupos de registros para devolver um único valor que se aplica a um grupo de registros.

AVG

Descrição – Utiliza para calcular a media dos valores de um campo determinado.

COUNT

Descrição – Utilizada para devolver o número de registros da seleção.

SUM

Descrição – Utilizada para devolver a soma de todos os valores de um campo determinado.

MAX

Descrição – Utilizada para devolver o valor mais alto de um campo especificado.

MIN

Descrição – Utilizada para devolver o valor mais baixo de um campo especificado.

Razões para a falta de portabilidade

Populares implementações do SQL comumente omitem características básicas de apoio para Standard SQL, tais como a data ou a hora do tipos de dados, preferindo variações do seu próprio. Como resultado, SQL raramente podem ser transferidos entre sistemas de banco de dados sem modificações.

Há várias razões para essa falta de portabilidade entre sistemas de banco de dados:

A complexidade e dimensão do padrão SQL significa que a maior parte das bases de dados não se aplicar a todo o tipo. Como normas não especificas, comportamento do banco de dados em diversos domínios importantes (por exemplo, índices, arquivos de armazenamento...), deixando aos que implementam o banco de dados para decidir o seu comportamento.

O padrão SQL especifica precisamente que a sintaxe conforme um sistema de base de dados deve executar. No entanto, o padrão da especificação da semântica da linguagem construída, é de menor definição, levando a áreas de ambigüidade.

Processamento e Optimização de Consultas SQL

Uma consulta expressa em uma linguagem de consulta de alto nível, como a SQL, deve primeiramente ser examinada (scanned), analisada e validada. O examinador (scanner) identifica os símbolos da linguagem – como por exemplo palavras chaves da SQL, nomes de atributos e nomes de relações – no texto de consulta, enquanto o analisador (parser) verifica a sintaxe de consulta para determinar se ela está formulada de acordo com as regras de sintaxe (regras de gramática) da linguagem de consulta. A consulta deve também ser validada, verificando se todos os nomes de atributos e relações são válidos e semanticamente significativos no esquema do banco de dados específico que está sendo consultado. Uma representação interna da consulta é então criada, geralmente em forma de uma estrutura de dados de árvore, denominada árvore de consulta. Também é possível representar a consulta utilizando-se de um a estrutura gráfica de dados denominada gráfico de consulta. O SGBD deve então planejar uma estratégia de execução para recuperar o resultado da consulta, a partir dos arquivos de banco de dados. Uma consulta geralmente tem muitas estratégias de execução e o processamento utilizado para escolher uma estratégia que seja adequada para processar uma consulta é conhecido como otimização de consulta.

Existem diferentes etapas de processamento de uma consulta de alto nível. Cabe ao módulo otimizador de consultas a tarefa de produzir um plano de execução e ao gerador de código gerar o código par executar esse plano. Ao processador runtime do banco de dados cabe a tarefa de executar o código da consulta, no modo compilado ou interpretado, para produzir o resultado da consulta. Se isso resultar em um erro de execução, uma mensagem de erro é gerada pelo processador runtime do banco de dados.

O termo otimização é na verdade um nome inapropriado porque, em alguns casos, o plano de execução escolhido não é a estratégia ótima (melhor) – é apenas uma estratégia razoavelmente eficiente para executar a consulta. Encontrar a estratégia ótima geralmente consume muito tempo, exceto para as consultas mais simples, e pode requerer informações sobre a maneira como os arquivos estão implementados e até mesmo sobre o conteúdo dos arquivos – informações que podem não estar plenamente disponíveis no catálogo do SGBD. Portanto, planejamento de uma estratégia de execução pode ser uma descrição mais precisa do que uma otimização de consulta.

Para linguagens de navegação de banco de dados de baixo nível em legacy systems (sistemas de legado) – como a DML de uma rede ou a HDML hierárquica – o programador deve escolher a estratégia de execução da consulta, enquanto escreve um programa para acesso ao banco de dados. Se um SGBD fornece somente uma linguagem de navegação, existe necessidade ou oportunidade limitada para a otimização extensiva de consulta por parte do SGBD; caso contrário, é dado ao programador a capacidade de escolher a estratégia “ótima” de execução. Por outro lado, uma linguagem de consulta de alto nível – como SQL para SGBDs relacionais (SGBDRs) ou a OQL para SGBDs de objetos (SGBDOs) – é uma declarativa em sua natureza porque especifica quais são os resultados pretendidos pela consulta, em vez de identificar os detalhes de como o resultado deve ser obtido. A otimização de consultas é, portanto, necessária para consultas que sejam especificadas em uma linguagem de consulta de alto nível.

Vamos nos concentrar em descrever a otimização de consultas no contexto de um SGBDR porque muitas das técnicas descritas foram adaptadas para SGBDOs. Um SGBD relacional deve sistematicamente avaliar estratégias alternativas de execução de consultas e escolher uma estratégia razoavelmente eficiente ou ótima. Cada SGBD em geral tem uma série de algoritmos gerais de acesso ao banco de dados que implementam operações relacionais como SELEÇÃO ou JUNÇÃO ou combinações dessas operações. Somente estratégias de execução que possam ser implementadas pelos algoritmos de acesso ao SGBD e que se apliquem à consulta específica e ao projeto físico específico de banco de dados podem ser consideradas pelo módulo de otimização de consultas.

Traduzindo consultas SQL para álgebra relacional

Na prática, a SQL é a linguagem de consulta que é utilizada na maioria dos SGBDRs comerciais. Uma consulta em SQL é primeiramente traduzida para uma expressão equivalente da álgebra relacional estendida – representada como uma estrutura de dados de árvore de consultas – que é então otimizada. Em geral consultas em SQL são decompostas em blocos de consultas, que formam as unidades básicas que podem ser traduzidas para os operadores algébricos e então otimizadas. Um bloco de consulta contém uma única expressão SELECT-FROM-WHERE, bem como cláusulas GROUP BY e HAVING, se essas forem parte do bloco. Portanto, subconsultas dentro de uma consulta são identificadas como blocos de consultas em separado. Uma vez que a SQL inclui operadores de agregação – como MAX, MIN, SUM, e CONT –, esses operadores devem também ser incluídos na álgebra estendida.

Considere a seguinte consulta SQL na relação EMPREGADO:

SELECT SOBRENOME, NOME

FROM EMPREGADO WHERE SALARIO > (SELECT MAX (SALARIO)

FROM EMPREGADO

WHERE NUD=5);


Essa consulta inclui uma subconsulta, e portanto, seria decomposta em dois blocos. O bloco interno é

(SELECT MAX (SALARIO)

FROM EMPREGADO

WHERE NUD=5);


e o bloco externo é


SELECT SOBRENOME, NOME

FROM EMPREGADO WHERE SALARIO > c


onde c representa o resultado retornado do bloco interno. O bloco interno poderia ser traduzido para a expressão da álgebra relacional estendida


ξ MAX SALÁRIO (σ NUD=5 (EMPREGADO))

π SOBRENOME, NOME (σ SALÁRIO>c (EMPREGADO))


e o bloco externo para a expressão


π SOBRENOME, NOME (σ SALÁRIO>c (EMPREGADO))


O otimizador de consulta escolheria então um plano de execução para cada bloco. Notamos que, no exemplo acima, o bloco interno precisa ser avaliado somente uma vez para produzir o salário máximo, que é então utilizado – como a constante c – pelo bloco externo. É muito mais difícil otimizar as consultas aninhadas correlacionadas mais complexas, nas quais uma variável de tupla do bloco externo aparece na cláusula WHERE do bloco interno.

Algoritmos básicos para a execução de operações de consulta

Um SGBDR deve conter algoritmos para implementar os diferentes tipos de operações relacionais (bem como outros tipos de operações), que podem aparecer em uma estratégia de execução de consulta. Essas operações incluem as operações básicas e estendidas da álgebra relacional e, em muitos casos, combinações dessas operações. Para cada uma dessas operações ou combinação de operações, um ou mais algoritmos estariam geralmente disponíveis para executar a(s) operação(ões). Um algoritmo pode ser aplicado somente a determinadas estruturas de armazenamento e caminhos de acesso; se esse for o caso, ele pode ser utilizado se os arquivos envolvidos na operação incluírem esses caminhos de acesso.

Sistemas de Banco de Dados que usam SQL

Ligações externas

Referências

  1. Chamberlin, D. D., Astrahan, M. M., Blasgen, M. W., Gray, J. N., King, W. F., Lindsay, B. G., Lorie, R., Mehl, J. W., Price, T. G., Putzolu, F., Selinger, P. G., Schkolnick, M., Slutz, D. R., Traiger, I. L., Wade, B. W., and Yost, R. A. 1981. A history and evaluation of System R. Commun. ACM 24, 10 (Oct. 1981), 632-646. http://doi.acm.org/10.1145/358769.358784
  • Navathe, S. B. and Elmasri, R.. Sistemas de banco de dados – Fundamentos e aplicações. LTC: 2002.
  • Celso Henrique Poderoso de Oliveira, SQL - Curso Prático. Novatec Editora. ISBN 8575220241.