Usaremos estas instâncias das relações Pilotos e Reservas.

Documentos relacionados
Aula 10 BD 1 SQL Parte 2. Profa. Elaine Faria UFU

Álgebra Relacional e SQL

Aula 9 BD 1 SQL Parte 1. Profa. Elaine Faria UFU

Aula 11 SBD SQL Parte 3. Profa. Elaine Faria UFU

SQL: Uma Linguagem de Consulta

SQL: Uma Linguagem de Consulta. Database Management Systems, R. Ramakrishnan (tradução, autorizada, de Anna & Mario Nascimento)

Projeto de Banco de Dados

- Um "query block" permite a implementação das operações de selecção, projecção e junção da álgebra relacional.

- SQL Linguagem de Manipulação de Dados

Sumário SELECT + FROM

Rápida revisão do Modelo Relacional

SQL - Perguntas. André Restivo. Faculdade de Engenharia da Universidade do Porto. February 24, 2012

SQL Consultas Básicas

ANÁLISE E PROJETO DE BANCO DE DADOS

modelo introduzido por E. F. Codd Meados da década de 70: protótipos. INGRES (UC Berkeley, 73 77) System R (IBM Research at San Jose, 74 78)

Oracle Database: Fundamentos de SQL e PL/SQL

Álgebra Relacional e SQL operações de interesse

SQL Linguagem de Manipulação de Dados SQL DML SQL DML. Exemplo Modelo Relacional. Exemplo ME-R SQL DML CONTINUAÇÃO...

SQL. Agregações e agrupamentos. Cristina C. Vieira Departamento de Engenharia Eletrónica e Informática

Banco de Dados I. Aula 16 - Prof. Bruno Moreno 04/11/2011

SQL-99: Esquema de BD EMPRESA

Banco de Dados I. Prof. Diego Buchinger. Profa. Rebeca Schroeder Freitas Prof. Fabiano Baldo.

MODELAGEM DE DADOS - INTRODUÇÃO AO SQL: DML. Prof. Angelo Augusto Frozza, M.Sc.

BCD29008 Banco de dados

Agenda. Linguagem de Consulta SQL. 1. Introdução Histórico. 1. Introdução BD Relacionais

Bases de Dados BDDAD. Linguagem SQL. Comando SELECT Divisão Algébrica. Nelson Freire (ISEP LEI-BDDAD 2015/16) 1/9

Sintaxe do comando SELECT

Linguagem SQL Comando SELECT Agrupamento de Resultados

SQL Linguagem de Manipulação de Dados. Banco de Dados Profa. Dra. Cristina Dutra de Aguiar Ciferri

Oracle Database 10g: Fundamentos de SQL e PL/SQL

Unipar Universidade Paranaense Disciplina: Banco de Dados II 3ª Série Profª: Késsia Marchi Profa. Késsia Marchi

SQL DML. SQL Linguagem de Manipulação de Dados SELECT SELECT SELECT SELECT

Um toque de álgebra relacional: UNION e outras operações

Exame de Recurso de Base de Dados Universidade do Algarve 03/Fev/2005, (duração: 2 horas)

UNIVERSIDADE FEDERAL DA GRANDE DOURADOS PRÓ-REITORIA DE GRADUAÇÃO PROGRAD FACULDADE DE CIÊNCIAS EXATAS E TECNOLOGIA CURSO DE SISTEMAS DE INFORMAÇÃO

SQL DML. Frederico D. Bortoloti

SQL CREATE DATABASE. MySQL, SQL Server, Access, Oracle, Sybase, DB2, e outras base de dados utilizam o SQL.

AULA 8. Ambientes Visuais 8.1. OBJETIVO DA AULA SQL (Structured Query Language)

Linguagem de Consulta Estruturada SQL- DML

Bancos (Bases) de Dados

PCS3413. Engenharia de So-ware e Banco de Dados. Aula 17. Escola Politécnica da Universidade de São Paulo

Introdução a Bancos de Dados

BASES DE DADOS I LTSI/2. Universidade da Beira Interior, Departamento de Informática Hugo Pedro Proença, 2010/2011

UTFPR - Universidade Tecnológica Federal do Paraná. Processamento e otimização de consultas

mod._1_teoria_sistemas de bancos de dados.doc

Aula 8 BD1 Álgebra Relacional. Profa. Elaine Faria UFU

Linguagem de pesquisa declarativa para banco de dados relacional; 1ª Versão - Desenvolvida pela IBM no laboratório de pesquisa de San José;

Básico da Linguagem SQL. Definição de Esquemas em SQL. SQL(Structured Query Language)

Sistemas de Informação e Bases de Dados 2012/2013. Linguagem SQL

Sumário. Motivação. Aplicações precisam acessar o BD Linguagens BD X Linguagens Programação. paradigmas diferentes (impedance mismatch)

SQL. SQL (Structured Query Language) Comando CREATE TABLE. SQL é uma linguagem de consulta que possibilita:

INSTITUTO FEDERAL DE EDUCAÇÃO, CIÊNCIA E TECNOLOGIA DO RIO GRANDE DO NORTE INTRODUÇÃO A SQL

Bases de Dados. DML Data Manipulation Language Parte 2

Banco de Dados I Linguagem SQL Parte 2. Autor: Prof. Cláudio Baptista Adaptado por: Prof. Ricardo Antonello

ÁLGEBRA E CÁLCULO RELACIONAL

Introdução ao Banco de Dados. Banco de Dados

Consulta sobre múltiplas relações

Bases de Dados. Álgebra Relacional II Junções, agregações, vistas. P. Serendero,

Preparação. Linguagem de Manipulação de Dados (DML) Estudo Dirigido 10/12/2013

ORACLE 11 G INTRODUÇÃO AO ORACLE, SQL,PL/SQL

Ordenação de tuplos order by

SQL BÁSICO. Luiz Antônio Vivacqua Corrêa Meyer

Linguagem SQL. ENG1518 Sistemas de Informação Gerenciais Prof. Marcos Villas

Prof. Fabiano Taguchi

SQL. Prof. Roger Cristhian Gomes

As Instruções DML. As Instruções de manipulação de dados(dml) em SQL são representados por: Modificam o estado do banco de dados:

saída durante o runtime Usando Functions de uma Única Linha para Personalizar Relatórios Mostrar as diferenças entre as functions SQL de uma única

Projeto de Banco de Dados

DDL DML DCL DTL Tipos Numéricos: INT FLOAT DOUBLE Tipos String: CHAR VARCHAR BINARY BLOB TEXT Tipos Data e Hora: DATE TIME TIMESTAMP YEAR

Manipulação de Dados com SQL

Subconsulta na Cláusula FROM

Banco de Dados Profa. Dra. Cristina Dutra de Aguiar Ciferri. Banco de Dados Processamento e Otimização de Consultas

MATA60 BANCO DE DADOS Aula 10- Indexação. Prof. Daniela Barreiro Claro

Banco de Dados II. Aula do dia 10/03. Revisão. SQL Estudado até o dia 03/03/2011

MODELAGEM DE DADOS -INTRODUÇÃO AO SQL: DML. Prof. Angelo Augusto Frozza, M.Sc.

SQL (Tópicos) Structured Query Language

Tecnologias e Linguagens para Banco de Dados II. Funções de Agregação. Usando funções de agregação Funções de agregação com valores NULL

Memória de aula Aulas 11 e 12

ACH2025. Laboratório de Bases de Dados Aula 15. Processamento de Consultas Parte 2 Otimização. Professora: Fátima L. S. Nunes SISTEMAS DE INFORMAÇÃO

A cláusula order by permite ordenar tuplos exemplo: listar por ordem alfabética os nomes dos clientes com empréstimo na agência de Perryridge

Banco de Dados Notas de Aula Consultas em SQL Prof. Dr. Daniel A. Furtado

Material Teórico. Cláusula GROUP BY e HAVING. Responsável pelo Conteúdo: Prof. Ms. Alexander Gobbato Albuquerque

Subconsultas ou Consultas Aninhadas

Avisos. SQL: Visões. Roteiro SELECT. Suporte de SQL para OLAP SQL DML CONTINUAÇÃO CONSULTAS AVANÇADAS. Cronograma das próximas aulas

MySql. Introdução a MySQL. Andréa Garcia Trindade

ANÁLISE E PROJETO DE BANCO DE DADOS

Consultas SQL. Andre Noel

Professor Eros Moura, DSc

Princípio dos anos 70 IBM desenvolve a linguagem Sequel para o System R. Renomeada para SQL (Structured Query Language)

Uma expressão básica em SQL consiste em três cláusulas: select, from e where.

Princípio dos anos 70 IBM desenvolve a linguagem Sequel para o System R. Renomeada para SQL (Structured Query Language)

Álgebra Relacional e Cálculo Relacional

MYSQL - PRIMEIROS COMANDOS CRIAÇÃCO DO BD E DAS TABELAS, INSERÇÃO E CONSULTA DE REGISTROS. create database [if not exists] <nome>

Manipulando a base de dados

SISTEMAS DE BANCO DE DADOS. Prof. Adriano Pereira Maranhão

Definida pelo American National Standard Institute (ANSI) em 1986

Álgebra Relacional. Conjunto de operações que usa uma ou duas relações como entrada e gera uma relação de saída. Operações básicas:

Transcrição:

1 Usaremos estas instâncias das relações Pilotos e Reservas. Que regra do negócio seria diferente se a chave da relação Reservas contivesse só os atributos num_p e num_a? R1 P1 P2 num_p num_a data 22 101 10/10/98 58 103 11/12/98 num_p nome_p nível idade 22 Joca 7 45 31 Laerte 8 55 58 Rafa 10 35 num_p nome_p nível idade 28 Zeca 9 35 31 Laerte 8 55 44 Giba 5 35 58 Rafa 10 35 2 Copyright 1998, 1999 Francisco Reverbel 1

SELECT [DISTINCT] lista-de-atribs FROM lista-de-relações WHERE condição lista-de-relações: Uma lista de nomes de tabelas ou visões (possivelmente com uma variável tupla depois de cada nome). lista-de-atribs: Uma lista de nomes de colunas das tabelas ou visões na lista-de-relações. condição: comparações (Atrib op const ou Atrib1 op Atrib2, onde op é um de <, >, =, <=, >=, <>) combinadas com AND, OR ou NOT. DISTINCT: eliminar linhas repetidas. 3 Copyright 1998, 1999 Francisco Reverbel A semântica de uma consulta SQL é definida pela seguinte estratégia de avaliação conceitual: Compute o produto cartesiano da lista-de-relações. Descarte as tuplas que não satisfazem a condição. Remova colunas não listadas em lista-de-atribs. Se houver DISTINCT, elimine repetições de linhas. Esta estratégia é provavelmente a maneira menos eficiente de se executar uma consulta! Um otimizador encontrará métodos mais eficientes que produzem os mesmos resultados. 4 Copyright 1998, 1999 Francisco Reverbel 2

Nomes dos pilotos que reservaram o avião nº 103: SELECT P.nome_p, Reservas R WHERE P.num_p = R.num_p AND R.num_a = 103 Π (σ (Pilotos Reservas) ) Pilotos.nome_p (num_p) nome_p nível idade (num_p) num_a data 22 Joca 7 45 22 101 10/10/98 22 Joca 7 45 58 103 11/12/98 31 Laerte 8 55 22 101 10/10/98 31 Laerte 8 55 58 103 11/12/98 58 Rafa 10 35 22 101 10/10/98 58 Rafa 10 35 58 103 11/12/98 Pilotos.num_p = Reservas.num_p AND num_a = 103 5 Copyright 1998, 1999 Francisco Reverbel São de fato necessárias só no caso da mesma tabela aparecer mais de uma vez na cláusula FROM. A consulta anterior pode ser escrita assim: SELECT P.nome_p, Reservas R WHERE P.num_p = R.num_p AND num_a = 103 Ou assim: É considerado bom estilo, no entanto, usar sempre variáveis tupla! SELECT nome_p FROM Pilotos, Reservas WHERE Pilotos.num_p = Reservas.num_p AND num_a = 103 6 Copyright 1998, 1999 Francisco Reverbel 3

"!#!$!%&!%'($ )+*,.-0/21',.34/6571"8 Vamos supor que existem várias tabelas com informações sobre pilotos (Pilotos, Pilotos2, etc.) e que na tabela Reservas são registradas as reservas feitas por pilotos das diferentes tabelas. Só estamos interessados nos pilotos que estão relacionados numa dessas tabelas (a tabela Pilotos). SELECT P.num_p, Reservas R WHERE P.num_p = R.num_p Se estivéssemos interessados nos números de todos os pilotos (das várias tabelas) que reservaram algum avião, a consulta seria mais simples. (Como?) 7 Copyright 1998, 1999 Francisco Reverbel "!#!$!%&!%'($ )+*,.-0/21',.34/6571"8 SELECT P.num_p, Reservas R WHERE P.num_p = R.num_p Faria alguma diferença especificar DISTINCT nesta consulta? Qual o efeito de se trocar P.num_p por P.nome_p na cláusula SELECT? Faria diferença especificar DISTINCT nesse caso? Para obter todos os atributos desses pilotos e de suas reservas, troque a primeira linha por SELECT * todos os atributos 8 Copyright 1998, 1999 Francisco Reverbel 4

SELECT P.nivel, nivel1 = P.nivel - 5, 2 * P.nivel AS nivel2 WHERE P.nome_p LIKE B_%B Ilustra o uso de expressões aritméticas e de strings com curingas : Encontrar triplas (nível do piloto e mais dois campos definidos por expressões) para pilotos cujos nomes começam e terminam com B e contém pelo menos três caracteres. AS e = são duas maneiras de nomear colunas do resultado. LIKE é usado para comparações envolvendo curingas: _ significa qualquer caracter e % significa 0 ou mais caracteres arbitrários. 9 Copyright 1998, 1999 Francisco Reverbel 9;:=<?>A@CBEDGFHBED I2JLKMBONPBD"QSR=> @T>DU>A@PVXWY@CWY<ZR=< [>D\D.]'W BAR R2< ^2>WY@_`>ON SELECT P.num_p, Avioes A, Reservas R WHERE P.num_p = R.num_p AND A.num_a = R.num_a AND (A.tipo = Cessna OR A.tipo = Learjet ) SELECT P.num_p, Avioes A, Reservas R WHERE P.num_p = R.num_p AND A.num_a = R.num_a AND A.tipo = Cessna UNION SELECT P.num_p, Avioes A, Reservas R WHERE P.num_p = R.num_p AND A.num_a = R.num_a AND A.tipo = Learjet O que obtemos trocando este OR por AND? UNION: união de dois conjuntos de tuplas compatíveis para união. 10 Copyright 1998, 1999 Francisco Reverbel 5

9;:H<a>A@CBbDcFHBED2I2JdKMBONPBD"QSRH>e@T>ED.>O@PVWY@CWY<ZRH< [>D\D.]W > RH< ^H>EWY@_`>AN SELECT P.num_p, Avioes A1, Reservas R1, Avioes A2, Reservas R2 WHERE P.num_p = R1.num_p AND A1.num_a = R1.num_a AND P.num_p = R2.num_p AND A2.num_a = R2.num_a AND (A1.tipo = Cessna AND A2.tipo = Learjet ) Chave! SELECT P.num_p, Avioes A, Reservas R WHERE P.num_p = R.num_p AND A.num_a = R.num_a AND A.tipo = Cessna INTERSECT SELECT P.num_p, Avioes A, Reservas R WHERE P.num_p = R.num_p AND A.num_a = R.num_a AND A.tipo = Learjet Mais complicado que o caso do ou! INTERSECT: intersecção de dois conjuntos de tuplas compatíveis para união. 11 Copyright 1998, 1999 Francisco Reverbel Nos exemplos anteriores, contraste a simetria das consultas que usam UNION e INTERSECT com a diferença entre as outras versões das mesmas consultas. Também disponível: EXCEPT, que computa a diferença de conjuntos de tuplas. No exemplo anterior, qual o efeito de se trocar INTERSECT por EXCEPT? INTERSECT e EXCEPT estão no padrão SQL-92, mas ainda não são suportados por todos os sistemas. Alguns sistemas suportam MINUS em vez de EXCEPT. 12 Copyright 1998, 1999 Francisco Reverbel 6

Nomes dos pilotos que reservaram o avião nº 103: SELECT P.nome_p WHERE P.num_p IN (SELECT R.num_p FROM Reservas R WHERE R.num_a = 103) A cláusula WHERE pode conter uma sub-consulta! (Cláusulas FROM e HAVING também podem.) Para achar os pilotos que não reservaram o avião nº 103, use NOT IN. Semântica: Para cada tupla de Pilotos, verifique se a condição é satisfeita computando a sub-consulta. 13 Copyright 1998, 1999 Francisco Reverbel fhgjitgkml2npogrqs tuo vws"gmxy{ztq l"x vws"}~}bozl2$is'gl't lgx Nomes dos pilotos que reservaram o avião nº 103: SELECT P.nome_p WHERE EXISTS (SELECT * FROM Reservas R WHERE R.num_p = P.num_p AND R.num_a = 103) O operador EXISTS verifica se um conjunto de tuplas é não-vazio. Este exemplo ilustra por que, em geral, a subconsulta precisa ser recomputada para cada tupla de Pilotos. 14 Copyright 1998, 1999 Francisco Reverbel 7

Já vimos IN e EXISTS. Há também NOT IN e NOT EXISTS. Também disponíveis: op ANY e op ALL (onde op pode ser >, <, =, >=, <=, ou <>). Pilotos mais velhos que algum piloto chamado Zé: SELECT * WHERE P.idade > ANY (SELECT P2.idade 2 WHERE P2.nome_p = Zé ) 15 Copyright 1998, 1999 Francisco Reverbel Números dos pilotos que reservaram um Cessna e um Learjet: SELECT P.num_p, Avioes A, Reservas R WHERE P.num_p = R.num_p AND A.num_a = R.num_a AND A.tipo = Cessna AND P.num_p IN (SELECT P2.num_p 2, Avioes A2, Reservas R2 WHERE P2.num_p = R2.num_p AND A2.num_a = R2.num_a AND A2.tipo = Learjet ) De modo análogo, consultas com EXCEPT podem ser reescritas usando NOT IN. Para achar os nomes (em vez dos números) desses pilotos, basta trocar P.num_p por P.nome_p no primeiro SELECT. Como fazer essa mudança na consulta com INTERSECT? 16 Copyright 1998, 1999 Francisco Reverbel 8

Nomes dos pilotos que reservaram todos os aviões: SELECT P.nome_p ➊ Usando EXCEPT WHERE NOT EXISTS ( (SELECT A.num_a ➋ Sem EXCEPT FROM Avioes A) EXCEPT (SELECT R.num_a SELECT P.nome_p FROM Reservas R WHERE R.num_p = P.num_p)) WHERE NOT EXISTS (SELECT A.num_a FROM Avioes A Pilotos P tais que WHERE NOT EXISTS (SELECT R.num_a FROM Reservas R não há avião A WHERE R.num_a = A.num_a AND R.num_p = P.num_p)) sem uma reserva de A para P 17 Copyright 1998, 1999 Francisco Reverbel Extensão significativa da álgebra relacional. COUNT (*) COUNT ([DISTINCT] atrib) SUM ([DISTINCT] atrib) AVG ([DISTINCT] atrib) MAX (atrib) MIN (atrib) SELECT COUNT(DISTINCT P.nivel) WHERE P.nome_p = Jorge SELECT AVG (P.idade) WHERE P.nivel = 10 SELECT AVG (DISTINCT P.idade) WHERE P.nivel = 10 SELECT COUNT (*) SELECT P.nome WHERE P.nivel = (SELECT MAX (P2.nivel) 2) 18 Copyright 1998, 1999 Francisco Reverbel 9

s'npo o it;l'tuoht seƒyx% {itzs"qseƒ4x n lhixmûoztks ƒ4x A primeira consulta é inválida! (Veremos a razão daqui a pouco, quando discutirmos GROUP BY.) A terceira consulta é equivalente à segunda e é permitida pelo padrão SQL-92, mas não é suportada por alguns sistemas. SELECT P.nome_p, MAX (P.idade) SELECT P.nome_p, P.idade WHERE P.idade = (SELECT MAX (P2.idade) 2) SELECT P.nome_p, P.idade WHERE (SELECT MAX (P2.idade) 2) = P.idade 19 Copyright 1998, 1999 Francisco Reverbel Até agora aplicamos funções de agregação a todas as tuplas que satisfazem a condição no WHERE. Algumas vezes é desejável aplicá-las a vários grupos de tuplas. Exemplo: Para cada nível, achar a idade do piloto mais jovem nesse nível. No caso geral, podemos não saber quantos níveis existem e quais os seus valores! Supondo que existem 10 níveis numerados de 1 a 10, podemos escrever 10 consultas assim (!): Para i = 1, 2,, 10: SELECT MIN (P.idade) WHERE P.nivel = i 20 Copyright 1998, 1999 Francisco Reverbel 10

SELECT [DISTINCT] lista-de-atribs-ou-agregações FROM lista-de relações WHERE condição GROUP BY lista-de-atribs-para-agrupamento HAVING condição-para-grupos A lista-de-atribs-ou-agregações contém: ➊ Nomes de atributos ➋ Termos com funções de agregação (ex: MIN (P.idade) ). Os nomes de atributos (➊) precisam estar todos contidos na lista-de-atribs-para-agrupamento. Intuitivamente, cada tupla do resultado corresponde a um grupo, e esses atributos precisam ter o mesmo valor sobre todo o grupo. 21 Copyright 1998, 1999 Francisco Reverbel Efetue o produto cartesiano da lista-de-relações, elimine as tuplas que não satisfazem à condição, remova as colunas desnecessárias e particione as tuplas restantes em grupos, de acordo com a lista-de-atribs-para-agrupamento. (Um grupo é um conjunto de tuplas que coincidem sobre todos os atributos dessa lista.) Aplique a condição-para-grupos e elimine os grupos que não atenderem esse requisito. Toda expressão que aparecer nessa condição deverá ter um valor único por grupo! Precisa estar na lista-de-atribs-para-agrupamento todo atributo que aparecer na condição-para-grupos e não for argumento para uma função de agregação. (SQL não explora a semântica de chaves aqui!) Para cada grupo sobrevivente, gere uma tupla resultado. 22 Copyright 1998, 1999 Francisco Reverbel 11

Š YŒ >{WcJUF=WFE>F=Be< WYJ.D_.BAV >A<ŽFHBD2I2JdK.BANTBD BA<ZJ.FHWFE> I"WY@W WF=Wc] V >AK BA< I2>AKUBe< >A]BDGFHBOJMD FE>D\D.>ED I2JdKUBANPBED Y SELECT P.nivel, MIN (P.idade) WHERE P.idade >= 18 GROUP BY P.nivel HAVING COUNT (*) > 1 Só P.nivel e P.idade aparecem nas cláusulas SELECT, GROUP BY ou HAVING; os demais atributos são desnecessários. A segunda coluna do resultado não tem nome. (Use AS para nomeá-la.) num_p nome_p nível idade 22 Joca 7 45 31 Laerte 8 55 71 Zildo 10 16 64 Henry 7 35 29 Bronco 1 33 58 Rafa 10 35 nível idade 1 33 7 45 7 35 8 55 10 35 Nível 7 35 Tabela resultado 23 Copyright 1998, 1999 Francisco Reverbel!# c!# S '!# HS!$! š!%!a!# '(# œ!$ ž Ÿ SELECT A.num_a, COUNT (*) AS reservas, Avioes A, Reservas R WHERE P.num_p = R.num_p AND R.num_a = A.num_a AND A.tipo = Learjet GROUP BY A.num_a Formando grupos sobre a junção de tres relações. O que obtemos retirando A.tipo = Learjet da cláusula WHERE e adicionando uma cláusula HAVING com essa condição? E se retirarmos Pilotos P e a condição sobre P.num_p? 24 Copyright 1998, 1999 Francisco Reverbel 12

Š YŒ >{WcJUF=WFE>F=Be< WYJ.D_.BAV >A<ŽFHBD2I2JdK.BANTBD BA<ZJ.FHWFE> I"WY@W WFHWc] V >OK BA<ZI2>AK.Be< >O]BD2uI2JdK.BANžBDG F> Y J.FHWF>E SELECT P.nivel, MIN (P.idade) WHERE P.idade >= 18 GROUP BY P.nivel HAVING 1 < (SELECT COUNT (*) 2 WHERE P.nivel = P2.nivel) Mostra uma cláusula HAVING contendo uma sub-consulta. Compare com a consulta que levava em conta somente níveis com pelo menos dois pilotos maiores de 18! E se a cláusula HAVING for trocada por: HAVING COUNT (*) > 1 25 Copyright 1998, 1999 Francisco Reverbel Š 4Œ >{BD2]# dv >OJ.DHI"WY@CWuBD"QSR"WYJMDGWc<? FEJ.WuFHWD2JMF=WFb>EDcF2BD2I2JdKMBONTBDH Wc< WYJUDH =WYJd #W Funções de agregação não podem ser aninhadas! Solução errada: SELECT P.nivel WHERE P.idade = (SELECT MIN (AVG( P2.idade) ) ) 2) Solução correta (em SQL-92): SELECT Temp.nivel, Temp.idade_media FROM (SELECT P.nivel, AVG (P.idade) AS idade_media GROUP BY P.nivel) AS Temp WHERE Temp.idade_media = (SELECT MIN (Temp.idade_media) FROM Temp) 26 Copyright 1998, 1999 Francisco Reverbel 13

Os atributos de uma tupla são às vezes desconhecidos (ex.: um nível que ainda não foi determinado) ou não aplicáveis (ex.: nome do conjuge, para uma pessoa solteira). Para tais situações, SQL tem um valor especial do atributo, o valor nulo (null). Null não é zero, é vazio! 27 Copyright 1998, 1999 Francisco Reverbel l2zs'}boxmgjy zsexm's'np {ztiž'lhn n y{itq l'xª cy{oxq «"oẍ Operadores especiais são necessários para testar se um valor é nulo ou não. A condição nivel > 8 é verdadeira ou falsa se o nivel for nulo? E condições contendo AND, OR e NOT? É necessária uma lógica a três valores (verdade, falso e desconhecido). O significado de construções com nulls tem que ser especificado cuidadosamente. (Por exemplo: a cláusula WHERE elimina as linhas para as quais a condição não é verdadeira.) Novos operadores de junção (outer joins) necessários. 28 Copyright 1998, 1999 Francisco Reverbel 14

%! š± œ² c(# ³!?œ c&!#&' X&"!#!#µ~(# Não é computacionalmente completa. Não tem comandos de controle de fluxo como if else, while, for, etc. Como programar aplicações de bancos de dados? Solução 1: estender SQL. Fornecedores de SGBDs oferecem extensões computacionalmente completas (e proprietárias) de SQL: PL/SQL (Oracle) Transact-SQL (Sybase) Access Basic (Microsoft Access) 29 Copyright 1998, 1999 Francisco Reverbel %! š± œ² c(# ³!?œ c&!#&' X&"!#!#µ~(# Solução 2: interfacear uma linguagem de programação com SQL. Dois tipos de interface são usados: API de comandos embutidos Comandos SQL são entremeados com comandos de uma linguagem de programação hospedeira (C ou COBOL, por exemplo). Requer um pré-compilador que trata o SQL embutido na linguagem hospedeira. API de chamadas de função Menos amigável. Requer apenas uma biblioteca que implementa a API. 30 Copyright 1998, 1999 Francisco Reverbel 15

Comandos SQL são colocados diretamente no texto de um programa na linguagem hospedeira (C ou COBOL, por exemplo). Comandos SQL podem se referir a variáveis da linguagem hospedeira (incluindo variáveis especiais para retorno de status). Deve ser incluído um comando especial para conexão ao BD desejado. Em SQL, relações são (multi-)conjuntos de registros (tuplas), sem limite no número de registros. Tal estrutura de dados não existe em C. SQL lida com esse problema oferecendo cursores. 31 Copyright 1998, 1999 Francisco Reverbel Pode-se declarar um cursor sobre uma relação ou sobre uma consulta (cujo resultado é uma relação). Pode-se abrir um cursor, depois repetidamente buscar tuplas (fetch) e mover o cursor, até que todas as tuplas tenham sido obtidas. A cláusula ORDER BY pode ser usada para controlar a ordem de obtenção das tuplas. Os atributos na cláusula ORDER BY precisam aparecer também na cláusula SELECT. Pode-se também modificar ou remover a tupla apontada por um cursor. 32 Copyright 1998, 1999 Francisco Reverbel 16

[R2@CD BA@QR2>{BA Ņ O< >A<ŽBA@CFE>O<ŽWYKd¹6WY OŅ J W BDH]BA<a>D"FHBDHI2JLK.BANPBD QSRH>e@T>ED.>O@PVWY@CWY<ZRH<ŽWYV J.ºBeNJLI"B [ >bdydu]w EXEC SQL DECLARE info_p CURSOR FOR SELECT P.nome_p, Avioes A, Reservas R WHERE P.num_p = R.num_p AND R.num_a = A.num_a AND A.tipo = Cessna ORDER BY P.nome_p Note que não podemos trocar o atributo P.nome_p na cláusula ORDER BY por outro atributo P.num_p, por exemplo. (Por quê?) Podemos adicionar P.num_p à cláusula SELECT e trocar P.nome_p por P.num_p na cláusula ORDER BY? 33 Copyright 1998, 1999 Francisco Reverbel char SQLSTATE[6]; EXEC SQL BEGIN DECLARE SECTION char c_nome_p[20]; short c_min_nivel; int c_idade; EXEC SQL END DECLARE SECTION c_min_nivel =... ; EXEC SQL DECLARE info_p CURSOR FOR SELECT P.nome_p, P.idade WHERE P.nivel > :c_min_nivel ORDER BY P.nome_p; do { EXEC SQL FETCH info_p INTO :c_nome_p, :c_idade; printf( %s tem idade %d\n, c_nome_p, c_idade); } while (strcmp(sqlstate, 02000 )); EXEC SQL CLOSE info_p; 34 Copyright 1998, 1999 Francisco Reverbel 17

Fator importante para a rápida aceitação do modelo relacional. Relacionalmente completa: Toda consulta que pode ser expressa na álgebra relacional pode também ser expressa em SQL (muitas vezes de modo mais natural). Tem poder expressivo significativamente maior que a álgebra relacional. Em geral há muitas maneiras de se escrever uma consulta. O otimizador de consultas deve escolher o plano de avaliação mais eficiente. Na prática, usuários preocupados com eficiência obtém melhores resultados conhecendo detalhes do otimizador. 35 Copyright 1998, 1999 Francisco Reverbel 18