Escolar Documentos
Profissional Documentos
Cultura Documentos
Introdução 2014-v0.2-GB
ÍNDICE
ADMINISTRAÇÃO DE SQL SERVER ...................................................................................................... 6
PLANO DO CAPÍTULO .................................................................................................................................... 6
OBJETIVOS ..................................................................................................................................................... 6
INSTALAÇÃO E CONFIGURAÇÃO DO SQL SERVER ......................................................................................... 6
SQL Server 2005 ........................................................................................................................................ 7
.................................................................................................................................................................. 7
Definição da Instância .............................................................................................................................. 7
Modo de Autenticação.............................................................................................................................. 8
Configuração do SQL Server ..................................................................................................................... 8
Bases de Dados ....................................................................................................................................... 11
................................................................................................................................................................ 13
Cópias de Segurança ............................................................................................................................... 14
Manutenção das Bases de Dados ........................................................................................................... 18
Alteração do Esquema de Autenticação do Servidor ............................................................................. 20
EXERCÍCIOS .................................................................................................................................................. 21
CONCEITOS ELEMENTARES SOBRE BASE DE DADOS........................................................................ 22
PLANO DO CAPÍTULO .................................................................................................................................. 22
OBJETIVOS ................................................................................................................................................... 22
CONCEITOS .................................................................................................................................................. 22
INTRODUÇÃO AO SQL ...................................................................................................................... 23
PLANO DO CAPÍTULO .................................................................................................................................. 23
OBJETIVOS ................................................................................................................................................... 23
Acerca do SQL ......................................................................................................................................... 23
O MOTOR DA BASE DE DADOS.................................................................................................................... 24
A INTERAÇÃO COM O MOTOR DE BASE DE DADOS .................................................................................... 24
ORIGENS E PRINCIPAIS CARACTERÍSTICAS .................................................................................................. 25
A ESTRUTURA DA BASE DE DADOS RELACIONAL ........................................................................................ 26
ESCREVENDO COMANDOS SQL ................................................................................................................... 27
As Regras ................................................................................................................................................ 27
Seleção de dados (SELECT) ..................................................................................................................... 28
Condições Compostas ............................................................................................................................. 29
E lógico - AND ......................................................................................................................................... 29
OU lógico - OR ......................................................................................................................................... 29
Negação - NOT ........................................................................................................................................ 30
Condições e Operadores ......................................................................................................................... 30
3 / 73
As informações descritas neste documento podem ser alteradas sem aviso prévio. Todos os
nomes apresentados ao longo dos exemplos e imagens, são fictícios. Nenhuma parte deste
documento pode ser reproduzida ou transmitida sob qualquer formato, para qualquer propósito,
sem autorização escrita da PRIMAVERA BSS. Excetua-se a transcrição de certas passagens para
efeitos de apresentação, crítica ou discussão das ideias e opiniões contidas no livro. Esta exceção
não pode, porém, ser interpretada como permitindo a transcrição de textos em recolhas
antológicas ou similares, da qual pode resultar prejuízo para o interesse para a obra. Os infratores
são passíveis de procedimento judicial.
6 / 73
Plano do capítulo
Introdução
Instalação do SQL Server
Objetivos
Depois deste capítulo deverá ser capaz de:
- Identificar os procedimentos para a instalação de um Servidor de dados.
- Compreender os modos de autenticação usados pelo SQL Server.
- Utilizar as ferramentas de administração do SQL Server.
- Entender o funcionamento das Bases de Dados.
- Alterar a localização física das Bases de Dados.
- Utilizar os mecanismos de segurança (Utilizadores e Perfis).
(Mixed Mode).
Outro ponto a ter em atenção na instalação do SQL Server tem a ver com a instalação
customizada em que as Collations a usar por defeito quando se cria uma Base de Dados no SQL,
terem que ter as seguintes propriedades: Accent Sensitive/Case Insensitive.
Instância
Modo de
autenticação
Collations
Definição da Instância
- Instância “Nomeada” (Named Instance): o utilizador tem que definir o nome a atribuir à
instância. A instalação do SQL Server será identificada da seguinte forma <NomeMaquina>\<Inst>
8 / 73
Modo de Autenticação
O modo de autenticação também pode ser definido durante o processo de instalação. Deve
garantir-se o modo de autenticação Misto, definindo a Password para o Utilizador SA (System
Administrator – utilizador por defeito com permissões de administrador do sistema).
Collation
Bases de Dados
Criação de Bases de Dados
Para criar uma base de dados no SQL Server na localização por defeito, devem seguir os seguintes
passos:
1. Abrir o “SQL Server Managment Studio”
2. Seleccionar o servidor:
3. Sobre o nó “Databases”, seleccionar a opção “New Database...”:
A localização física por defeito dos ficheiros de dados corresponde normalmente à subdirectoria
“DATA” da directoria onde o SQL Server foi instalado. Por exemplo, num servidor em que o SQL
Server tenha sido instalado na directoria “C:\Program Files\Microsoft SQL Server”, os ficheiros de
dados das bases de dados serão criados, por defeito, na directoria “C:\Program Files\Microsoft
SQL Server\MSSQL.1\MSSQL\Data”.
Alternativamente, pode determinar-se esta directoria por defeito, recorrendo ao “SQL Server
Managment Studio” no momento de criação de uma nova base de dados:
NOTA: O acesso via “SQL Server Managment Studio” deve ser efectuado no próprio servidor ou
numa máquina com os componentes cliente do SQL Server instalados, utilizando uma conta de
administração SQL Server.
13 / 73
Para alterar a localização física de uma base de dados após a sua criação deverão utilizar-se as
funções “Dettach Database” e “Attach Database” do” SQL Server Managment Studio”.
No momento de criação da base de dados, quando se pretende que esta seja armazenada numa
directoria específica, deve-se alterar a localização dos dois ficheiros de dados:
“Database file” e “Transaction Log”:
14 / 73
Cópias de Segurança
Criação de uma Cópia de Segurança em Ficheiro
Usando o SQL Server Managment Studio
Para criar uma cópia de segurança em ficheiro devem seguir os seguintes passos:
1. Abrir o “SQL Server Managment Studio”
2. Selecionar o servidor onde está armazenada a base de dados pretendida
3. Abrir a pasta “Databases” e seleccionar a base de dados pretendida
4. Sobre o nome da base de dados, seleccionado o menu de contexto com o botão direito do
rato, deve selecionar-se a opção “Backup...”:
5. No diálogo seguinte devem ser activadas as seguintes opções: “Backup to Disk”, “Backup
Database Complete” e “Overwrite existing media” (para que a base de dados seja
salvaguarda por completo, substituindo todo o ficheiro destino, caso exista).
6. Utilizando o botão “Add...” deve-se indicar a localização do ficheiro destino:
15 / 73
NOTA: A localização indicada neste passo corresponde a uma diretoria no servidor (não na
máquina que estiver a ser utilizada).
8. O SQL Server procederá de seguida à cópia de segurança. No fim da operação surgirá uma
mensagem indicando o resultado.
16 / 73
O SQL Server permite efectuar a reposição de uma cópia de segurança para uma base de dados
nova ou para uma já existente.
Para repor uma cópia de segurança devem-se seguir os seguintes passos:
1. Abrir o “SQL Server Managment Studio”
2. Selecionar o servidor onde está armazenada a base de dados pretendida
3. Sobre a pasta “Databases” selecionar a opção de contexto “Restore Database...”:
4. Para restaurar a cópia de segurança sobre uma base de dados já existente, deve
selecionar-se, o nome dessa base de dados.
NOTA: Caso se pretenda criar uma nova base de dados a partir da cópia de segurança,
deve indicar-se, neste passo, um nome ainda não existente.
5. Ainda no mesmo diálogo, deve selecionar-se a opção “Restore from device” e utilizar o
botão “Select Devices...” para indicar a localização do ficheiro de segurança:
17 / 73
6. No diálogo seguinte deve-se utilizar o botão “Add...” para indicar a localização física do
ficheiro de segurança
7. Novamente no diálogo inicial, devem ser ativadas as seguintes opções: “Restore backup
set”, “Database – complete” e “Overwrite the existing database”:
5. Após confirmação, a base de dados será compactada e o espaço em disco que não esteja
a ser utilizado será libertado.
Importação de Dados
O SQL Server inclui múltiplas funcionalidades de importação de dados provenientes de várias
fontes (SQL Server, MS Access, MS Excel, Oracle, Paradox, FoxPro, ODBC, etc).
A importação de dados permite definir o conjunto de tabelas a importar, o conjunto de colunas a
importar para cada uma dessas tabelas, as tabelas destino, etc.
Para importar dados para uma determinada base de dados, basta seguir os seguintes passos:
1. Abrir o “SQL Server Managment Studio”
2. Selecionar o servidor onde está armazenada a base de dados pretendida
3. Abrir a pasta “Databases” e selecionar a base de dados pretendida
4. Sobre o nome da base de dados, selecionado o menu de contexto com o botão direito do
rato, deve selecionar-se a opção “Import Data...”:
Exportação de Dados
À semelhança da importação de dados, o SQL Server inclui ainda funcionalidades de exportação
de dados para vários destinos (SQL Server, Texto, MS Access, MS Excel, Oracle, Paradox, FoxPro,
ODBC, etc).
A exportação de dados permite definir o conjunto de tabelas a exportar, o conjunto de colunas a
exportar para cada uma dessas tabelas, as tabelas destino, etc.
20 / 73
Conexão de um Servidor
É possível efetuar a manutenção de várias instancias de SQL no mesmo SQL Server Managment
Studio. Para tal, basta selecionar a opção “Connect”, a opção “Database Engine...” e escolher o
novo servidor.
NOTA: Depois de se fazer esta alteração, convém parar e arrancar o serviço SQL Server
para o sistema assumir as novas configurações.
Exercícios
3. Inicialize a Plataforma do ERP na nova instância com o novo utilizador do SQL Server.
5. Através SQL Server, altere a localização da Base de Dados para uma nova pasta ‘Base de
Dados’ em c:\.
Objetivos
Depois deste capítulo deverá ser capaz de
- Definir conceitos elementares tais como Base de Dados, Tabelas, etc
- Identificar a diferença entre Chave Primária e Chave Estrangeira.
Conceitos
Para efetuar a manutenção de dados numa Base de Dados, é necessário garantir um conjunto de
conhecimentos elementares sobre Base de Dados. Analisemos alguns conceitos:
Base de Dados: coleção de elementos de informação organizada de acordo com algum princípio
ou regra.
Tabela: Uma tabela é uma representação matricial, isto é, em linhas e colunas, tantas quantas a
aplicação que se queira dar. As colunas são chamadas de Campo (ou atributo). As linhas são
chamadas de Registos.
Chave Primária: Chave primária (em inglês Primary Keys ou PK) sob o ponto de vista das Bases de
Dados refere-se a um dado campo, cujos valores nunca se repetem e que podem ser usados como
um índice para os demais campos da tabela. Nesta chave não podem existir valores nulos ou
repetidos.
Uma chave externa ou estrangeira é um atributo ou uma combinação de atributos numa relação
R2, cujos valores são necessários para equivaler à chave primária de uma relação R1.
23 / 73
Introdução ao SQL
Plano do capítulo
Breve abordagem histórica da Linguagem SQL
As instruções SQL (DDL, DML e DCL)
Objetivos
Depois deste capítulo deverá ser capaz de:
- Entender o tipo de operações que se podem executar via SQL
- Executar operações e consulta de dados (SELECT)
- Efetuar ligações entre tabelas (JOIN)
- Executar operações de inserção (INSERT), atualização, (UPDATE) e eliminação
(DELETE)
Acerca do SQL
O SQL é uma Linguagem Estruturada de Consulta1, baseada na língua Inglesa, que permite definir
pedidos de informação/ comandos, que são emitidos ao motor da base de dados, e por este
processados.
Segundo a ANSI (American National Standards Institute), o SQL é a linguagem standard para bases
de dados relacionais. Alguns exemplos de Sistemas de Gestão de Bases de Dados Relacionais
(SGBDR) que usam o SQL são o Microsoft SQL Server, Oracle, Sybase, DB2, Access e muitos outros.
Apesar do standard ANSI-SQL ser um facto, alguns SGBDR implementam extensões ao SQL, que,
na maior parte dos casos, só podem ser usadas no próprio sistema. No entanto, o conjunto base
de cláusulas SQL (SELECT, INSERT, UPDATE, DELETE, CREATE e DROP) podem ser utilizados para
levar a cabo a maior parte das operações necessárias.
Em termos lógicos, podemos dividir o SQL em três subconjuntos diferentes:
• DDL - Data Definition Language (Definição de estrutura da base de dados): Cláusulas que
permitem modelar a estrutura da base de dados (criar, modificar e remover objetos ou a própria base de
dados): CREATE TABLE, ALTER TABLE, DROP TABLE, CREATE INDEX e DROP INDEX.
• DCL - Data Control Language (Controlo de permissões): Cláusulas que permitem controlar
1
do inglês: STRUCTURED QUERY LANGUAGE
24 / 73
O motor da base de dados é assim a única entidade que tem acesso direto aos dados.
2
do inglês: DATABASE ENGINE
25 / 73
Fig. 1 Arquitetura
A linguagem para troca de pedidos/comandos é, na esmagadora maioria dos sistemas de gestão
de bases de dados, o SQL.
esta altura, os sistemas de gestão de bases de dados que o implementam completamente. Note-
se que a tendência do mercado é, atualmente, tornar os produtos compatíveis (o mais possível)
com os standards ANSI, e depois adicionar algumas funcionalidades específicas. Desta forma,
apesar de a estrutura base da implementação SQL ser compatível entre os vários SGBD, algumas
funcionalidades proprietárias poderão levantar incompatibilidades pontuais.
O SQL3 é o sucessor do SQL-92, e introduzirá melhoramentos significativos: orientação a objetos e
suportes para manipulação, seleção e armazenamento de multimédia, entre outros.
O facto do SQL ser baseado na língua Inglesa é particularmente evidente se atentarmos nos seus
comandos (cláusulas): SELECT para selecionar, INSERT para Inserir, CREATE para criar, DELETE
para apagar, FROM para designar origem, WHERE para designar condições, etc.
O SQL é, na sua essência, uma Linguagem Declarativa: em SQL indicamos a informação que
pretendemos obter, e não a forma como esta deve ser obtida. O motor da base de dados
encarregar-se-á de escolher os métodos mais adequados para responder aos comandos/pedidos
SQL, e retornar os resultados.
Este facto contrasta com as linguagens de programação usuais (C, Pascal, Basic, etc.), em que
devem ser especificadas instruções que descrevem ao sistema como deve executar as ações, por
forma a conseguir os resultados pretendidos. Estas são Linguagens Procedimentais.
As linguagens declarativas são, como é óbvio, bastante mais simples de usar.
Temos 4 atributos definidos: Cliente, Nome, Apelido, NumBI, e 3 registos (1 registo por Cliente). A cada
registo correspondem valores próprios dos atributos.
27 / 73
Geralmente associado às tabelas está o conceito de Chave Primária. A chave primária é um valor
que identifica univocamente cada registo. No nosso exemplo, a Chave Primária seria Cliente.
Sempre que quisermos referenciar Clientes noutras tabelas, usaremos a chave Cliente, em vez do
nome. Por exemplo, numa possível tabela de Faturas, usaríamos, além duma chave primária para
as faturas, um código identificativo do Cliente a que a fatura diz respeito: o equivalente ao
Cliente.
Clientes:
CodTerc Nome Apelido NumBI
1 Paulo Almeida 123456789
2 José Fictício 235457891
3 Pedro Fictício 121453708
Faturas:
Num CodTerc Data …
100 1 01-02-1999 …
101 2 10-05-1999 …
102 1 16-07-1999 …
Conforme podemos observar, a Chave de cada fatura é o seu Número (não existem duas faturas
com o mesmo número), e o campo CodTerc identifica o Cliente na tabela de Clientes, sendo
equivalente ao campo CodTerc de Faturas. Estabelecemos assim uma relação entre as duas
tabelas, através dum campo com o mesmo nome. Note-se, no entanto, que os campos poderiam
ter nomes diferentes.
No fundo, especificamos:
• Que dados obter: Especificamos, a seguir ao SELECT, o nome da(s) coluna(s)
(campos) desejada(s). Neste caso, queremos a coluna Nome.
• De onde os obter: Uma base de dados contém um grande número de tabelas.
Adicionalmente, os nomes de campos podem estar repetidos entre tabelas. Assim, existe
a necessidade de especificar a que tabela os campos dizem respeito.
O asterisco (*) pode ser usado para especificar todas as colunas duma tabela.
Mais um exemplo, para selecionar todos os registos da tabela de Clientes, usaríamos:
SELECT *
FROM Clientes
Condições Compostas
Existem algumas cláusulas específicas que poderá usar nas suas condições.
E lógico - AND
Junta duas ou mais condições, e mostra resultados apenas se todas as condições forem
satisfeitas.
SELECT Nome
FROM Clientes
WHERE CodPostal = 4700 AND Nome LIKE 'A%'
OU lógico - OR
Junta duas ou mais condições, e mostra resultados se qualquer das condições for satisfeitas.
SELECT Nome
FROM Clientes
WHERE CodPostal = 4700 OR CodPostal = 4000
Negação - NOT
Pode usar a negação em conjunto com outros operadores. Por exemplo, tendo como base a query
apresentada na secção anterior, que selecionava todos os Clientes de Braga e do Porto, é muito
fácil obter uma versão oposta: todos os Clientes que não moram nem em Braga nem no Porto:
SELECT Nome
FROM Clientes
WHERE NOT (CodPostal = 4700 OR CodPostal = 4000)
Condições e Operadores
Existe um leque familiar de operadores que pode usar nas condições:
>1000
> Maior que
>’a’
>= 10
>= Maior ou igual a
>= ‘Ant’
<100
< Menor que
<‘Man’
<=100
<= Menor ou igual a
<=’Man’
<>10
<> Diferente de
<>’Braga’
Intervalos - BETWEEN
Permite especificar uma gama de valores que deve ser respeitada por um campo. Exemplo: todos
os Artigos com preços de venda entre 1000 e 5000:
SELECT CodArtigo, Designacao, PrecoVenda
FROM Artigos
WHERE PrecoVenda BETWEEN 1000 AND 5000
Usando o IN, poderá simplificar o seu comando SQL, especificando a lista de valores admitidos:
SELECT Nome, Localidade
FROM Clientes
WHERE Localidade IN ('Braga', 'Porto', 'Lisboa')
Pode usar a cláusula IN em conjunto com a negação, para obter outros resultados. Por exemplo,
todos os Clientes que não vivem em nenhuma das três cidades:
SELECT Nome, Localidade
FROM Clientes
WHERE Localidade NOT IN ('Braga', 'Porto', 'Lisboa')
32 / 73
De igual modo, é possível usar em comandos SQL mais complexos abreviaturas para os nomes das
tabelas. Este facto é particularmente útil nos casos em que estamos a seleccionar informação
proveniente de várias tabelas.
SELECT c.Nome, c.CodTerc, f.Num, f.Data
FROM Clientes c, Facturas f
Nesta tabela simples (versão simplificada dos detalhes duma fatura), temos um código que
identifica um artigo, o seu preço unitário e uma quantidade.
Provavelmente, existirão localidades que aparecem mais do que uma vez (uma por cada Cliente
dessa Localidade).
Como pretendemos que cada localidade apareça uma só vez, adicionamos DISTINCT à nossa
query:
SELECT DISTINCT Localidade
FROM Clientes
Por exemplo, ao selecionar o código dum Cliente, o seu Nome e a Localidade onde reside, terá
várias hipóteses de ordenação:
Por Nome :
SELECT CodTerc, Nome, Localidade
FROM Clientes
ORDER BY Nome
Por Código:
SELECT CodTerc, Nome, Localidade
FROM Clientes
ORDER BY CodTerc
Por Localidade:
SELECT CodTerc, Nome, Localidade
FROM Clientes
ORDER BY Localidade
Adicionalmente, pode especificar a ordenação por mais do que um campo. Nesse caso, separe os
campos por vírgulas na cláusula ORDER BY.
É possível especificar o tipo de ordenação desejado. Por omissão é assumida a ordenação
ascendente, o que equivalente à utilização da cláusula ASC. Para forçar a ordenação descendente,
é usada a cláusula DESC:
SELECT CodTerc, Nome, Localidade
FROM Clientes
ORDER BY Nome ASC
Funções Adicionais
Existem algumas funções adicionais que podem ser utilizadas para criar campos calculados em
comandos (queries) SQL.
Ilustraremos algumas das funções mais significativas disponibilizadas pelo SQL Server, e que
podem ser utilizadas em todas as aplicações.
Exemplo: Número de dias que ocorreram desde a data de emissão das Faturas.
SELECT Num, Data, DATEDIFF(d, Data, Getdate()) AS Num_Dias
FROM Fact
Este exemplo usa, adicionalmente, a função GetDate, que retorna a data atual.
Sintaxe: DATEDIFF(Que_Parte, DataInicial, DataFinal)
Arredondamento - ROUND
Arredonda o número/expressão de acordo com a precisão especificada.
Sintaxe: ROUND (Num_Expr, Comprimento)
Exemplos:
Expressão Resultado
ROUND(589.8656, 1) 589.9000
ROUND(589.8656, 2) 589.8700
ROUND(589.8656, 3) 589.8660
ROUND(589.8656, -1) 590.0000
38 / 73
Exemplos:
Expressão Resultado
FLOOR(589.8) 589
FLOOR(14.1) 14
Exemplo prático:
Estas duas funções podem ser usadas para auxiliar a manipulação de campos textuais. Supondo
que tem dois campos numa base de dados: Nome e Apelido. Se os campos tiverem sido definidos
com uma dimensão de, por exemplo, 30 caracteres, haverá espaços em branco em ambos os
campos, para um nome como 'Manuel' e apelido 'Farinhoca'.
É possível usar um campo calculado para construir o nome completo baseado nestes dois campos.
Por exemplo:
SELECT Nome + ' ' + Apelido AS NomeCompleto FROM Pessoas
Neste caso, é conveniente que não haja espaços em branco após Nome, de modo a que Nome e
Apelido sejam separados apenas por um espaço. Para o efeito basta usar RTRIM(Nome) e
LTRIM(Apelido):
Exemplos:
Expressão Resultado
REPLACE('abcd', 'cd', 'ef') abef
REPLACE('João Paparoca', 'Paparoca', 'Farinhoca') João Farinhoca
Variância - VAR
Retorna a variância estatística de todos os valores na expressão indicada.
Sintaxe: VAR(Campo_ou_Expressao)
Campo_ou_Expressão Campos/valores a utilizar no cálculo Campos/expressões numéricas.
Exemplo:
SELECT VAR(PrecoVenda) FROM Artigos
A junção pode englobar mais do que duas tabelas. Supondo que temos uma terceira tabela, com
as linhas/detalhes de cada fatura:
100 5485 1 5 …
101 4000 1 2 …
102 4205 2 1 …
Teremos que indicar o nome da tabela ao incluirmos o campo Num, na lista de campos do
SELECT, dado existirem duas tabelas com um campo Num (Fact e LFact). O motor de base de
dados necessita de saber de qual das duas tabelas deve extrair o valor para o campo. Se não for
especificada qualquer tabela, o servidor retorna uma mensagem do tipo “Ambiguous column
name 'Num'.”
45 / 73
Assim, basta incluir também uma condição de igualdade entre estes dois campos nas nossas
condições de junção:
SELECT Nome, Fact.Num, Data, CodArtigo, Qtd
FROM Clientes, Fact, LFact
WHERE Clientes.CodTerc = Facturas.CodTerc
AND LFact.Num = Facturas.Num
Note que o resultado inclui todas as linhas em que os campos de ligação são iguais. Ou seja, um
Cliente que não tenha qualquer Fatura associada não vai ser selecionado, dado não haver
nenhuma fatura que satisfaça a primeira condição.
Para incluir todos os Clientes, independentemente de terem ou não faturas, usamos o JOIN à
esquerda (LEFT JOIN), como veremos na página seguinte.
Note que é bastante simples encadear LEFT JOINs. Neste caso, estamos a dizer: "Queremos todos
os Clientes, todas as faturas relacionadas com Clientes, e as linhas de fatura relacionados com
faturas".
Tabela 1 Tabela 2
O resultado é o seguinte:
Resultado
Num Nome
5 Carlos
6 Alberto
7 Maria
9 Jerónimo
10 António
Só pode fazer a UNION entre dois SELECTs que retornem o mesmo número de campos, e
entre estes deve haver correspondência no tipo de dados. Por exemplo, os comandos seguintes
são inválidos.
48 / 73
• O tipo de dados das colunas envolvidas não é compatível (Num é numérico e Nome é
textual).
Um exemplo dum comando SQL válido é o seguinte, que tem por objetivo retornar o Nome e
Código Postal de todos os Clientes de Braga (4700) e Porto (4000):
SELECT Nome, CodPostal
FROM Clientes
WHERE CodPostal LIKE '4700%'
UNION
SELECT Nome, CodPostal
FROM Clientes
WHERE CodPostal LIKE '4000%'
Estamos neste caso a assumir com o campo CodPostal é textual, e que pode conter "4000 Porto"
e "4700 Braga". Assim, justifica-se o uso do operador LIKE.
O SQL Engine do SQL Server/MSDE não suporta o INTERSECT. No entanto, é possível obter a
mesma funcionalidade usando a cláusula EXISTS.
Vejamos como podemos obter o Nome de todos os Clientes que tenham faturas associadas,
usando a intersecção:
Usando INTERSECT (Oracle, por exemplo)
SELECT Nome
FROM Clientes
INTERSECT
SELECT C.Nome
FROM Clientes C, Facturas F
WHERE C.CodTerc = F.CodTerc
Usando EXISTS:
SELECT C.Nome
FROM Clientes C
WHERE EXISTS
(SELECT CodTerc
FROM Fact F
WHERE C.CodTerc = F.CodTerc)
Podemos usar uma sintaxe semelhante para obter todos os Clientes que não têm faturas
associadas:
SELECT C.Nome
FROM Clientes C
WHERE NOT EXISTS
(SELECT CodTerc
FROM Fact F
WHERE C.CodTerc = F.CodTerc)
Em Sistemas que suportam o MINUS (Oracle, por exemplo), o mesmo resultado seria obtido por:
SELECT Nome
FROM Clientes
MINUS
SELECT C.Nome
FROM Clientes C, Facturas F
WHERE C.CodTerc = F.CodTerc
Agrupamentos - GROUP BY
A Cláusula GROUP BY permite criar sumários da informação através do SQL. Quando
estabelecemos agrupamentos dentro de uma tabela, estamos (conceptualmente) a dividir a
tabela em partições distintas, de acordo com a variação de um determinado atributo (campo) ou
vários.
Vamos retomar o nosso exemplo de análise, em que temos uma tabela de Clientes, outra de
Faturas (Fact), e ainda os detalhes das faturas (LFact).
Fig. Tabela de Clientes (CLIENTES)
Fig. Tabela de Facturas (FACT)
Fig. Tabela de Linhas de Factura (LFACT)
Temos pois um conjunto de faturas, em que cada fatura está associada a um cliente (através da
ligação pelo campo CodTerc). Cada fatura tem a si associado um conjunto de linhas (detalhes),
armazenados na tabela LFact, e a si associadas pelo número da fatura (Num).
51 / 73
É óbvio que pode haver várias faturas associadas a um cliente. Suponhamos agora que desejamos
saber o número de faturas associadas a cada cliente.
A função de agregação a usar é o COUNT.
Um comando do tipo
SELECT c.TodCerc, c.Nome, COUNT(f.Num) AS NumFacturas
FROM Clientes c, Fact f
WHERE c.CodTerc = f.CodTerc
não é válido. O SQL Server retorna uma mensagem do tipo:
“Column 'c.Nome'’ is invalid in the select list because it is not contained in an aggregate
function and there is no GROUP BY clause.”
A melhor forma de contar o n.º de faturas associadas a cada Cliente é particionar os dados por
cada Cliente, e aplicar a função COUNT a cada partição. Ou seja, definir um agrupamento por
cliente. Para o efeito, acrescentamos a cláusula GROUP BY CodTerc ao nosso comando SQL.
Na realidade, o SQL Server exige que inclua na lista dos campos de agrupamento todos os campos
incluídos no SELECT que não estejam a ser usados numa função de agregação. No caso presente,
estamos a selecionar dois campos base: CodTerc e Nome. O procedimento comum é incluir
primeiro o campo (ou campos) segundo o qual queremos agrupar (CodTerc), e depois os restantes
(Nome).
Podemos, de uma forma muito semelhante, saber, por exemplo, o número de linhas de cada
fatura:
SELECT f.Num, f.Data, COUNT(lf.Num) AS NumLinhas
FROM Fact f, LFact lf
WHERE f.Num = lf.Num
GROUP BY f.Num, f.Data
Resultado:
Localidade Numero de Clientes
--------------------------------------------------
NULL 21
Adaufe 15
Alfragide 5
Amadora 10
Amares 7
Barcelos 59
Braga 285
Cabeceiras de Bastos 5
Caldas das Taipas 200
Carcavelos 20
Castelo de Paiva 12
...
• Preços Mínimo, Máximo e Médio de venda de cada Artigo, com base nas facturas:
SELECT CodArtigo,
MIN(PrecoUni) AS PrecoMinimo,
MAX(PrecoUni) AS PrecoMaximo,
ROUND(AVG(PrecoUni),2) AS PrecoMedio
FROM LFact
GROUP BY CodArtigo
54 / 73
Resultado:
Vamos supor que desejávamos saber qual o preço do artigo mais caro em cada fatura.
Podemos usar uma SubQuery que nos retorna o preço máximo de entre todos os preços de todos
os artigos incluídos em cada fatura, e dar-lhe um nome para que possa ser usada como uma
coluna simples.
O resultado será o seguinte:
SELECT f.Num, f.data,
(SELECT MAX(lf.PrecoUni)
FROM LFact lf
WHERE f.Num = lf.Num) AS PrecoUnitarioMax
FROM Fact f
Uma SubQuery pode conter dentro de si outras SubQueries, e pode servir de origem de dados
para outra query (ver exemplo "Determinar qual a localidade em que a empresa tem mais
Clientes" nas próximas seções)
Outra variante é a utilização da negação em conjunto com o IN (NOT IN) . Por exemplo, pode
selecionar todos os Clientes que não moram na mesma localidade que António Fictício.
SELECT Nome
FROM Clientes
WHERE Localidade NOT IN
(SELECT Localidade
FROM Clientes
WHERE Nome = 'Antonio Fictício')
Determinar: ‘qual a localidade em que a empresa tem mais Clientes?’. Como se descreveu
anteriormente, a cada Cliente está associada uma Localidade. Como também já vimos antes, é
possível determinar facilmente o n.º de Clientes por localidade:
SELECT Localidade, COUNT(CodTerc) AS 'Numero de Cli¬entes'
FROM Clientes
GROUP BY Localidade
Neste momento não desejamos uma lista completa de Localidades e Número de Clientes, mas
apenas UMA localidade: aquela em que o número de clientes (COUNT(CodTerc)) toma o valor
máximo. Ou seja, desejamos selecionar Localidade da tabela de clientes onde COUNT(CodTerc) é
máximo.
Necessitamos agora de uma SubQuery que retorne um único valor, o MAX, de entre todos os que
são selecionados pelo nosso comando SQL original:
SELECT MAX(NumClientes)
FROM
(SELECT COUNT(CodTerc) AS NumClientes
FROM Clientes
GROUP BY Localidade) AS Q2
Ou seja, estamos a selecionar o valor máximo de NumClientes da nossa query original (sem o
campo Localidade).
NOTA: Repare que é necessário atribuir um pseudónimo à SubQuery (AS Q2), dado que a estamos
a usar como origem de dados na query original (FROM).
58 / 73
Stored Procedures
Stored Procedures são blocos de SQL compilados, que são executados pelo motor da base de
dados. Ou seja, quando, a partir duma aplicação cliente PRIMAVERA, executamos um Stored
Procedure, o SQL Server executa o seu código, e retorna quaisquer resultados necessários.
Desta forma, a máquina Cliente ficou liberta do trabalho de processamento, que foi levado a cabo
pelo Servidor. Este facto é particularmente interessante quando temos múltiplos postos ligados a
um servidor. Geralmente, a máquina servidora tem maiores capacidades de processamento que
as máquinas Clientes. Ao retirarmos trabalho dos Clientes para o Servidor estamos a maximizar a
produtividade, ao tirar maior partido dos equipamentos mais potentes.
Os Stored Procedures são um conceito avançado de SQL, e a sua explicação exaustiva não se
enquadra nos objetivos deste capítulo introdutório. No entanto, e para efeitos de ilustração,
apresentamos seguidamente um exemplo de um Stored Procedure, que se destina a apagar todas
as faturas respeitantes a um Cliente.
Analise-o apenas como referência, e não se deixe intimidar pela aparente complexidade. Repare
que a maior parte do Stored Procedure usa comandos SQL que já lhe são familiares, e,
adicionalmente, alguns conceitos adicionais.
/* *************************************************/
/* Apaga Faturas */
/***************************************************/
CREATE PROCEDURE p_ApagaFaturas
@CodCliente INT
/* Retorna: -1000 - Cliente Nao Existe */
/* -1001 - Erro ao apagar Faturas */
/* -1002 - Erro ao apagar Linhas de Fatura */
/* -9999 - Erro reportado pelo Engine */
WITH RECOMPILE
AS
BEGIN Tran
/* Declara variaveis locais */
DECLARE @Estado INT
DECLARE @Res INT
/* Verifica se o Cliente Existe */
IF NOT EXISTS(SELECT * FROM Clientes WHERE CodTerc = @CodCliente)
BEGIN
SELECT @Estado = -1000
PRINT 'Cliente não encontrado'
GOTO Cancelar
59 / 73
END
DECLARE e_cursor CURSOR FOR
SELECT Num
FROM Fact
WHERE CodTerc = @CodCliente
FOR READ ONLY
OPEN e_cursor
DECLARE @NumFactura INT
FETCH e_cursor INTO @NumFactura
WHILE @@FETCH_STATUS = 0
BEGIN
/* Apaga Linhas Factura */
DELETE FROM LFact WHERE Num = @NumFactura
IF (@@error <> 0 )
BEGIN
SELECT @Estado = -1002
PRINT 'Erro ao apagar Linhas Factura'
GOTO Cancelar
END
/* Apaga factura */
DELETE FROM Fact WHERE Num = @NumFactura
IF (@@error <> 0 )
BEGIN
SELECT @Estado = -1001
PRINT 'Erro ao apagar factura'
GOTO Cancelar
END
FETCH e_cursor INTO @Numfactura
END
CLOSE e_cursor
DEALLOCATE e_cursor
Ok:
COMMIT Tran
PRINT 'Apaga Facturas - Transação Concluída'
RETURN 0
Cancelar:
IF @Estado <> -1000
BEGIN
CLOSE e_cursor
DEALLOCATE e_cursor
END
ROLLBACK Tran
PRINT 'Apaga Facturas - Transação Cancelada'
RETURN @Estado
60 / 73
Triggers
Usando Triggers, pode implementar procedimentos de validação de dados, que analisam os dados
a inserir retirando-os da tabela Inserted. Pode, igualmente, usar Triggers para propagar alterações
entre tabelas (por exemplo, alterar o código de cliente em todas as tabelas que o referenciem, ao
haver uma modificação na tabela de clientes).
Os Triggers são frequentemente usados para implementar políticas das empresas (por exemplo,
não deixar que um artigo duma determinada subfamília tenha um preço maior que x).
À semelhança dos Stored Procedures, os Triggers são um conceito avançado de SQL, e a sua
explicação exaustiva não se enquadra nos objetivos deste capítulo introdutório. Para efeitos de
ilustração, apresentamos seguidamente um exemplo de um Trigger.
Suponha que tinha, para o artigo B, o desconto máximo admissível de 10%. O trigger seguinte,
associado aos eventos Update e Insert da tabela de detalhes duma fatura (LFact), vai cancelar a
inserção/alteração duma linha de fatura se esta tiver um desconto superior a 10% para o artigo
'XPTO':
61 / 73
Novamente recomendamos que o analise apenas como referência. Em termos gerais, o trigger vai
à tabela Inserted buscar os dados que foram inseridos/alterados, e analisa-os. Se o artigo tiver o
código XPTO, e a quantidade de desconto especificada for maior que 10, gera um erro invocando
a função RaiseError, e anula a operação de inserção/ atualização, invocando ROLLBACK
TRANSACTION.
Como já referimos na secção introdutória, centramos este capítulo nos conceitos gerais da
linguagem SQL, sua filosofia e aplicabilidade, e no mais universal dos seus comandos, o SELECT,
com toda a variedade de conceitos a ele associados.
Finalizamos este capítulo com uma descrição breve dos comandos SQL base adicionais, e que
poderá ter necessidade de usar em conjunto com as aplicações PRIMAVERA.
UPDATE Clientes
SET Nome = 'Antonio Manuel Fictício'
WHERE CodTerc = 411
ATENÇÃO: A maior parte dos comandos que a seguir descrevemos podem alterar a
estrutura/conteúdo da sua base de dados. A sua incorreta utilização pode danificar a estrutura da
base de dados e causar a remoção de dados importantes.
• GRANT - Cria uma entrada no sistema de segurança definindo que tipo acesso aos dados
um ou mais utilizadores podem ter.
Exemplo:
GRANT INSERT, UPDATE, DELETE
ON Teste
TO Cardoso, Rui
Notas Finais
O SQL é uma linguagem simples, mas extremamente poderosa. Esperamos que o presente
capítulo contribua para alicerçar os seus conhecimentos de SQL, e lhe permita obter benefícios
acrescidos através da sua utilização em ferramentas disponibilizadas nas aplicações PRIMAVERA.
Para testar comandos SQL, pode usar o utilitário Dentro de Ficheiros, distribuído pela PRIMAVERA
em conjunto com as suas aplicações. Mais uma vez recomendamos muita precaução ao testar
comandos SQL que tenham impacto na estrutura da base de dados ou no seu conteúdo.
65 / 73
Anexo I – Exercícios
Plano do Anexo
Enunciado dos Exercícios
Objetivos
Depois deste capítulo deverá ser capaz de
• Compreender o modelo canónico na prática dominando as principais técnicas de
normalização de esquemas relacionais;
• Entender e aplicar as principais instruções de SQL na vertente DML;
• Com base nos exemplos abordados, saber extrapolar para outros casos práticos que
possam surgir.
Exercícios de SQL
Consultas
Exercício 1
Obtenha uma listagem dos pendentes de Clientes (faturas) ordenada ascendentemente por
Entidade e descendentemente por Tipo de Documento e Data de Vencimento. Acrescente uma
nova coluna que permita obter o prazo de vencimento, de cada documento, em dias. Altere a
listagem por forma a obter o plafond de crédito para cada um desses Clientes.
Exemplo de resultado numa base de dados DEMO:
66 / 73
Exercício 2
Obtenha uma lista de Clientes sem Encomendas. Indique o comando necessário para incluir, nesta
lista, os Clientes sem documentos de Venda emitidos. Faça a distinção por meio de uma nova
coluna que identifique a situação em cada caso.
Exemplo de resultado numa base de dados DEMO:
Exercício 3
Em que documentos de Venda se encontra o artigo A0001 e qual a quantidade vendida?
Exemplo de resultado numa base de dados DEMO:
Exercício 4
Elabore uma query que permita saber o valor global esperado nas encomendas em carteira.
Classifique o resultado obtido por zonas.
Exemplo de resultado numa base de dados DEMO:
67 / 73
Exercício 5
Visualize o número total de Clientes por Localidade. Aplique uma condição ao agrupamento de
forma a visualizar apenas as localidades com 2 ou mais Clientes. Proceda às alterações necessárias
para efetuar os mesmos cálculos pelo campo de descrição da Zona.
Exercício 6
Calcule o diferencial entre o limite de crédito e o plafond gasto pelos Clientes. Crie uma nova
coluna que permita visualizar ‘Boa’ ou ‘Má’ performance consoante a percentagem do plafond
gasto seja inferior ou superior a 50%, respetivamente. Efetue as alterações necessárias, de forma
a evidenciar as situações em que o cliente já excedeu o Limite de Crédito definido.
Exemplo de resultado numa base de dados DEMO:
68 / 73
Exercício 7
Com base no exercício 4, calcule a percentagem do valor do artigo A0004 em relação ao valor
total de cada encomenda.
Exemplo de resultado numa base de dados DEMO:
Exercício 8
Agrupe as vendas efetuadas por rubrica (ex.: ‘REC-VENDAS’) e obtenha o valor total obtido. Com
base nesta script, obtenha o volume de vendas por zona.
Exclua desta última lista, todas as zonas cujo valor obtido seja inferior a 1000 €.
Exemplo de resultado numa base de dados DEMO:
69 / 73
Exercício 9
Elabore uma listagem dos artigos que ainda não foram faturados. Obtenha a descrição ordenada
por famílias e apresente o seu stock atual.
Exemplo de resultado numa base de dados DEMO:
Exercício 10
Exercício 11
Obtenha uma listagem de inventário (valorizada a PCU) onde seja possível obter os seguintes
indicadores: stock atual, stock em excesso ou rutura (consoante o caso). Obtenha uma coluna
descritiva que deverá apresentar ‘excesso’ ou ‘rutura’ em função da situação.
Exemplo de resultado numa base de dados DEMO:
Exercício 1
Insira um novo registo de vendedor, sabendo que:
Código: V10
Nome: Vendedor nº 10
Comissão: 3%
Pagamento de Comissões:
20% Liquidação
80% Venda
Chefe dos vendedores:
4 – 3% comissão
5 – 5% comissão
71 / 73
Exercício 2
Insira um novo utilizador no sistema, sabendo que:
Login: admin
Nome: Administrador
(este utilizador é administrador)
Exercício 3
Introduza para todos os funcionários, a remuneração ‘R21’ com o valor parametrizado por defeito
na ficha de remuneração, para o período de Março de 20XX até Dezembro de 20XX, em que 20XX
corresponde ao Ano corrente.
Exercício 4
Altere os dados do cliente XPTO, sabendo que:
Nova morada:
Rua das Fábricas
Novo limite de Crédito: 2500€
Site da empresa: www.xpto.pt
Exercício 5
Altere os dados da empresa DEMO, sabendo que:
Nova morada: Rua das Flores, nº 14 piso 1 - 1000-000 Lisboa
Exercício 6
Force o PCM dos artigos cujo stock atual é zero.
72 / 73
Exercício 7
Atualize a ficha de funcionários para que todos os funcionários referenciem na ficha que recebem
Subsídio de Alimentação por dias processados e o valor diário a receber é de 10% sobre o
vencimento.
73 / 73