Sie sind auf Seite 1von 28

Instituto de informtica Disciplina: Banco de Dados I

Linguagem SQL
Professor:
Gustavo Belgini Andretta

ndice
ndice..................................................................................................................................................................2 Linguagem SQL.................................................................................................................................................3
Notao para Sintaxes...........................................................................................................................................3

Tabelas, Colunas e Linhas...............................................................................................................................4 O Banco de Dados Exemplo.............................................................................................................................5 Linguagem de Manipulao de Dados Interativa (DML).............................................................................8
SELECT.................................................................................................................................................................8
Eliminao de linhas duplicadas..............................................................................................................................................8 Constantes e Expresses..........................................................................................................................................................9 Condies de Procura..............................................................................................................................................................9 Predicados Relacionais..........................................................................................................................................................10 Predicado Between.................................................................................................................................................................10 Predicado NULL....................................................................................................................................................................11 Predicado LIKE.....................................................................................................................................................................11 Predicado Exists.....................................................................................................................................................................12 Predicado IN..........................................................................................................................................................................12 Utilizando mais de uma tabela na clusula from...................................................................................................................13 Chaves....................................................................................................................................................................................14 Variveis Tuplas....................................................................................................................................................................15 Operaes de Conjuntos........................................................................................................................................................15 Exibindo Resultados Ordenados............................................................................................................................................17 Funes de agregao............................................................................................................................................................17 A Clusula HAVING.............................................................................................................................................................18 Consultas Complexas.............................................................................................................................................................19

Funes Built-in.............................................................................................................................................20
Funes para manipulao de strings................................................................................................................20 Funes para manipulao de nmeros.............................................................................................................21 Funes para manipulao de datas..................................................................................................................21 Funes de converso..........................................................................................................................................22

Modificando o Banco de Dados.....................................................................................................................23


Inserindo Linhas: INSERT.................................................................................................................................23 Removendo Linhas: DELETE............................................................................................................................24 Modificando Linhas: UPDATE..........................................................................................................................24

Introduo a DDL - Linguagem de Definio de Dados.............................................................................26


Tabelas (Tables) - Criando, Alterando e Excluindo.........................................................................................26 Vises (Views)......................................................................................................................................................27 ndices (Indexes)..................................................................................................................................................27

Linguagem SQL
SQL (Structured Query Language) trata-se de um conjunto completo de comandos que permite ao usurio acessar um banco de dados relacional. uma linguagem no procedural que permite dizer apenas o que voc quer e no como fazer isto. A linguagem SQL surgiu no incio do anos 70 como parte do projeto System R, no laboratrio de pesquisa da IBM em San Jose. Inicialmente foi chamada de Sequel. Ela surgiu com o intuito de fornecer ao usurio (ou desenvolvedor) uma interface mais amigvel com os bancos de dados. Obteve grande sucesso, sendo que a maioria dos gerenciadores de bancos de dados atuais a utilizam. Embora existam inmeras verses do SQL, e cada produto utiliza uma, pode-se dizer que as diferenas chegam a ser secundrias, pois o ncleo, ou seja, os principais comandos mantm o mesmo padro. Em 1986, o American National Standart Intitute (ANSI) publicou um primeiro padro SQL, e grandes esforos vem sendo tomados para que o padro ANSI seja cada vez mais obedecido. A primeira grande reviso do padro SQL foi completa em 1992, recebendo a denominao de SQL2.Contudo, uma nova reformulao, j chamada de SQL3, que incluir tambm o suporte a objetos, est em vias de ser completada. A SQL estabeleceu-se claramente como a linguagem padro de bancos de dados. Alguns dizem que SQL uma linguagem de consulta, entretanto, o seu propsito inicial foi ampliado e ela permite uma interao completa com o banco, desde a atualizao de dados, criao de tabelas at a administrao da base de dados. Podemos dividir a linguagem em alguns mdulos. So eles: Data definition language (DDL) (Linguagem de definio de dados): A SQL fornece comandos para definio, modificao e remoo de tabelas, criao de ndices, definio de vises. Inclui tambm comandos para especificao de direitos de acessos a tabelas e vises. Interactive data manipulation language (DML) (Linguagem de manipulao de dados interativa): A SQL DML inclui uma linguagem de consulta baseada na lgebra relacional e no clculo relacional de tuplas (linhas). Possui tambm comandos para inserir, remover e modificar linhas num banco de dados. Integrity (Integridade): A SQL possui comandos para se especificar restries de integridade, como chaves primrias e chaves estrangeiras. Transaction control (Controle de Transaes): A SQL inclui comandos para especificao de incio e fim de transaes, visando a integridade dos dados no momento em que ocorrem atualizaes. A linguagem SQL pode ser utilizada de duas maneiras diferentes: Interativamente atravs de um programa que faz a interface com o banco de dados. Por exemplo, utilizando o SQLPlus do Oracle. Ele se encarrega de manter a conexo com o banco e o usurio entra com as instrues SQL, recebendo as respostas imediatamente; ou Embutida numa aplicao utilizando uma linguagem de programao comum, como Pascal, C, Centura Builder, Delphi ou Visual Basic, etc. Nesta apostila, particularmente, daremos nfase DML.

Notao para Sintaxes


Nesta apostila utilizamos uma conveno para descrever as sintaxes de alguns comandos e clusulas. Utilizaremos o comando insert para explicar a notao:
insert into <nome da tabela> | (<C1, C2 ... Cn>) | values (< V1, V2 ... Vn >)

Os smbolos < (menor) e > (maior) indicam que devemos substituir a frase de indicao por uma string vlida para o comando SQL. Utilizando o exemplo, poderamos substituir <nome da tabela> por FUNCIONARIO. Quando encontrarmos uma lista do tipo: C1,C2 ... Cn, isto indica que deve-se trocar esta seqncia simblica por uma seqncia de colunas ou valores, dependendo do caso. C1, C2 ... Cn, seguindo o exemplo, poderia ser trocada pelas colunas da tabela FUNCIONARIO, ou seja, COD_FUNCIONARIO, NOME, RG, etc. Blocos de comandos limitados pelo smbolo | (pipe) so opcionais, ou seja, podem ser omitidos sem invalidar a expresso. Neste caso, a seqncia C1, C2 ... Cn pode ser omitida por estar entre pipes: | (<C1, C2 ... Cn>) | . As outras palavras que no se encontram entre < > ou entre | | so obrigatrias (palavras chaves ). As palavras insert, into e values, neste caso, so palavras-chaves.

Tabelas, Colunas e Linhas


Nos bancos de dados relacionais, os dados so armazenados em relaes ou tabelas. Um exemplo de tabela poderia conter os dados bsicos dos setores de uma empresa, como seu Cdigo e seu Nome.

Tabela de Setores Cdigo e Nome, que no Modelo Entidade-Relacionamento (MER) ns chamamos de atributos, aqui so denominados colunas. Uma linha a denominao dada a cada instncia armazenada na tabela de Setores, ou seja, (100, Vendas) constitui uma linha ou registro. Da mesma forma que os dados so armazenados, o resultado de um comando de consulta SQL, tambm obtido sob a forma de tabelas, ou seja, um conjunto de linhas e colunas. O banco de dados utilizado para a construo dos exemplos citados nesta apostila foi desenvolvido a partir do exemplo Controle de Estoque mostrado a seguir atravs do seu Projeto Conceitual (Diagrama de Entidades e Relacionamentos) e correspondente diagrama de tabelas.

O Banco de Dados Exemplo


Todos os exemplos desta apostila esto baseados num bancos de dados exemplo, que se prope a armazenar, simplificadamente, os dados de um controle de estoque. A seguir, temos o seu Modelo de Entidade-Relacionamento (MER), seguido pelo seu Diagrama de Tabelas (ou Diagrama Relacional).

Linguagem de Manipulao de Dados Interativa (DML)


Como citado anteriormente, esta poro da linguagem SQL cuida de fornecer aos usurios comandos e funes para a recuperao de informaes, bem como a atualizao destas no banco de dados. A instruo utilizada para consultas na base de dados a select, enquanto para atualizaes so utilizadas as instrues insert, para insero de linhas, delete, para remoo de linhas, e update, para alteraes nas linhas.

SELECT
A estrutura bsica da instruo de consulta select consiste em trs clusulas: select: usada para listar os atributos desejados no resultado da consulta, ou seja, as colunas requisitadas como respostas.Esta lista, alm de nomes de colunas, pode conter: um asterisco (*), indicando que todas as colunas devem ser retornadas; expresses; constantes; funes; qualquer combinao destes, conectadas por operadores aritmticos e parnteses. from: Lista as tabelas a serem examinadas na avaliao da expresso.As colunas indicadas na clusula select devem constar nas tabelas listadas nesta clusula. where: Consiste de uma condio de procura envolvendo atributos das tabelas que aparecem na clusula from. o lugar onde se restringe ou seleciona quais linhas devero ser retornadas. Uma consulta tpica SQL tem a forma: select from | where onde: Ai : representa uma coluna (atributo) de uma tabela Ri, uma expresso, constante ou funo; Ri : representa uma tabela; P : uma condio de procura que utiliza os atributos de R1, ..., Rn. A clusula where pode ser omitida; neste caso, o predicado tido como sempre verdadeiro e todas as linhas sero retornadas. A lista de colunas na clusula select (A1, .., An) pode ser substituda por um asterisco (*) para selecionar todos os atributos de todas as tabelas presentes na clusula from. Considerando uma simples consulta ao banco de dados exemplo: Quais os cdigos de todos os funcionrios que fizeram alguma requisio ao estoque ?; a instruo correspondente ser: select from COD_FUNCIONARIO REQUISICAO < A1, A2, ..., An > < R1, R2, ..., Rn > P|

Eliminao de linhas duplicadas


No exemplo anterior, caso um funcionrio tivesse feito mais de uma requisio, o cdigo dele teria aparecido mais de uma vez na resposta dada pelo gerenciador de banco de dados. Entretanto, a eliminao de linhas repetidas ou duplicadas possvel utilizando a palavra-chave distinct depois de select. Ento podemos reescrever a consulta anterior da seguinte maneira:

select distinct from

COD_FUNCIONARIO REQUISICAO

Nota-se que permitido o uso da palavra-chave all para especificar explicitamente que as duplicaes no sero removidas. Uma vez que a deteno das duplicaes o padro, o uso palavra-chave all pode ser omitido. Abaixo segue um exemplo utilizando all: select all COD_FUNCIONARIO from REQUISICAO

Constantes e Expresses
Como citado anteriormente, a lista da clusula select tambm pode conter constantes e expresses. Exemplo utilizando constante: select from COD_REQUISICAO, datada de, DATA REQUISICAO

As constantes utilizadas na clusula select, alm de strings, podem ser de quaisquer outros tipos, tais como nmeros, datas, etc. Exemplo utilizando expresso: select from COD_REQUISICAO, ( QTDE / QTDE_MINIMA ) / 100 PRODUTO

Uma expresso pode conter uma combinao de parnteses e das quatro operaes aritmticas bsicas: adio (+) subtrao (-) multiplicao (*) diviso (/)

Condies de Procura
Uma condio de procura na clusula where qualifica o escopo de um consulta, pois especifica as condies particulares que devem ser encontradas. A clusula where pode ser usada nas instrues select, delete, update. Cada condio de procura contm um ou mais predicados conectados por operadores lgicos or, and, e not, conforme o exemplo:
where (not P1 and P2) and P3 or P4

onde: Pi so predicados da clusula where. A seguinte ordem de precedncia utilizada ao avaliar uma expresso numa condio: 1. Primeiro so analisados as expresses dentro de parnteses; 2. O operador not analisado antes do and; 3. And antes do or; 4. Operadores do mesmo nvel de precedncia so analisados da esquerda para a direita. Utilizando a regra de precedncia, a ordem de avaliao dos predicados, do exemplo anterior, ser:

1. R1 = not P1 2. R2 = R1 and P2 3. R3 = R2 and P3 4. R4 = R3 or P4 Onde: Ri trata-se um resultado booleano intermedirio. Predicados usam operadores, expresses, e constantes para especificar a condio a ser avaliada. Os seguintes tipos de predicados sero discutidos: Relacionais BETWEEN NULL LIKE EXISTS IN

Predicados Relacionais
Os predicados relacionais so aqueles que relacionam duas expresses segundo um operador. Os seguintes operadores so suportados:
Operador = != <> > !> < !< >= <= Significado Igual Diferente Diferente Maior No maior (menor ou igual ) Menor No menor (maior ou igual ) Maior ou igual Menor ou igual

Um predicado relacional segue a seguinte sintaxe: <expresso> <operador> <expresso>. Logo abaixo encontra-se um exemplo utilizando operadores relacionais. Neste exemplo, queremos obter todos os dados dos funcionrios cujos salrios so maiores ou iguais a R$ 1.000,000. select * from FUNCIONARIO where SALARIO >= 1000 Lembre que o uso do asterisco (*) na clusula select indica o desejo de que todas as colunas sejam retornadas.

Predicado Between
O predicado between compara um valor com uma faixa de valores. Os limites da faixa esto inclusos. Ele possui a seguinte sintaxe:

<expresso> | not | between <expresso> and <expresso>

O exemplo seguinte mostra uma instruo usando between: select DESCRICAO from PRODUTO where PRECO between 50 and 100 Neste exemplo, recuperamos todas as descries de produtos, cujos seus preos esto entre R$ 50,00 e R$ 100,00.

Predicado NULL
O predicado NULL testa valores nulos. Verifica, por exemplo, se colunas no contm nenhum valor armazenado. Ele possui a seguinte sintaxe:
<nome da coluna> is | not | NULL

Caso seja necessrio conhecer os funcionrios cujo cadastro do endereo esteja faltando, utilizaramos a seguinte instruo: select COD_FUNCIONARIO, NOME from FUNCIONARIO where ENDERECO is NULL possvel utilizar o operador not juntamente com a palavra-chave is (is not NULL) para, por exemplo, montar condies de colunas que no possuem valores nulos.

Predicado LIKE
O predicado LIKE procura por strings que se encontram dentro de um determinado padro. O predicado LIKE s pode ser usado com tipos de dados CHAR e VARCHAR. A sintaxe para o predicado seguinte:
<nome da coluna> | not | like < padro de pesquisa >

O padro de pesquisa trata-se de uma string a ser comparada com a coluna especificada. Este padro pode ser formatado com a utilizao de coringas, permitindo a procura de substrings. Os dois caracteres coringas existentes so o smbolo porcentagem % e o undescore _.
% _ Equivale a zero ou mais caracteres Equivale a um caracter qualquer

Os exemplos abaixos mostram a utilizao do predicado LIKE: Verificar todos os funcionrios que possuem Silva como ltimo sobrenome. select * from FUNCIONARIO where NOME like %Silva Retornar todos os cdigos das requisies dos produtos que os cdigos comecem com 01.

select COD_REQUISICAO from ITENS_REQUISICAO where COD_PRODUTO like 01% Verificar todos os produtos onde na descrio aparece a palavra couro. select * from PRODUTO where DESCRICAO like %couro% Retornar todos os funcionrios cujo o nome possui uma das preposies: de, do ou da. select * from FUNCIONARIO where NOME like % d_ %

Predicado Exists
utilizado para testar se o conjunto de linhas resultantes de uma consulta vazio. Sintaxe:
| not | exists < subselect >

O exemplo seguinte mostra a utilizao do predicado exists. Neste caso desejamos todos os nomes de funcionrios que tenham feito pelo menos uma requisio. Para fazermos isto, utilizamos a seguinte lgica: para cada funcionrio em FUNCIONARIO, pesquisamos em REQUISICAO se ele requisitou algo. select NOME from FUNCIONARIO where exists ( select * from REQUISICAO where FUNCIONARIO.COD_FUNCIONARIO = REQUISICAO.COD_FUNCIONARIO )

Predicado IN
O predicado in compara um valor com um conjunto de valores. Este conjunto de valores pode ser uma lista ou o resultado de um subselect. Sintaxe:
<expresso> | not | in < subselect >

ou
<expresso> | not | in < lista de valores >

Os seguintes exemplos demonstram o uso do predicado in: Selecionar todos os dados dos funcionrios que no possuem os cdigos: 11, 20 e 21. select * from FUNCIONARIO where COD_FUNCIONARIO not in (11,20,21) Selecionar todas as requisies realizadas por funcionrios que recebem salrios superiores a R$ 1000,00.

select * from REQUISICAO where COD_FUNCIONARIO in ( select COD_FUNCIONARIO from FUNCIONARIO where SALARIO > 1000)

Utilizando mais de uma tabela na clusula from


Nos exemplos que discutimos at o presente momento, s utilizamos uma tabela na clusula from, ou seja, pesquisamos apenas em uma tabela individualmente. Entretanto, na maioria dos casos, precisaremos combinar e recuperar dados de diversas tabelas simultaneamente. Para conseguirmos isto, devemos relacionar na clusula from todas as tabelas necessrias. Caso fosse necessrio selecionar, por exemplo, todos os funcionrios (cdigo e nome) e seus respectivos setores (cdigo e nome) seria preciso extrair dados de duas tabelas: FUNCIONARIOS e SETORES, pois o cdigo, nome e cdigo do setor do funcionrio poderia ser extrado da tabela FUNCIONRIOS, mas o nome do setor apenas da tabela setor. Desta maneira a instruo seria a seguinte: select COD_FUNCIONARIO, FUNCIONARIO.NOME, FUNCIONARIO.COD_SETOR, SETOR.NOME from FUNCIONARIO, SETOR where FUNCIONARIO.COD_SETOR = SETOR.COD_SETOR A linguagem utiliza-se de um mtodo chamado produto cartesiano para resolver esta questo. O produto cartesiano de tabelas, gera uma nova tabela auxiliar contendo todas as colunas de todas as tabelas listadas na clusula from, relacionando cada linha de uma tabela com todas as outras da segunda tabela, e assim por diante, gerando uma grande tabela que possui todas as combinaes de linhas posssveis. Para discutirmos melhor este mtodo imaginemos que as nossas tabelas FUNCIONARIO e SETOR tivessem os seguintes dados: FUNCIONARIO:
COD_FUNCIONARIO

10 11 20 30

NOME Andr Pires Roberto Azevedo Carla Campos Cleber Barros

COD_SETOR 100 100 200 300

Outras Colunas nononononononononon nononononononononon nononononononononon nononononononononon

A coluna Outras Colunas est representando todas as demais colunas (RG, CPF, ENDERECO, CIDADE, ESTADO, SALARIO) da tabela, apenas para simplificar a demonstrao. SETOR:
COD_SETOR

100 200 300

NOME Vendas PCP Produo

Aplicando o produto cartesiano entre FUNCIONARIO e SETOR a tabela auxiliar resultante FUNCIONARIO-SETOR seria a seguinte:

FUNCIONARIO-SETOR:
COD_FUNCIONARIO FUNCIONARIO.NOME SETOR.COD_SETORSETOR. NOME FUNCIONARIO.COD_SETOR Outras Colunas

10 10 10 11 11 11 20 20 20 30 30 30

Andr Pires 100 Andr Pires 100 Andr Pires 100 Roberto Azevedo Roberto Azevedo Roberto Azevedo Carla Campos Carla Campos Carla Campos Cleber Barros Cleber Barros Cleber Barros 200 200 200 300 300 300

nononon nononon nononon 100 100 100 nononon nononon nononon nononon nononon nononon

100 200 300 nononon nononon nononon 100 200 300 100 200 300

Vendas PCP Produo 100 Vendas 200 PCP 300 Produo Vendas PCP Produo Vendas PCP Produo

Verificamos, ento, que a tabela gerada possui todas as colunas de FUNCIONARIO adicionadas s colunas de SETOR. Note que para o atributos COD_SETOR e NOME foram necessrios qualificadores, representados pelo nome da tabela, para no causar ambigidades. Sempre que colunas com nomes idnticos existirem ser necessrio inserir os nomes das tabelas frente dos nomes das colunas, para fazer a distino. A tabela resultante ficou com 12 linhas, resultado do produto entre o nmero de linhas da tabela FUNCIONARIO (4 linhas) e a tabela SETOR (3 linhas ). No entanto, dentre estas linhas, vrias no tm sentido prtico, pois FUNCIONARIO.COD_SETOR diferente de SETOR.COD_SETOR. Deste modo, sempre que utilizarmos vrias tabelas numa clusula from, ou seja, utilizarmos produto cartesiano, devemos fazer o que a lgebra relacional chama de ligao natural, eliminando essas linhas. No caso a restrio foi feita atravs do predicado where FUNCIONARIO.COD_SETOR = SETOR.COD_SETOR.

Chaves
Antes de discutirmos o que vem a ser a ligao natural, devemos discutir o conceito de chaves (keys). Num banco de dados relacional, existem dois tipos de chaves: Chave Primria (primary key) Uma chave primria uma coluna ou um conjunto de colunas que identificam unicamente uma linha numa tabela. As colunas que fazem parte da chave primria so os atributos determinantes do MER.Por exemplo, na tabela SETOR, o cdigo (COD_SETOR) identifica unicamente cada linha. Deste modo, uma chave primria um valor que no pode se repetir dentro de uma mesma tabela. Chave Estrangeira (foreign key) Uma chave estrangeira uma ou mais colunas numa tabela que so chaves primrias em outra tabela, o que significa que qualquer valor para uma coluna que chave estrangeira deve corresponder a um valor existente na outra tabela onde a coluna chave primria.Na linguagem dos sistemas gerenciadores de banco de dados, isto conhecido como integridade referencial. Por exemplo, temos o cdigo do setor (COD_SETOR) na tabela FUNCIONARIO que uma chave estrangeira para o campo de mesmo nome na tabela SETOR onde este chave primria. Decorrente do conceito de chave estrangeira, tambm surge a definio de regras de deleo. Esta regra determina qual processamento deve ser praticado quando da remoo de linhas de uma tabela e que so referenciadas como chaves estrangeiras em outras tabelas. Os dois tipos de regra de deleo mais comuns so: Restrita (restrict): este regra determina que uma linha somente pode ser excluda de uma tabela se os seus valores de chave primria no forem referenciados por nenhuma linha na

tabela onde ele pode aparecer como chave estrangeira. No nosso exemplo, o que acontece nas tabelas SETOR e FUNCIONARIO, onde um setor somente pode ser removido caso no exista nenhum funcionrio pertencente quele setor; Em Cascata (cascade): este regra determina que a excluso de uma linha numa tabela dispara, automaticamente (em cascata), a remoo de todas as linhas que referenciavam o seu valor como chave estrangeira na outra tabela. No exemplo, o que ocorre entre as tabelas REQUISIO e ITENS_REQUISIO, onde a remoo de uma requisio ocasiona a remoo automtica de todos os seus itens, ou seja, a remoo de todas as linhas da tabela ITENS_REQUISIO que referenciavam a requisio excluda. Contudo, deve-se ressaltar que a regra de deleo definida para cada relao entre duas tabelas separadamente. Deste modo, possvel a ocorrncia de casos onde uma chave primria referenciada como chave estrangeira de regra restrict por uma tabela, e como regra cascade por outra. o que ocorre com a tabela PRODUTO do nosso exemplo. Um produto somente poder ser removido se no existirem nenhuma linhas nas tabelas ITENS_DEVOLUO e ITENS_REQUISIO que o referenciem e tambm na tabela COMPOSIO caso ele aparece como componente de outro produto. Entretanto, caso o produto aparea somente como composto, ele poder ser normalmente excludo e todas as suas composies (linhas que o referenciam como composto na tabela COMPOSIO) tambm sero removidas automaticamente.

Variveis Tuplas
SQL empresta a noo de varveis tuplas do Clculo Relacional de tuplas. Uma varivel Tupla em SQL deve ser associada a uma relao particular, definida na clusula from. Para ilustrar, vamos reescrever uma das consultas anteriores utilizando esse novo conceito. A consulta selecionar todos os funcionrios (cdigo e nome) e seus respectivos setores (cdigo e nome), utilizando variveis tuplas ficaria assim: select from where T.COD_FUNCIONARIO, T.FUNCIONARIO_NOME, S.COD_SETOR, S.NOME FUNCIONARIO T, SETOR S T.COD_SETOR = S.COD_SETOR

Varveis Tuplas so particularmente importantes quando queremos comparar duas tuplas numa mesma relao, o que no seria possvel simplesmente com a aplicao do produto cartesiano. Por exemplo, a consulta selecionar todos os funcionrios que trabalham no mesmo setor que o funcionrio de cdigo 20, resultaria na seguinte sentena SQL: select from where S.COD_FUNCIONARIO FUNCIONARIO T,S T.COD_FUNCIONARIO = 20 and T.COD_SETOR = S.COD_SETOR

Note que a varivel T foi utilizada para localizar a tupla relativa ao funcionrio de cdigo 20 e seu respectivo setor, ao passo que a varivel S foi utilizada para localizar todos os funcionrios que trabalham neste setor. A varivel S selecionar inclusive o prprio funcionrio de cdigo 20.

Operaes de Conjuntos
A lgebra relacional, na qual a SQL se baseia, inclui as operaes union, intersect e minus, para junes de conjuntos. Entretanto, apenas a instruo union foi includa no padro ANSI da linguagem SQL. Isto no chega a ser um problema, pois a instruo intersect pode ser realizada com a construo in, e a minus com a not in. Para demonstrarmos a utilidade da instruo union, vamos considerar que a seguinte consulta seja requisitada: fornea todos os cdigos dos funcionrios que provocaram qualquer movimentao no estoque, ou seja, uma requisio ou uma devoluo.

Para recuperarmos os funcionrios que requisitaram produtos, utilizaramos a seguinte instruo: select from COD_FUNCIONARIO REQUISICAO

Para aqueles que devolveram algum produto: select from COD_FUNCIONARIO DEVOLUCAO

Agora para fazermos a unio destes dois conjuntos de valores, utilizamos o operador union. Assim a instruo resultante : select from union select from COD_FUNCIONARIO DEVOLUCAO COD_FUNCIONARIO REQUISICAO

Se a consulta fosse os cdigos dos funcionrios que participaram de uma requisio e de uma devoluo, teramos: select from COD_FUNCIONARIO REQUISICAO

intersect select from COD_FUNCIONARIO DEVOLUCAO

O mesmo resultado obteramos com a seguinte sentena: select COD_FUNCIONARIO from REQUISICAO where COD_FUNCIONARIO in (select COD_FUNCIONARIO from DEVOLUCAO) Se a consulta fosse para obter os cdigos dos funcionrios que participaram de alguma requisio, mas no participaram de nenhuma devoluo, teramos: select from minus select from COD_FUNCIONARIO DEVOLUCAO COD_FUNCIONARIO REQUISICAO

O mesmo resultado obteramos com a seguinte sentena:

select COD_FUNCIONARIO from REQUISICAO where COD_FUNCIONARIO not in (select COD_FUNCIONARIO from DEVOLUCAO) Portanto pudemos comprovar que tanto a operao intersect como a operao minus podem ser realizadas em construes anlogas utilizando in e not in, respectivamente. importante ressaltar que o operador union trata as tabelas como conjuntos, e pela regra de unio de conjuntos, valores duplicados so descartados. Assim, se um funcionrio requisitou e devolveu algum produto, ele aparecer apenas uma vez na lista resultante. Caso seja necessrio manter as duplicaes, deve-se utilizar o operador union all ao invs de union.

Exibindo Resultados Ordenados


SQL oferece controle sobre a ordem na qual as linhas do resultado de uma consulta esto dispostas. A clusula order by ocasiona o aparecimento das linhas de resultado de uma consulta em uma ordem determinada. Por exemplo para listar em ordem alfabtica todos os funcionrios do setor 100, escrevemos: select from where order by F.NOME, COD_FUNCIONARIO FUNCIONARIO F, SETOR S F.COD_SETOR = S.COD_SETOR and S.COD_SETOR = 100 F.NOME

Como padro, SQL lista itens na ordem ascendente. Para especificar a ordem de classificao, podemos especificar desc para descendente ou asc para ascendente. Alm do mais, a ordenao pode ser feita por mltiplos atributos, bastando, para isto list-los na clusula order by. Suponha que fosse necessrio gerar uma lista contendo as requisies realizadas em ordem descendente, ou seja, primeiro pelos mais recentes. Para as requisies realizadas no mesmo momento, ordenamos em ordem ascendente pelo nmero da requisio. Neste caso o comando SQL seria: select from order by * REQUISICAO data desc, COD_REQUISICAO asc

Para atender a clusula order by, SQL precisa executar uma classificao. Uma vez que uma classificao de um grande nmero de linhas pode ser custoso, deve-se utiliz-la apenas quando necessrio.

Funes de agregao
SQL oferece a possibilidade de computar funes em grupos de linhas usando a clusula group by. Os atributos, dados na clusula group by, so usados para formar grupos. Linhas com o mesmo valor em todos os atributos na clusula group by so colocados em um grupo. SQL inclui funes de agregao para computar: mdia: avg mnimo: min mximo: max total: sum

contar: count As operaes, como a avg, so chamadas funes de agregao, porque operam em agregaes de linhas. O resultado de uma funo de agregao um valor nico. Para ilustrar, considere a consulta Selecione o salrio mdio em cada setor da empresa. A instruo ficaria assim: select COD_SETOR, avg (SALARIO) from FUNCIONARIO group by COD_SETOR

Funes de Agregao e seus resultados Deve-se notar que as funes SUM e AVG somente aceitam expresses numricas como argumentos, uma vez que elas calculam a soma e a mdia de valores, respectivamente. As demais (COUNT, MAX e MIN) aceitam qualquer tipo de dado na expresso como parmetro. A principal particularidade a ser ressaltada com relao funo COUNT. COUNT(expresso) e COUNT(*) so sutilmente diferentes, uma vez que COUNT(expresso) no conta as linhas nulas e COUNT(*) realiza a contagem de todas as linhas, sejam elas nulas ou no. Outra questo a ser ressaltada com relao utilizao da clusula group by que a lista de valores da clusula select somente aceita funes de agregao, constantes e expresses combinando-as, alm dos campos listados na clusula group by. Tal restrio evidente, uma vez que a incluso de outros campos na lista do select seria totalmente sem sentido e impossvel de ser retornada. Porm, podemos tambm usar as funes de agregao sem a clusula group by. Neste caso a tabela inteira tratada como um nico grupo. Uma consulta, para contar o nmero de funcionrios da sua empresa, pode ser expressa da seguinte maneira: select count (* ) from FUNCIONARIO

A Clusula HAVING
Em certas situaes, necessrio definir uma condio que se aplique a grupos, ao invs de linhas. Imagine se estivssemos interessados em saber o salrio mdio apenas daqueles setores, cujo salrio mdio seja maior que R$ 1100,00. Esta condio no se aplica a linhas simples, mas sim a cada grupo construdo com a clusula group by. Deste modo, no podemos utilizar funes de agregao na clusula where e para expressar tal condio utilizamos a clusula having. Os predicados na clusula having so aplicados depois da formao dos grupos, para que funes de agregao possam ser usadas. Expressamos esta consulta SQL assim: select from COD_SETOR, avg (SALARIO) FUNCIONARIO

group by COD_SETOR having avg (SALARIO) > 1100 Se uma clusula where e uma clusula having aparecerem numa mesma consulta, o predicado na clusula where aplicado primeiro. As linhas que satisfazem a condio da clusula where so ento agrupadas pela clusula group by. Em seguida, o predicado da clusula having aplicado a cada grupo. Ilustrando a utilizao de where e having na mesma instruo, faremos a seguinte consulta: cdigo do produto e quantidade total requisitada, para os produtos que possuem quantidade total requisitada maior que 10. select COD_PRODUTO, sum (QTDE ) from REQUISICAO R, ITENS_REQUISICAO I where R.COD_REQUISICAO = I.COD_REQUISICAO group by COD_PRODUTO having sum (QTDE) > 100

Consultas Complexas
SQL permite que alguns consultas mais elaboradas possam ser feitas, utilizando apenas variveis tuplas sem as funes de agregao. Por exemplo, uma sentena em SQL para devolver todos os setores que tm mais que 15 funcionrios alocados, seria: select from where distinct S.NOME SETOR S ( select count(*) from FUNCIONARIO T where T.COD_SETOR = S.COD_SETOR) > 15

Funes Built-in
Alm dos comandos, clusulas e funes agregadas da linguagem SQL, os gerenciadores de bancos de dados disponibilizam uma srie de outras funes para ajudar o usurio na manipulao dos dados. Estas funes podem ser utilizadas normalmente com as instrues SQL comuns. Contudo, essas extenses acarretam uma grande desvantagem quando se pretende desenvolver sistemas multiplataformas, pois estas funes so especficas para cada servidor de banco de dados. Por exemplo, uma funo de converso de inteiro para string, por exemplo, diferente entre o Oracle e o Sybase. O Oracle fornece um grande conjunto de funes para manipular strings, datas e nmeros. Dentre elas, podemos destacar:

Funes para manipulao de strings


Funo ASCII(x) CHR(x) CONCAT(x,y) INITCAP(x) prprio) LENGTH(x) LENGTHB(x) LOWER(x) LTRIM(x|,y|) Retrona o tamanho da string x Retorna o tamanho em bytes da string x Retorna a string x com todas as letras em minscula Elimina caracteres esquerda da string x e retorna a string resultante. Se y no for especificado, caracteres em branco sero removidos. O valor da string y (opcional) o conjunto de caracteres a ser eliminado Retorna a string x com todas as ocorrncias de y substitudas por z. Se z for omitido, todas as ocorrncias de y sero simplesmente removidas Elimina caracteres direita da string x e retorna a string resultante. Se y no for especificado, caracteres em branco sero removidos. O valor da string y (opcional) o conjunto de caracteres a ser eliminado Retorna a parte da string x, iniciando com o caracter y. Se z for especificado, a funo retorna z caracteres a partir de y (inclusive); caso contrrio, a parte retornada vai Retorna a string x com todas as letras em maiscula Propsito Retorna o valor numrico ASCII do caracter x Retorna o caracter ASCII correspondente ao inteiro x Retorna x concatenado com y Retorna a string x com a primeira letra de cada palavra em maiscula e as restantes em minscula (nome

REPLACE(x,y|,z|) RTRIM(x|,y|)

SUBSTR(x,y|,z|) at o final da string x UPPER(x)

Um exemplo, de utilizao das funes de manipulao de strings, seria a eliminao de todos os espaos em branco que tenham sido digitados direita dos nomes dos funcionrios: update FUNCIONARIO set NOME = RTRIM(NOME)

Funes para manipulao de nmeros


Funo ASCII(x) CEIL(x) COS(x) COSH(x) EXP(x) FLOOR(x) LN(x) LOG(x,y) MOD(x,y) POWER(x,y) ROUND(x|,y|) SIGN(x) SIN(x) SINH(x) SQRT(x) TAN(x) TANH(x) TRUNC(x|,y|) Propsito Retorna o valor absoluto de x Retorna o menor inteiro superior ou igual a x Retorna o co-seno de x Retorna o co-seno hiperblico de x Retorna e elevado potncia de x Retorna o maior inteiro inferior ou igual a x Retorna o logaritmo natural de x Retorna o logaritmo de base x de y Retorna o resto de x dividido por y Retorna o x elevado potncia y Retorna o x arredondado y casas direita da casa decimal. O valor padro de y, caso seja omitido, 0 (zero) Retorna o sinal de x como -1 se x for negativo; 0 (zero) se x for 0 (zero); e 1 se x for positivo Retorna o seno de x Retorna o seno hiperblico de x Retorna a raiz quadrada de x Retorna a tangente de x Retorna a tangente hiperblica de x Retorna x truncado para y casas decimais. O valor padro de y, caso omitido, 0 (zero)

Para exemplificar o uso de funes de manipulao de nmeros, desejamos eliminar os centavos dos preos dos produtos, arredondando todos os preos para cima. update PRODUTO set PRECO = CEIL(PRECO)

Funes para manipulao de datas


Funo ADD_MONTHS(x,y) LAST_DAY(x) MONTHS_BETWEEN(x) SYSDATE Propsito Retorna a data x acrescida de y meses Retorna o ltimo dia do mesmo da data x Retorna o nmero de meses entre as datas x e y Retorna a data e hora atuais do sistema

Para exemplificar o uso de funes de manipulao de datas, desejamos saber quantos meses decorreram desde a primeira requisio do produto 0101001 at a data atual. select from MONTHS_BETWEEN(MIN(R.DATA),SYSDATE) REQUISICAO R,

ITENS_REQUISICAO IR where R.COD_REQUISICAO = IR.COD_REQUISICAO and IR.COD_PRODUTO=0101001

Funes de converso
Funo TO_CHAR(x|,y|) Propsito Converte uma data ou um nmero x em uma string de caracteres. A string y define o formato de converso da data ou nmero. Exemplos de formato so dd-MM-yyy e 999.99 Converte a string x em uma data, usando o modelo de formato y Converte a string x em um nmero, usando o modelo de formato y

TO_DATE(x|,y|) TO_NUMBER(x|,y|)

Um exemplo do uso de funes de converso, seria um comando select que retornasse o valor numrico dos anos em que foram realizadas requisies ao estoque. select distinct from TO_NUMBER(TO_CHAR(DATA,yyyy)) REQUISICAO

Modificando o Banco de Dados


At o presente momento, restringimos nossa ateno consulta ao banco de dados. Agora discutiremos as instrues da SQL para atualizao do banco, atravs dos comandos insert, delete e update.

Inserindo Linhas: INSERT


Para inserir um dado numa tabela, podemos faz-lo de duas formas: especificando uma linha a ser inserida, ou seja, os campos e seus valores; escrevendo uma consulta cujo o resultado seja um conjunto de linhas a serem inseridas. A primeira maneira mais simples, pois inserimos uma linha por vez, atribuindo valores as colunas da tabela. Sintaxes:
insert into <nome da tabela> | (<C1, C2 ... Cn>) | values (< V1, V2 ... Vn >) insert into <nome da tabela> <select ... from ... where ...>

onde: Ci : nome da coluna Vi : valor a ser inserido. Pode ser uma constante ou uma expresso. Os nomes das colunas podem ser omitidos, se a ordem dos valores a serem inseridos corresponder com a ordem de criao dos mesmos. Para incluirmos o setor de Compras no nosso banco de dados exemplo utilizaramos a seguinte instruo: insert into values SETOR (COD_SETOR, NOME ) (500, Compras)

Deve-se notar que ao fazer uma insero todas as restries (constraints) de integridade referencial declaradas sero processadas, de modo a preservar a consistncia dos dados. Na tabela SETOR h apenas a restrio de chave-primria (COD_SETOR), que no permitir a insero de um setor com o mesmo cdigo. Entretanto, em outras tabelas, como a FUNCIONARIO, existem restries de chave estrangeira. Esta restrio no permitir que um funcionrio seja inserido num setor inexistente, ou seja, que o seu COD_SETOR no exista na tabela SETOR. Pode-se tambm fazer uma insero atravs do resultado de uma consulta. Conseguimos assim fazer uma insero em lote. Imaginemos um caso, onde a requisio de cdigo 1015 realizada pelo funcionrio 10, deve ser extornada, ou seja, todos os itens que constam como requisitados devero ser lanados na devoluo de cdigo 5005 com a mesma data da requisio. Deveramos fazer os seguintes inserts: insert into DEVOLUCAO select 5005, COD_FUNCIONARIO, DATA from REQUISICAO where COD_REQUISICAO = 1015 ITENS_DEVOLUCAO select 5005, COD_PRODUTO, QUANTIDADE from ITENS_REQUISICAO where COD_REQUISICAO = 1015

insert into

No exemplo dado sobre insert considerou-se que todos os valores foram dados. Porm isto no uma regra, pois h caso de colunas que aceitam valores nulos. Deste modo pode-se numa instruo insert utilizar a palavra reservada null para indicar a insero de um valor nulo. Exemplo: insert into values FUNCIONARIOS (COD_FUNCIONRIO, COD_SETOR, NOME, RG, CPF, ENDERECO, CIDADE, ESTADO, SALARIO) (51,500,Jos Martins,null,null,null,null,null,1300)

Com esta instruo, inserimos o funcionrio Jos Martins. Todas as colunas que poderiam conter valores nulos (RG, CPF, ENDERECO, CIDADE, ESTADO), segundo suas definies no banco de dados, receberam null como contedo. Outra forma de fazer esta insero seria explicitando apenas os nomes das colunas que receberiam valores nulos. Desta outra forma, o exemplo acima ficaria do seguinte modo: insert into values FUNCIONARIOS (COD_FUNCIONRIO, COD_SETOR, NOME, SALARIO) (51,500,Jos Martins,1300)

Removendo Linhas: DELETE


Uma requisio de remoo expressa da mesma forma que uma consulta. Podemos remover apenas linhas inteiras, e no apenas alguns atributos. A instruo delete possui a seguinte sintaxe:
delete from <nome da tabela> | where < condio de procura > |

Se desejarmos remover linhas de diversas tabelas, precisaremos utilizar um comando delete para cada uma. A condio de procura na clusula where pode ser to complexa quanto a do comando select. Podemos tambm omitir a clusula where, contudo devemos ter muito cuidado, pois, neste caso, todas as linhas da tabelas sero excludas. Em seguida mostrado um comando delete que exclui um item de uma requisio: delete from where ITENS_REQUISICAO COD_REQUISICAO = 432 and COD_PRODUTO = 0101001

Assim como na insero, a remoo de linhas tambm ocasiona o processamento de todas as restries relativas a integridade referencial tangentes tabela que est sofrendo a remoo. Nota-se que neste delete no haver nenhum problema quanto as restries declaradas, pois as chaves primrias da tabela ITENS_REQUISICAO no so chave estrangeira em nenhuma outra tabela. Porm, se tentarmos excluir um funcionrio, poderamos ter problemas, se no relacionamento entre FUNCIONARIO e DEVOLUCAO ou REQUISICAO, a restrio relativa a chave estrangeira COD_FUNCIONARIO estiver configurada como restrict (que o caso do nosso exemplo). Neste caso, a deleo s iria se proceder, caso o funcionrio a ser excludo no tivesse feito nenhuma requisio ou devoluo. Se a regra de deleo estiver setada como cascade, ao excluir o funcionrio todas as requisies e devolues seriam eliminadas juntamente com o funcionrio em questo.

Modificando Linhas: UPDATE


Utilizamos o comando update, quando desejamos mudar alguns valores em algumas colunas de uma tabela. Ressalta-se que a atualizao pode ser feita em apenas uma tabela por vez. Como no select e delete, podemos utilizar de uma condio de procura, para selecionar as linhas que desejamos que sofram modificaes. Sintaxe do comando update:
update <nome da tabela> set (C1 = V1, C2=V2 ... Cn = Vn) | where <condio de procura> |

onde:

Ci : coluna da tabela; Vi : novo valor, podendo ser uma constante, ou uma expresso. Suponha que queiramos atualizar os slarios dos funcionrios do setor 200 em 10%. Utilizaramos a seguinte instruo: update set where FUNCIONARIO SALARIO = SALARIO * 1.1 COD_SETOR = 200

Assim como no comando delete, a clsula where tambm pode ser omitida no update. Deste modo, todas as linhas da tabela sofreriam a atualizao. Supondo que desejemos atualizar o salrio de todos os funcionrios em 10%, independentemente do setor, a instruo SQL se resumiria a: update set FUNCIONARIO SALARIO = SALARIO * 1.1

Introduo a DDL - Linguagem de Definio de Dados


Tabelas (Tables) - Criando, Alterando e Excluindo
Como j citado, as tabelas so os blocos bsicos de construo de qualquer banco de dados e, com os comandos de definio de dados da linguagem SQL, podemos criar, excluir e alterar tabelas. Quando se cria uma tabela com SQL, na verdade, so definidas as colunas, com seus tipos e outras caractersticas, que cada linha criada na tabela armazenar.Para a definio de uma coluna so necessrios: um nome, um tipo e se a coluna permitir o armazenamento de valores nulos. O comando para criao de tabelas, o CREATE TABLE. Eis, sua sintaxe:
create table <nome da tabela> ( <nome da coluna 1> <tipo de dado> | NULL ou NOT NULL |, ..., <nome da coluna n> <tipo de dado> | NULL ou NOT NULL | )

Como exemplo do comando CREATE_TABLE, citamos o comando para criao da tabela de setores: create table SETOR ( COD_SETOR NOME

smallint varchar(30)

not null, not null )

O padro SQL-92 (tambm conhecido como SQL2) acrescentou ao comando CREATE TABLE algumas clusulas para declarao de restries para os campos de tabelas. Estas clusulas so: PRIMARY KEY DEFAULT: quando um campo for declarado, possvel especificar o seu valor default, ou seja, se na insero de uma linha este campo no tiver um valor fornecido, o valor default armazenado. Isto til quando se tem uma grande quantidade (quase maioria) de linhas onde uma coluna assume sempre um mesmo valor. Deste modo, somente seria necessrio especificar um valor para esta coluna, numa insero, quando este fosse diferente do default, ou seja, em poucos casos. CHECK: restringe a faixa de valores que a coluna pode assumir. Restries de check so tambm chamadas de regras (rules) ou regras de validao (validation rules), uma vez que permitem que o prprio gerenciador de bancos de dados verifique se o valor sendo atribudo para a coluna est dentre os valores vlidos. REFERENCES: caso uma coluna seja definida com REFERENCES, ou seja, a coluna uma chave estrangeira, quando um valor est para ser atribudo para esta coluna, primeiro verificado se o mesmo valor existe na tabela e coluna referenciadas. UNIQUE: garante que valores para uma coluna no se repitam dentro da tabela. Esta restrio tambm impe que a coluna no possa aceitar valores nulos. Como exemplo da definio de restries, temos um comando para criao da tabela REQUISIO: create table REQUISICAO ( COD_REQUISICAO smallint primary key, COD_FUNCIONARIO smallint not null references FUNCIONARIO, DATA date default SYSDATE check (DATA <= TO_DATE(01-01-1980,dd-MM-yyyy) ) ) Deve-se notar que na definio da tabela REQUISICAO foram utilizadas algumas funes built-in do Oracle, as quais devem ser substitudas caso a tabela seja gerada em outro gerenciador de bancos de dados. J com relao s regras de deleo, a sua definio varia de acordo com cada gerenciador. No Oracle, ela pode ser declarada aps a restrio references.

Outra questo a ser ressaltada que quando a chave primria composta por mais de um campo, esta deve ser declarada aps todos os campos. Vejamos como ficaria um exemplo, acrescentando uma regra de deleo e uma chave primria com mais de um campo. Deve-se considerar que, no Oracle, a regra de deleo default a restrita (restrict): create table ITENS_REQUISICAO ( COD_REQUISICAO smallint COD_PRODUTO DATA

not null references REQUISICAO on delete cascade, char(7) not null references PRODUTO, float not null )

A linguagem SQL tambm permite a alterao de componentes de uma tabela. O comando utilizado para este fim o ALTER TABLE. Sua sintaxe inclui palavras-chave para adicionar e remover colunas, bem como alterar seus atributos de nome, tipo de dado, tamanho, etc. Sintaxe:
alter table <nome da tabela> ADD ( <nome da nova coluna> <tipo de dado> | NULL ou NOT NULL | ) alter table <nome da tabela> DROP ( <nome da coluna> alter table <nome da tabela> MODIFY ( <nome da coluna> <tipo de dado> | NULL ou NOT NULL | )

Contudo, deve-se considerar que as alteraes de tabelas gozam de algumas restries em certos gerenciadores de bancos de dados, vetando, por exemplo, a adio de uma coluna que no permita valores nulos, numa tabela que j contm linhas armazenadas. A DDL tambm dispe de um comando para excluir tabelas: o DROP TABLE. Sintaxe:
drop table <nome da tabela>

Vises (Views)
Uma viso (view) permite que voc associe os resultados de uma consulta a um nome, que voc pode utilizar em outras consultas, como se fosse uma tabela normal. Quando voc acessa uma view, a consulta que est definida para esta executada e os resultados desta trabalham com uma nova tabela base para a nova consulta que est sendo praticada. Sintaxe:
create view <nome da viso> as <select ... from ... where ...>

Como exemplo, poderamos criar uma viso de nome FUNCIONARIOS_VENDAS, a qual conteria apenas os funcionrios do setor de Vendas. Eis o comando: create view FUNCIONARIOS_VENDAS as select * from FUNCIONARIO where COD_SETOR = 100

Aps criada a view FUNCIONARIOS_VENDAS, caso realizemos um select * na mesma (select * from FUNCIONARIOS_VENDAS), apenas as linhas dos funcionrios cujo cdigo do setor igual a 100 (Vendas) seriam exibidos como resultado. Para excluir views, a DDL dispe do comando DROP VIEW. Sintaxe:
drop view <nome da viso>

ndices (Indexes)
Os ndices so mecanismos que permitem que o gerenciador de bancos de dados acesse um dado mais rpidos; todavia, o mecanismo de ndice no padro e nem todos os gerenciadores o implementam. Os sistemas criam uma estrutura interna de dados (o ndice), os quais so envolvidos, quando um comando

de consulta SQL (um select) baseado na coluna do ndice, para que a consulta seja processada mais rapidamente. O comando para criao de ndices o CREATE INDEX. Sintaxe:
create index <nome do ndice> on <nome da tabela> (<nome da coluna 1>, ..., <nome da coluna n>)

A ttulo de exemplo, poderamos imaginar que vrias consultas envolvendo a tabela FUNCIONARIO baseiam-se na coluna NOME. Deste modo, deveramos criar um ndice para esta coluna, de modo que as consultas se processem de forma mais rpida: create index IDX_NOME_FUNC on FUNCIONARIO (NOME) Para a excluso de um ndice, o comando o DROP INDEX. Sintaxe:
drop index <nome da tabela>.<nome do ndice>

Das könnte Ihnen auch gefallen