Sunteți pe pagina 1din 30

CURSO TCNICO DE INFORMTICA DE GESTO

ANO 10. - TURMA: H

SISTEMAS DE INFORMAO

MDULO 2 Programao SQL

ANO LETIVO: 2016/2017 FORMADOR: Jorge S


Mdulo 2 - Programao SQL

ndice

Introduo........................................................................................................................................ 5
A quem se destina?.......................................................................................................................... 6
Onde que se pode utilizar?...........................................................................................................6
Quais so os objectivos do SQL?....................................................................................................6
Quais so as caractersticas do SQL?.............................................................................................7
A clusula de seleco Select........................................................................................................8
Operadores especiais utilizados em SQL.........................................................................................9
A clusula de ordenao (Order By)............................................................................................11
Seleco de expresses................................................................................................................11
Eliminao de repeties............................................................................................................... 12
Juno de tabelas.......................................................................................................................... 12
Tipos de Junes Joins................................................................................................................ 12
Funes Agregadas....................................................................................................................... 15
Agrupamento de informao.......................................................................................................... 16
Agrupamentos e o valor Nul........................................................................................................ 18
Ordenao de Grupos.................................................................................................................... 18
Sub-Consultas (SubQuerys)........................................................................................................18
Manipulao de Dados (DML)........................................................................................................22
Insero de registos simples.......................................................................................................... 22
Insero de conjuntos de registos..................................................................................................22
Actualizao de registos................................................................................................................ 23
Eliminao de registos................................................................................................................... 23
Manipulao de datas.................................................................................................................... 24
Criao e manuteno de tabelas (DDL).......................................................................................24
Criar uma base de dados............................................................................................................... 24
Eliminar uma base de dados.......................................................................................................... 24
Criar uma tabela............................................................................................................................. 25
Tipos de dados............................................................................................................................... 25
Valores por defeito......................................................................................................................... 27
Valores a admitir (restries).......................................................................................................... 27
Criao de tabelas a partir de outras tabelas.................................................................................28
Alterar a estrutura de uma tabela...................................................................................................28
Eliminar uma tabela....................................................................................................................... 29
Vises (Views) em SQL (SQLServer e Oracle)............................................................................29
Juntando vrias tabelas numa View (SQLServer e Oracle).........................................................30
Clusula With Check Option (SQLServer e Oracle).....................................................................30
Eliminar Vises (SQLServer e Oracle)...........................................................................................31
Criao de ndices......................................................................................................................... 31
Eliminao de ndices.................................................................................................................... 32

Formador: Jorge S Curso - Tcnico de Informtica de Gesto 2/30


Mdulo 2 - Programao SQL

Introduo
Quando as Bases de Dados Relacionais estavam a ser desenvolvidas, foram criadas linguagens
destinadas sua manipulao. O Departamento de Pesquisas da IBM, desenvolveu o SQL (l-se
SEQUEL) como interface para o sistema de BD relacional denominado SYSTEM R, no incio dos
anos 70. Em 1986 o American National Standard Institute (ANSI), publicou um padro SQL.
O SQL estabeleceu-se ento como linguagem padro das Bases de Dados Relacionais.
O SQL apresenta uma srie de comandos que permitem a definio dos dados, chamada de DDL
(Data Definition Language), composta entre outros pelos comandos Create, que destinado
criao da Base de Dados, das Tabelas que o compe, alm das relaes existentes entre as
tabelas. Como exemplo de comandos da classe DDL temos os comandos Create, Alter e
Drop.
Os comandos da srie DML (Data Manipulation Language), destinados a consultas, inseres,
excluses e alteraes em um ou mais registros de uma ou mais tabelas de maneira simultnea.
Como exemplo de comandos da classe DML temos os comandos Select, Insert, Update e
Delete.
Uma subclasse de comandos DML, a DCL (Data Control Language), dispe de comandos de
controlo como Grant e Revoke.
A Linguagem SQL tem como grandes virtudes a capacidade de gerir ndices, sem a necessidade
de controlo individualizado de ndice corrente, algo muito comum nas linguagens de manipulao
de dados do tipo registro a registro. Outra caracterstica muito importante disponvel em SQL
sua capacidade de construo de vises, que so formas de visualizarmos os dados na forma de
listagens independente das tabelas e organizao lgica dos dados.
Outra caracterstica interessante na linguagem SQL a capacidade que dispomos de cancelar
uma srie de actualizaes ou de as gravarmos, depois de iniciarmos uma sequncia de
actualizaes. Os comandos Commit e Rollback so responsveis por estas facilidades.
Devemos notar que a linguagem SQL consegue implementar estas solues, somente pelo facto
de estar baseada em Base de Dados, que garantem por si mesmo a integridade das relaes
existentes entre as tabelas e seus ndices.

Algumas siglas usadas:


SQL - Linguagem Estruturada de Consulta
BD - Base de Dados
SGBDR - Sistemas de Gesto de Base de Dados Relacionais
DML - Linguagem de Manipulao de Dados
DDL - Linguagem de Definio de Dados

Formador: Jorge S Curso - Tcnico de Informtica de Gesto 3/30


Mdulo 2 - Programao SQL

No sendo considerada uma linguagem de programao, no contempla:


Variveis;
Arrays;
Estruturas de deciso (SE Ento Seno);
Estruturas iteractivas (Fazer Para, Fazer Enquanto, Repetir At);
Funes e procedimentos, entre outros.

A quem se destina?
Esta linguagem destina-se essencialmente a programadores, administradores de base de dados,
gestores, estudantes e utilizadores em geral.

Onde que se pode utilizar?


O SQL pode ser utilizado directamente nos SGBDR existentes, ou ento, pode ser
embutido/embebido em linguagens/tecnologias, tais como:
Linguagens de programao tradicionais: Basic, Pascal, C, Cobol, Perl, etc;
Linguagens de programao orientadas a objectos e conduzidas por eventos: Visual Basic,
Delphi, Java, C++, etc;
Tecnologias servidoras usadas na construo de websites dinmicos: PHP, ASP, ASP.NET,
ColdFusion, JSP, PERL/CGI, Python, etc,

Quais so os objectivos do SQL?


O SQL visa permitir a manipulao/acesso aos dados existentes em base de dados, servindo de
interface entre o utilizador e o SGBD.

Formador: Jorge S Curso - Tcnico de Informtica de Gesto 4/30


Mdulo 2 - Programao SQL

Quais so as caractersticas do SQL?


Implementao dos conceitos definidos no Modelo Relacional;
Reduo de incompatibilidades entre sistemas e evitar que se opte por arquitecturas
proprietrias que implicam maiores custos de desenvolvimento e um maior esforo financeiro
e humano;
Torna-se ento possvel:
o Criar, alterar e remover componentes duma BD (tabelas, vistas e ndices);
o Inserir, alterar e apagar dados;
o Interrogar a base de dados;
o Controlar o acesso dos utilizadores BD e as operaes a que cada um deles
pode ter acesso;
o Obter a garantia de consistncia e integridade dos dados.

Dos principais SGBDR conhecidos do mercado actual, de destacar o Access, SQL Server,
MySQL, Oracle, SQL AnyWhere, Informix, Paradox, entre outros.
Salienta-se contudo que, as verses de SQL utilizadas nestas diferentes plataformas, diferem
ligeiramente (em determinadas operaes), visto haver ainda algumas situaes que passam pela
utilizao de comandos proprietrios. Exemplos: SQL Jet no Access, SQL Plus no Oracle, SQL
Transact no SQL Server. O SQL aqui abordado passar essencialmente por demonstrar a
utilizao do SQL Standard, que reconhecido na totalidade em qualquer uma das plataformas
supra mencionadas. No entanto, isto no inviabiliza o facto de em algumas
situaes/consideraes ser feito uma meno a alguns comandos, ditos proprietrios. Aconselha-
se, pois, a consultar a documentao nas plataformas que vier a utilizar para um conhecimento
mais detalhado e aprofundado da sintaxe em questo.

Como sabido, uma tabela ou entidade num SGBDR constituda por linhas (registos ou tuplos)
e colunas (campos ou atributos), em que as tabelas so identificadas inequivocamente atravs de
chaves primrias e, possivelmente, relacionadas entre si.
O SQL usa na sua sintaxe comandos para interagir com as BD, fazendo permanentemente
interrogaes s mesmas. Estes comandos so designados por clusulas.

Formador: Jorge S Curso - Tcnico de Informtica de Gesto 5/30


Mdulo 2 - Programao SQL

A clusula de seleco Select


Este comando essencialmente utilizado para efectuar o pedido de consultas/listagem de dados,
com ou sem base em critrios (condies), podendo-se para tal, ter que beber em mltiplas
fontes/origens, que so, nada mais, nada menos, que tabelas interligadas entre si.

Sintaxe geral:
Select campo1, campo2, , campoN ou *
From tabela1, , tabelaN
[Where condio]
[Group By]
[Having]
[Order By]

Nota: O smbolo * representa tudo (todos os campos); os comandos entre [ ] so opcionais, pois
nem sempre esto presentes numa consulta. Se tivermos que utilizar todos estes comandos numa
consulta, a ordem sequencial dos mesmos ter que ser respeitada!
Vamos supor que temos definido numa base de dados as tabelas Pessoa, Postal, Comissao e
Mensagem, com as relaes indicadas e constitudas pelos seguintes campos:

Formador: Jorge S Curso - Tcnico de Informtica de Gesto 6/30


Mdulo 2 - Programao SQL

Os exemplos seguintes seriam obviamente equivalentes:

Select Codigo, Local Select *


From Postal From Postal

A ordem pela qual so enumerados os campos, assim como a sua escrita em


maisculas/minsculas determina a forma de apresentao dos resultados listados.

H dois conceitos que importa desde j explicar. Quando se fala de projeco, estamos
interessados em obter apenas algumas das colunas da(s) tabela(s). Quando se fala de restrio,
estaremos interessados em efectuar algum tipo de filtragem aos dados, restringindo o n. de
linhas a mostrar/visualizar. Neste ltimo caso, teremos que usar a clusula Where.

Operadores Relacionais: =, >, <, >=, <=, <> ou != (diferente, em algumas verses de SQL).
Operadores Lgicos: And (E), Or (Ou), Not (No).

Problemas:
1. Seleccionar todas as pessoas com menos de 35 anos de idade.
2. Seleccionar o nome e salrio de todas as pessoas com idade para votar.
3. Seleccionar as pessoas com idades compreendidas entre os 30 e os 45 anos de idade.
4. Seleccionar as pessoas cujas idades no esto compreendidas entre os 30 e os 45 anos de
idade.

Operadores especiais utilizados em SQL


1. Between (valores compreendidos num dado intervalo)
Sintaxe:
Select ..
From
Where campo [Not] Between valor 1 and valor2

2. In (permite especificar conjuntos de valores)


Sintaxe:
Select ..
From
Where campo [Not] In (valor1, , valorN)

Formador: Jorge S Curso - Tcnico de Informtica de Gesto 7/30


Mdulo 2 - Programao SQL

3. Is
Operador bastante utilizado no tratamento de nulos.
As BDR contm um valor especial NULL que pode ser atribudo a qualquer tipo de dados. Esse
valor, quando presente num campo, indica a ausncia de valor.
As comparaes de valores com NULL so feitas com o operador Is.
Sintaxe:
Select ..
From
Where campo Is [Not] Null

4. Like (permite fazer comparaes entre strings)


Utilizam-se dois caracteres especiais (os wildcards do MS-DOS):
* (qualquer string de zero ou mais caracteres) ou % noutras verses de SQL.
? (um caracter qualquer) ou _ (underscore) noutras verses de SQL.
Sintaxe:
Select ..
From
Where campo like ..

Problemas:
1. Seleccionar pessoas com idades compreendidas entre 20 e 50, utilizando o operador
Between.
2. Seleccionar os cdigos postais completos de Lisboa e Porto.
3. Seleccionar os cdigos postais completos que no sejam nem 1000, 4000 e 4760.
4. Seleccionar os nomes das pessoas que no possuem telefone.
5. Seleccionar os nomes das pessoas que possuem telefone.
6. Seleccionar todas as pessoas cujo nome comea por J.
7. Seleccionar todas as pessoas cujo nome contenha a palavra Manuel.
8. Seleccionar todas as pessoas cuja 2. letra do nome um a.

Formador: Jorge S Curso - Tcnico de Informtica de Gesto 8/30


Mdulo 2 - Programao SQL

Precedncia de operadores: (), * /, + -, Not, And, Or


Exemplo:
Select *
From Pessoa
Where Idade <= 27 or Idade => 30 and Telef is Null

A clusula Where de cima equivalente a: Where Idade <= 27 or (Idade >= 30 and Telef is Null).

A clusula de ordenao (Order By)


A ordenao em SQL baseada no valor do cdigo ASCII de cada caracter. Logo:
0<<9<A<Z<a<z

Alguns sistemas so case-sensitive, outros no.

Sintaxe:
Select .
From .
Order By campo1 [ASC | DESC], , campoN [ASC | DESC]

Problemas:
1. Seleccionar todas as pessoas, ordenando o resultado pelo campo Idade.
2. Seleccionar o nome e o salrio de todas as pessoas, ordenando o resultado pelos
salrios mais elevados.
3. Seleccionar todo o contedo da tabela de Comisses, ordenado por ID e ID_MSG.
4. Seleccionar da tabela de Comisses, as linhas cujo ID menor que 40, ordenadas,
dentro de cada ID, pela coluna valor de forma descendentemente.

Seleco de expresses
Podemos efectuar clculos a nvel de operaes aritmticas na clusula Select.
Exemplo:
1. Seleccionar o nome, idade actual e idade que iro ter daqui a 1 ano de todas as pessoas
registas na BD.
Select Nome, Idade, Idade+1 As [Idade para o ano]
From Pessoa
O operador AS entendido como sendo uma aliase.

Formador: Jorge S Curso - Tcnico de Informtica de Gesto 9/30


Mdulo 2 - Programao SQL

Problema:
1. Seleccionar da tabela de Comisses, o valor bruto a receber, o montante do IVA (23%) e o
valor lquido para os indivduos cujo ID igual a 14 e 25, ordenando o resultado pelo campo
ID.
A listagem obtida dever ter o seguinte aspecto:

ID LIQUIDO IVA BRUTO

Eliminao de repeties
possvel em SQL eliminar linhas repetidas na visualizao de registos, usando para o efeito a
palavra reservada Distinct. Os dados obtidos ficam automaticamente ordenados.

Exemplo:
Select Distinct Local
From Postal

Juno de tabelas
O Join (ligao) entre tabelas permite extrair, num nico Select, qualquer informao contida
em diferentes tabelas.
A ligao entre tabelas feita atravs de chaves primrias na origem e chaves estrangeiras no
destino. Recordando o conceito de chave estrangeira (Foreign Key): trata-se de um campo ou
conjunto de campos existentes numa tabela, que permite ligar os dados desta tabela a outra
tabela, onde este mesmo conjunto de campos existe como chave primria.

Sintaxe:
Select campo1, , campoN, *
From tabela1, , tabelaN
Tipos de Junes Joins
1. Cross Join (Produto Cartesiano): associa a cada linha de uma tabela o conjunto de linhas
de outra tabela. Nota: Pouco usado.

Exemplo:
Select *
From Pessoa, Postal

Formador: Jorge S Curso - Tcnico de Informtica de Gesto 10/30


Mdulo 2 - Programao SQL

Se a tabela Pessoa tivesse 7 registos e a Postal tivesse 9 registos, seriam obtidos 63


registos.

2. Equi Join: obtm-se duas colunas com a mesma informao.


Exemplo:
Select *
From Pessoa, Postal
Where Cod_Postal=Codigo

3. Natural Join: existe quando todas as colunas envolvidas na ligao entre as tabelas so
apresentadas sem repetio de colunas.
Exemplo:
Select Pessoa.*,Postal.Local
From Pessoa, Postal
Where Cod_Postal=Codigo

4. Inner Join: juntam-se duas ou mais tabelas, ligando-as atravs da chave primria de uma e
da chave estrangeira da outra. Os dois tipos anteriores fazem parte deste tipo de ligao.
Nota: O mais usado de todos.
Exemplo:
Select Nome,Cod_Postal,Local
From Pessoa, Postal
Where Cod_Postal=Codigo

Podamos tambm substituir o campo Cod_Postal em cima pelo campo Codigo, visto as
duas tabelas estarem relacionadas atravs deles.

Em determinados sistemas, o cdigo de cima substitudo por outro:


Select Nome,Cod_Postal,Local
From Pessoa Inner Join Postal
On Pessoa.Cod_Postal=Postal.Codigo

A juno de N tabelas num nico Select obriga colocao de, pelo menos, N-1 condies de
juno.

Formador: Jorge S Curso - Tcnico de Informtica de Gesto 11/30


Mdulo 2 - Programao SQL

Problemas:
1. Seleccionar os nomes e as localidades das pessoas que no possuem telefone.
2. Seleccionar o ID das pessoas, seus nomes e valor de todas as comisses ganhas.
3. Seleccionar o nome das pessoas e o valor das comisses, ordenando o resultado pelo nome e
colocando os maiores valores de comisso no topo do resultado de cada indivduo.
4. Seleccionar todas as comisses, o seu destinatrio e a descrio da operao que reflectem.
O resultado dever aparecer ordenado por nome.

5. Outer Join: permite que a totalidade das linhas de uma tabela seja obtida, ainda que no
exista o correspondente valor na outra tabela a que esta est ligada.
Exemplo: Todos os cdigos postais e respectivas pessoas, mesmo para aqueles cdigos que
no estejam associados a nenhuma pessoa em particular.
Select Nome, Cod_Postal, Codigo, Local
From Postal Left Join Pessoa
On Postal.Codigo=Pessoa.Cod_Postal

O Outer Join pode ser realizado esquerda ou direita, isto , quando se faz a ligao entre
duas tabelas, ir mostrar-se respectivamente, todo o contedo da tabela da esquerda e
respectiva ligao tabela da direita ou vice-versa.
Quando o Outer Join realizado direita, so considerados todos os registos da tabela da
direita e apenas os registos correspondentes na tabela da esquerda.
Exemplo:
Select Nome, Valor
From Comissao Right Join Pessoa
On Comissao.ID=Pessoa.ID

6. Union: permite juntar o contedo de mltiplos comandos Select


Exemplo: Juntar o cdigo e a descrio associados s mensagens e aos cdigos postais.
Select ID_Msg, Mensagem
From Mensagem
Union
Select Codigo, Local
From Postal

O n. de campos a seleccionar em cada um dos comandos Select tem que ser igual. Se se
pretender juntar tabelas que no possuam o conjunto de campos necessrio, devemos adicionar a
constante Null seleco. O nome das colunas na listagem final, o que resulta do 1. Select.

Formador: Jorge S Curso - Tcnico de Informtica de Gesto 12/30


Mdulo 2 - Programao SQL

Cada Select pode conter a sua prpria clusula Where, no entanto, s poder existir uma nica
clusula Order By no ltimo Select, sendo a ordenao aplicada a todo o resultado final. Por
defeito, um Union remove sempre as linhas duplicadas.

Problemas:
1. Juntar as tabelas Postal com os locais contendo a string Ar e Mensagem, com os
IDs de mensagem <= 50. Ordenar o resultado pela coluna das descries das
mensagens.
2. Unir o contedo da tabela Postal ao da tabela Pessoa.

7. Intersect e Minus (apenas no SQL Plus - Oracle)


O operador Intersect permite juntar o resultado de dois comandos Select, apresentando
apenas as linhas que resultam de ambos os comandos.
O operador Minus devolve os registos que resultam do primeiro Select e que no aparecem
no segundo.

Funes Agregadas
O uso de funes agregadas ou estatsticas permite obter informao sobre conjuntos de linhas
especificados na clusula Where ou sobre grupos de linhas indicados na clusula Group By.

Funo Descrio
Count Devolve o n. total de linhas (registos)
Max Devolve o maior valor de uma coluna
Min Devolve o menor valor de uma coluna
Sum Devolve a soma de todos os valores de uma coluna
Avg Devolve a mdia de todos os valores de uma coluna

A funo agregada Count possui as seguintes variantes:


Count(*) Devolve o n. de linhas que resulta dum Select.
Count(campo) Devolve o n. de ocorrncias na coluna diferentes de Null.
Count(Distinct campo) Devolve o n. de ocorrncias (sem repeties) de uma coluna; o Access
no permite esta forma!

Problemas:
1. Quantas pessoas existem na BD?
2. Qual o n. total de pessoas e quantas possuem telefone?
3. Quantas pessoas no possuem telefone?
4. Quantas comisses tm valores superiores a 1000?
5. Quantos so os IDs envolvidos na tabela de Comisses?

Formador: Jorge S Curso - Tcnico de Informtica de Gesto 13/30


Mdulo 2 - Programao SQL

6. Qual o valor do maior salrio pago?


7. Qual a idade da pessoa mais nova?
8. Qual o menor e maior valor de comisso superior a 1000 e inferior a 5000?
9. Qual o valor total das comisses a pagar?
10. Qual o valor total das comisses a pagar aos indivduos que moram em Lisboa?
11. Qual o valor total das comisses e IVA (23%) a pagar?
12. Qual a mdia de idades das pessoas registadas na BD?
13. Qual o salrio mdio das pessoas com mais de 30 anos?
14. Qual a comisso mdia da pessoa com o ID 14?

Nota: A funo Round permite aplicar um arredondamento sada dos resultados.


Exemplo:
Select Round(Avg(Salario),2) As Media_Salario
From Pessoa

Agrupamento de informao
Os conceitos de agrupamento de dados so fundamentais na maior parte das consultas
efectuadas a Base de Dados Relacionais.
Vejamos os dois seguintes exemplos em que no existe qualquer tipo de agrupamento:

Select ID, Valor Mostra o valor das comisses existentes na


From Comisso BD; da listagem obtm-se a totalidade das
Order By ID linhas contidas na tabela das Comisses.
Select Sum(Valor) As Total Devolve unicamente o total global de toda a
From Comissao tabela.

A clusula Group By est ligada s funes de agregao, permitindo agrupar a informao e


obter valores estatsticos sobre os grupos formados.
Se um comando Select tiver a clusula Group By, ento todas as colunas seleccionadas tero
que estar presentes na clusula Group By.

Exemplos:
1. Mostrar para cada ID, o valor total das comisses.
Select ID, Sum(Valor) As Total
From Comisso
Group By ID
2. Mostrar para cada pessoa, o valor total das comisses.
Select Nome, Sum(Valor) As Total
From Pessoa P,Comissao C

Formador: Jorge S Curso - Tcnico de Informtica de Gesto 14/30


Mdulo 2 - Programao SQL

Where P.ID=C.ID
Group By Nome

Problemas:
1. Mostrar o valor total (salrio+comisses) a receber por cada pessoa.
2. Seleccionar a maior comisso de cada ID.
3. Seleccionar o n. de comisses de cada ID.
4. Mostrar o valor total e o n. das comisses sobre Vendas a receber por cada pessoa,
indicando tambm o local onde essa pessoa vive.

Se num Select com a clusula Group By no houver nenhuma funo de agregao, ento
estamos perante um Select Distinct.

Exemplo:
Select ID Select Distinct ID
From Comissao From Comissao
Group By ID

A clusula Having permite aplicar restries ao nvel dos grupos que so processados.
Exemplo:
1. Mostrar o valor total de cada comisso agrupada por ID, seleccionando apenas os IDs com
comisses totais maiores que 1000.
Select ID, Sum(Valor) As Total
From Comissao
Group By ID
Having Sum(Valor)>1000

Notas: Usa-se a clusula Where sempre que se pretende restringir os registos a considerar na
seleco. Usa-se a clusula Having para restringir o conjunto dos grupos de registos a
considerar.

Problemas:
1. Seleccionar o nome de todas as pessoas que tenham alguma mensagem com ID_Msg > 35.
2. Qual o total das comisses agrupadas por ID, considerando apenas aquelas de valor > 1000.
3. Qual o total das comisses agrupadas por ID, considerando apenas aquelas cujo valor total >
1000.

Formador: Jorge S Curso - Tcnico de Informtica de Gesto 15/30


Mdulo 2 - Programao SQL

Agrupamentos e o valor Nul


Num Select com a clusula Group By, se existirem Nulos na coluna ou colunas de
agrupamento, estas devero ser agrupadas.
Exemplo:
1. Seleccionar os vrios grupos de telefones.
Select Telef, Count(*) As Conta
From Pessoa
Group By Telef

Ordenao de Grupos
Pode-se efectuar a ordenao por colunas, expresses ou pela ordem da coluna ou expresso
seleccionada.
Exemplos:
1. Ordenao por coluna
Select ID, Count(ID) As Conta
From Comissao
Group By ID
Order By ID

2. Ordenao por uma expresso ou funo de agregao


Select ID, Count(ID) As Total
From Comissao
Group By ID
Order By Count(ID)

3. Ordenao pela ordem duma coluna ou expresso


Select ID, Count(ID) As Total
From Comissao
Group By ID
Order By 2 Desc

Sub-Consultas (SubQuerys)
O resultado do comando Select sempre uma tabela, ainda que da sua execuo no resulte
qualquer linha/registo.
Um subquery consiste num comando Select dentro doutro.
Um comando Select pode ser colocado:
dentro doutro nas clusulas Where, Having, Select e From;

Formador: Jorge S Curso - Tcnico de Informtica de Gesto 16/30


Mdulo 2 - Programao SQL

nos comandos Insert, Upate e Delete que iremos ver mais frente;
na definio de vistas (Views), que iremos tambm ver mais frente.

Exemplo:
1. Qual o nome da pessoa que aufere o menor salrio?
Select Nome
From Pessoa
Where Salario=(Select Min(Salario) From Pessoa)

O resultado da utilizao de comandos Select dentro doutros composto unicamente pelas


colunas (campos) seleccionadas(os) no Select exterior.

Quando um Select contm outro Select encadeado, por vezes, pode acontecer que o Select
interior necessite de valores do Select exterior.
Exemplo:
1. Qual o nome das pessoas cujo salrio menor que 15 vezes o conjunto das suas comisses?
Select Nome,Salario
From Pessoa P
Where Salario<15*(Select Sum(Valor) From Comissao C Where C.ID=P.ID)

Para cada pessoa estudada no Select exterior, executado o Select interior calculando o total
das comisses que lhe esto associadas.
Ao Select exterior chama-se Outer Select.
Ao Select interior chama-se Inner Select.
A sub-query (colocada entre parntesis) que depende, para o seu funcionamento, de valores da
query mais exterior chama-se Query correlacionada. Se no depender, diz-se que no
correlacionada.
A utilizao de operadores lgicos e relacionais na comparao com o resultado duma subquery
obriga a que esta ltima devolva apenas uma nica linha de resultado. Caso contrrio, obtm-se
um erro.

Exemplos:
1. Seleccionar o nome das pessoas que vivem na localidade com o maior cdigo postal.
Select Nome
From Pessoa
Where Cod_Postal=(Select Max(codigo) From Postal)

Formador: Jorge S Curso - Tcnico de Informtica de Gesto 17/30


Mdulo 2 - Programao SQL

2. Qual o nome e respectivo salrio do indivduo mais bem remunerado?


Select Nome,Salario
From Pessoa
Where Salario=(Select Max(Salario) From Pessoa)

O operador In
Verifica se um valor existe no resultado duma subquery, devolvendo True ou False.
Exemplo:
1. Qual o conjunto de pessoas que vivem em Lisboa?
Select Nome, Cod_Postal
From Pessoa
Where Cod_Postal In (Select Codigo From Postal Where Local=Lisboa)

O operador Exists
S pode ser usado para avaliar o resultado de subqueries; o seu objectivo verificar se, da
execuo da subquery, resultou ou no alguma linha de resultado, devolvendo True ou False.
Sintaxe:
Select .
From ..
Where [Not] Exists (Subquery)

Exemplos:
1. Seleccionar o nome e a morada completa de todas as pessoas que tm comisses a receber.
a. Usando a juno de tabelas:
Select Distinct Nome, Cod_Postal, Local
From Pessoa,Postal,Comissao
Where Cod_Postal=Codigo and Comissao.ID=Pessoa.ID

Apenas os registos que existirem nas 3 tabelas sero mostrados.


b. Usando o operador In numa subquery correlacionada:
Select Nome, Cod_Postal, Local
From Pessoa,Postal
Where Cod_Postal=Codigo and ID In (Select ID From Comissao Where ID=Pessoa.D)

c. Usando o operador In numa subquery no correlacionada:


Select Nome, Cod_Postal, Local
From Pessoa,Postal

Formador: Jorge S Curso - Tcnico de Informtica de Gesto 18/30


Mdulo 2 - Programao SQL

Where Cod_Postal=Codigo and ID In (Select ID From Comissao)

d. Usando o operador Exists:


Select Nome, Cod_Postal, Local
From Pessoa,Postal
Where Cod_Postal=Codigo and Exists (Select ID From Comissao Where ID=Pessoa.ID)

Se colocarmos Not Exists, obteremos aqueles que no tm qualquer comisso a receber.

Exemplos:
1. Seleccionar todos os cdigos e respectivas localidades que no esto associados a nenhuma
pessoa.
Select *
From Postal
Where Not Exists (Select * From Pessoa Where Cod_Postal=Codigo)

2. Seleccionar todas as linhas da tabela Postal cujo cdigo menor ou igual que 5000 e
simultaneamente maior ou igual que 3000.
Select *
From Postal P
Where Codigo<=5000 and Exists (Select * From Postal Where Codigo>=3000 and
Codigo=P.Cod_Postal)

Os operadores All e Any


Exemplos:
1. Seleccionar o nome e idade de todas as pessoas que no vivem em Lisboa.
Select Nome,Idade
From Pessoa
Where Cod_Postal <> All (Select Codigo From Postal Where Local=Lisboa)

Ou

Select Nome,Idade
From Pessoa
Where Cod_Postal = Any (Select Codigo From Postal Where Local<>Lisboa)

Formador: Jorge S Curso - Tcnico de Informtica de Gesto 19/30


Mdulo 2 - Programao SQL

Manipulao de Dados (DML)


Constituda pelas clusulas Select, Insert, Update e Delete.

Insero de registos simples


Sintaxe:
Insert Into Tabela(campo1, , campoN) Values(valor1, , valorN)
ou
Insert Into Tabela Values(valor1, , valorN) => se introduzirmos todos os valores na tabela.
Problemas:
1. Introduzir na tabela Postal uma linha com os valores 4470 e Maia.
2. Introduzir na tabela Pessoa um registo com o seguinte contedo:
999, Joaquim Almeida, 55, 2000, 4100

Nota: As colunas que no forem colocadas no comando Insert so preenchidas com o valor
Null.

Ocorrncia de possveis falhas:


Tentar inserir mais do que uma vez a mesma chave primria;
Tentar inserir mais do que uma vez o mesmo valor num campo com ndice nico;
Tentar inserir o valor Null num campo de preenchimento obrigatrio.

Cuidados a ter:
Manter a compatibilidade de tipos de dados;
Manter o n. de colunas iguais.

Insero de conjuntos de registos


Mtodo usado para inserir numa tabela conjunto de registos que existem noutras tabelas.
Sintaxe:
Insert Into Tabela(campo1, , campoN)
Select .

Exemplo:
1. Inserir na tabela Postal, o ID e Nome de todas as pessoas (algo estranho, mas que
comprova este facto) => J funciona no SQL Server 2005
Insert Into Postal(Codigo,Local) Insert Into Postal
Select ID, Nome Select ID As Codigo, Nome As Local From Pessoa
From Pessoa

Formador: Jorge S Curso - Tcnico de Informtica de Gesto 20/30


Mdulo 2 - Programao SQL

Cuidados a ter:
Manter o n. de colunas igual;
Manter compatibilidade de tipos de dados;
O comando Select no pode conter a tabela em que se est a fazer a insero.

Actualizao de registos
Sintaxe:
Update tabela [Aliase]
Set campo1={expresso1,query1},
.
.
campoN={expressoN,queryN}
[Where condio]

Exemplo:
1. Aumentar o salrio 10% a todas as pessoas
Update Pessoa
Set Salario=Salario*1.1

Problemas:
1. Aumentar o salrio 20% ao Paulo Viegas e adicionar mais 1 ano sua idade.
2. Adicionar o prefixo 1 ao telefone de todas as pessoas que tm telefone e que vivem em
Lisboa.

Eliminao de registos
Apaga linhas completas duma determinada tabela.
Sintaxe:
Delete From Tabela
[Where condio]

Problemas:
1. Eliminar o registo do Sr. Joaquim Almeida.
2. Apagar as localidades da tabela Postal que no esto associadas a nenhuma pessoa.

Nota: Ateno Integridade Referencial! Cuidado ao remover as linhas da tabela Postal que
possuem cdigos postais associados na tabela Pessoa.

Formador: Jorge S Curso - Tcnico de Informtica de Gesto 21/30


Mdulo 2 - Programao SQL

Manipulao de datas
Cada um dos diferentes SGBDR representa e manipula de forma distinta datas e horas.
Exemplos:
Inserir uma data de nascimento (2/Julho/1979) numa tabela:
Insert Into Tabela(Num,Nome,Data_Nasc) Values (1,Carlos Sousa,#07/02/1979#) => Access
Insert Into Tabela(Num,Nome,Data_Nasc) Values (1,Carlos Sousa,02 Jul 1979) => SQLServer

Criao e manuteno de tabelas (DDL)


Constituda pelas clusulas Create, Alter e Drop.

Criar uma base de dados


A generalidade dos SGBDR disponibiliza utilitrios que permitem a criao de BD.
possvel em alguns casos, usar o comando: Create Database NomeBD => SQLServer, Oracle e
MySQL.
O seguinte comando cria uma base de dados no SQLServer, chamada mydb que vai ser
guardada num ficheiro mydb.mdf:

CREATE DATABASE mydb ON (NAME = 'mydb_dat',FILENAME = 'C:\Programas\Microsoft SQL


Server\MSSQL.1\MSSQL\Data\mydb.mdf')

O ficheiro vai ter o nome lgico de mydb_dat no caso de ser preciso referenci-lo num script de
SQL mais tarde.

Notas: Apesar desses utilitrios fornecerem ambientes grficos amigveis, existem situaes em
que absolutamente necessrio efectuar a criao da BD atravs de um Script (ficheiro externo
com comandos de SQL), incluindo muitas vezes a criao das tabelas, ndices e mesmo o
eventual carregamento de dados.

Eliminar uma base de dados


Sintaxe:
Drop Database NomeBD

Exemplo:
DROP DATABASE mydb
Alguns sistemas no disponibilizam este comando.

Formador: Jorge S Curso - Tcnico de Informtica de Gesto 22/30


Mdulo 2 - Programao SQL

Criar uma tabela


Sintaxe:
Create Table Tabela(campo1 tipodados, , campoN tipodados)

Exemplo:
Create Table Empregado(ID int, Nome text, DataNasc datetime, Salario float)

Tipos de dados
Strings;
Numricos;
Data e Hora.

Vejamos de seguida alguns dos principais tipos de dados encontrados na maioria dos SGBDR.

Formador: Jorge S Curso - Tcnico de Informtica de Gesto 23/30


Mdulo 2 - Programao SQL

Tipos de Dados Descrio


character(n) ou char(n) String de comprimento fixo
varchar(n) String de comprimento varivel (n>0)
nvarchar(n) String de comprimento varivel at um limite de n=4000 caracteres
(1 por defeito)
nchar(n) String de comprimento fixo at um limite de n=4000 caracteres (1
por defeito)
Text Dados de comprimento varivel, mximo 231-1 (2,147,483,647)
caracteres
Bit True ou False
bit(n) String com n Bits (n>0) - comprimento fixo
numeric ou numeric(n) ou Valor numrico constitudo por n dgitos e sinal e com d casas
numeric(n,d) ou number decimais (0<=d<=n; n>0)
integer ou int Inteiro com sinal
smallInt Inteiro pequeno com sinal
Tinyint Inteiro compreendido entre 0 e 255
Float N. de dupla preciso (vrgula flutuante)
Real N. de vrgula flutuante desde -3.40x1038 at 3.4038
date / time Data / Hora
Datetime Data e Hora
Smalldatetime Data e hora entre 1 de Janeiro de 1900 e 6 de Junho de 2079, com
preciso de 1 minuto
Money Serve para representar valores monetrios
Smallmoney Valores monetrios desde -214,748.3648 at +214,748.3647.
Sinnimo de decimal(10,4)
Counter Incremento automtico (no Access)
Identity Incremento automtico (no SQLServer)
auto_increment Incremento automtico (no MySQL)
enum('valor1',, 'valorN') Lista de opes. Ex: enum(M,F)
Image Dados binrios de comprimento varivel, mximo 231-1
(2,147,483,647) bytes
binary(n) Dados binrios
decimal(preciso,escala) Valores decimais com preciso fixa (p) e escala (s) desde -1038 + 1
at 1038 1. A preciso pode ser qualquer nmero entre 1 e 38; a
preciso predefinida 18. A escala pode ser qualquer nmero entre
0 e a preciso. A preciso predefinida 0
sql_variant Tipo de dados predefinido
Timestamp Binrio (n) gerado automaticamente pela base de dados e que
nico em relao ao tempo. Excelente para mecanismos de gesto
de verses. Atravs de um timestamp, podemos por exemplo,
saber se uma linha foi ou no alterada desde a ltima vez que
carregamos os dados (ocupa 8 bytes)
Uniqueidentifier Identificador nico a nvel global. N gerado pela base de dados
(funo NewID) que sempre nico no tempo e no espao
(mquina)
varbinary(n) Dados binrios de tamanho varivel at 2.147.483.648 bytes
(aprox. 2GB)
Xml Possibilita a integrao com dados XML
Bigint Valores inteiros entre -9.223.372.036.854.775.808
e 9.223.372.036.854.775.807

Algumas questes que se colocam relativamente s caractersticas dos campos duma tabela so:

Formador: Jorge S Curso - Tcnico de Informtica de Gesto 24/30


Mdulo 2 - Programao SQL

Que valores podem admitir?


Que valores podem ter por defeito?
Podem ter valores nulos ou so de preenchimento obrigatrio?

Valores por defeito


Se na criao da coluna (campo) C duma tabela T no for indicada qualquer restrio relativa a
valores nulos, ento a coluna C pode admitir como valor por defeito o valor Null.

Logo:
Insert Into Postal(Local) Values(Faro) Insert Into Postal Values(Null,Faro)

O Access, por exemplo, no aceita o seguinte comando:


Create Table Postalito (cdigo int not null, local char(30) default Santo Tirso)

Outros SGBDR, j reconhecem esta sintaxe.

Valores a admitir (restries)


Not Null => impede a introduo de valores nulos numa coluna.
Check => permite realizar a validao de dados introduzidos numa coluna, atravs da
especificao duma condio.

O Access, por exemplo, no aceita os seguintes comandos:


1. Create Table Teste1(sexo char not null check(sexo In (M,F)), Idade int not null check(Idade
between 1 and 115))
2. Create Table Teste2(Data_Nasc smalldatetime, Data_Admin smalldatetime
check(Data_Nasc>Data_Admin))

Outros SGBDR, j reconhecem esta sintaxe.


Unique => permite indicar que os valores de uma coluna no se podem repetir; criado sobre
cada uma das colunas Unique, um ndice nico.

Exemplo:
Create Table Teste3(BI int Constraint BI Unique)

Primary Key (chave primria) => Not Null + Unique juntos.

Formador: Jorge S Curso - Tcnico de Informtica de Gesto 25/30


Mdulo 2 - Programao SQL

Exemplos:
Create Table Teste4(ID Int Constraint Chave1 Primary Key, Nome Char(50))
Create Table Comissao2(ID int not null, ID_Msg int not null, Valor float not null, Constraint Chave2
Primary Key(ID,ID_Msg))

References: Validao de chaves estrangeiras


S possvel em alguns SGBDR!

Exemplo:
Create Table Funcionarios(Cod_Postal smallint References Postal(Codigo))

O que que acontece quando tentarmos apagar ou alterar os valores duma chave primria que
tem dados associados noutra(s) tabela(s)?
Se no houver qualquer ligao entre as tabelas atravs da clusula References, ento as
alteraes na tabela Me no se reflectem na tabela Filho.
Se existir uma ligao entre as duas tabelas, ento o sistema no vai permitir que os valores da
tabela me sejam alterados ou apagados, se estes existirem em qualquer tabela filho.
No entanto, por vezes interessa que, ao alterar um valor (chave primria) numa tabela, sejam
alteradas todas as ocorrncias desse mesmo valor nas tabelas filhos ou, ento que, ao apagar o
valor na tabela me, sejam apagados todos os valores existentes nas tabelas filhos.

Criao de tabelas a partir de outras tabelas


S possvel em alguns SGBDR!

Exemplo (O SQL Server no permite isto):


Create Table Empregado As Select ID, Nome, Salario From Pessoa Where ID<=35

Alterar a estrutura de uma tabela


Sintaxe (usada, por exemplo, pelo Access e pelo SQL Server):
Alter Table Tabela Add campo tipo
Alter Table Tabela Alter Column campo tipo
Alter Table Tabela Drop Column campo

Outros SGBDR usam a seguinte sintaxe:


Alter Table Tabela Add campo tipo
Alter Table Tabela Modify campo tipo
Alter Table Tabela Drop campo

Formador: Jorge S Curso - Tcnico de Informtica de Gesto 26/30


Mdulo 2 - Programao SQL

Problemas:
1. Adicionar tabela Pessoa a coluna Fax com 15 caracteres.
2. Alterar o tipo de dados da coluna Fax para 25 caracteres.
3. Alterar as caractersticas da coluna Salario, de forma a que esta possa admitir nulos.
4. Eliminar a coluna Fax.

Eliminar uma tabela


Sintaxe:
Drop Table Tabela

Em alguns SGBDR (no se aplica ao Access nem ao SQL Server):


Drop Table Tabela{Restrict | Cascade}
Se a opo Restrict estiver includa e se a tabela a remover estiver referenciada em Views (a
ver mais frente) ou em regras de integridade (Constraints), o comando ir falhar. Se a opo
Cascade estiver includa, o comando ter sempre sucesso.

Vises (Views) em SQL (SQLServer e Oracle)


Suponhamos, por exemplo, que na nossa tabela Pessoa existia informao geral (Nome,
Morada, Telefone, etc), informao contabilstica (Salrio, Subsdios, etc) e informao mdica
(doenas, drogas, etc). Embora a informao esteja localizada fisicamente na mesma tabela, no
faz sentido que o departamento de contabilidade, por exemplo, tenha acesso aos dados mdicos
de cada pessoa
Apesar desta separao ser absolutamente necessria, ambos os servios devero ter acesso
aos dados de informao geral para que, por exemplo, o cheque com o salrio possa ser enviado
para a mesma morada para onde devem seguir as anlises clnicas realizadas nos servios
mdicos.
As Vises servem para resolver esta necessidade de diferentes utilizadores verem a mesma
tabela ou tabelas de forma distinta.
Uma viso funciona como uma janela, dando uma determinada perspectiva da BD. A viso
consiste num comando Select realizado sobre tabelas ou outras vises. No entanto, ela no
existe fisicamente. Para todos os efeitos, funciona como uma tabela virtual.

Sintaxe:
Create View nomevista [(lista de campos)] As
Select
From
[Where condio]

Formador: Jorge S Curso - Tcnico de Informtica de Gesto 27/30


Mdulo 2 - Programao SQL

O nome dos campos da View so, por defeito, iguais aos nomes dos campos das tabelas a que
pertencem. Uma viso pode ser criada a partir de tabelas ou de outras views.

Exemplos:
1. Criar uma viso com o conjunto das pessoas cujo salrio menor que 10000.
Create View Salrios AS
Select ID, Nome, Salario
From Pessoa
Where Salario < 10000

Podemos depois efectuar uma consulta vista criada:


Select *
From Salrios
2. Criar uma viso com as caractersticas da vista anterior alterando os nomes das colunas para
Num, Nome e Ordenado.
Create View Remuneracoes(Num, Nome, Ordenado) AS
Select ID, Nome, Salario
From Pessoa
Where Salario < 10000

Juntando vrias tabelas numa View (SQLServer e Oracle)


Exemplos:
1. Criar a viso Moradas com o Nome, Cdigo Postal e Localidade de todas as pessoas.
Create View Moradas As
Select Nome, Cod_Postal, Local
From Pessoa, Postal
Where Cod_Postal = Codigo

Clusula With Check Option (SQLServer e Oracle)


Existe para evitar que uma viso possa manipular registos fora dos seus limites de definio.
Vamos supor que o campo salrio da viso estava validado de forma a no aceitar valores
superiores a 2500.
Exemplo:
Create View Teste As
Select *
From Pessoa
Where Salario < 2500

Formador: Jorge S Curso - Tcnico de Informtica de Gesto 28/30


Mdulo 2 - Programao SQL

With Check Option

Se de seguida inserssemos um registo na viso, com um salrio igual a 3000:


Insert Into Teste Values(888,Jorge Campos,31,3000,Null,2300), o sistema iria acusar um erro!

Eliminar Vises (SQLServer e Oracle)


Sintaxe:
Drop View nomevista
Nota: O Access no incorpora o conceito de vises. No Access, as queries so o equivalente s
views noutros SGBDR.

Criao de ndices
Os registos, quando adicionados ao ficheiro ou BD, so sempre colocados no fim do mesmo.
Evita-se desta forma pesadas reorganizaes dos sistemas do ficheiro sempre que um novo
registo introduzido. Sendo os registos colocados sempre no final do ficheiro ou da tabela, outra
forma qualquer ter que existir para simular uma ordenao sobre os dados.

A indexao a estrutura que permite essa simulao. Consiste numa rvore de termos que
revertem para uma determinada posio no ficheiro ou tabela.
Uma rvore binria uma estrutura em que, para cada um dos ns da rvore, todos os ns
esquerda so menores ou iguais chave de indexao e todos os ns direita so maiores que a
chave de indexao. Em cada um dos ns vai-se guardar a chave de indexao e a posio no
ficheiro ou o n. de registo.

Exemplo: ndice sobre o campo Nome

ID Nome Apelido
2456 Clia Morais
Clia
4561 Jos Lopes 1
6452 Florinda Simes
1289 Antnio Dias
4978 Beatriz Costa
3254 Ana Rita Antnio Jos
4 2
5698 Paulo Viegas

Ana Beatriz Florinda Paulo


6 5 3 7

A maioria dos SGBDR inclui utilitrios que criam ndices de forma visual.

Sintaxe:

Formador: Jorge S Curso - Tcnico de Informtica de Gesto 29/30


Mdulo 2 - Programao SQL

Create [Unique] Index nomendice On Tabela(campo1{Asc|Desc}, )

Exemplo:
1. Criar um ndice sobre o campo Local da tabela Postal.
Create Index ILocal On Postal(Local)

Problemas:
1. Criar um ndice nico sobre o campo Nome da tabela Pessoa.
2. Criar um ndice descendente sobre o campo Salario da tabela Pessoa.
3. Criar um ndice nico sobre os campos ID e ID_Msg da tabela Comissoes.

possvel a criao de ndices sobre campos que so de tipos de dados diferentes. Os ndices
so automaticamente actualizados pelo SGBDR cada vez que um registo indexado inserido,
alterado ou eliminado. de referir ainda que os ndices existem fisicamente em disco.

Eliminao de ndices
Sintaxe:
Drop Index Nomendice on Tabela

Exemplos:
1. Drop Index ILocal On Postal
2. Drop Index INome On Pessoa

Formador: Jorge S Curso - Tcnico de Informtica de Gesto 30/30

S-ar putea să vă placă și