Você está na página 1de 30

CURSO TÉCNICO DE INFORMÁTICA DE GESTÃO

ANO 10.º - TURMA: I

SISTEMAS DE INFORMAÇÃO

MÓDULO 2 – Programação SQL

ANO LETIVO: 2022/2023 FORMADOR: Jorge Sá


Módulo 2 - Programação SQL

Índice

Introdução ....................................................................................................................................... 3
A quem se destina? ........................................................................................................................ 4
Onde é que se pode utilizar? .......................................................................................................... 4
Quais são os objectivos do SQL? ................................................................................................... 4
Quais são as características do SQL? ............................................................................................ 5
A cláusula de selecção “Select” ...................................................................................................... 6
Operadores especiais utilizados em SQL........................................................................................ 7
A cláusula de ordenação (“Order By”) ............................................................................................. 9
Selecção de expressões ................................................................................................................. 9
Eliminação de repetições .............................................................................................................. 10
Junção de tabelas ......................................................................................................................... 10
Tipos de Junções “Joins” .............................................................................................................. 10
Funções Agregadas ...................................................................................................................... 13
Agrupamento de informação ......................................................................................................... 14
Agrupamentos e o valor “Nul” ....................................................................................................... 16
Ordenação de Grupos................................................................................................................... 16
Sub-Consultas (“SubQuerys”) ....................................................................................................... 17
Manipulação de Dados (DML)....................................................................................................... 20
Inserção de registos simples......................................................................................................... 20
Inserção de conjuntos de registos................................................................................................. 20
Actualização de registos ............................................................................................................... 21
Eliminação de registos .................................................................................................................. 21
Manipulação de datas ................................................................................................................... 22
Criação e manutenção de tabelas (DDL) ...................................................................................... 22
Criar uma base de dados .............................................................................................................. 22
Eliminar uma base de dados......................................................................................................... 22
Criar uma tabela ........................................................................................................................... 23
Tipos de dados ............................................................................................................................. 23
Valores por defeito ........................................................................................................................ 25
Valores a admitir (restrições) ........................................................................................................ 25
Criação de tabelas a partir de outras tabelas ................................................................................ 26
Alterar a estrutura de uma tabela .................................................................................................. 26
Eliminar uma tabela ...................................................................................................................... 27
Visões (“Views”) em SQL (SQLServer e Oracle) ........................................................................... 27
Juntando várias tabelas numa “View” (SQLServer e Oracle) ........................................................ 28
Cláusula “With Check Option” (SQLServer e Oracle) .................................................................... 28
Eliminar Visões (SQLServer e Oracle) .......................................................................................... 29
Criação de Índices ........................................................................................................................ 29
Eliminação de índices ................................................................................................................... 30

Formador: Jorge Sá Curso - “Técnico de Informática de Gestão” 2/30


Módulo 2 - Programação SQL

Introdução
Quando as Bases de Dados Relacionais estavam a ser desenvolvidas, foram criadas linguagens
destinadas à sua manipulação. O Departamento de Pesquisas da IBM, desenvolveu o SQL (lê-se
SEQUEL) como interface para o sistema de BD relacional denominado SYSTEM R, no início dos
anos 70. Em 1986 o “American National Standard Institute” (ANSI), publicou um padrão SQL.
O SQL estabeleceu-se então como linguagem padrão das Bases de Dados Relacionais.
O SQL apresenta uma série de comandos que permitem a definição dos dados, chamada de DDL
(“Data Definition Language”), composta entre outros pelos comandos “Create”, que é destinado à
criação da Base de Dados, das Tabelas que o compõe, além das relações existentes entre as
tabelas. Como exemplo de comandos da classe DDL temos os comandos “Create”, “Alter” e
“Drop”.
Os comandos da série DML (“Data Manipulation Language”), destinados a consultas, inserções,
exclusões e alterações em um ou mais registros de uma ou mais tabelas de maneira simultânea.
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”), dispõe 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 manipulação
de dados do tipo registro a registro. Outra característica muito importante disponível em SQL é
sua capacidade de construção de visões, que são formas de visualizarmos os dados na forma de
listagens independente das tabelas e organização lógica dos dados.
Outra característica interessante na linguagem SQL é a capacidade que dispomos de cancelar
uma série de actualizações ou de as gravarmos, depois de iniciarmos uma sequência de
actualizações. Os comandos “Commit” e “Rollback” são responsáveis por estas facilidades.
Devemos notar que a linguagem SQL consegue implementar estas soluções, somente pelo facto
de estar baseada em Base de Dados, que garantem por si mesmo a integridade das relações
existentes entre as tabelas e seus índices.

Algumas siglas usadas:


SQL - Linguagem Estruturada de Consulta
BD - Base de Dados
SGBDR - Sistemas de Gestão de Base de Dados Relacionais
DML - Linguagem de Manipulação de Dados
DDL - Linguagem de Definição de Dados

Formador: Jorge Sá Curso - “Técnico de Informática de Gestão” 3/30


Módulo 2 - Programação SQL

Não sendo considerada uma linguagem de programação, não contempla:


 Variáveis;
 Arrays;
 Estruturas de decisão (SE… Então… Senão);
 Estruturas iteractivas (Fazer Para, Fazer Enquanto, Repetir Até);
 Funções 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 então, pode ser
embutido/embebido em linguagens/tecnologias, tais como:
 Linguagens de programação tradicionais: Basic, Pascal, C, Cobol, Perl, etc;
 Linguagens de programação orientadas a objectos e conduzidas por eventos: Visual Basic,
Delphi, Java, C++, etc;
 Tecnologias servidoras usadas na construção de websites dinâmicos: PHP, ASP, ASP.NET,
ColdFusion, JSP, PERL/CGI, Python, etc,

Quais são os objectivos do SQL?


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

Formador: Jorge Sá Curso - “Técnico de Informática de Gestão” 4/30


Módulo 2 - Programação SQL

Quais são as características do SQL?


 Implementação dos conceitos definidos no Modelo Relacional;
 Redução de incompatibilidades entre sistemas e evitar que se opte por arquitecturas
proprietárias que implicam maiores custos de desenvolvimento e um maior esforço financeiro
e humano;
 Torna-se então possível:
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 operações a que cada um deles
pode ter acesso;
o Obter a garantia de consistência 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 versões de SQL utilizadas nestas diferentes plataformas, diferem
ligeiramente (em determinadas operações), visto haver ainda algumas situações que passam pela
utilização de comandos proprietários. Exemplos: SQL Jet no Access, SQL Plus no Oracle, SQL
Transact no SQL Server. O SQL aqui abordado passará essencialmente por demonstrar a
utilização do SQL Standard, que é reconhecido na totalidade em qualquer uma das plataformas
supra mencionadas. No entanto, isto não inviabiliza o facto de em algumas
situações/considerações ser feito uma menção a alguns comandos, ditos proprietários.
Aconselha-se, pois, a consultar a documentação nas plataformas que vier a utilizar para um
conhecimento mais detalhado e aprofundado da sintaxe em questão.

Como é sabido, uma tabela ou entidade num SGBDR é constituída por linhas (registos ou tuplos)
e colunas (campos ou atributos), em que as tabelas são identificadas inequivocamente através de
chaves primárias e, possivelmente, relacionadas entre si.
O SQL usa na sua sintaxe comandos para interagir com as BD, fazendo permanentemente
interrogações às mesmas. Estes comandos são designados por cláusulas.

Formador: Jorge Sá Curso - “Técnico de Informática de Gestão” 5/30


Módulo 2 - Programação SQL

A cláusula de selecção “Select”


Este comando é essencialmente utilizado para efectuar o pedido de consultas/listagem de dados,
com ou sem base em critérios (condições), podendo-se para tal, ter que “beber” em múltiplas
fontes/origens, que são, nada mais, nada menos, que tabelas interligadas entre si.

Sintaxe geral:
Select campo1, campo2, …, campoN ou *
From tabela1, …, tabelaN
[Where condição]
[Group By…]
[Having…]
[Order By…]

Nota: O símbolo * representa tudo (todos os campos); os comandos entre [ ] são opcionais, pois
nem sempre estão 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 relações indicadas e constituídas pelos seguintes campos:

Formador: Jorge Sá Curso - “Técnico de Informática de Gestão” 6/30


Módulo 2 - Programação SQL

Os exemplos seguintes seriam obviamente equivalentes:

Select Codigo, Local Select *


From Postal From Postal

A ordem pela qual são enumerados os campos, assim como a sua escrita em
maiúsculas/minúsculas determina a forma de apresentação dos resultados listados.

Há dois conceitos que importa desde já explicar. Quando se fala de projecção, estamos
interessados em obter apenas algumas das colunas da(s) tabela(s). Quando se fala de restrição,
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 cláusula “Where”.

Operadores Relacionais: =, >, <, >=, <=, <> ou != (diferente, em algumas versões de SQL).
Operadores Lógicos: And (E), Or (Ou), Not (Não).

Problemas:
1. Seleccionar todas as pessoas com menos de 35 anos de idade.
2. Seleccionar o nome e salário 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 não estão 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 - “Técnico de Informática de Gestão” 7/30


Módulo 2 - Programação SQL

3. “Is”
Operador bastante utilizado no tratamento de nulos.
As BDR contêm um valor especial “NULL” que pode ser atribuído a qualquer tipo de dados. Esse
valor, quando presente num campo, indica a ausência de valor.
As comparações de valores com NULL são feitas com o operador “Is”.
Sintaxe:
Select ……..
From ………
Where campo Is [Not] Null

4. “Like” (permite fazer comparações entre strings)


Utilizam-se dois caracteres especiais (os “wildcards” do MS-DOS):
* (qualquer string de zero ou mais caracteres) ou % noutras versões de SQL.
? (um caracter qualquer) ou _ (“underscore”) noutras versões 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 códigos postais completos de Lisboa e Porto.
3. Seleccionar os códigos postais completos que não sejam nem 1000, 4000 e 4760.
4. Seleccionar os nomes das pessoas que não possuem telefone.
5. Seleccionar os nomes das pessoas que possuem telefone.
6. Seleccionar todas as pessoas cujo nome começa 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 - “Técnico de Informática de Gestão” 8/30


Módulo 2 - Programação SQL

Precedência de operadores: (), * /, + -, Not, And, Or


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

A cláusula “Where” de cima é equivalente a: Where Idade <= 27 or (Idade >= 30 and Telef is Null).

A cláusula de ordenação (“Order By”)


A ordenação em SQL é baseada no valor do código ASCII de cada caracter. Logo:
0<…<9<A…<Z<a…<z

Alguns sistemas são “case-sensitive”, outros não.

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 salário de todas as pessoas, ordenando o resultado pelos
salários mais elevados.
3. Seleccionar todo o conteúdo da tabela de Comissões, ordenado por ID e ID_MSG.
4. Seleccionar da tabela de Comissões, as linhas cujo ID é menor que 40, ordenadas,
dentro de cada ID, pela coluna valor de forma descendentemente.

Selecção de expressões
Podemos efectuar cálculos a nível de operações aritméticas na cláusula “Select”.
Exemplo:
1. Seleccionar o nome, idade actual e idade que irão 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 - “Técnico de Informática de Gestão” 9/30


Módulo 2 - Programação SQL

Problema:
1. Seleccionar da tabela de Comissões, o valor bruto a receber, o montante do IVA (23%) e o
valor líquido para os indivíduos 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

Eliminação de repetições
É possível em SQL eliminar linhas repetidas na visualização de registos, usando para o efeito a
palavra reservada “Distinct”. Os dados obtidos ficam automaticamente ordenados.

Exemplo:
Select Distinct Local
From Postal

Junção de tabelas
O “Join” (ligação) entre tabelas permite extrair, num único “Select”, qualquer informação contida
em diferentes tabelas.
A ligação entre tabelas é feita através de chaves primárias 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 primária.

Sintaxe:
Select campo1, …, campoN, *
From tabela1, …, tabelaN
Tipos de Junções “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 - “Técnico de Informática de Gestão” 10/30


Módulo 2 - Programação SQL

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


registos.

2. “Equi Join”: obtém-se duas colunas com a mesma informação.


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

3. “Natural Join”: existe quando todas as colunas envolvidas na ligação entre as tabelas são
apresentadas sem repetição 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 através da chave primária de uma e
da chave estrangeira da outra. Os dois tipos anteriores fazem parte deste tipo de ligação.
Nota: O mais usado de todos.
Exemplo:
Select Nome,Cod_Postal,Local
From Pessoa, Postal
Where Cod_Postal=Codigo

Podíamos também substituir o campo “Cod_Postal” em cima pelo campo “Codigo”, visto as
duas tabelas estarem relacionadas através deles.

Em determinados sistemas, o código de cima é substituído por outro:


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

A junção de N tabelas num único “Select” obriga à colocação de, pelo menos, N-1 condições de
junção.

Formador: Jorge Sá Curso - “Técnico de Informática de Gestão” 11/30


Módulo 2 - Programação SQL

Problemas:
1. Seleccionar os nomes e as localidades das pessoas que não possuem telefone.
2. Seleccionar o ID das pessoas, seus nomes e valor de todas as comissões ganhas.
3. Seleccionar o nome das pessoas e o valor das comissões, ordenando o resultado pelo nome e
colocando os maiores valores de comissão no topo do resultado de cada indivíduo.
4. Seleccionar todas as comissões, o seu destinatário e a descrição da operação 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 não
exista o correspondente valor na outra tabela a que esta está ligada.
Exemplo: Todos os códigos postais e respectivas pessoas, mesmo para aqueles códigos que
não 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 ligação entre
duas tabelas, irá mostrar-se respectivamente, todo o conteúdo da tabela da esquerda e
respectiva ligação à tabela da direita ou vice-versa.
Quando o “Outer Join” é realizado à direita, são 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 conteúdo de múltiplos comandos “Select”


Exemplo: Juntar o código e a descrição associados às mensagens e aos códigos 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 não possuam o conjunto de campos necessário, devemos adicionar a
constante “Null” à selecção. O nome das colunas na listagem final, é o que resulta do 1.º “Select”.

Formador: Jorge Sá Curso - “Técnico de Informática de Gestão” 12/30


Módulo 2 - Programação SQL

Cada “Select” pode conter a sua própria cláusula “Where”, no entanto, só poderá existir uma única
cláusula “Order By” no último “Select”, sendo a ordenação 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
ID’s de mensagem <= 50. Ordenar o resultado pela coluna das descrições das
mensagens.
2. Unir o conteúdo 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 não aparecem
no segundo.

Funções Agregadas
O uso de funções agregadas ou estatísticas permite obter informação sobre conjuntos de linhas
especificados na cláusula “Where” ou sobre grupos de linhas indicados na cláusula “Group By”.

Função Descrição
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 média de todos os valores de uma
coluna

A função agregada “Count” possui as seguintes variantes:


Count(*) – Devolve o n.º de linhas que resulta dum Select.
Count(campo) – Devolve o n.º de ocorrências na coluna diferentes de Null.
Count(Distinct campo) – Devolve o n.º de ocorrências (sem repetições) de uma coluna; o Access
não permite esta forma!

Problemas:
1. Quantas pessoas existem na BD?
2. Qual o n.º total de pessoas e quantas possuem telefone?

Formador: Jorge Sá Curso - “Técnico de Informática de Gestão” 13/30


Módulo 2 - Programação SQL

3. Quantas pessoas não possuem telefone?


4. Quantas comissões têm valores superiores a 1000?
5. Quantos são os ID’s envolvidos na tabela de Comissões?
6. Qual o valor do maior salário pago?
7. Qual a idade da pessoa mais nova?
8. Qual o menor e maior valor de comissão superior a 1000 e inferior a 5000?
9. Qual o valor total das comissões a pagar?
10. Qual o valor total das comissões a pagar aos indivíduos que moram em Lisboa?
11. Qual o valor total das comissões e IVA (23%) a pagar?
12. Qual a média de idades das pessoas registadas na BD?
13. Qual o salário médio das pessoas com mais de 30 anos?
14. Qual a comissão média da pessoa com o ID 14?

Nota: A função “Round” permite aplicar um arredondamento à saída dos resultados.


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

Agrupamento de informação
Os conceitos de agrupamento de dados são fundamentais na maior parte das consultas
efectuadas a Base de Dados Relacionais.
Vejamos os dois seguintes exemplos em que não existe qualquer tipo de agrupamento:

Select ID, Valor Mostra o valor das comissões existentes na


From Comissão BD; da listagem obtém-se a totalidade das
Order By ID linhas contidas na tabela das Comissões.
Select Sum(Valor) As Total Devolve unicamente o total global de toda a
From Comissao tabela.

A cláusula “Group By” está ligada às funções de agregação, permitindo agrupar a informação e
obter valores estatísticos sobre os grupos formados.
Se um comando “Select” tiver a cláusula “Group By”, então todas as colunas seleccionadas terão
que estar presentes na cláusula “Group By”.

Exemplos:
1. Mostrar para cada ID, o valor total das comissões.
Select ID, Sum(Valor) As Total
From Comissão

Formador: Jorge Sá Curso - “Técnico de Informática de Gestão” 14/30


Módulo 2 - Programação SQL

Group By ID
2. Mostrar para cada pessoa, o valor total das comissões.
Select Nome, Sum(Valor) As Total
From Pessoa P,Comissao C
Where P.ID=C.ID
Group By Nome

Problemas:
1. Mostrar o valor total (salário+comissões) a receber por cada pessoa.
2. Seleccionar a maior comissão de cada ID.
3. Seleccionar o n.º de comissões de cada ID.
4. Mostrar o valor total e o n.º das comissões sobre “Vendas” a receber por cada pessoa,
indicando também o local onde essa pessoa vive.

Se num “Select” com a cláusula “Group By” não houver nenhuma função de agregação, então
estamos perante um “Select Distinct”.

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

A cláusula “Having” permite aplicar restrições ao nível dos grupos que são processados.
Exemplo:
1. Mostrar o valor total de cada comissão agrupada por ID, seleccionando apenas os ID’s com
comissões totais maiores que 1000.
Select ID, Sum(Valor) As Total
From Comissao
Group By ID
Having Sum(Valor)>1000

Notas: Usa-se a cláusula “Where” sempre que se pretende restringir os registos a considerar na
selecção. Usa-se a cláusula “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.

Formador: Jorge Sá Curso - “Técnico de Informática de Gestão” 15/30


Módulo 2 - Programação SQL

2. Qual o total das comissões agrupadas por ID, considerando apenas aquelas de valor > 1000.
3. Qual o total das comissões agrupadas por ID, considerando apenas aquelas cujo valor total >
1000.

Agrupamentos e o valor “Nul”


Num “Select” com a cláusula “Group By”, se existirem Nulos na coluna ou colunas de
agrupamento, estas deverão ser agrupadas.
Exemplo:
1. Seleccionar os vários grupos de telefones.
Select Telef, Count(*) As Conta
From Pessoa
Group By Telef

Ordenação de Grupos
Pode-se efectuar a ordenação por colunas, expressões ou pela ordem da coluna ou expressão
seleccionada.
Exemplos:
1. Ordenação por coluna
Select ID, Count(ID) As Conta
From Comissao
Group By ID
Order By ID

2. Ordenação por uma expressão ou função de agregação


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

3. Ordenação pela ordem duma coluna ou expressão


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

Formador: Jorge Sá Curso - “Técnico de Informática de Gestão” 16/30


Módulo 2 - Programação SQL

Sub-Consultas (“SubQuerys”)
O resultado do comando “Select” é sempre uma tabela, ainda que da sua execução não resulte
qualquer linha/registo.
Um “subquery” consiste num comando “Select” dentro doutro.
Um comando “Select” pode ser colocado:
 dentro doutro nas cláusulas “Where”, “Having”, “Select” e “From”;
 nos comandos “Insert”, “Upate” e “Delete” que iremos ver mais à frente;
 na definição de vistas (“Views”), que iremos também ver mais à frente.

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

O resultado da utilização de comandos “Select” dentro doutros é composto unicamente pelas


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

Quando um “Select” contém 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 salário é menor que 15 vezes o conjunto das suas comissões?
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 comissões que lhe estão associadas.
Ao “Select” exterior chama-se “Outer Select”.
Ao “Select” interior chama-se “Inner Select”.
A sub-query (colocada entre parêntesis) que depende, para o seu funcionamento, de valores da
query mais exterior chama-se “Query correlacionada”. Se não depender, diz-se que é não
correlacionada.
A utilização de operadores lógicos e relacionais na comparação com o resultado duma subquery
obriga a que esta última devolva apenas uma única linha de resultado. Caso contrário, obtém-se
um erro.

Formador: Jorge Sá Curso - “Técnico de Informática de Gestão” 17/30


Módulo 2 - Programação SQL

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

2. Qual o nome e respectivo salário do indivíduo 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
execução da subquery, resultou ou não 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 têm comissões a receber.
a. Usando a junção 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 serão mostrados.


b. Usando o operador “In” numa subquery correlacionada:
Select Nome, Cod_Postal, Local

Formador: Jorge Sá Curso - “Técnico de Informática de Gestão” 18/30


Módulo 2 - Programação SQL

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 não correlacionada:


Select Nome, Cod_Postal, Local
From Pessoa,Postal
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 não têm qualquer comissão a receber.

Exemplos:
1. Seleccionar todos os códigos e respectivas localidades que não estão 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 código é 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 não vivem em Lisboa.
Select Nome,Idade
From Pessoa
Where Cod_Postal <> All (Select Codigo From Postal Where Local=’Lisboa’)

Ou

Formador: Jorge Sá Curso - “Técnico de Informática de Gestão” 19/30


Módulo 2 - Programação SQL

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

Manipulação de Dados (DML)


Constituída pelas cláusulas “Select”, “Insert”, “Update” e “Delete”.

Inserção 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 conteúdo:
999, Joaquim Almeida, 55, 2000, 4100

Nota: As colunas que não forem colocadas no comando “Insert” são preenchidas com o valor
“Null”.

Ocorrência de possíveis falhas:


 Tentar inserir mais do que uma vez a mesma chave primária;
 Tentar inserir mais do que uma vez o mesmo valor num campo com índice único;
 Tentar inserir o valor Null num campo de preenchimento obrigatório.

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

Inserção de conjuntos de registos


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

Exemplo:

Formador: Jorge Sá Curso - “Técnico de Informática de Gestão” 20/30


Módulo 2 - Programação SQL

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

Cuidados a ter:
 Manter o n.º de colunas igual;
 Manter compatibilidade de tipos de dados;
 O comando “Select” não pode conter a tabela em que se está a fazer a inserção.

Actualização de registos
Sintaxe:
Update tabela [Aliase]
Set campo1={expressão1,query1},
.
.
campoN={expressãoN,queryN}
[Where condição]

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

Problemas:
1. Aumentar o salário 20% ao “Paulo Viegas” e adicionar mais 1 ano à sua idade.
2. Adicionar o prefixo “1” ao telefone de todas as pessoas que têm telefone e que vivem em
Lisboa.

Eliminação de registos
Apaga linhas completas duma determinada tabela.
Sintaxe:
Delete From Tabela
[Where condição]

Problemas:

Formador: Jorge Sá Curso - “Técnico de Informática de Gestão” 21/30


Módulo 2 - Programação SQL

1. Eliminar o registo do Sr. “Joaquim Almeida”.


2. Apagar as localidades da tabela “Postal” que não estão associadas a nenhuma pessoa.

Nota: Atenção à Integridade Referencial! Cuidado ao remover as linhas da tabela “Postal” que
possuem códigos postais associados na tabela “Pessoa”.

Manipulação 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

Criação e manutenção de tabelas (DDL)


Constituída pelas cláusulas “Create”, “Alter” e “Drop”.

Criar uma base de dados


A generalidade dos SGBDR disponibiliza utilitários que permitem a criação de BD.
É possível 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 lógico de “mydb_dat” no caso de ser preciso referenciá-lo num script de
SQL mais tarde.

Notas: Apesar desses utilitários fornecerem ambientes gráficos amigáveis, existem situações em
que é absolutamente necessário efectuar a criação da BD através de um Script (ficheiro externo
com comandos de SQL), incluindo muitas vezes a criação das tabelas, índices e mesmo o
eventual carregamento de dados.

Eliminar uma base de dados


Sintaxe:
Drop Database NomeBD

Formador: Jorge Sá Curso - “Técnico de Informática de Gestão” 22/30


Módulo 2 - Programação SQL

Exemplo:
DROP DATABASE mydb
Alguns sistemas não disponibilizam este comando.

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;
 Numéricos;
 Data e Hora.

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

Formador: Jorge Sá Curso - “Técnico de Informática de Gestão” 23/30


Módulo 2 - Programação SQL

Tipos de Dados Descrição


character(n) ou char(n) String de comprimento fixo
varchar(n) String de comprimento variável (n>0)
nvarchar(n) String de comprimento variável 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 variável, máximo 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 numérico constituído por n dígitos 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 precisão (vírgula flutuante)
Real N.º de vírgula 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
precisão de 1 minuto
Money Serve para representar valores monetários
Smallmoney Valores monetários desde -214,748.3648 até +214,748.3647.
Sinónimo de decimal(10,4)
Counter Incremento automático (no Access)
Identity Incremento automático (no SQLServer)
auto_increment Incremento automático (no MySQL)
enum('valor1',…, 'valorN') Lista de opções. Ex: enum(‘M’,’F’)
Image Dados binários de comprimento variável, máximo 231-1
(2,147,483,647) bytes
binary(n) Dados binários
decimal(precisão,escala) Valores decimais com precisão fixa (p) e escala (s) desde -1038 + 1
até 1038 – 1. A precisão pode ser qualquer número entre 1 e 38; a
precisão predefinida é 18. A escala pode ser qualquer número
entre 0 e a precisão. A precisão predefinida é 0
sql_variant Tipo de dados predefinido
Timestamp Binário (nº) gerado automaticamente pela base de dados e que é
único em relação ao tempo. Excelente para mecanismos de gestão
de versões. Através de um timestamp, podemos por exemplo,
saber se uma linha foi ou não alterada desde a última vez que
carregamos os dados (ocupa 8 bytes)
Uniqueidentifier Identificador único a nível global. Nº gerado pela base de dados
(função NewID) que é sempre único no tempo e no espaço
(máquina)
varbinary(n) Dados binários de tamanho variável até 2.147.483.648 bytes
(aprox. 2GB)
Xml Possibilita a integração com dados XML
Bigint Valores inteiros entre -9.223.372.036.854.775.808
e 9.223.372.036.854.775.807

Algumas questões que se colocam relativamente às características dos campos duma tabela são:

Formador: Jorge Sá Curso - “Técnico de Informática de Gestão” 24/30


Módulo 2 - Programação SQL

 Que valores podem admitir?


 Que valores podem ter por defeito?
 Podem ter valores nulos ou são de preenchimento obrigatório?

Valores por defeito


Se na criação da coluna (campo) C duma tabela T não for indicada qualquer restrição relativa a
valores nulos, então 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, não aceita o seguinte comando:


Create Table Postalito (código int not null, local char(30) default ‘Santo Tirso’)

Outros SGBDR, já reconhecem esta sintaxe.

Valores a admitir (restrições)


Not Null => impede a introdução de valores nulos numa coluna.
Check => permite realizar a validação de dados introduzidos numa coluna, através da
especificação duma condição.

O Access, por exemplo, não 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 não 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 primária) => Not Null + Unique juntos.

Formador: Jorge Sá Curso - “Técnico de Informática de Gestão” 25/30


Módulo 2 - Programação 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: Validação de chaves estrangeiras


Só possível 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 primária que
tem dados associados noutra(s) tabela(s)?
Se não houver qualquer ligação entre as tabelas através da cláusula “References”, então as
alterações na tabela “Mãe” não se reflectem na tabela “Filho”.
Se existir uma ligação entre as duas tabelas, então o sistema não vai permitir que os valores da
tabela mãe sejam alterados ou apagados, se estes existirem em qualquer tabela filho.
No entanto, por vezes interessa que, ao alterar um valor (chave primária) numa tabela, sejam
alteradas todas as ocorrências desse mesmo valor nas tabelas filhos ou, então que, ao apagar o
valor na tabela mãe, sejam apagados todos os valores existentes nas tabelas filhos.

Criação de tabelas a partir de outras tabelas


Só possível em alguns SGBDR!

Exemplo (O SQL Server não 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 - “Técnico de Informática de Gestão” 26/30


Módulo 2 - Programação 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 características 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 (não se aplica ao Access nem ao SQL Server):


Drop Table Tabela{Restrict | Cascade}
Se a opção “Restrict” estiver incluída 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 opção
“Cascade” estiver incluída, o comando terá sempre sucesso.

Visões (“Views”) em SQL (SQLServer e Oracle)


Suponhamos, por exemplo, que na nossa tabela “Pessoa” existia informação geral (Nome,
Morada, Telefone, etc), informação contabilística (Salário, Subsídios, etc) e informação médica
(doenças, drogas, etc). Embora a informação esteja localizada fisicamente na mesma tabela, não
faz sentido que o departamento de contabilidade, por exemplo, tenha acesso aos dados médicos
de cada pessoa…
Apesar desta separação ser absolutamente necessária, ambos os serviços deverão ter acesso
aos dados de informação geral para que, por exemplo, o cheque com o salário possa ser enviado
para a mesma morada para onde devem seguir as análises clínicas realizadas nos serviços
médicos.
As Visões servem para resolver esta necessidade de diferentes utilizadores verem a mesma
tabela ou tabelas de forma distinta.
Uma visão funciona como uma janela, dando uma determinada perspectiva da BD. A visão
consiste num comando “Select “ realizado sobre tabelas ou outras visões. No entanto, ela não
existe fisicamente. Para todos os efeitos, funciona como uma tabela virtual.

Sintaxe:
Create View nomevista [(lista de campos)] As
Select …
From …
[Where condição]

Formador: Jorge Sá Curso - “Técnico de Informática de Gestão” 27/30


Módulo 2 - Programação SQL

O nome dos campos da “View” são, por defeito, iguais aos nomes dos campos das tabelas a que
pertencem. Uma visão pode ser criada a partir de tabelas ou de outras views.

Exemplos:
1. Criar uma visão com o conjunto das pessoas cujo salário é menor que 10000.
Create View Salários AS
Select ID, Nome, Salario
From Pessoa
Where Salario < 10000

Podemos depois efectuar uma consulta à vista criada:


Select *
From Salários
2. Criar uma visão com as características 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 várias tabelas numa “View” (SQLServer e Oracle)


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

Cláusula “With Check Option” (SQLServer e Oracle)


Existe para evitar que uma visão possa manipular registos fora dos seus limites de definição.
Vamos supor que o campo salário da visão estava validado de forma a não aceitar valores
superiores a 2500.
Exemplo:
Create View Teste As
Select *
From Pessoa
Where Salario < 2500

Formador: Jorge Sá Curso - “Técnico de Informática de Gestão” 28/30


Módulo 2 - Programação SQL

With Check Option

Se de seguida inseríssemos um registo na visão, com um salário igual a 3000:


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

Eliminar Visões (SQLServer e Oracle)


Sintaxe:
Drop View nomevista
Nota: O Access não incorpora o conceito de visões. No Access, as “queries” são o equivalente às
“views” noutros SGBDR.

Criação de Índices
Os registos, quando adicionados ao ficheiro ou à BD, são sempre colocados no fim do mesmo.
Evita-se desta forma pesadas reorganizações 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 ordenação sobre os dados.

A indexação é a estrutura que permite essa simulação. Consiste numa árvore de termos que
revertem para uma determinada posição no ficheiro ou tabela.
Uma árvore binária é uma estrutura em que, para cada um dos nós da árvore, todos os nós à
esquerda são menores ou iguais à chave de indexação e todos os nós à direita são maiores que a
chave de indexação. Em cada um dos nós vai-se guardar a chave de indexação e a posição no
ficheiro ou o n.º de registo.

Exemplo: Índice sobre o campo “Nome”

ID Nome Apelido
Célia
2456 Célia Morais 1

4561 José Lopes


6452 Florinda Simões
António José
1289 António Dias 4 2

4978 Beatriz Costa


3254 Ana Rita
5698 Paulo Viegas Ana Beatriz Florinda Paulo
6 5 3 7

Formador: Jorge Sá Curso - “Técnico de Informática de Gestão” 29/30


Módulo 2 - Programação SQL

A maioria dos SGBDR inclui utilitários que criam índices de forma visual.

Sintaxe:
Create [Unique] Index nomeíndice 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”.

É possível a criação de índices sobre campos que são de tipos de dados diferentes. Os índices
são automaticamente actualizados pelo SGBDR cada vez que um registo indexado é inserido,
alterado ou eliminado. É de referir ainda que os índices existem fisicamente em disco.

Eliminação de índices
Sintaxe:
Drop Index NomeÍndice on Tabela

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

Formador: Jorge Sá Curso - “Técnico de Informática de Gestão” 30/30

Você também pode gostar