António Rocha Nuno Melo e Castro
SQL- Strutured Query Language é a linguagem mais usada nas bases dados relacionais. Originalmente desenvolvida pela IBM Actualmente é um standard, o mais recente é o SQL:2003
No SQL existem vários aspectos a considerar: DML - Data Manipulation Language DDL - Data Definition Language DCL - Data Control Language Triggers, Stored Procedures, Functions, Etc Tratamento de transações Etc. Nesta aula vamos apenas abordar a DML
!"#$% Pesquisa simples SELECT [DISTINCT] lista-atributos FROM lista-tabelas WHERE condições Uma pesquisa corresponde a uma expressão de álgebra relacional, envolvendo selecções, projecções e produtos cartesianos.
&'( ) Encontrar o nome e idade de todos os marinheiros
&'( )
&'( ) Encontrar todos os marinheiros cujo rating é maior do que 7 σ rating > 7 (Sailors) Opcionalmente podemos usar SELECT * Retorna todos os atributos Problemas de performance e manutenção Operadores aritméticos: <, <=, =, <>, >=, > E lógicos: AND e OR
&'( )+$ Procurar o name dos Sailors que tenham reservado o Bid 103. *
&')(##-(#( ((#$.# Na lista de campos do Select é possível usar expressões do tipo: Expressão As Nome Em que expressão pode ser uma operação que envolve: Variáveis Constantes Campos String Exemplo: SELECT S.sname, S.rating+1+S.Age AS Demo From Sailors,
&')(##-(#( ((#$.# Na cláusula Where é também possível usar expressões no formato: Expressão1 <operador> Expressão2 Exemplo: SELECT S.sname, S.rating+1+S.Age AS Demo From Sailors S Where S.rating*3>(S.Age-4)
&')(##-(#( ((#$.# Operador LIKE Para tratamento de string Operador _ Operador % Ex: sname like _or%
/( SELECT [DISTINCT] lista-atributos FROM lista-tabelas WHERE condições Order By lista-atributos-ordenação Por cada atributo da lista lista-atributos-ordenação é possivel definir se é decrescente (DESC) ou Crescente (ASC) por omissão é crescente. Ex. SELECT S.sname, S.age, S.sid From Sailors Order by S.age DESC, S.Sname ASC
/( Na ordenação é possível especificar os atributos a partir da ordem dele no SELECT Ex. SELECT S.sname, S.age, S.sid From Sailors S Order by 2 DESC, 1 ASC
0$ Tem o mesmo efeito que a união da álgebra relacional Une dois conjuntos e elimina os repetidos Tem de existir compatibilidade entre os conjuntos: Mesmo número de campos Tipos de dados compatíveis
0$('( ) Encontre o nome dos marinheiros que reservaram um barco vermelho ou verde É importante referir que a cláusula anterior é muito mais simples de escrever através de um OR e retirando o segundo conjunto
1(#(2($(# Nested queries: São pesquisas que tem outras pesquisas embutidas A pesquisa embutida chama-se subquery
1(#(2($(# Outro exemplo
1(#(2($(# Para efectuar negações usamos o NOT *
1(#(2($(# Podemos usar o EXISTS para testar se um conjunto está ou não vazio Da mesma forma podemos também negar com o NOT EXISTS,
/)((#(.(. COUNT ([DISTINCT] A): O número de valores (únicos) na coluna A SUM ([DISTINCT] A): A soma de todos os valores (únicos) de A AVG ([DISTINCT] A): A média de todos os valores (únicos) de A MAX (A). O valor máximo existente na coluna A MIN (A). O valor mínimo existente na coluna A
&'( )#.(. Encontrar a média de idades dos marinheiros SELECT AVG (S.age) FROM Sailors S Quantos marinheiros existem com idade superior a 35? SELECT Count(*) FROM Sailors S Where S.age > 35
3(#$-(#.(. Se um SELECT tem um uma operação de agregação, então apenas pode conter operadores de agregação, excepto se tiver uma cláusula GROUP BY Exemplo: Encontrar o nome e a idade do marinheiro mais velho SELECT S.sname, MAX(S.age) FROM Sailors Está errado, o correcto poderá ser: SELECT S.sname FROM Sailors WHERE S.age = (SELECT MAX (S2.age) FROM Sailors S2)
43/056(7814 SELECT [DISTINCT] lista-atributos FROM lista-tabelas WHERE condições GROUP BY lista-atributos-do-grupo HAVING condições-do-grupo
&'( ) Encontrar a idade do marinheiro mais novo por cada nível. SELECT S.rating, MIN (S.age) FROM Sailors S GROUP BY S.rating
9#$(-(# A lista-atributos da cláusula SELECT consiste(1) numa lista de nomes e (2) uma lista de termos de agrupadores. Cada coluna que apareça em (1) tem também de aparecer na lista-atributos-do-grupo As expressões que aparecem nas condiçõesdo-grupo na cláusula HAVING servem para filtrar os valores dos grupos Atenção: Não é possível usar directamente os operadores de agregação na cláusula WHERE
&'( ) Encontrar a idade do marinheiro mais novo por cada nível, desde que o marinheiro mais novo do nível tenha idade superior a 20 SELECT S.rating, MIN (S.age) FROM Sailors S GROUP BY S.rating Having MIN(S.Age)>20
&'( ) Encontrar a média de idades dos marinheiros para os níveis 7 e 8, desde que cada nível tenha pelo menos dois marinheiros. SELECT S.rating, AVG (S.age) FROM Sailors S WHERE S.rating = 7 or S.rating = 8 GROUP BY S.rating Having COUNT(*)>1
10 Representa algo que não existe Ex.1 Ex.2 Select * from Alunos Where Telefone = NULL -------- Errado Select * from Alunos Where Telefone Is NULL -------- Correcto Função IsNull / NVL Sqlserver / Oracle Select IsNull(Telefone, Não tem ) From alunos Select NVL(Telefone, Não tem ) From alunos *
10:%;< O que acontece? Select * from alunos Where Telefone<> 931234567 Select * from alunos Where Telefone= 931234567 Select * from alunos Where Telefone= 931234567 or Telefone is NULL,
/(+$ Variantes do operador join que assentam no valor Null Na expressão seguinte apenas aparecem os registos que existam em ambas as tabelas Com os outer join podemos especificar que os registos apareçam independentemente se existem em ambas as tabelas. Quando não existe numa das tabelas os valores aparecem a NULL
8$(#+$ Existem várias variantes: Left Outer Join além dos registos que fazem match, os registos da tabela esquerda que não existam na direita também aparecem Rigth Outer Join além dos registos que fazem match, aparecem todos os restantes registos da tabela direita que não existam na esquerda Full Outer Join aparecem todos os registos independentemente de fazerem ou não match. Com o Inner Join apenas aparecem os que fazem match. Tem o mesmo efeito que igualar ao campos de ambas as tabelas na cláusula WHERE
&'( )+$ SELECT S.sid, R.bid FROM Sailors S LEFT OUTER JOIN Reserves R ON (S.sid=R.sid) Resultado
/#('( )# Por cada barco vermelho, determine o número de reservas por barco.
/#('( )# Determine a média de idades dos marinheiros que têm idade superior a 17 para cada nível que tenha pelo menos dois marinheiros (independentemente da idade)
$ Baseado em Database Management Systems - Ramakrishnan