Você está na página 1de 82

Mdulo 14

Linguagem de Manipulao de Dados

Apresentao
Este mdulo pretende introduzir uma linguagem
standard de manipulao de dados em sistema de
gesto de bases de dados.
Esta linguagem permite a pesquisa, a insero, a
alterao e a remoo de registos numa base de
dados.
Neste mdulo, os alunos so confrontados com a
necessidade de aceder a uma base de dados e retirar
de l a informao necessria ao funcionamento do
sistema de informao.

Objetivos de Aprendizagem
No final deste mdulo os alunos devem ter adquirido
conhecimentos, procedimentos e atitudes que lhe permitam:
Utilizar uma linguagem de manipulao de dados.
Pesquisar informao numa base de dados, inserir, apagar e
atualizar dados numa base de dados.
Produzir pesquisas complexas recorrendo aos mecanismos prprios
do SQL.

mbito dos Contedos


SQL como linguagem universal para pesquisas sobre
bases de dados.
Apresentao da linguagem SQL.
Pesquisas (queries) simples sobre a base de dados
(estrutura bsica do comando SELECT).
Predicados ALL e DISTINCT 5.

mbito dos Contedos


Pesquisas complexas. Agregao de dados com a instruo SELECT
Lgica e funes de grupo
JOIN como forma de extrair informao de tabelas diferentes com
base em critrios de comparao de valores em colunas comuns
(INNER JOIN, LEFT JOIN e RIGHT JOIN)
Utilizao de sub pesquisas (ou pesquisas encadeadas)
Unies

Bibliografia / Outros Recursos


CARRIO, Rui Carrio, Desenho de bases de dados e linguagem SQL em Access, Lisboa: C.T.I,
2002. DAMAS, Luis,
SQL Structed Query Language, Lisboa: FCA,2003. PEREIRA, Jos Luis
Tecnologia de bases de dados, FCA,sd. WAZLAWICK, Raul,
Anlise e Projecto de Sistemas de Informao Orientados a Objectos. Lisboa: Editora Campus,
2004.
Computador Internet Retroprojetor / Projetor Multimdia Manuais Escolares
Links importantes:
http://sqlzoo.net/wiki/SELECT_basics
http://sourceforge.net/projects/xampp/
http://dev.mysql.com/doc/refman/5.7/en
http://www.w3schools.com/sql/default.asp
http://Lanapt.com

SQL como linguagem universal para


pesquisas sobre bases de dados.
A SQL (Structured Query Language) uma linguagem de
interrogao para o sistema relacional. Sendo que, embora
possua caractersticas que permitam criar, alterar e remover
todos os componentes de uma base de dados, como tabelas,
consultas, chaves, etc., ser apresentada como linguagem de
manipulao de dados.
A SQL que ser apresentada, baseia-se na estrutura de
funcionamento do MySql em plataforma Windows. Podero
aparecer algumas diferenas na sintaxe para SGBD distintos:
Access MS (Microsoft), o Sql AnyWhere (Sybase) e o Oracle
(Oracle).

Estrutura bsica de expresso de SQL


Select - Sintaxe
Conceptual:
SELECT (projeo da lgebra relacional)
FROM (lista das relaes)
WHERE (predicado da seleo)

Estrutural:
SELECT a1, a2, a3, ...an
(campos pretendidos)
FROM r1, r2, r3, ...rn
(tabelas dos campos pretendidos)
WHERE p
(condies a serem satisfeitas)
Sendo que a clusula WHERE opcional.

Ver mais em: MySql 5.7 en/select

Select - Aplicaes
Como exemplo temos a tabela: tbl_codigospostais
O mais simples:
Select * from tbl_codigospostais;
Ou
Select codigo, local from tbl_codigospostais;
Ou
Select tbl_codigospostais.codigo, tbl_codigospostais.local from tbl_codigospostais;
Ou
Select tbl_codigospostais.* from tbl_codigospostais;
Ou
Select cp.codigo, cp.local from tbl_codigospostais AS cp;
https://www.sqlteaching.com
http://sqlzoo.net/wiki/SELECT_basics

codigo
1000
1100
1500
2000
2040
2300
4000

local
LISBOA
LISBOA
LISBOA
SANTARM
RIO MAIOR
TOMAR
PORTO

Select - Aplicaes
Como exemplo temos a tabela: tbl_codigospostais, tbl_clientes

codigo
1000
1100
1500
2000
2040
2300
4000

local
LISBOA
LISBOA
LISBOA
SANTARM
RIO MAIOR
TOMAR
PORTO

codcliente
1
2
3
4
5
6
7

nome
Ana
Maria
Jos
Andr
Luis
Mrio
Vitor

codigoc
1100
4000
1500
1100
2040
2300
4000

O mais simples:
Select * from tbl_codigospostais, tbl_clientes;
Ou
Select codigo, local, codcliente, nome, codigoc from tbl_codigospostais, tbl_clientes;
Ou
Select tbl_codigospostais.codigo, tbl_codigospostais.local, tbl_clientes.codcliente, tbl_clientes.nome,
tbl_clientes.codigoc from tbl_codigospostais, tbl_clientes;
Ou
Select tbl_codigospostais.*, tbl_clientes.* from tbl_codigospostais, tbl_clientes;
Ou
Select cp.codigo, cp.local, cl.codcliente, cl.nome, cl.codigoc from tbl_codigospostais AS cp, tbl_clientes as cl;

Clusula WHERE (Restrio)

A operao de restrio permite restringir o nmero de linhas a apresentar, que satisfaam a condio pretendida.
No entanto, para efetuar as restries, necessria a utilizao de operadores:
Operadores Relacionais
Operador

Descrio

=
>

Igual a
Maior que

<
>=

Exempl Resultado
o
7=5
Falso
7>5
Verdadeir
o
7<5
Falso
7>=5 Verdadeir
o
7<=5
Falso

Menor que
Maior ou Igual
que
Operadores
Lgicos
<=
Menor ou Igual
que
Operador
Exemplo
<> ou !=
Diferente
7<>5 Verdadeir
AND
condio ou atributo AND condio ou atributo
o
OR
condio ou atributo OR condio ou atributo
NOT
NOT condio

Outros Operadores
BETWEEN permite especificar intervalos de valores.
IN permite especificar conjuntos de valores.
IS permite efetuar o tratamento de nulos (NULL) strings vazias.
LIKE permite resolver alguns problemas naturais que existem quando se pretende

codigo
1000
1100
1500
2000
2040
2300
4000

Select - Aplicaes
Como exemplo temos a tabela: tbl_codigospostais

O mais simples:
Select * from tbl_codigospostais where codigo=1000;
Ou

codigo
1000

Select codigo, local from tbl_codigospostais where codigo=1000;


Ou
Select tbl_codigospostais.codigo, tbl_codigospostais.local from tbl_codigospostais where
tbl_codigospostais.codigo=1000;
Ou
Select tbl_codigospostais.* from tbl_codigospostais where tbl_codigospostais.codigo=1000;
Ou
Select cp.codigo, cp.local from tbl_codigospostais AS cp where cp.codigo=1000;

local
LISBOA

local
LISBOA
LISBOA
LISBOA
SANTARM
RIO MAIOR
TOMAR
PORTO

codigo
1000
1100
1500
2000
2040
2300
4000

=
SELECT *
FROM tbl_codigospostais
WHERE local = LISBOA;

codigo
1000
1100
1500

local
LISBOA
LISBOA
LISBOA

local
LISBOA
LISBOA
LISBOA
SANTARM
RIO MAIOR
TOMAR
PORTO

>
SELECT *
FROM tbl_codigospostais
WHERE codigo > 1100;

codigo
1500
2000
2040
2300
4000

local
LISBOA
SANTARM
RIO MAIOR
TOMAR
PORTO

codigo
1000
1100
1500
2000
2040
2300
4000

local
LISBOA
LISBOA
LISBOA
SANTARM
RIO MAIOR
TOMAR
PORTO

<
SELECT *
FROM tbl_codigospostais
WHERE codigo < 1100;

codigo
1000

local
LISBOA

codigo
1000
1100
1500
2000
2040
2300
4000

local
LISBOA
LISBOA
LISBOA
SANTARM
RIO MAIOR
TOMAR
PORTO

codigo
1000
1100
1500
2000
2040
2300
4000

<=
SELECT *
FROM tbl_codigospostais
WHERE codigo <= 1100;

codigo
1000
1100

local
LISBOA
LISBOA

local
LISBOA
LISBOA
LISBOA
SANTARM
RIO MAIOR
TOMAR
PORTO

!=
SELECT *
FROM tbl_codigospostais
WHERE codigo != 1100;

codigo
1000
1500
2000
2040
2300
4000

local
LISBOA
LISBOA
SANTARM
RIO MAIOR
TOMAR
PORTO

codigo
1000
1100
1500
2000
2040
2300
4000

local
LISBOA
LISBOA
LISBOA
SANTARM
RIO MAIOR
TOMAR
PORTO

codigo
1000
1100
1500
2000
2040
2300
4000

AND
SELECT *
FROM tbl_codigospostais
WHERE (codigo > 1100 AND codigo !=codigo
2000);local
1500
2040
2300
4000

LISBOA
RIO MAIOR
TOMAR
PORTO

local
LISBOA
LISBOA
LISBOA
SANTARM
RIO MAIOR
TOMAR
PORTO

AND
SELECT *

codigo
1000
1100
1500
2000
2040
2300
4000

FROM tbl_codigospostais
WHERE (codigo < 1100 AND codigo > 1500);

local
LISBOA
LISBOA
LISBOA
SANTARM
RIO MAIOR
TOMAR
PORTO

codigo
1000
1100
1500
2000
2040
2300
4000

OR
SELECT *
FROM tbl_codigospostais
codigo
1000
2000
2040
2300
4000

WHERE (codigo < 1100 OR codigo > 1500);

local
LISBOA
SANTARM
RIO MAIOR
TOMAR
PORTO

local
LISBOA
LISBOA
LISBOA
SANTARM
RIO MAIOR
TOMAR
PORTO

codigo
1000
1100
1500
2000
2040
2300
4000

OR
SELECT *
FROM tbl_codigospostais
codigo
1000
2000
2040
2300
4000

WHERE (codigo < 1100 OR codigo > 1500);

local
LISBOA
SANTARM
RIO MAIOR
TOMAR
PORTO

local
LISBOA
LISBOA
LISBOA
SANTARM
RIO MAIOR
TOMAR
PORTO

codigo
1000
1100
1500
2000
2040
2300
4000

NOT
SELECT *
FROM tbl_codigospostais
codigo
1100
1500

WHERE NOT (codigo < 1100 OR codigo > 1500);

local
LISBOA
LISBOA

local
LISBOA
LISBOA
LISBOA
SANTARM
RIO MAIOR
TOMAR
PORTO

NOT/IS
SELECT *
FROM tbl_codigospostais
WHERE IS NOT NULL;

codigo
1000
1100
1500
2000
2040
2300
4000

local
LISBOA
LISBOA
LISBOA
SANTARM
RIO MAIOR
TOMAR
PORTO

SELECT *
FROM tbl_codigospostais
WHERE IS NULL;

codigo

local

codigo
1000
1100
1500
2000
2040
2300
4000

local
LISBOA
LISBOA
LISBOA
SANTARM
RIO MAIOR
TOMAR
PORTO

codigo
1000
1100
1500
2000
2040
2300
4000

NOT
SELECT *
FROM tbl_codigospostais
codigo
1100
1500

WHERE NOT (codigo < 1100 OR codigo > 1500);

local
LISBOA
LISBOA

local
LISBOA
LISBOA
LISBOA
SANTARM
RIO MAIOR
TOMAR
PORTO

LIKE
Comparao entre um valor e uma cadeia de valores
(dados).
codigo
case sensitive.
1000
1100
% todos os carateres de qualquer comprimento 1500
2000
_ todos os carateres de 1 comprimento.
2040

SELECT *
FROM tbl_codigospostais
WHERE local like L%;

codigo
local
1000 LISBOA
1100 LISBOA
1500 LISBOA

2300
4000

local
LISBOA
LISBOA
LISBOA
SANTAR
M
RIO
MAIOR
TOMAR
PORTO

LIKE
SELECT *
FROM tbl_codigospostais
WHERE local like _i%;

codigo
1000
1100
1500
2000
2040
2300
4000

local
LISBOA
LISBOA
LISBOA
SANTAR
M
RIO
MAIOR
TOMAR
PORTO

codigo
1000
1100
1500
2000

LIKE
SELECT *
FROM tbl_codigospostais
WHERE local like _I%;

2040

codigo
1000
1100
1500
2040

local
LISBOA
LISBOA
LISBOA
RIO
MAIOR

2300
4000

local
LISBOA
LISBOA
LISBOA
SANTAR
M
RIO
MAIOR
TOMAR
PORTO

codigo
1000
1100
1500
2000
2040
2300
4000

IN

Especifica a condio para um determinado grupo de


valores.
Select * from tbl_codigospostais
Where local IN (LISBOA, PORTO);

codigo
1000
1100
1500
4000

local
LISBOA
LISBOA
LISBOA
PORTO

local
LISBOA
LISBOA
LISBOA
SANTARM
RIO MAIOR
TOMAR
PORTO

codigo
1000
1100
1500
2000
2040
2300
4000

BETWEEN

local
LISBOA
LISBOA
LISBOA
SANTARM
RIO MAIOR
TOMAR
PORTO

Especifica a condio para um intervalo. til em datas e


valores.
Select * from tbl_codigopostal
Where codigo BETWEEN 1100 AND 2100;
codigo
1100
1500
2000
2040

local
LISBOA
LISBOA
SANTARM
RIO MAIOR

codigo
1000
1100
1500
2000
2040
2300
4000

DISTINCT

Mostra os resultados sem repetir os registos iguais.


Select DISTINCT * from tbl_codigospostais.
codigo
1000
1100
1500
2000
2040
2300
4000

local
LISBOA
LISBOA
LISBOA
SANTARM
RIO MAIOR
TOMAR
PORTO

local
LISBOA
LISBOA
LISBOA
SANTARM
RIO MAIOR
TOMAR
PORTO

ORDER BY
A ordenao pode ser realizada atravs da clusula ORDER BY no comando SELECT. Esta clusula, se
existir, aparece sempre posicionada no final do comando SELECT.

SELECT campo1, campo2, ... campon


FROM tabela

, tabela 2, .... tabela

[WHERE Condio ]
[GROUP BY ............]
[HAVING ]
[ORDER BY Campo [ASC | DESC], Campo [ASC | DESC]]

Onde Campo representa o nome de um Campo, uma Expresso ou a Posio pela qual se pretende
ordenar o resultado do SELECT.
ASC indica que a ordenao ASCendente e DESC indica que a ordenao DESCendente.
Por defeito, ou seja, caso no seja indicado um tipo de ordenao, esta efectuada por ordem
ascendente.

codigo
1000
1100
1500
2000
2040
2300
4000

ORDER BY
SELECT *
FROM tbl_codigospostais
WHERE (codigo < 1100 OR codigo > 1500)
codigo
ORDER BY codigo ASC;

1000
2000
2040
2300
4000

local
LISBOA
SANTARM
RIO MAIOR
TOMAR
PORTO

local
LISBOA
LISBOA
LISBOA
SANTARM
RIO MAIOR
TOMAR
PORTO

ORDER BY
SELECT *
FROM tbl_codigospostais
ORDER BY codigo ASC, local DESC;

codigo
1000
1100
1500
2000
2040
2300
4000

local
LISBOA
LISBOA
LISBOA
SANTARM
RIO MAIOR
TOMAR
PORTO

codigo
1000
1100
1500
2000
2040
2300
4000

Seleo de Expresses

SELECT codigo, local, codigo + 1000


FROM tbl_codigospostais
where cdigo <2000;

codigo
1000
1100
1500

local
LISBOA
LISBOA
LISBOA

Expr1
2000
2100
2500

local
LISBOA
LISBOA
LISBOA
SANTARM
RIO MAIOR
TOMAR
PORTO

Sumario 139-140 (187) +3h


Mdulo 14 Linguagem de manipulao de dados
Comando insert seleo de expresses. Utilizao de
funes (linha e grupo).

codigo
1000
1100
1500
2000
2040
2300
4000

Seleo de Expresses

local
LISBOA
LISBOA
LISBOA
SANTARM
RIO MAIOR
TOMAR
PORTO

SELECT codigo, local, codigo + 1000 AS Novo Codigo


FROM tbl_codigospostais
where cdigo <2000;

codigo
1000
1100
1500

local
LISBOA
LISBOA
LISBOA

Novo Cdigo
2000
2100
2500

Funes
Def. Permitem aplicar formulas na query para atingir e
formatar resultados.
Estas podem ser funes de linha e funes de grupo.
Um funo de linha devolve um resultado por linha da
tabela acedida.
J uma funo de grupo retorna um resultado por grupo
de registros.

Funes de Linha

MID() - Extract characters from a text field


LEN() - Returns the length of a text field
Exemplos de Funes de Linha:
NOW() - Returns the current system date and
time
- LCASE ("UFF") uf
FORMAT() - Formats how a field is to be
- UPPER ("uf") UFF
displayed
- INITCAP (escola secundria Dom") Escola Secundria Dom (ORACLE)
- CONCAT ("String1", "String2") String1String2
- SUBSTR ("String", 1, 3) Str
- LENGTH ("UFF") 3
- IFNULL (SAL, 0) Se SAL for NULO seu valor ser convertido para zero.
- ROUND (78.731, 2) 78.73 (At 4 p/ baixo, Acima de 4 p/ cima)
- ROUND (78.731, 0) 79
- TRUNC (78.731, 2) 78.73
- TRUNC (78.731) 78
- MOD (100, 30) 10

Funes de Grupo
Funes de Grupo Existentes:
AVG() - Mdia
COUNT() Total de registos
FIRST() Mostra o primeiro valor
LAST() Mostra o ultimo valor
MAX() O mximo (Maior)
MIN() O Mnimo (valor mais pequeno)
SUM() Soma dos resultados
VARIANCE(), STDDEV e STDEVP () (Estatsticas)

Insert Into
Sintaxe:
INSERT INTO TABLE_NAME (column1, column2,
column3,...columnN)]
VALUES (value1, value2, value3,...valueN);
No preciso especificar os campos desde que:
INSERT INTO TABLE_NAME VALUES
(value1,value2,value3,...valueN);

INSERT INTO
Inserir registos nas tabelas.
INSERT INTO tbl_codigospostais (codigo, local)
values (2900, Setbal);

INSERT INTO tbl_codigospostais (codigo, local)


values (5900, Viana do Castelo);

Update
Sintaxe:
UPDATE table_name
SET column1 = value1, column2 = value2...., columnN =
valueN
WHERE [condition];
(na condio pode-se combiner and e or)

UPDATE
UPDATE from tbl_codigopostal set local= PORTO
where codigo=2000;
codigo
1000
1100
1500
2000
2040
2300
4000

local
LISBOA
LISBOA
LISBOA
SANTARM
RIO MAIOR
TOMAR
PORTO

codigo
1000
1100
1500
2000
2040
2300
4000

local
LISBOA
LISBOA
LISBOA
PORTO
RIO MAIOR
TOMAR
PORTO

DELETE
Sintaxe:
DELETE FROM table_name
WHERE [condition];
(na condio pode-se usar o AND e OR).
Cuidado ao realizar o: Delete From table;

DELETE - Exemplos
Delete from tbl_codigopostalcodigo
1000
where local=PORTO;

1100
1500
2000
2040
2300
4000

local
LISBOA
LISBOA
LISBOA
PORTO
RIO MAIOR
TOMAR
PORTO

codigo
1000
1100
1500
2040
2300

local
LISBOA
LISBOA
LISBOA
RIO MAIOR
TOMAR

Juntando vrias tabelas


O Modelo Relacional estabelece claramente as regras
para a diviso da informao entre tabelas, de forma a
evitar a duplicao da informao.
Esta disperso da informao por diferentes tabelas
facilmente manipulvel atravs da linguagem SQL, um
vez que a ligao entre estas ser realizada atravs das
chaves estrangeiras.

A juno entre tabelas faz-se colocando na clusula


FROM o conjunto de tabelas que se pretende juntar.
SELECT campo1, campo2, ... Campo n
FROM tabela 1 , tabela 2, .... tabela n

Produto Cartesiano de Tabelas


Consideremos as seguintes relaes (Pessoa e Postal):
Id
71
54
12
49

Nome
Antnio Dias
Clia Morais
Isabel Silva
Jos Antnio

Idade
43
36
28
17

Telefone
789654
123456
333555

Cod_postal
1000
1000
2040
2000

Cdigo
1000
2000
2040
4000

Local
Lisboa
Santarm
Rio Maior
Porto

SELECT *
FROM Pessoa, Postal
Obtm-se um resultado bastante inesperado e que consiste no produto cartesiano de
dois conjuntos de elementos.
O produto cartesiano entre as tabelas Pessoa e Postal associa a cada linha da tabela
Pessoa o conjunto das linhas da tabela Postal.

Produto Cartesiano de Tabelas

Dado que na tabela Pessoa existem


4 registos e na tabela Postal
existem 4 registos, o resultado do
produto cartesiano ser 4*4 = 16
registos.

Id

Nome

7
1
7
1
7
1
7
1
5
4
5
4
5
4
5
4
1
2

Antnio Dias

Idade Telefone Cod_postal Cdig


Local
o
43 789654
1000 1000 Lisboa

Antnio Dias

43

789654

1000

2000 Santarm

Antnio Dias

43

789654

1000

2040 Rio Maior

Antnio Dias

43

789654

1000

4000 Porto

Clia Morais

36

123456

1000

1000 Lisboa

Clia Morais

36

123456

1000

2000 Santarm

Clia Morais

36

123456

1000

2040 Rio Maior

Clia Morais

36

123456

1000

4000 Porto

Isabel Silva

28

2040

1000 Lisboa

Produto Cartesiano de Tabelas

O pretendido seria a juno entre


as tabelas Pessoa e Postal. Para tal
necessrio, na clusula WHERE,
indicar as chaves estrangeiras de
ligao.

Id
71
71
71
71
54
54
54
54
12
12
12
12
49
49
49
49

Nome
Antnio Dias
Antnio Dias
Antnio Dias
Antnio Dias
Clia Morais
Clia Morais
Clia Morais
Clia Morais
Isabel Silva
Isabel Silva
Isabel Silva
Isabel Silva
Jos Antnio
Jos Antnio
Jos Antnio
Jos Antnio

Idade
43
43
43
43
36
36
36
36
28
28
28
28
17
17
17
17

Telefone
789654
789654
789654
789654
123456
123456
123456
123456

333555
333555
333555
333555

Cod_postal Cdigo
Local
1000
1000 Lisboa
1000
2000 Santarm
1000
2040 Rio Maior
1000
4000 Porto
1000
1000 Lisboa
1000
2000 Santarm
1000
2040 Rio Maior
1000
4000 Porto
2040
1000 Lisboa
2040
2000 Santarm
2040
2040 Rio Maior
2040
4000 Porto
2000
1000 Lisboa
2000
2000 Santarm
2000
2040 Rio Maior
2000
4000 Porto

Produto Cartesiano de Tabelas

SELECT *
FROM Pessoa, Postal
WHERE Cod_postal = Cdigo

Id

Nome

7
1
5
4
1
2
4
9

Antnio Dias

Idade Telefone Cod_postal Cdig


Local
o
43 789654
1000 1000 Lisboa

Clia Morais

36

Isabel Silva

28

Jos Antnio

17

123456

333555

1000

1000 Lisboa

2040

2040 Rio Maior

2000

2000 Santarm

Equi-Join
Acontece quando todas as colunas das tabelas so
apresentadas e a ligao entre as tabelas feita
atravs de uma igualdade, dando origem assim a duas
colunas de contedos exatamente iguais.
SELECT *
FROM Pessoa, Postal

Id

Nome

7
1
5
4
1
2
4
9

Antnio Dias

Idade Telefone Cod_postal Cdig


Local
o
43 789654
1000 1000 Lisboa

Clia Morais

36

Isabel Silva

28

Jos Antnio

17

WHERE Cod_postal = Cdigo

123456

333555

1000

1000 Lisboa

2040

2040 Rio Maior

2000

2000 Santarm

Natural Join
Acontece quando todas as colunas envolvidas na
ligao entre tabelas so apresentadas sem repetio
de colunas.
SELECT Pessoa.*, Postal.Local
FROM Pessoa, Postal
WHERE Cod_postal = Cdigo

INNER JOIN
Estes dois tipos de ligao entre tabelas fazem parte de
um tipo de ligao mais geral denominada INNER JOIN.
Num INNER JOIN, apenas so apresentados os registos
em que exista ligao entre as tabelas.
http://www.codeproject.com/Articles/33052/VisualRepresentation-of-SQL-Joins

INNER JOIN
Embora existam diversos tipos de ligao entre tabelas
(JOIN), este o tipo mais comum e utilizado.
Pretende-se selecionar o nome e morada completa
(cdigo e localidade) de todas as pessoas da tabela
Pessoa.
SELECT Nome, Cod_postal, Local
FROM Pessoa, Postal
Where Cod_postal = Cdigo

INNER JOIN
Embora ainda de uso pouco comum, possvel, em
alguns sistemas, escrever o mesmo SELECT num
formato em que se especifique a natureza do Join
(INNER), no mesmo exemplo mas ordenando o resultado
por Cdigo Postal.
SELECT Nome, Cod_postal, Local
FROM Pessoa INNER JOIN Postal

Nome
Cod_postal
Local
Antnio Dias
1000 Lisboa
Clia Morais
1000 Lisboa
Jos Antnio
2000 Santarm
Isabel Silva
2040 Rio Maior

ON Pessoa.Cod_postal = Postal.Cdigo
ORDER BY Pessoa.Cod_postal

OUTER JOIN - LEFT


O conceito do Outer Join obter numa ligao a totalidade das linhas de uma
tabela, ainda que no exista o correspondente valor na outra tabela a que esta
est ligada pela juno.
Pretende-se selecionar o nome e morada completa (cdigo e localidade) de todas
as pessoas da tabela Pessoa, assim como todos os cdigo postais existentes na
Nome
Cod_postal Cdigo
Local
tabela Postal.
SELECT Nome, Cod_postal, Cdigo, Local
FROM Postal LEFT JOIN Pessoa
ON Postal.Cdigo = Pessoa.Cod_postal

Antnio Dias
Clia Morais

1000
1000

Jos Antnio
Isabel Silva

2000
2040

1000
1000
1100
2000
2040
2300
4000

Lisboa
Lisboa
Lisboa
Santarm
Rio Maior
Tomar
Porto

Todas as linhas da tabela Postal so apresentadas. Se existir correspondente na


coluna Cod_postal da tabela Pessoa, so mostrados os dados, seno as entradas
da tabela Pessoa so preenchidas a NULL.

OUTER JOIN
Quando o Outer Join efectuado direita, so considerados todos os
registos da tabela da direita e apenas os registos correspondentes na
tabela da esquerda.
Pretende-se selecionar todas as pessoas da tabela
pessoa, assim como os correspondentes valores de
comisso.

OUTER JOIN
Pretende-se selecionar todas as pessoas da tabela
pessoa, assim como os correspondentes valores de
comisso.
SELECT Nome, Valor
FROM Comisso RIGHT JOIN Pessoa

Nome
Antnio Dias
Antnio Dias
Isabel Silva
Jos Antnio
Jos Antnio
Joo Silva

Valor
100
200
1250
750

ON Comisso.Id = Pessoa.Id
Saber todas as pessoas e quais as correspondncias na
comisso mesmo que no tenham valor.

SELF JOIN
O Self Join uma variante do Inner Join, em que se comparam duas colunas da mesma
tabela.

Pretende-se saber quais os tipos de cdigos postais existentes diferentes do local LISBOA.

SELECT p1.Cdigo, p2.Local


FROM Postal.p1, Postal.p2
WHERE p1.Cdigo = p2.Cdigo
AND
p2.Local <> Lisboa

UNION
Uma unio no propriamente uma ligao entre tabelas.
A UNION permite juntar o contedo de mltiplos comandos SELECT.
Pretende-se juntar o cdigo e a descrio da tabela mensagens aos cdigos
postais.
Depois de executados os comandos, os resultados obtidos sero:
Id_msg
10
30
40
1000
2040
4000

Mensagem
Comisso de vendas
Vendas extra
Refeies
Lisboa
Rio Maior
Porto

Na UNION, o nmero de campos a selecionar em cada um dos comandos


SELECT tem de ser igual.
O nome dos campos no relevante, mas o tipo de dados que pode ser agrupado
depende de sistema para sistema.

SELECT Id_msg, Mensagem FROM Mensagem


UNION
SELECT Cdigo, Local FROM Postal

Funes de agregao/conjunto/grupo
Estas funes, tambm designadas por Funes Estatsticas, tm por objetivo obter informao sobre conjuntos de
linhas especificadas na clusula WHERE ou sobre grupos de linhas indicadas na clusula GROUP BY.

Funo

Descrio

COUNT(campo) Devolve o nmero de linhas.


MAX(campo)

Devolve o maior valor da coluna.

MIN(campo)

Devolve o menor valor da coluna.

SUM(campo)

Devolve a soma de todos os valores da coluna.

AVG(campo)

Devolve a mdia de todos os valores da coluna.

FUNO COUNT
A funo de agregao COUNT devolve o nmero de
linhas que resultam num SELECT.
Pode ser utilizada de trs formas distintas:
Forma
COUNT (*)
COUNT (coluna)
COUNT (DISTINCT coluna)

Descrio
Devolve o nmero de linhas que resulta de um SELECT.
Devolve o nmero de ocorrncias na coluna diferentes de NULL.
Devolve o nmero de ocorrncias (sem repeties) na coluna.

MIN e MAX
As funes de agregao MIN e MAX permitem obter o menor e o
maior valor de uma determinada coluna.
Exemplo: Pretende-se saber qual o salrio mais elevado e o salrio mais baixo da
tabela Pessoa.
SELECT MAX (salrio) AS [Salrio mais elevado],
MIN (salrio) AS [Salrio mais baixo]
FROM Pessoa

Exemplos prticos
Pretende-se saber a idade da pessoa mais nova e a
idade da pessoa mais velha da tabela Pessoa.
?
Qual o pas com mais e com menos populao?
?
Nota: tambm funciona alfabeticamente.

Id
42
5
32
37
49
14
75

SUM

Nome
Antnio Dias
Clia Morais
Florinda Simes
Isabel Espada
Jos Antnio
Nascimento Augusto
Pedro Santos

Idade
43
36
35
28
17
35
42

Salrio
Telefone
94000 7896544
170000 1234565
147000
86000
210000
220000 4561233
235000

A funo SUM devolve a soma de uma determinada coluna.


Pretende-se saber o total de salrios da tabela Pessoa.
SELECT SUM (salrio) AS [Total de Salrios]
FROM Pessoa
Total de Salrios
1162000

E quanto 10% do total dos salrios?

Cod_postal
1000
1000
4000
2040
1000
2300
2040

AVG
A funo AVG devolve a mdia dos valores de uma determinada coluna.
Pretende-se saber a mdia das idades da tabela Pessoa.
SELECT AVG (idade) AS [Mdia de Idades]
FROM Pessoa

Mdia de idades
33.714285714285714

Agrupando a informao

As funes de agregao so uma ferramenta til quando usada para


obter informao resumida sobre o resultado de um comando
SELECT.
No entanto, estas funes podem ser particularmente teis no
tratamento de informao de forma agrupada, no como um todo, mas
em grupos mais pequenos.

Agrupando a informao
Pretende-se mostrar as comisses e respetivos valores, ordenando o resultado por Id da
tabela comisso.
SELECT Id_comisso, Valor
FROM Comisso
ORDER BY Id_comisso

SELECT SUM(Valor) AS Total


FROM Comisso

Id_comisso
14
14
14
14
25
25
25

Valor
2600
400
3750
10500
370
2400
100

Total
40180

Id_comisso
37
37
37
37
40
42
42

Valor
120
5500
14230
20
20
150
20

Agrupando a informao
No entanto, se o objectivo fosse obter a soma das comisses por cada Id_comisso, o
resultado apresentado no seria o pretendido.
Para resolver essas questes necessrio, antes de aplicar as funes de agregao,
possuir a informao agrupada.
SELECT campo1, campo2, ... campon
FROM tabela

, tabela 2, .... tabela

[WHERE Condio ]
[GROUP BY ............]

Clusula GROUP BY
Esta clusula divide o resultado de um SELECT em grupos de
resultados que iro ser tratados com as funes de agregao.
A clusula GROUP BY utilizada para agrupar informao.
Os registos so processados em grupos de caractersticas semelhantes.
As funes de agregao podem ser utilizadas para obter informao
sobre cada um dos grupos.

Agrupando a informao
Pretende-se mostrar as comisses e respetivos valores, ordenando o resultado por Id da
tabela comisso.
SELECT Id_comisso, Valor
FROM Comisso
ORDER BY Id_comisso

SELECT SUM(Valor) AS Total


FROM Comisso

Id_comisso
14
14
14
14
25
25
25

Valor
2600
400
3750
10500
370
2400
100

Total
40180

Id_comisso
37
37
37
37
40
42
42

Valor
120
5500
14230
20
20
150
20

Agrupando a informao
Pretende-se saber, para cada Id, o total de valores de
comisses.
SELECT Id_comisso, SUM(Valor) AS Total
FROM Comisso
GROUP BY Id_comisso

Id_comisso

Total
14
25
37
40
42

17250
2870
19870
20
170

Exerccios prticos
Pretende-se saber, para cada Id, o maior valor de
comisso?
Pretende-se saber para cada Id, o maior valor de
comisso, efectuando a ordenao descendente por
maior valor de comisso?

Resposta
SELECT MAX(Valor) AS Maior, Id_comisso
FROM Comisso
GROUP BY Id_comisso
ORDER BY MAX(Valor) DESC
Maior

Id_comisso
14230
10500
2400
150
20

37
14
25
42
40

Microsoft.jet.oledb.4.0
microsoft.ace.oledb.12.0
Connection String
Provider=Microsoft.ACE.OLEDB.12.0;Data
Source=C:\AccessFile.accdb;
Jet OLEDB:Database Password=MyDbPassword;
Provider=Microsoft.Jet.OLEDB.4.0;Data
Source=C:\mydatabase.mdb;
Jet OLEDB:Database Password=MyDbPassword;

conn = new
System.Data.OleDb.OleDbConnection(@"Provider=Micros
oft.ACE.OLEDB.12.0;Data Source=C:\test.accdb")

using (var conn = new


OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data
Source=C:\BC207\test.accdb"))
using (var comm = conn.CreateCommand())
{

comm.CommandText = "SELECT password FROM HAHA";

comm.CommandType = CommandType.Text;

conn.Open();

var returnValue = comm.ExecuteScalar();

MessageBox.Show(returnValue.ToString());

ExecuteScalar is typically used when your query returns


a single value. If it returns more, then the result is the
first column of the first row. An example might be
SELECT @@IDENTITY AS 'Identity'.
ExecuteReader is used for any result set with multiple
rows/columns (e.g., SELECT col1, col2 from sometable).
ExecuteNonQuery is typically used for SQL statements
without results (e.g., UPDATE, INSERT, etc.).

using (SqlConnection connection = new SqlConnection(connectionString))


{
connection.Open();
//
// Create new SqlCommand object.
//
using (SqlCommand command = new SqlCommand("SELECT * FROM Dogs1", connection))
{
SqlDataReader reader = command.ExecuteReader();
while (reader.Read())
{
int weight = reader.GetInt32(0);

// Weight int

string name = reader.GetString(1); // Name string


string breed = reader.GetString(2); // Breed string
Console.WriteLine("Weight = {0}, Name = {1}, Breed = {2}", weight, name, breed);
}
}
}