S.Q.L. (Structured Query Language) Escola Secundária de Emídio Navarro 2001/2002 Estruturas, Tratamento e Organização de Dados SQL (Structured Querie Language) 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: DDL – Data Definition Language DML – Data Manipulation Language DCL – Data Control Language 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 São válidos os seguintes operadores aritméticos: • Soma + • Subtracção - • Multiplicação * • Divisão / Os operadores lógicos são: AND, OR e NOT. 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 Linguagem de Manipulação de Dados (DML – Data Manipulation Language) É utilizada para efectuar operações de selecção, ordenação, cálculo de informação guardada em tabelas, entre outras. Se lect Q ue r ie s Cláusula SELECT Permite extrair informação de uma Base de Dados (DB – Data Base). Sintaxe: SELECT <lista_campos> FROM <lista_tabelas> • Consulta todos os autores da tabela Autores: SELECT Autor FROM Autores • Consulta todos os campos da tabela Autores: SELECT * FROM Autores • Consulta todos os autores visualizando o dobro da sua idade: SELECT Autor, Idade * 2 AS [Idades] FROM Autores 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> ) as listas são separadas por vírgulas ) se desejarmos seleccionar todos os campos usamos * 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 • Uma consulta à tabela no sentido de obter apenas os elementos relativos às editoras situadas na cidade de Lisboa: SELECT Pubid, Nome AS [Nome Editora], Morada, Cod_Postal, Cidade, Telefone FROM Editoras WHERE Cidade=’Lisboa’ • Consulta o nome e morada de todas as editoras da cidade de Lisboa: SELECT Nome, Morada FROM Editoras WHERE Cidade=’Lisboa’ • 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’ Utilizar na cláusula WHERE – LIKE Destina-se a comparar strings com padrão. • Consulta os nomes de todos os autores que tenham Lopes no nome: SELECT Autor FROM Autores WHERE Autor LIKE ‘*Lopes*’ • Consulta o(s) código(s) e descrição(ões) do(s) produto(s) quando na descrição está envolvida a palavra sumos: SELECT Prod_Cod, Prod_Descrição FROM Produtos WHERE Prod_Descrição LIKE ‘*sumos*’ 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 Utilizar na cláusula WHERE – BETWEEN … AND • 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 Utilizar na cláusula WHERE – IN • 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’) Cláusula WHERE na “ligação” de duas ou mais tabelas 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 Permite alterar o cabeçalho (titulo) que irá aparecer na listagem obtida. SELECT Titulos.Titulo AS [Titulo do Livro], Autores.Autor AS [Autor do Livro] FROM Titulos.Autores WHERE Titulos.Au_ID = Autores.Au_ID Funções agregadas Devolve o número de linhas em que COUNT(<nome_campo>) o campo <nome_campo> não é nulo MAX(<nome_campo>) Devolve o maior valor para o campo <nome_campo> MIN(<nome_campo>) Devolve o menor valor para o campo <nome_campo> SUM(<nome_campo>) Devolve a soma dos conteúdos do campo <nome_campo> AVG(<nome_campo>) Devolve a média dos conteúdos do campo <nome_campo> FIRST(<nome_campo>) Devolve o valor do primeiro registo da tabela ou Querie LAST(<nome_campo>) Devolve o valor do último registo da tabela ou Querie • Devolve o número de elementos da tabela Produtos: SELECT COUNT(Prod_Codigo) AS [Total] FROM Produtos 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 • Devolve o menor, o maior e o preço médio dos livros: SELECT COUNT(Unidades) AS [Nº Elementos], MIN(Preço_Unidades) AS Min, MAX(Preço_Unidades) AS Max, AVG(Preço_Unidades) AS Média FROM Preços_Livros • Consulta os livros com menor preço SELECT titulo, anopublicação, preço FROM titulos, preços WHERE titulos.codpreco = precos.codpreco AND Preco = (SELECT Min(preco) FROM precos) Cláusula INNER JOIN Estabelece ligação entre duas ou mais tabelas através de campos chave. SELECT titulos.titulo, autores.autor FROM titulos, autores.titulos INNER JOIN autores ON titulos.au_ID = autores.au_ID 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 Cláusulas LEFT JOIN e RIGHT JOIN 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). • Listar todos os titulos, mesmo os que não tenham editoras: SELECT titulos.titulo, editoras.nome FROM titulos, editoras titulos LEFT JOIN editoras ON titulos.editID = editoras.auID 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. Dois exemplos equivalentes: 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. • Lista as editoras que têm pelo menos um titulo publicado: SELECT editoras.nome FROM titulos, editoras WHERE editoras.editID = titulos.edit.ID 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 • Permite ordenar a listagem pelo campo referido, por ordem crescente: SELECT au_ID, autor FROM autores ORDER BY autor • Consulta as regiões e cidades por ordem descendente e ascendente respectivamente: SELECT regiao, cidade FROM editoras ORDER BY regiao DESC, cidade ASC Cláusulas TOP n e TOP n PERCENT Estas cláusulas servem para limitar o número de registos num conjunto de resultados. TOP n – Devolve os primeiros n registos. Quando utilizamos a cláusula TOP por vezes recorre-se ao uso da cláusula ORDER BY. SELECT TOP 5 * FROM precos_livros ORDER BY unidades DESC TOP n PERCENT – Devolve os primeiros n porcentos de registos. SELECT TOP 5 PERCENT * FROM preco_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 Agrupar os resultados das queries segundo um determinando critério. GROUP BY <coluna1>, <coluna2>, ..., <colunaN> • Consulta o número de elementos da tabela Produtos para cada categoria de Produto: SELECT prod_categoria AS Categoria, COUNT(prod_categoria) AS [Nº Elementos] FROM Produtos GROUP BY prod_categoria 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 SELECT ISBN AS Código, COUNT(au_ID) AS [Nº Elementos] FROM Titulos GROUP BY ISBN 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”] Podemos formatar os resultados numéricos obtidos (Visual Basic): SELECT prod_categoria AS categoria, FORMAT(COUNT(prod_categoria),”000”) AS [Nº Elementos] FORMAT(MIN(prod_preco),”$00”) AS Min, FORMAT(MAX(prod_preco),”$00”) AS Max, FORMAT(AVG(prod_preco),”$00”) AS Média FROM Produtos GROUP BY prod_categoria Vejamos exemplos que involvem mais que uma tabela: • Consulta o nome dos autores e o númerode titulos publicados pelos mesmos: SELECT autores.autor, COUNT(titulos.titulo) FROM titulos, autores WHERE titulos.au_ID = autores.au_ID GROUP BY autores.autor 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 • Consulta os autores que escrevam mais de um titulo SELECT autores.autor, COUNT(titulos.titulo) FROM titulos, autores WHERE titulos.au_ID = autores.au_ID GROUP BY autores.autor HAVING COUNT(titulos.titulo)>1 Revisão: SELECT titulos.titulo, titulos.anoedicao, autores.autor, editoras.nome AS Editora FROM editoras, titulos, autores, (editoras RIGHT JOIN titulos ON editoras.editID = titulos.editID) LEFT JOIN autores ON titulos.au_ID = autores.au_ID ORDER BY titulos.titulo ) 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 Nomes Alternativos para Tabelas 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: SELECT au.autor, COUNT(titulos.titulo) FROM titulos, autores AS au WHERE titulos.au_ID = au.au_ID 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. Comando INSERT INTO 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> INSERT INTO <destino> [(<campo1>[,<campo2>,...])] VALUES (<valor1>[,<valor2>,...]) Existem duas maneiras principais de o utilizar: • Selecciona todos os registos da tabela Novo Cliente e adiciona-o à tabela Clientes: INSERT INTO Clientes SELECT [Novo Cliente].* FROM [Novo Cliente] 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 • Insere um registo na tabela autores co os valores especificados: INSERT INTO autores(au_ID, autor, idade) VALUES (11,”Francisco Manuel”,30) Outro processo equivalente será: INSERT INTO autores(au_ID, autor, idade) SELECT 11, “Francisco Manuel”, 30 Actualizar Registos Usa-se a cláusula UPDATE para actualizar um registo numa tabela. Sintaxe: UPDATE <tabela> SET <coluna1> = <valor1> SET <coluna2> = <valor2> .............. SET <colunaN> = <valorN> WHERE <critério> • Aumenta os preços dos produtos da categoria “Bebidas” em 3%: UPDATE produtos SET prodpreco = 1.03 * prodpreco WHERE prodcategoria = ”Bebidas” A cláusula especifica a operação a efectuar nas colunas. 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 • Atribui ao campo relatorio o valor 5 em todos os registos onde a condição relatorio = 2 se verifica: UPDATE Empregados SET relatorio = 5 WHERE relatorio = 2 Apaga Registo(s) A cláusula DELETE é utilizada para eliminar registos. • Remover os registos cujos empregados sejam do tipo “Provisório” DELETE * FROM empregados WHERE tipo = “Provisório” • Remover todos os empregados e os seus registos de (remover numa relação do lado N) DELETE pagamentos.* FROM empregados, pagamentos, empregados INNER JOIN pagamentos ON empregados.empregadoID = pagamento.empregadoID WHERE tipo = “Provisório” ) Nota: O comando DELETE apaga o registo e não valores isolados da tabela. Pág. 16 de 16