Escolar Documentos
Profissional Documentos
Cultura Documentos
SQL é mais que uma linguagem de interrogação estruturada. Inclui características para a definição
da estrutura de dados, para alterar os dados de uma base de dados, e para especificar esquemas de
segurança. Estas características agrupam-se do seguinte modo:
Numa base de dados relacional, toda a informação está logicamente organizada em tabelas.
Podemos considerar a existência de dois tipos de tabelas numa base de dados:
• as tabelas base que efectivamente estão armazenadas num suporte físico da base de
dados
• as tabelas virtuais que só existem em resultado da execução de um conjunto de
comandos de consulta, executados sobre as tabelas base.
A palavra inglesa querie designa uma consulta à base de dados e consiste na execução de uma ou
mais operações sobre tabelas.
As queries ou consultas podem ser executadas sobre as tabelas base ou sobre as tabelas virtuais
que resultam de outras consultas.
Do ponto de vista lógico, o resultado de uma consulta (querie) é uma tabela. A diferença entre uma
tabela base e uma tabela virtual é basicamente a seguinte: as tabelas base existem fisicamente como
estruturas de dados; as tabelas virtuais (resultados de queries) existem apenas como um conjunto de
comandos que permitem extrair informação da base de dados.
Pág. 1 de 16
S.Q.L. (Structured Query Language)
Escola Secundária de Emídio Navarro 2001/2002
Estruturas, Tratamento e Organização de Dados
Noções Elementares
Predicados – Um predicado é uma condição que pode ser realizada para produzir um valor
verdadeiro, falso ou desconhecido. São eles:
• Comparação (=, <, >, <>, <=, =>)
• Entre (... BETWEEN ... AND ..., IN, NOT IN)
• LIKE
• NULL
• Quantificadores (ALL, SOME, ANY)
• EXISTS, NOT EXISTS
As cláusulas são expressões realizadas em tabelas que se usam para derivar tabelas, tais como
FROM, WHERE, GROUP BY, HAVING e ORDER BY.
Pág. 2 de 16
S.Q.L. (Structured Query Language)
Escola Secundária de Emídio Navarro 2001/2002
Estruturas, Tratamento e Organização de Dados
Se lect Q ue r ie s
Cláusula SELECT
Sintaxe:
SELECT <lista_campos>
FROM <lista_tabelas>
Cláusula WHERE
Permite estabelecer condições entre campos da tabela(s) ou até mesmo envolvendo input’s
digitados pelo utilizador.
Sintaxe:
SELECT <lista_campos> FROM <lista_tabelas>
WHERE <critério>
Pág. 3 de 16
S.Q.L. (Structured Query Language)
Escola Secundária de Emídio Navarro 2001/2002
Estruturas, Tratamento e Organização de Dados
• Consulta o Nome, Região e Cidade quando a região toma o valor ‘CA’ e a cidade é Lisboa:
SELECT Nome, Região, Cidade
FROM Editoras
WHERE Região=’CA’ AND Cidade=’Lisboa’
Pág. 4 de 16
S.Q.L. (Structured Query Language)
Escola Secundária de Emídio Navarro 2001/2002
Estruturas, Tratamento e Organização de Dados
• Consulta todos os nomes e cidades onde o campo Pubid toma valores entre 10 e 20:
SELECT Nome, Cidade
FROM Editoras
WHERE Pubid BETWEEN 10 AND 20
• Consulta todos os nomes e cidades onde o campo região toma valores no conjunto (‘NY’,
’CA’, ’AK’):
SELECT Nome, Cidade
FROM Editoras
WHERE Região IN (‘NY’, ’CA’, ’AK’)
Sintaxe:
SELECT <tabela1.colunaA>, <tabela2.colunaA>
FROM <tabela1>, <tabela2>
WHERE <tabela1.colunaA> = <tabela2.colunaA>
• Consulta todas as linhas da tabela Títulos e da tabela Autores com o mesmo campo Au_ID.
Se existir algum título para o qual não foi introduzido código de um Autor, o mesmo não
aparecerá (se o código do autor não for chave primária).
SELECT Titulos.Titulo, Autores.Autor
FROM Titulos, Autores
WHERE Titulos.Au_ID = Autores.Au_ID
Esta operação designa-se por INNER JOIN, como se verá na devida altura.
Pág. 5 de 16
S.Q.L. (Structured Query Language)
Escola Secundária de Emídio Navarro 2001/2002
Estruturas, Tratamento e Organização de Dados
Cláusula AS
Funções agregadas
Se não for mencionado o Nome da coluna [Total], é por defeito Expr1000. Como tal, é conveniente
atribuir um título à coluna.
Pág. 6 de 16
S.Q.L. (Structured Query Language)
Escola Secundária de Emídio Navarro 2001/2002
Estruturas, Tratamento e Organização de Dados
Poderíamos escrever o mesmo comando com uma cláusula WHERE (talvez mais prático).
SELECT titulos.titulo, titulos.ISBN, autores.autor, editoras.nome
FROM titulos, autores, editoras
WHERE editoras.editID = titulos.editID
AND titulos.au_ID = autores.au_ID
Pág. 7 de 16
S.Q.L. (Structured Query Language)
Escola Secundária de Emídio Navarro 2001/2002
Estruturas, Tratamento e Organização de Dados
Uma cláusula RIGHT JOIN inclui todos os registos da segunda tabela (à direita), mesmo que não
exista nenhuma relação com a primeira tabela (à esquerda).
• Listar todas as editoras, mesmo que não tenham nenhum titulo publicado:
SELECT titulos.titulo, editoras.nome
FROM titulos, editoras
titulos RIGHT JOIN editoras ON titulos.editID = editoras.auID
A cláusula LEFT JOIN inclui todos os registos da primeira tabela (à esquerda), mesmo que não
exista nenhuma relação com a segunda tabela (à direita).
Predicado ALL
ALL – Se não incluir um dos predicados referidos, ALL é assumido e todos os registos que verificam
as condições são devolvidos.
SELECT ALL
FROM titulos, autores
WHERE editoras.editID = titulos.editID
SELECT *
FROM titulos, autores
WHERE editoras.editID = titulos.editID
Pág. 8 de 16
S.Q.L. (Structured Query Language)
Escola Secundária de Emídio Navarro 2001/2002
Estruturas, Tratamento e Organização de Dados
Predicado DISTINCT
Esta cláusula omite todos os registos que contêm dados duplicados nos campos seleccionados. Por
outras palavras, se o querie contiver um campo com o mesmo valor em mais do que uma linha, a cláusula
DISTINCT elimina todos os duplicados.
Este querie devolve tantas linhas quantos os títulos que existem na tabela de títulos. Para eliminar a
repetição do nome das editoras, usa-se:
SELECT DISTINCT editoras.nome
FROM titulos, editoras
WHERE editoras.editID = titulos.edit.ID
Predicado DISTINCTROW
Omite dados baseados em registos duplicados, mas não referentes a campos duplicados.
SELECT DISTINCTROW titulos.titulo, titulos.anoedicao,
autores.autor, editoras.nome AS Editora
FROM editoras, titulos.(editoras RIGHT JOIN titulos
ON editoras.editID = titulos.editID) LEFT JOIN autores
ON titulos.au_ID = autores.au_ID
WHERE (editoras.nome = [Insira Nome])
ORDER BY titulos.titulo
Observa que na sexta linha existe [Insira Nome]. Isto significa que é solicitado ao utilizador que
insira um nome para depois efectuar-se a comparação. Deste modo, quando se utiliza uma string entre
parêntesis rectos que não seja o nome de um campo, o SQL solicita ao utilizador que insira um valor (string
ou não) pelo teclado.
Pág. 9 de 16
S.Q.L. (Structured Query Language)
Escola Secundária de Emídio Navarro 2001/2002
Estruturas, Tratamento e Organização de Dados
Cláusula ORDER BY
Estas cláusulas servem para limitar o número de registos num conjunto de resultados.
SELECT TOP 5 *
FROM precos_livros
ORDER BY unidades DESC
Pág. 10 de 16
S.Q.L. (Structured Query Language)
Escola Secundária de Emídio Navarro 2001/2002
Estruturas, Tratamento e Organização de Dados
Cláusula GROUP BY
A cláusula GROUP BY especifica o modo como queremos agrupar o resultado da função agregada.
• Consulta o menor preço, maior preço e preço médio dos produtos por categoria:
SELECT prod_categoria AS Categoria,
COUNT(prod_categoria) AS [Nº Elementos],
MIN(prod_preco) AS Min,
MAX(prod_preco) AS Max,
AVG(prod_preco) AS Média
FROM Produtos
GROUP BY prod_categoria
Pág. 11 de 16
S.Q.L. (Structured Query Language)
Escola Secundária de Emídio Navarro 2001/2002
Estruturas, Tratamento e Organização de Dados
Cláusula HAVING
Podemos utilizar a cláusula HAVING para aplicar um filtro ao resultado de um querie ao contrário da
cláusula WHERE que aplica um filtro a toda(s) a(s) tabela(s) envolvida(s).
Vejamos o mesmo querie com a aplicação de um filtro, para limitar as categorias de produtos a
bolachas e aperitivos.
SELECT prod_categoria AS Categoria,
COUNT(prod_categoria) AS [Nº Elementos],
MIN(prod_preco) AS Min,
MAX(prod_preco) AS Max,
AVG(prod_preco) AS Média
FROM Produtos
GROUP BY prod_categoria
HAVING prod_categoria IN [“Bolachas”,”Aperitivos”]
Pág. 12 de 16
S.Q.L. (Structured Query Language)
Escola Secundária de Emídio Navarro 2001/2002
Estruturas, Tratamento e Organização de Dados
Revisão:
) Observe que o nome de um campo quando possui um ou mais espaços, deve estar envolvido entre
parêntesis rectos.
Pág. 13 de 16
S.Q.L. (Structured Query Language)
Escola Secundária de Emídio Navarro 2001/2002
Estruturas, Tratamento e Organização de Dados
Um nome alternativo para uma tabela deve ser definido na cláusula FROM. O nome alternativo
pode depois ser usado tanto na cláusula SELECT como na cláusula WHERE. Por exemplo: para abreviar o
nome da tabela autores para au, escreve-se:
AC TION QU ER IES
As Action Queries não devolvem um conjunto de registos. Apenas modificam o conteúdo de uma
ou mais tabelas.
O comando INSERT serve para inserir novas linhas, ou parte de novas linhas, numa tabela.
Sintaxe:
INSERT INTO <destino> [IN <externaldatabase>][(<campo1>[,<campo2>...)]]
SELECT [<origem>.]<campo1>[,<campo2>[,...]
FROM <expressão>
Pág. 14 de 16
S.Q.L. (Structured Query Language)
Escola Secundária de Emídio Navarro 2001/2002
Estruturas, Tratamento e Organização de Dados
• Selecciona todos os registos da tabela Ajudantes que verificam a condição “DataSalario <
Now()-30” e adiciona-os à tabela empregados:
INSERT INTO Empregados
SELECT Ajudantes.*
FROM Ajudantes
WHERE [Data Salário] < Now() - 30
Actualizar Registos
Sintaxe:
UPDATE <tabela>
SET <coluna1> = <valor1>
SET <coluna2> = <valor2>
..............
SET <colunaN> = <valorN>
WHERE <critério>
Pág. 15 de 16
S.Q.L. (Structured Query Language)
Escola Secundária de Emídio Navarro 2001/2002
Estruturas, Tratamento e Organização de Dados
Apaga Registo(s)
Pág. 16 de 16