Vous êtes sur la page 1sur 30

LINGUAGEM SQL 1.

Histria
A IBM desenvolveu uma verso original da SQL, chamada SEQUEL, como parte do projeto R no incio da dcada de 70. A linguagem Sequel evoluiu desde ento, e seu nome mudou para SQL (Structured Query Language). Muitos produtos agora aceitam a linguagem SQL. A SQL se estabeleceu no mercado como sendo a linguagem padro de banco de dados relacional. Em 1986, o American National Standards Institute (ANSI) e a International Organzation for Standardization (ISO) publicaram um padro SQL, chamado SQL-86. Em 1989, o ANSI publicou um padro estendido para a linguagem: a SQL-89. A prxima verso do padro foi SQL-92, seguida pela SQL:1999. A verso mais recente a SQL:2003. Por ser uma linguagem de numerosas aplicaes, a SQL pode manipular objetos de diferentes classes entre as funes de um SGBD: Definio de dados (DDL): permite ao usurio a definio da estrutura e organizao dos dados armazenados, e as relaes que existem entre eles; Manipulao de dados (DML): permite ao usurio ou a um programa de aplicao a incluso, remoo, seleo ou atualizao de dados previamente armazenados no banco; Controle de Acesso: protege os dados de manipulaes no autorizadas; Compartilhamento de dados: coordena o compartilhamento dos dados por usurios concorrentes, sem, contudo, interferir na ao de cada um deles; Integridade de Dados: auxilia no processo de definio da integridade dos dados, protegendo contra corrupes, inconsistncias e falhas do sistema de computao.

2. Tipos de Dados
Como outras linguagens, SQL usa identificadores definidos pelo usurio, constantes e palavras-chave (reservadas). Nomes definidos pelo usurio e palavras reservadas no so sensveis a maisculas e minsculas. Um identificador comea por uma letra seguida de qualquer ordem de outras letras, dgitos e do caractere _ (underline) at no Maximo de 128 caracteres. Os seguintes tipos de dados so suportados pelo padro: CHAR (n) cadeia de caracteres com exatamente n caracteres; VARCHAR(n) cadeia com at n caracteres; BIT (n) cadeia com exatamente n bits; VARBIT (n) cadeia com at n bits; INT inteiro com sinal (preciso definida pela implementao, usualmente 32 bits) SMALLINT inteiro com sinal (preciso definida pela implementao);

NUMERIC (p,q) nmero decimal com p dgitos mais sinal e ponto decimal implcito com q dgitos a partir da direita; (38 caracteres decimais) DECIMAL (p, q) semelhante a NUMERIC, mas a preciso pode ser maior que p dgitos; (38 caracteres decimais) FLOAT nmero em ponto flutuante (preciso definida pela implementao). (15 caracteres decimais)

Existem tipos de dados para suportar diversas formas de datas e horas, por exemplo: DATE 1999-12-25, TIME 18:45:00, TIMESTAMP 1999-12-25 18:45:00; Operadores Aritmticos +, -, * (asterisco), /, com o significado usual. Operadores de Comparao >, >=, <, <=, =, <> ou !=, com o significado usual; Concatenador de cadeias de caracteres: || Pedro lvares || Cabral A linguagem SQL dividida nos seguintes componentes: Data Definition Language (DDL): permite ao usurio a definio da estrutura e a organizao dos dados armazenados e das relaes que existem entre eles. Disponibiliza comandos para criao dos componentes do banco de dados, como tabelas, ndices, etc. Principais comandos DDL: CREATE TABLE: comando que permite a definio do esquema de uma tabela; ALTER TABLE: permite alterar o esquema de uma tabela; DROP TABLE: permite eliminar uma tabela; CREATE INDEX: permite criar um ndice para tabela; ALTER INDEX: permite alterar um ndice de uma tabela; DROP INDEX: permite eliminar o ndice de uma tabela.

Data Manipulation Language (DML): permite a manipulao dos dados armazenados no banco de dados. Comandos DML: INSERT: permite inserir dados; DELETE: permite excluir dados; UPDATE: permite alterar dados.

Data Query Language (DQL): permite extrair dados do banco de dados. Comando: SELECT: permite consultar dados.

Data Control Language (DCL): prov a segurana interna do banco de dados. Comandos DCL:

CREATE USER: permite criar usurio; ALTER USER: permite alterar usurio; GRANT: concede permisso de acesso; REVOKE: revoga permisso de acesso; CREATE SCHEMA: cria um esquema no banco de dados corrente. Um esquema essencialmente um espao de nomes: contm objetos nomeados (tabelas, tipos de dado, funes e operadores) cujos nomes podem ser iguais aos de outros objetos existentes em outros esquemas.

3. Criando e Eliminando um Banco de Dados


O comando CREATE DATABASE utilizado para criar um banco de dados. Exemplo CREATE DATABASE Escola O comando DROP DATABASE utilizado para eliminar um banco de dados. Exemplo DROP DATABASE Escola

4. Criao de Tabelas
O comando CREATE TABLE utilizado para criar uma tabela no banco de dados. A sintaxe bsica do comando a seguinte:
CREATE TABLE nome-tabela (nome-coluna1 tipo-de-dado-coluna1 coluna1constrant, nome-coluna2 tipo-de-dado-coluna2 coluna2-constraint, nome-colunan tipo-de-dado-colunan colunan-constraint, constraint-de-tabela) Onde: Argumento Nome-tabela Nome-coluna Tipo-de-dado-coluna Coluna-constraint Constraint-de-tabela Exemplo: CREATE TABLE CD ( Codigo_CD INTEGER NOT NULL, Codigo_Gravadora INTEGER NULL, Descrio Nome da tabela. Deve ser nico para o usurio. No pode coincidir com o nome de outros objetos do banco de dados de um mesmo usurio. Nome da coluna. Esse nome deve ser nico e exclusivo na tabela Tipo de dado conforme tabela anterior. Regras agregadas coluna. Regras agregadas tabela inteira.

Nome_CD VARCHAR (60) NULL, Preo_Venda DECIMAL (16, 2) NULL, Data_Lancamento DATE DEFAULT, PRIMARY KEY (Cdigo_CD), FOREIGN KEY (Cdigo_Gravadora) REFERENCES Gravadora (Cdigo_Gravadora), CHECK (Preo_Venda > 0) )

5. Tipos de Constraints
As constraints variam muito de um banco de dados para outro. Pode ser que algumas delas no estejam presentes no banco de dados que voc estiver utilizando. 5.1. Chave Primria

Chave Primria a coluna, ou grupo de colunas, que permite identificar um nico registro na tabela. Para especificar que uma coluna ou grupo de colunas representa a chave primria de uma tabela, deve-se acrescentar a palavra-chave PRIMARY KEY seguida do nome da(s) coluna(s). Alguns bancos de dados permitem especificar a chave primria como constraint da coluna (quando a chave primria for apenas uma coluna) ou como constraint da tabela. Outros aceitam apenas como constraint de tabela. Para facilitar, aconselha-se utilizar a chave primria como constraint de tabela. Digamos que haja uma tabela de cliente cuja chave primria seja o campo CDCLIENTE. A criao da chave primria ficaria assim:
CREATE TABLE CLIENTE ( Cod_Cliente INTEGER NOT NULL PRIMARY KEY, Nome_Cliente VARCHAR(50) NULL ) ou CREATE TABLE CLIENTE ( Cod_Cliente INTEGER NOT NULL, Nome_Cliente VARCHAR (50) NULL, PRIMARY KEY (Cod_Cliente) )

Criao de Chaves Primrias Compostas No modelo de dados essa tabela representa uma entidade associativa entre pedido e produto, logo sua chave primria ser composta das duas chaves primarias das tabelas adjacentes do

relacionamento produto e pedido. Exemplo:


CREATE TABLE ITEM_PEDIDO (num_pedido int not null UNIQUE, cod_produto smallint not null unique, quantidade decimal, Constraint PK_Item_Pedido PRIMARY KEY (num_pedido, cod_produto), Constraint FK_Pedido FOREIGN KEY (num_pedido) REFERENCES Pedido, Constraint FK_Produto FOREIGN KEY (cod_produto) REFERENCES Produto )

5.2.

Chave Estrangeira

Chave Estrangeira o campo que estabelece o relacionamento entre duas tabelas. Assim, uma coluna, ou grupo de colunas, de uma tabela corresponde mesma coluna, ou grupo de colunas, que a chave primria de outra tabela. Dessa forma, deve-se especificar na tabela que contm a chave estrangeira quais so essas colunas e qual tabela est relacionada. Veja que o banco de dados verificar se todos os campos que fazem referncia tabela esto especificados. Ao determinar esse tipo de relacionamento, fica garantida a integridade das informaes. Os valores presentes na(s) coluna(s) definida(s) como chave estrangeira devem ter um correspondente na outra tabela, caso contrrio o banco de dados deve retornar uma mensagem de erro. normal que, ao tentar excluir um registro de uma tabela, o banco de dados verifique se h chaves estrangeiras relacionadas a esse registro. Se houver, tambm ser retornado um erro impedindo essa operao. Infelizmente, muitos programadores no utilizam esses recursos dos bancos de dados. Caso no sejam definidas as chaves estrangeiras nas tabelas, apenas o programa controlar o que pode ou no ser excludo, ou alterado, colocando em risco informaes relevantes do sistema. Por exemplo, pode-se excluir uma pea da tabela, mesmo que haja pedidos ou notas fiscais relacionadas a ela. Dessa forma, perde-se a Informao. Muitos poderiam dizer que o programa no permitiria tal ocorrncia. verdade. Porm todos os bancos de dados possuem programas de manipulao direta dos dados. No apenas por meio do seu programa que algum manipular as informaes. Alis, se algum estiver mal-intencionado, no utilizar o seu programa para agir. Para especificar uma chave estrangeira, utilize a seguinte sintaxe:

... FOREIGN KEY nome-chave-estrangeira (lista-de-colunas) REFERENCES nome-tabela (lista de colunas) ON UPDATE ao ON DELETE ao Exemplo:
CREATE TABLE CD ( Cod_CD INTEGER NOT NULL, Cod_Gravadora INTEGER NULL, Nome_CD VARCHAR (60) NULL, Preo_Venda DECIMAL (16, 2) NULL, PRIMARY KEY (Cod_CD), FOREIGN KEY (Cod_Gravadora) REFERENCES Gravadora (Cod_Gravadora),

ON DELETE NO ACTION ON UPDATE NO ACTION


Onde: Opo Nome-chave-estrangeira Lista-de-coluna Nome-tabela Ao Descrio Nome opcional da constraint Lista de colunas da tabela que faz referncia a outra tabela. Nome da tabela em que est a chave primria. Determina qual ao o banco de dados deve tomar quando for excluda ou alterada uma linha da tabela que contm referncia a esta chave. Pode ser: SET NULL (altera o contedo da coluna para nulo, perdendo a referncia, sem deixar valores inconsistentes); SET DEFAULT (altera o contedo da coluna para o valor especificado na clusula DEFAULT se houver) CASCADE (exclui ou altera todos os registros que se relacionam a eles) NO ACTION (em caso de alterao, no modifica os valores que se relacionam a eles) ou RESTRICT (no permite a excluso da chave primria)

A clusula REFERENCES estabelece a restrio de integridade referencial entre as tabelas, porm s podemos incluir essas restries se as tabelas referidas na clusula REFERENCES j foram criadas antes dela. A Clusula ON DELETE CASCADE e ON UPDATE CASCADE Esta uma clusula que deve ser utilizada com muito critrio na construo de um banco de dados pelos riscos implcitos na sua utilizao, porm ela de grande valia na garantia de integridade referencial no banco de dados. A utilizao de uma clusula ON DELETE CASCATE em uma declarao de constraint de FOREIGN KEY especifica que se houver uma tentativa de apagar uma linha com uma chave primria referenciada por chaves estrangeiras em linhas existentes em outras tabelas, tambm sero

apagadas todas as linhas que contm essas chaves estrangeiras. Exemplo


ALTER TABLE Pedido ADD Constraint Fk_Pedido FOREIGN KEY (cod_cliente) REFERENCES Cliente (cod_cliente) ON DELETE CASCADE

O que implica na operao das tabelas a existncia de ON DELETE CASCADE? Se for deletada alguma linha de cliente que tenha referncia em pedido, as linhas correspondentes de pedido tambm sero deletadas. A opo de ON UPDATE CASCADE impede que sejam feitas mudanas na chave referenciada caso existam linhas linhas referenciando o valor desta. Caso seja possvel a mudana do valor de uma chave primria de cliente, a existncia de ON UPDATE CASCADE na tabela Pedido provocaria a alterao dos valores das chaves estrangeiras associadas ao valor original.
Exemplo ALTER TABLE Pedido ADD Constraint FK_Pedido FOREIGN KEY (Cod_Cliente) REFERENCES Cliente (Cod_Cliente) ON DELETE CASCADE, ON UPDATE CASCADE

5.3.

DEFAULT

Serve para atribuir um contedo-padro a uma coluna da tabela, sempre que for includa uma nova linha da tabela. Deve-se especificar a palavra-chave DEFAULT, seguida do contedo-padro. Imaginando uma coluna QUANTIDADE que deva ter o contedo-padro 1, deveramos cri-la desta forma:
CREATE TABLE Cliente ( Cod_Cliente int NOT NULL, Nome_Cliente varchar (60) NULL, Cod_UF char (2) DEFAULT SP )

5.4.

NOT NULL

Indica que o contedo de uma coluna no poder ser Nulo. Caso cada coluna no tenha

valor atribudo durante uma incluso, ter seu valor Nulo. Alguns outros bancos de dados no SQL atribuam contedo em funo do tipo de dado: campos numricos tinham valor zero, cadeias de caracteres contedo branco e assim por diante. Lembre-se: em bancos de dados SQL, colunas sem valor atribudo possuem contedo Nulo. Dessa forma, ao tentar incluir uma coluna com essa restrio, que no apresenta valor, o banco de dados retornar uma mensagem de erro e no incluir a linha. Imagine um caso em que no se possa incluir um cliente sem que seja preenchido o nome. Essa coluna seria criada desta forma:
CREATE TABLE Cliente ( Cod_Cliente int NOT NULL,

Nome_Cliente varchar (60) NULL )

5.5.

UNIQUE

Indica que no pode haver repetio no contedo da coluna. Isso diferente do conceito de chave primria. A chave primria, alm de no permitir repetio, no pode conter valores nulos. Ao especificarmos que uma coluna deve conter valores nicos, indicamos que todos os valores no nulos devem ser exclusivos. Devemos acrescentar a clusula UNIQUE, aps a definio da coluna, ou UNIQUE, seguido dos campos que devem ter essa caracterstica no final da criao da tabela. Ainda na tabela de clientes, vamos especificar o nmero do CPF como campo de valor nico.
CREATE TABLE Cliente ( Cod_Cliente int NOT NULL,

Nome_Cliente varchar (60) NULL, CPF int UNIQUE )

5.6.

CHECK Definio de Domnio

Um domnio uma expresso de valores possveis para o contedo de uma coluna. Ao criar uma coluna pode-se especificar quais os valores que podero ser utilizados para preencher a coluna. Para criar um domnio para uma coluna, utilizamos a palavra-chave CHECK, seguida da condio que validar o contedo. Imagine um campo de sexo. Esse campo s poder aceitar M para Masculino ou F para Feminino. O domnio dessa coluna (F, M) e seria criado da seguinte forma:
CREATE TABLE Cliente ( Cod_Cliente int NOT NULL,

Nome_Cliente varchar (60) NULL, Sexo ) CHAR (1) CHECK (UPPER (Sexo) = M OR UPPER (Sexo) = F)

6. Eliminando uma tabela


Para eliminar uma tabela do banco de dados, utilizamos o comando DROP TABLE seguido do nome da tabela. Alguns bancos de dados somente permitiro a excluso da tabela desde que no esteja relacionada a outras. Alguns deles podem conter clusulas especficas para excluir a tabela, independentemente das constraints definidas (no ORACLE voc pode especificar CASCATE aps o nome da tabela).
Exemplo: DROP TABLE cliente

7. Alterao de Estrutura de Tabela


Para alterar a estrutura de uma tabela, utilizamos o comando ALTER TABLE. Dependendo do banco de dados, podemos: 7.1. Acrescentar novas colunas

O comando utilizado para acrescentar novas colunas muito semelhante ao da criao de colunas em uma tabela:
ALTER TABLE nome_tabela ADD nome-coluna tipo-de-dado constraints [, nome-coluna tipo-de-dado constraints, ...] Exemplo: ALTER TABLE cliente ADD email VARCHAR (80) UNIQUE 7.2. Acrescentar novas constraints

O comando utilizado para acrescentar novas constraints muito semelhante ao da criao de constraints em uma tabela:
ALTER TABLE tabela ADD (constraint)

Exemplo: ALTER TABLE cliente ADD PRIMARY KEY (CodCliente)

Nesse caso, estamos alterando uma constraint de tabela. Note que a colocao dos parnteses

aps a clusula ADD opcional. Uma constraint de coluna deve ser alterada utilizando o comando a seguir, relacionado prpria coluna.

7.3.

Modificar Colunas

Podemos modificar qualquer caracterstica de uma coluna, seja o tipo de dado (alguns bancos de dados requerem ausncia de contedo na coluna para fazer essa alterao), o tamanho (alguns s aceitam alteraes para valores maiores que o definido) e as constraints:
ALTER TABLE tabela ALTER COLUMN (nome-coluna tipo-dado constraints) Exemplo: ALTER TABLE cliente ALTER COLUMN nome_cliente VARCHAR (10) NULL PostgreSQL: ALTER TABLE products ALTER COLUMN product_no SET NOT NULL; ALTER TABLE products ALTER COLUMN product_no DROP NOT NULL; ALTER TABLE products ALTER COLUMN price SET DEFAULT 7.77; ALTER TABLE products ALTER COLUMN price DROP DEFAULT; ALTER TABLE products ALTER COLUMN price TYPE numeric(10,2); ALTER TABLE products RENAME COLUMN product_no TO product_number; ALTER TABLE products RENAME TO items;

Podemos especificar apenas o que estamos modificando; no necessrio repetir o que no ser alterado. Assim, se quisermos apenas modificar o tipo de dado e seu tamanho, no necessrio especificar a constraint e vice-versa. De qualquer forma, devemos sempre especificar qual coluna est sofrendo a modificao.
7.4. Excluindo Elementos

Pelo padro SQL, deveria ser possvel excluir colunas ou constraints de uma tabela. Alguns bancos de dados no permitem a excluso de colunas. Exemplos do SQL SERVER: Exemplo 1: Excluso de coluna:
ALTER TABLE tabela DROP COLUMN campo ALTER TABLE cliente DROP COLUMN DATAHORA

10

Exemplo 2: Excluso de constraint de tabela


ALTER TABLE cliente DROP CONSTRAINT nome_primarykey ALTER TABLE TURMA DROP CONSTRAINT PK

TURMA__7C8480AE

8. Criao de ndice
O ndice serve para prover um acesso rpido a linhas das tabelas. Por meio dele possvel unir uma ou mais colunas por onde o acesso mais freqente. Por exemplo: quando temos uma tabela de pessoas, normalmente queremos fazer buscas em ordem alfabtica. Como o nome no uma boa chave primria para a tabela (por ser alfanumrica, o que deixa as pesquisas mais lentas, e pela possvel repetio de nomes), ento criamos um ndice para o nome da pessoa. Assim, mesmo que o ndice no seja a chave primria, garante-se um acesso mais rpido aos nomes, uma vez que, os dados buscados estariam fora de seqncia. Os valores indexados so armazenados em um objeto do banco de dados em ordem, o que permite ao gerenciador do banco de dados pesquisar primeiro no ndice, para depois buscar na tabela. O funcionamento de um ndice muito simples. mais ou menos como o ndice de um livro, os principais assuntos esto indexados em ordem alfabtica. Voc localiza ali o assunto, verifica o nmero da pgina em que ele tratado e vai diretamente a essa pgina, sem precisar busc-lo, seqencialmente, nas pginas. Isso tambm acontece com o ndice de uma tabela. O ndice simplesmente uma outra tabela no banco de dados, na qual esto armazenados valores e ponteiros, arrumados de forma ascendente ou descendente. Com os ponteiros se localiza a linha em que o valor desejado est armazenado. Alguns bancos de dados necessitam de ndices constantemente atualizados, pois, em virtude de quedas de energia ou outros problemas no gerenciamento da informao, os ndices eventualmente perdem a referncia ao dado. Outros bancos de dados se incumbem de realizar esse trabalho automaticamente, sem a interferncia do usurio. Voc deve estar atento a esse problema para evitar que a sua aplicao perca o acesso adequado aos dados. Quando criar um ndice: O ndice deve ser de coisas que vamos pesquisar com freqncia; Indexe as suas chaves estrangeiras quando precisar de joins mais eficientes e performticos;

11

As colunas que so regularmente utilizadas em joins devem ser indexadas, porque o sistema pode executar esses joins de modo muito mais rpido, e como tempo de resposta algo vital no desenvolvimento de projetos fsicos de banco de dados, recomendvel a sua utilizao.

Crie ndices sempre em colunas que so pesquisas por intervalo de valores; Crie ndices sempre em colunas que so utilizadas em clusulas WHERE.

Obs: ndices agrupados ou clustered so colocados na mesma ordem fsica das linhas da tabela, e ndices no agrupados ou nonclustered so dispostos na ordem lgica das linhas da tabela.
8.1. Criando um ndice

Para criar um ndice, utilize o comando:


CREATE [UNIQUE] INDEX nome ON tabela (coluna [, coluna,...] [ASC I DESC])

Onde:
Identificador UNIQUE Nome Tabela Coluna ASC DESC Descrio Identifica que esse ndice no permite repetio de contedo da chave (lista de colunas). Se o ndice no for especificado, admitir repetio. Nome do objeto que ser criado Nome da tabela que contm a (s) coluna (s) Lista de colunas que compe a chave de indexao Determina que a ordem de indexao ascendente (opo-padro, caso no seja definido DESC) Determina que a ordem de indexao descendente.

A quantidade de colunas indexadas varia muito em funo do banco de dados utilizado.


Exemplos: CREATE INDEX xAutor ON Autor (nmAutor) CREATE INDEX xPedido ON Pedido (cdPedido DESC) CREATE INDEX xCidade ON Cidade (SGESTADO, CDCIDADE) CREATE UNIQUE INDEX xCliente ON Cliente (CDCLIENTE)

12

8.2.

Eliminando um ndice

Para excluir um ndice, utilize o comando: DROP INDEX nomeTabela.nomeIndex


Exemplo: DROP INDEX Autor.xAutor

Incluso, Excluso e Alterao de dados em Tabelas.


Quando as tabelas j esto criadas, relacionadas e com ndices para agilizar as pesquisas temos que inserir dados nessas tabelas. Com os registros inseridos nas tabelas surge a necessidade de excluir registros e alterar dados. Portanto, vamos estudar a Data Manipulation Language (DML) que composta pelos comandos INSERT, DELETE e UPDATE.
Incluindo dados em tabelas (INSERT)

Para incluir linhas em tabelas, utilizamos o comando:


INSERT INTO tabela (campo 1, campo 2, ...) VALUES (contedo, contedo)

Onde: Tabela Nome da tabela em que ser efetuada a incluso das linhas; Campo lista de campos que tero os valores atribudos; Contedo Contedo que ser atribudo a cada um dos campos. Note que estes devem corresponder (em quantidade e tipo de dados) lista de campos, especificadas anteriormente.

Voc deve ter notado que a lista de campos opcional no comando INSERT. Caso voc no especifique em quais campos est incluindo valores, assume-se a incluso de valores em todos os campos e a ordem de incluso dos dados ser de acordo com a ordem de criao dos campos da tabela. Caso mude a ordem dos campos na tabela e voc execute o INSERT retornar uma mensagem de erro ou podem ser includos dados em campos errados caso haja uma coincidncia de tipos de campos. Portanto, o melhor sempre declarar os campos e na mesma seqncia especificar o contedo que ser inserido.

13

Note que os valores numricos no necessitam de aspas simples ou apstrofos. J os valores alfanumricos (que aceitam letras e nmeros, por exemplo, os campos varchar) devem conter aspas simples. Campos definidos como data tambm devem conter aspas. Sempre que voc incluir uma linha no banco de dados, o gerenciador checara quaisquer restries de integridade (constraints). Assim, chaves primrias, estrangeiras, domnios, etc. sero verificados no momento da incluso. Caso alguma restrio seja violada, a linha no ser includa e uma mensagem de erro ser enviada pelo banco de dados. Lembre-se de que campos que no tiverem valores atribudos tero contedo nulo. Caso, eventualmente, voc queira explicitamente incluir um valor nulo em um campo da tabela, voc deve informar NULL no lugar correspondente a este campo. Isso normalmente ocorre quando voc estiver incluindo uma linha sem especificar a lista de campos. O banco de dados automaticamente incluir contedo nulo, caso no haja restrio para valores nulos (NOT NULL).
Exemplos: INSERT INTO Autor VALUES (1, Renato Russo)

INSERT INTO Autor (CDAutor, NMAutor) VALUES (2, Tom Jobim)

Incluindo vrias linhas (INSERT) Para incluir diversas linhas em uma tabela do banco de dados, utiliza-se o comando INSERT em conjunto com o comando SELECT. Veja que, nesse caso, apenas se copiam linhas de uma para outra. Isso ser til para criar tabelas temporrias com base em outra(s) tabela(s). Veja a sintaxe: INSERT INTO tabela (campo1, campo2) SELECT campo1, campo2 FROM tabela Nesse caso, a lista de campos do comando SELECT deve corresponder totalidade das colunas na mesma seqncia das colunas da tabela, se no for especificada a lista de colunas, ou conter os contedos relativos lista de campos, na mesma ordem e com os mesmos tipos de dados. No exemplo a seguir, incluiremos em uma tabela temporria chamada tmpAutor todas as linhas da tabela Autor. O exemplo seguinte mostrar o mesmo comando, mas especificando o nome de cada um dos campos.

14

Exemplo: INSERT INTO tmpAutor SELECT * FROM Autor INSERT INTO tmpAutor (CDAUTOR, NMAUTOR) SELECT CDAUTOR, NMAUTOR FROM Autor

Exemplos: INSERT INTO CD (Codigo_CD, Codigo_Gravadora, Nome_CD, Preco_Venda, Data_Lancamento) VALUES (1, 1, Mais ou menos, 15.00. 01/02/2001)

INSERT INTO Gravadora (Codigo_Gravadora, Nome_Gravadora, Endereo, URL) VALUES (1, EMI, Rod. Presidente Dutra, s/n Km 228,0, www.emi-music.com.br)

Insero com coluna calculada Considere a tabela: maiores_premios (numj, ano, maxpremio)
INSERT maiores_premios SELECT numj, ano, premio * 1.33 FROM torneios

Observaes: Os tipos dos valores devem coincidir, respectivamente, com os tipos do esquema da tabela; Colunas no mencionadas recebem valor nulo (se o esquema permitir); Se permitido no esquema, pode-se especificar Null para valor; Apenas uma tabela pode ser atualizada num comando;

Atualizao de dados em tabelas (UPDATE) Uma vez que uma linha esteja em uma tabela, pode-se querer alterar o contedo de um ou mais campos, ou at o contedo de um campo em diversas linhas. Por isso utilizamos o comando UPDATE.
UPDATE tabela SET campo1 = conteudo1, Campo2 = conteudo2 WHERE condicao

15

Onde: Tabela nome da tabela onde ser realizada a alterao. Campo campo que ter o valor alterado. Conteudo novo contedo para o campo; Condicao Condio que indicar o escopo (limite) de atualizao das linhas.

Note que: O contedo deve respeitar o tipo de dado do campo. Assim, dados alfanumricos devem vir separados por apstrofos ou aspas simples, dados numricos no devem conter apstrofos ou aspas simples e data ou devero ser alimentados via funo de transformao de dados (CAST ou TO_DATE, converso de tipos de dados) ou entre aspas simples, dependendo do banco de dados. A condio expressa no comando servira para definir quais linhas devem ser atualizadas. Caso a clusula WHERE contenha a chave primria da tabela somente uma linha da tabela ser atualizada, pois a chave primria no admite repeties. Todas as condies de restrio de integridade (Constraints) sero avaliadas pelo banco de dados, incluindo chaves primrias, estrangeiras, domnios, etc. Assim, se quisermos alterar o preo de um CD, podemos utilizar o seguinte comando, filtrando na clusula WHERE a chave primria do CD cujo preo ser alterado:
UPDATE CD SET Preco_Venda = 15 WHERE Codigo_CD = 1

Imagine que ocorra um aumento de preo para todos os CDs de uma determinada gravadora. Nesse caso, utilizaremos como filtro da clusula WHERE o cdigo da gravadora, campo que faz parte da estrutura da tabela CD. Tambm possvel alterar o contedo de um campo com base nela mesma. Aumenta-se o preo de todos os CDs de uma gravadora em 5%, multiplicando o prprio preo do CD por 1.05.
UPDATE CD SET Preco_Venda = Preco_Venda * 1.05 WHERE Codigo_Gravadora = 2

Caso no seja especificada a clusula WHERE, ento todas as linhas sero afetadas pelo comando UPDATE. Todos os CDs sero aumentados em 5%. Veja:
UPDATE CD SET Preco_Venda = Preco_Venda * 1.05

16

Mais de um campo poderia ser alterado ao mesmo tempo e poderamos utilizar o contedo de um campo para alterar o contedo de outro. Imagine uma tabela de Item de Pedidos em que, por qualquer motivo, escolheu-se armazenar o valor total do item na linha (valor unitrio multiplicado pela quantidade). O comando UPDATE ficaria assim:
UPDATE ItemPedido SET VlTotalItem = VLUnitario * NrQtde WHERE CDPedido = 1 AND NRITem = 1

Nesse caso, utilizamos um operador AND para determinar que somente no caso de o Cdigo do Pedido ser 1 e o item ser 1 que o campo da tabela deve ser atualizado. Outro operador que podemos utilizar em outra situao o OR, que indicar qual condio dever ser satisfeita para que o comando seja executado. Exemplos:
UPDATE Autor SET Nome_Autor = Vinicius de Moraes UPDATE Gravadora SET URL = www.emi.com.br, Nome_Gravadora = EMI Music, WHERE Codigo_Gravadora = 4 UPDATE CD SET Preco_Venda = Preco_Venda * 1.10 WHERE Codigo_Gravadora = 2

Excluso de Dados em Tabelas (DELETE) Sempre que alguma informao deixar de ser relevante para ser armazenada, pode-se exclu-la de tabelas. O comando DELETE pode, da mesma forma que o comando UPDATE, afetar uma ou mais linhas de uma tabela. Mais uma vez, o escopo da excluso ser definido pela clusula WHERE. Veja a sintaxe:
DELETE FROM tabela WHERE condio

Onde: Tabela nome da tabela onde ser excluda a linha. Condio Condio que define o escopo (limite) de excluso de linhas na tabela. Note que: Se voc especificar na clusula WHERE a chave primria de uma tabela, somente uma linha da tabela ser excluda. Caso seja ma outra condio, vrias linhas podero ser excludas. Portanto,

17

tome cuidado com a condio que definir esse limite. Caso no seja especificada a clusula WHERE, todas as linhas da tabela sero excludas. Outro ponto importante que o gerenciador sempre checar a integridade das informaes. Caso tente excluir uma linha de uma tabela que tenha filhos em outras tabelas (por exemplo, tentar excluir um autor que tenha msicas vinculadas a ele), ser retornada uma mensagem de erro. Isso ocorre porque, de outra forma, a informao ficaria perdida na tabela dependente aps a excluso da tabela me. Neste primeiro exemplo, apenas o autor com cdigo 1 ser excludo (desde que no haja relacionamentos com outras tabelas).
DELETE FROM Autor WHERE CDAUTOR = 1

Neste exemplo, todos os CDs da gravadora 2 sero excludos:


DELETE FROM CD WHERE Codigo_Gravadora = 2

Neste ltimo exemplo, todas as msicas sero excludas:


DELETE FROM Musica

Pesquisa Bsica em Tabelas (SELECT) Agora que j sabemos criar, incluir, alterar e excluir informaes em tabelas veja como, podemos realizar pesquisas, ou seja, extrair informaes do banco de dados. O comando utilizado para esse fim o comando SELECT. Atrs dele h uma extenso de possibilidades que vo desde a simples extrao do contedo de todas as linhas e campos de uma tabela at a unio de diversas tabelas, clculos, agrupamentos, alm de ordenaes e filtragem de linhas e colunas. A sintaxe mais simples do comando SELECT :
SELECT Campo1, Campo2,... FROM tabela SELECT DISTINCT Campo1, Campo2 FROM Tabela

Obs. O DISTINCT utilizado para no mostrar valores repetidos de campos. Para visualizar todas as linhas e campos da tabela Autor, devemos utilizar o seguinte comando:
SELECT * FROM CD

O exemplo a seguir demonstra como filtrar apenas algumas colunas da tabela:


SELECT Codigo_CD, Nome_CD FROM CD

18

Ordenando o Resultado (ORDER BY) Voc deve ter observado que, mesmo que entremos com as linhas em determinada ordem (em ordem de Codigo_CD, por exemplo), a ordem mostrada nem sempre aquela que esperamos. Ao utilizarmos o SQL, devemos utilizar a clusula ORDER BY para determinar a ordem em que so mostradas as linhas de uma tabela. Portanto, para alterar a ordem, voc dever acrescentar ao comando a clusula ORDER BY seguida pelo(s) campo(s) que desejar. Sintaxe: SELECT campos FROM tabela ORDER BY campo1, campo2 ... Para ver a lista de autores em ordem alfabtica, devemos escrever o comando da seguinte forma: SELECT Codigo_CD, Nome_CD FROM CD ORDER BY Nome_CD SELECT * FROM CD ORDER BY Codigo_CD Caso especifique mais de um campo para ser ordenado, o gerenciador de banco de dados (SQL SERVER, por exemplo) primeiro ordenar pelo primeiro campo, em seguida pelo segundo e assim por diante. Por exemplo, se voc quisesse fazer a mesma consulta, mas ordenando primeiro pelo cdigo da gravadora e em seguida pela ordem alfabtica do nome do CD, o comando deveria ser o seguinte: SELECT Codigo_Gravadora, Nome_CD FROM CD ORDER BY Codigo_Gravadora, Nome_CD Como padro os resultados obtidos com o ORDER BY so retornados na ordem ascendente (ASC) para orden-los de forma decrescente basta incluir no comando o DESC. SELECT Codigo_Gravadora, Nome_CD FROM CD ORDER BY Codigo_Gravadora, Nome_CD DESC Filtrando Linhas Para filtrar linha em uma pesquisa (SELECT), utilizamos a clusula WHERE. Aqui, definimos uma expresso lgica (condio) que ser avaliada e mostrar apenas as linhas que atenderem ao critrio estabelecido. Sintaxe: SELECT campos

19

FROM tabela WHERE condio Onde: Condio condio que define o escopo (limite) de apresentao dos resultados. Devemos saber exatamente como construir condies que satisfaam s nossas necessidades de busca para atingir nossos objetivos. Sempre que a condio especificada for verdadeira, a linha ser mostrada. Por outro lado, sempre que a condio testada na linha for falsa, ento a linha no ser mostrada. H diversas formas e tcnicas para fazer isso: Operadores Relacionais
Operador = < <= > >= != ou <> Igual Menor que Menor ou igual a Maior que Maior ou igual a Diferente Significado Exemplo Codigo_Autor = 1 Preco_Venda < 12 Preco_Venda <= 12 Preco_Venda > 20 Preco_Venda >= 20 Codigo_Autor <> 2 ou Codigo_Autor != 2

Dessa forma, se quisermos pesquisar apenas os CDs com Preo de Venda superior a 10 reais, devemos utilizar o seguinte comando:
SELECT Nome_CD, Preco_Venda FROM CD WHERE Preco_Venda > 10.00

Note que: Da mesma forma que podemos comparar um campo com um valor, podemos comparar um campo com outro. O funcionamento exatamente igual. Note que ser comparado o valor do campo de uma linha com o valor do outro campo na mesma linha. Sempre que fazemos esse tipo de comparao, devemos obedecer ao tipo de dados que estamos comparando. Quando esto sendo comparados valores numricos, no devemos colocar qualquer smbolo separador como cifro ou vrgula, tampouco letras. O ponto decimal, contudo, deve ser especificado. Comparaes entre alfanumricos devem estar sempre entre aspas simples e, normalmente, so sensveis a letras maisculas e minsculas. Assim, Tom Jobim diferente de TOM JOBIM.

20

Operadores Lgicos Muitas vezes, apenas uma condio no o suficiente para determinarmos o critrio de busca. Sempre que isso ocorrer, podemos utilizar operadores lgicos:
Operador AND OR NOT ou ! E Ou No/negao Significado Exemplo Condio 1 AND condio 2 Condicao1 OR condicao2 NOT condio

AND O operador indica que as duas condies devem ser verdadeiras para que seja mostrada a linha. Exemplo:
SELECT Nome_CD, Preco_Venda, Codigo_Gravadora FROM CD WHERE Preco_Venda > 10 AND Codigo_Gravadora = 2

Somente sero mostrados os nomes dos CDs que tiverem o preo de venda maior que 10 e cuja gravadora seja a de cdigo 2.
OR

Utilizamos o operador OR quando quisermos que o resultado final seja verdadeiro sempre que uma das duas condies forem verdadeiras (ou ambas). Exemplo:
SELECT Nome_CD, Preco_Venda, Codigo_Gravadora FROM CD WHERE Preco_Venda > 11 OR Codigo_Gravadora = 3

Somente sero mostrados os nomes dos CDs que tiverem preo de venda maior que 11 e cuja gravadora tenha o cdigo igual a 3. Cuidado: No h limitao no uso e na combinao de condies utilizando AND e OR. Mas devemos tomar cuidado na combinao de ambos. A avaliao desse tipo de condio , no padro, da esquerda para direita. conveniente utilizar parnteses para determinar o que voc quer comparar. Assim, o resultado dos dois comandos a seguir pode no ser exatamente o que voc est esperando:
SELECT Nome_CD, Codigo_Gravadora, Preco_Venda FROM CD WHERE Codigo_Gravadora = 2 OR Codigo_Gravadora = 3 AND Preco_Venda = 11

21

Os CDs que listados incluem dois com preo de venda inferior a 11. Isso acontece porque primeiro verificado se o cdigo da gravadora 2 ou 3, somente depois, verifica-se o preo de venda. Veja a diferena no resultado da consulta a seguir:
SELECT Nome_CD, Codigo_Gravadora, Preco_Venda FROM CD WHERE (Codigo_Gravadora = 2 OR Codigo_Gravadora = 3) AND Preco_Venda = 11

Nesse caso, checa-se o cdigo da gravadora e obtm-se uma lista de linhas vlidas (somente os das gravadoras 2 ou 3). Depois, verifica-se o preo de venda apenas das linhas selecionadas anteriormente, e, assim, temos o que deve ser apresentado. NOT utilizado para inverter o resultado de uma expresso lgica, negando o resultado da condio. Caso a condio seja verdadeira, ser retornado falso e vice-versa.
SELECT Nome_CD, Preco_Venda FROM CD WHERE NOT (Preco_Venda < 15)

Nesse caso so mostradas apenas as linhas da tabela CD que no tenham preo menor que 15. Primeiro o banco de dados avalia o preo de venda menor que 15 e depois exclui da lista de resultado esses elementos Mais uma vez, apesar de opcional, o uso de parnteses deixa mais claro o que est sendo esperado do comando. Pode-se avaliar com o NOT expresses complexas incluindo as clusulas AND e OR.
SELECT Nome_CD, Codigo_Gravadora, Preco_Venda FROM CD WHERE NOT (Codigo_Gravadora = 2 OR Codigo_Gravadora = 3) AND Preco_Venda > 11

Operadores Especiais

H alguns operadores que so utilizados para determinar melhor as linhas que queremos filtrar. So eles: IS NULL, IS NOT NULL, BETWEEN, LIKE e IN.

IS NULL (nulo)

Sabemos que todos os campos que no possuem valor inicializado so nulos em banco de dados SQL. Logo, esse comando utilizado para saber se o contedo da coluna foi ou no inicializado. Exemplo:

22

SELECT Nome_Gravadora, Endereco FROM Gravadora WHERE Endereco IS NULL

IS NOT NULL (no nulo)

Compara a negao do operador anterior. Somente aqueles que tiverem contedo atribudo sero mostrados.
SELECT Nome_Gravadora, Endereco FROM Gravadora WHERE Endereco IS NOT NULL BETWEEN

Esse operador serve para determinar um intervalo de busca. Assim, sempre que quisermos realizar buscas que indiquem um intervalo de nmeros, datas, etc., podemos utilizar o BETWEEN para simplificar a forma de escrevermos o comando. muito utilizado para simplificar a utilizao do AND.
SELECT Nome_CD, Data_Lancamento FROM CD WHERE Data_Lancamento BETWEEN 01/01/1999 AND 01/12/2001 SELECT Nome_CD, Preco_Venda FROM CD WHERE Preco_Venda BETWEEN 9 AND 11

Caso voc utilize NOT, somente as linhas fora do intervalo sero apresentadas.
SELECT Nome_CD, Preco_Venda FROM CD WHERE Preco_Venda NOT BETWEEN 9 AND 11

LIKE

Com este operador, podemos comparar cadeias de caracteres utilizando padres de comparao para um ou mais caracteres. Normalmente, o caracter percentual (%) substitui zero, um ou mais caracteres e sublinha (_) substitui um caractere. Utilizando a combinao desses caracteres especiais com o que se quer localizar, pode-se conseguir uma variedade muito grande de expresses. Veja a tabela a seguir de possveis combinaes:
Expresso LIKE A% LIKE %A LIKE %A% LIKE A_ Explicao Todas as palavras que iniciem com a letra A Todas as palavras que terminem com a letra A Todas que tenham a letra A em qualquer posio String de dois caracteres que tenham a primeira letra A e o segundo caractere seja qualquer outro.

23

LIKE _A LIKE _A_ LIKE %A_ LIKE _A%

String de dois caracteres cujo primeiro caractere seja qualquer um e a ltima letra seja A. String de trs caracteres cuja segunda letra seja A, independentemente do primeiro ou do ltimo caractere. Todos que tenham a letra A na penltima posio e a ltima seja qualquer outro caractere. Todos que tenham a letra A na segunda posio e o primeiro caractere seja qualquer um.

No exemplo seguinte, procuraremos todos os autores cujos nomes sejam iniciados com a letra R.
SELECT * FROM AUTOR WHERE Nome_Autor LIKE R%

Nessa busca sero localizados todos os autores que tenham a letra b na segunda posio da palavra:
SELECT * FROM AUTOR WHERE Nome_Autor LIKE _b%

Neste exemplo, buscaremos todos os autores com a letra C no incio e a letra R na terceira posio do nome:
SELECT * FROM AUTOR WHERE Nome_Autor LIKE C_r%

Neste prximo exemplo, utilizaremos o LIKE com nmeros Apenas os preos que comecem com o algarismo 1 e tenham apenas um algarismo aps o 1 sero retornados.
SELECT Codigo_CD, Nome_CD, Preco_Venda FROM CD WHERE Preco_Venda LIKE 1_%

Um problema que pode surgir quando queremos fazer buscas utilizando os caracteres de substituio t-los na cadeia de caracteres que est sendo pesquisada. Nesse caso, devemos avisar o banco de dados utilizando um caracter especial denominado ESCAPE. Dessa forma, o comando a seguir seria vlido e localizaria qualquer CD que tivesse no nome o caracter sublinha (_).
SELECT * FROM CD WHERE Nome_CD LIKE %\_% ESCAPE \

IN

Permite comparar o valor de um campo com um conjunto de valores. Normalmente, utilizamos o IN para substituir uma srie de comparaes seguidas da clusula OR. Note que apenas os autores cujo cdigo seja 1,10 ou 20 sero retornados.
SELECT * FROM AUTOR WHERE Codigo_Autor IN (1, 10, 20)

24

Funes de Grupo e Agrupamentos Funes de Grupo operam conjuntos de linhas visando a fornecer um resultado para o grupo. At agora trabalhamos apenas com funes que tratavam apenas uma linha de cada vez. A diferena bsica que sero utilizados grupos de linhas. Esses grupos podem ser constitudos desde toda a tabela at subgrupos da tabela. Funes de Grupo Existem diversas funes de grupo que so implementadas pelo padro SQL. Essas funes auxiliam a computar uma variedade de medidas baseadas em valores dos campos do banco de dados. As principais funes de grupo so:
Funes COUNT SUM AVG MIN MAX Ao Retorna o nmero de linhas afetadas pelo comando. Retorna o somatrio do valor dos campos especificados. Retorna a mdia aritmtica dos valores dos campos Retorna o menor valor do campo de um grupo de linhas Retorna o maior valor do campo de um grupo de linhas

COUNT

Diferentemente das outras funes de grupo, o COUNT retorna o nmero de linhas que atende a uma determinada condio. Podemos utiliz-lo com um asterisco entre parnteses, para indicar que queremos saber a quantidade total de linhas, independentemente de haver linhas com campos nulos ou no. Caso queiramos saber quantas linhas existem e quais destas no tm valor nulo em determinado campo, especificamos esse campo entre parnteses.
SELECT COUNT (*) FROM Gravadora

Aqui o total de registros que possuem Endereco:


SELECT COUNT (Endereo) FROM Gravadora

Efeito semelhante poderamos ter com o comando:


SELECT COUNT (*) FROM Gravadora WHERE Endereco IS NOT NULL Uma outra forma interessante de utilizar o COUNT acrescentando a ele uma clusula DISTINCT.

25

SELECT COUNT (DISTINCT Codigo_Musica) FROM Musica_Autor SUM

Retorna o valor total de um determinado campo em um determinado grupo de linhas. Assim, se quisermos saber o total do preo de venda dos CDs, utilizamos o comando:
SELECT SUM (Preco_Venda) FROM CD

Podemos realizar outros clculos baseados na somatria ou mesmo incluir outros campos e operaes no comando. Imaginando que se queira saber como ficariam os preos aps um aumento de 20%, temos o comando:
SELECT SUM (Preco_Venda) * 1.2 FROM CD

AVG

Extrai a mdia aritmtica de um determinado grupo de linhas. Para saber a mdia dos CDs da loja, execute o seguinte comando:
SELECT AVG (Preco_Venda) FROM CD

MIN

Retorna o menor valor de uma coluna em um grupo de linhas. Podemos utiliz-las para campos do tipo data ou alfanumricos. Para saber o preo de venda do CD mais barato da loja, execute o comando:
SELECT MIN (Preco_Venda) FROM CD MAX

Retorna o maior valor de uma coluna em um grupo de linhas. Igualmente ao MIN, pode-se utiliz-la para campos do tipo data ou alfanumricos. Para saber qual o CD mais caro da loja, execute o seguinte comando:
SELECT MAX (Preco_Venda) FROM CD SELECT MAX (Data_Lancamento) FROM CD SELECT MAX (Nome_CD) FROM CD

26

Converso de Tipos de Dados (CAST) Freqentemente necessrio realizar uma converso entre tipos de dados para determinadas situaes. Para isso, utilizamos a funo CAST. Sintaxe: CAST (dado_origem AS tipo_dado_destino)

No exemplo anterior, a mdia de preo de venda dos CDs utilizava diversas casas decimais. Seria desejvel que aparecessem apenas duas casas decimais. Isso pode ser feito convertendo o resultado para o formato decimal e utilizando apenas 2 casas depois da vrgula. O comando ficaria assim:

SELECT CAST (AVG(Preco_Venda) AS Decimal (10,2)) Coluna FROM CD

H outras situaes em que isso pode ser muito importante, como na converso de alfanumricos para data:
SELECT CAST (11/02/2002 AS Date) Coluna FROM DUAL

Podemos converter alfanumricos em numricos:


SELECT CAST (12 AS Integer) * 5 Coluna FROM Dual

Pesquisa em Mltiplas Tabelas Como visto anteriormente, a unio entre as Entidades do Modelo Lgico se d por meio de chaves primrias e estrangeiras. Essas chaves so, na representao Fsica do Modelo, os campos que as tabelas tm em comum. Vejamos formas de unir campos utilizando o comando SQL.

Unio de Tabelas Para realizar a unio de tabelas, basta acrescentarmos aps a clusula FROM do comando SELECT as tabelas que queremos unir. Devemos colocar na clusula WHERE a condio de unio das tabelas, ou seja, as respectivas chaves primrias e estrangeiras. Sintaxe:
SELECT tabela1.campo, tabela2.campo FROM tabela1, tabela2 WHERE tabela1.chaveprimaria = tabela2.chaveprimaria

possvel colocar diversas tabelas na clusula FROM. No devemos esquecer, porm, que necessrio especificar as chaves primrias e estrangeiras de cada relacionamento entre as tabelas.

27

Em caso de dvida, consulte o Modelo de Dados para estabelecer quais so os campos comuns entre as tabelas. A clusula WHERE deve conter obrigatoriamente todo o canal de relacionamento entre as tabelas listadas na clusula FROM. Se isso no acontecer, ocorrer o produto cartesiano. Nessa situao, as linhas da primeira tabela sero combinadas com as linhas da segunda tabela, demonstrando um resultado na maior parte das vezes indesejado. Para evitar esse problema os relacionamentos, entre todas as tabelas envolvidas, deve ser declarado no comando SELECT:
SELECT a.Nome_CD, b.Numero_Faixa, c.Nome_Musica FROM CD a JOIN FAIXA b JOIN MUSICA c WHERE a.Codigo_CD IN (1, 2)

Utilizando essa sintaxe, podemos determinar e influenciar o tipo de recuperao de informaes no banco de dados. No SQL, a ordem em que colocamos a seqncia das tabelas na clusula FROM determina as quais tabelas que sero pesquisadas primeiro. Logo, se colocarmos as tabelas menores primeiro a sua busca ficar mais rpida. Deixe as tabelas maiores, sempre que possvel, para o final da clusula. Unio de Tabelas Sem Colunas em Comum Existem situaes em que, mesmo no havendo um relacionamento explcito entre colunas de tabelas, h relacionamento de uma coluna com o intervalo de outras colunas em outra tabela. Por exemplo, a tabela CD_Categoria contm a menor e a maior faixa de preos de CD dividida por categoria. Como temos o preo dos CDs na tabela CD, fica claro que podemos definir a qual categoria pertence cada um dos CDs realizando uma busca nessas tabelas. Esse tipo de relacionamento no definido por uma igualdade, e sim por um intervalo. Para no gerar mais de uma linha para cada CD, certifique-se de que as faixas estejam bem definidas (tabela CD_Categoria). Caso haja possibilidade de um nico CD estar em duas faixas (preo maior e de uma faixa coincidir com o preo menor da prxima faixa), ele ser mostrado duas vezes. Exemplo:
SELECT a.Nome_CD, a.Preco_Venda, b.Codigo_Categoria FROM CD a, CD_CATEGORIA b WHERE a.Preco_Venda BETWEEN b.Menor_Preco AND b.Maior_Preco

Unies Externas (OUTER JOIN)

Quando uma linha no satisfaz a condio de unio entre as tabelas, a linha no ser mostrada no resultado da busca. Isso acontece porque o banco de dados, no podendo estabelecer a relao entre as colunas que esto sendo unidas na busca, coloca NULL onde o dado no existe.

28

SELECT a.Codigo_CD, a.Nome_CD, a.Codigo_Gravadora, b.Nome_Gravadora FROM CD a, Gravadora b WHERE a.Codigo_Gravadora = b.Codigo_Gravadora

Existem 3 formas de realizar a unio externa: Unio Externa Esquerda (LEFT OUTER JOIN)

A unio pela esquerda incluir linhas da primeira tabela na expresso de unio. Note que, caso voc esteja fazendo uma unio com chave primria de uma tabela com a respectiva chave estrangeira na outra e deixar a chave estrangeira esquerda, ser igual fazer uma unio regular (Inner Join) uma vez que no haver linhas opcionais na tabela da esquerda (pois ali est a chave primria).
SELECT a.Codigo_CD, a.Nome_CD, a.Codigo_Gravadora, b.Nome_Gravadora FROM CD a LEFT OUTER JOIN Gravadora b ON (a.Codigo_Gravadora = b.Codigo_Gravadora)

Nesse caso, sero retornados todos os CDs que possuem o cdigo da gravadora cadastrado e, tambm, os que o cdigo da gravadora no estiver na tabela Gravadora. Como foi definido o LEFT OUTER JOIN sero retornados todos os registros da tabela CD (que est esquerda) independente de existirem na tabela Gravadora.
Unio Direita (RIGHT OUTER JOIN)

Realiza a unio pela direita, ou seja, as linhas da segunda tabela sero includas na busca, mesmo sem haver o campo correspondente na primeira tabela. Da mesma forma que a unio esquerda, se voc colocar a tabela da chave estrangeira direita da busca, ter uma unio regular entre as tabelas.
SELECT a.Codigo_CD, a.Nome_CD, a.Codigo_Gravadora, b.Nome_Gravadora FROM CD a RIGHT OUTER JOIN Gravadora b ON (a.Codigo_Gravadora = b.Codigo_Gravadora)

Nesse caso, sero retornados todos os CDs que possuem o cdigo da gravadora cadastrado e, tambm, os que o cdigo da gravadora no estiver na tabela CD. Como foi definido o RIGHT OUTER JOIN sero retornados todos os registros cujo cdigo est na tabela Gravadora (que est direita) independente de existirem na tabela CD.
Unio Externa Total (FULL OUTER JOIN)

Realiza uma unio, independente de a coluna opcional estar direita ou esquerda. Tome cuidado ao utilizar esse tipo de unio, uma vez que, na busca, sero geradas linhas que no existem em uma, outra ou em ambas as tabelas.

29

SELECT a.Codigo_CD, a.Nome_CD, a.Codigo_Gravadora, b.Nome_Gravadora FROM CD a FULL OUTER JOIN Gravadora b ON (a.Codigo_Gravadora = b.Codigo_Gravadora) Unio de tabela com ela mesma (SELF JOIN)

Algumas vezes necessrio unir uma tabela a ela mesma por diversas razes. Veja o caso no qual se quer saber o nome do CD que foi indicado ao fazermos uma busca na tabela CD. Como esse uma autorelacionamento, necessrio que faamos uma busca na prpria tabela, para sabermos o nome do CD que foi indicado. Para fazer isso, coloca-se duas vezes o nome da tabela CD, mas com apelidos diferentes. A partir da, basta colocar a clusula de unio entre as tabelas na clusula WHERE:
SELECT a.Codigo_CD, a.Nome_CD, a.CD_Indicado, b.Nome_CD FROM CD a, CD b WHERE a.CD_Indicado = b.Codigo_CD

Controle Bsico de Transaes (COMMIT e ROLLBACK) Uma vez realizadas as operaes de Incluso, Alterao e Excluso, a modificao realizada no estar ainda no Banco de Dados. Ela visvel apenas na seo atual. Todas as modificaes podem ser efetuadas de duas formas no banco de dados: ou sero gravadas para que todos os usurios tenham acesso ou sero descartadas e nenhum usurio poder visualiz-las. Para que os comandos de incluso, alterao e excluso sejam definitivamente enviados ao banco de dados, necessrio utilizarmos o comando:
COMMIT Work;

Para que os comandos sejam descartados (sejam desfeitos) utilizamos o comando:


ROLLBACK Work;

30