Baixe o app para aproveitar ainda mais
Prévia do material em texto
Structured Query Language SQL Banco de Dados I 2 Introdução • Padrão adotado por todos o fabricantes de SGBD para gerenciamento da estrutura e dos dados em um banco de dados • Versão atual – 1999 • 2 partes principais – DDL: Data Definition Language – DML: Data Manipulation Language 3 Data Definition Language (DDL) • Usada para manipular as estruturas do banco de dados – Tabelas – Visões – Usuários • Comandos – CREATE (criação) – ALTER (alteração) – DROP (exclusão) 4 CREATE TABLE CREATE TABLE nome_tabela ( Campo1 tipo [null|not null], Campo2 tipo [null|not null], ... ... ... CampoN tipo [null|not null], [CONSTRAINT nome_restrição]PRIMARY KEY (campo1[,campo2]), [[CONSTRAINT nome_restrição] FOREIGN KEY on (campo(s)) REFERENCES tabela_ref ON DELETE cascade|set null|restrict ON UPDATE cascade|set null|restrict]) 5 CREATE TABLE • O que está entre colchetes [ ] indica que é opcional • Dicas – sempre definir a chave primária (primary key) na criação da tabela • Usar Constraint nome_chave, mesmo que não precise – definir as chaves estrangeiras (foreign key) no comando ALTER TABLE. 6 CREATE TABLE CREATE TABLE hospedagem.hotel ( codigo varchar(7), nome varchar(30) NOT NULL, estrelas integer, cidade varchar(3), CONSTRAINT hotel_pk PRIMARY KEY(codigo)) esquema Exercícios • Criar as seguintes tabelas – cidade • codcidade – varchar(3) • nomecidade – varchar(50) • Chave primária codcidade – quarto • codhotel – varchar(7) • numero – integer • valor_diaria – numeric(7,2) • Chave primária – (codhotel, numero) 7 8 ALTER TABLE /* adiciona/exclui coluna à tabela */ ALTER TABLE nome_tabela ADD nomeCampo tipo; ALTER TABLE nome_tabela DROP COLUMN nomeCampo; /* adiciona restrição (chave estrangeira ou primária) */ ALTER TABLE nome_tabela ADD CONSTRAINT nome_restricao FOREIGN KEY ON campo(s) REFERENCES tabela_ref ON DELETE CASCADE|RESTRICT|SET NULL ON UPDATE CASCADE|RESTRICT|SET NULL; ALTER TABLE nome_tabela ADD CONSTRAINT nome_restricao PRIMARY KEY campo; /*exclui restrição*/ ALTER TABLE nome_tabela DROP CONSTRAINT nome_restricao 9 ALTER TABLE • Uma coluna é sempre inserida ao final da tabela (última coluna) • Existe o comando MODIFY, mas ainda não é padrão SQL. – Se quiser alterar uma coluna, deve-se fazer um DROP COLUMN e depois um ADD • CUIDADO ao excluir uma constraint, especialmente se for primary key – Isto é feito, em geral, se a chave primária de uma tabela era simples e deve passar a ser composta 10 ALTER TABLE ALTER TABLE hospedagem.hotel ADD CONSTRAINT hotel_fk_cidade FOREIGN KEY (cidade) REFERENCES hospedagem.cidade on delete restrict on update cascade Exercícios • Adicionar chave estrangeira na tabela quarto – Campo codhotel, referenciando a tabela hotel 11 12 DROP TABLE DROP TABLE nome_tabela 13 Data Manipulation Language (DML) • Usada para manipular os dados do banco propriamente ditos • Comandos – INSERT (inserir) – UPDATE (atualizar) – DELETE (excluir) – SELECT (consultar) 14 INSERT INSERT INTO nome_tabela (campo1, campo2, ... , campoN) VALUES (valCampo1, ‘valCampo2’, ... , valCampoN); 15 INSERT • Os campos da tabela não precisam ser informados, mas se não forem informados – devem ser dados valores a todos eles – a ordem devem ser a mesma dos campos da tabela • Quando os campos forem especificados – Deve haver 1 valor para cada campo – Os valores devem ser especificados na mesma ordem que foram os campos • Quanto aos valores – Se for numérico, não precisa de aspas ‘ ’ – Se não for numérico, deve vir entre aspas ‘’ • A campos que são chave estrangeira somente podem ser atribuidos valores existentes nos campos referenciados. 16 INSERT INSERT INTO hospedagem.cidade (codcidade, nomecidade) VALUES (‘GMD’, ‘Gramado’); INSERT INTO hospedagem.hotel VALUES (‘HTL004’,‘Serra Azul’, 5, ‘GMD’); INSERT INTO hospedagem.hotel (cidade, codigo, estrelas, nome) VALUES (‘GMD’, ‘HTL003’, 4, ‘Serrano’); 17 DELETE DELETE FROM nome_tabela [WHERE (condição)] • Alguns bancos de dados requerem um * antes do FROM • Na cláusula where pode-se colocar desde uma condição simples até condições que envolvam mais de uma tabela 18 DELETE DELETE FROM hospedagem.hotel WHERE (nome = ‘Continental’) DELETE FROM hospedagem.reserva WHERE ((data < ‘2011-11-25’) AND(hotel = ‘HTL005’)) DELETE FROM hospedagem.reserva WHERE ((codcli = ‘CLI003’) OR (diarias >= 4)) 19 UPDATE UPDATE nome_tabela SET campo1=novoVal1, campo2 = ‘novoVal2’, ... , campoN = novoValN WHERE (condição). 20 UPDATE • No SET, não precisam constar todos os campos. Apenas aqueles que devem ter seus valores atualizados. • No WHERE, a condição é um teste booleano. Serão alterados todos os registros que satisfizerem à condição, desde que não violem regras de integridade. • No WHERE podem aparecer junções de tabelas, caso a atualização envolva mais de uma tabela. 21 UPDATE UPDATE hospedagem.hospede SET nome = ‘Paula’, email = ‘paulasoares@hotmail.com’ WHERE codcliente = ‘CLI006’ Exercícios • Criar uma nova cidade, chamada Novo Hamburgo • Criar 2 hotéis na cidade de Novo Hamburgo, sendo 1 deles com 3 estrelas e outro com 4 estrelas. • Criar 2 quartos no hotel 4 estrelas, com diárias de R$ 100,00. • Atualizar as diárias dos quartos do hotel 4 estrelas para R$ 200,00. • Excluir o hotel 3 estrelas. 22 23 SELECT SELECT campo1, campo2, … , campoN FROM tabela1[, tabela2, … , tabelaN] [WHERE (condição)] [GROUP BY função_de_agrupamento [HAVING (condição_grupo)]] [ORDER BY campo_de_ordenação] 24 SELECT • No caso de usarmos múltiplas tabelas, não se pode esquecer da condição de junção na clausula WHERE. • No caso de múltiplas tabelas, se um determinado campo aparecer em ambas, deve ser colocado nome_tabela.nome_campo. • No ORDER BY somente podem ser colocados campos que constem no SELECT. – Alguns SGBD permitem que o campo não conste no SELECT, mas não é padrão SQL. 25 SELECT • Caso queira selecionar-se todos os campos de uma tabela, pode-se usar SELECT * FROM tabela ao invés de especificar todos os campos. • O ordem de cada parte do comando deve ser seguida, a menos que alguma delas não seja usada. 26 SELECT • Obter todos os dados da tabela cidade SELECT * FROM hospedagem.cidade • Obter o nome e o email de cada hóspede SELECT nome, email FROM hospedagem.hospede • Obter o nome e o número de estrelas de cada hotel ordenando os resultados por este último Select nome, estrelas From hospedagem.hotel Order by estrelas – Para ordenar do maior para o menor, coloca-se, ao final, DESC – Para ordenar do menor para o maior, coloca-se, ao final, ASC. Esta é a opção default, que será usada se nada for especificado. 27 FUNÇÕES NO SELECT • Ao invés de especificar campos, podem ser especificadas algumas funções no SELECT SELECT funcao(campo), e o resto fica igual – Somente pode ser especificado 1 campo por função – Se é especificada uma função, ela é a única coisa que aparece no SELECT 28 FUNÇÕES NO SELECT • Count (*): retorna o número de registros que satisfazem a consulta • Max(campo): retorna o maior valor do campo especificado, para os registros que satisfazem a consulta. • Min(campo): retorna o menor valor do campo especificado, para os registros que satisfazem a consulta. • AVG(campo): retorna a média dos valores do campo especificado, para os registros que satisfazem a consulta. • SUM(campo): retorna a soma dos valores do campo especificado, para os registros que satisfazem aconsulta. • Distinct(campo): retorna os valores do campo especificado para os registros que satisfazem a consulta, sem repetição 29 FUNÇÕES NO SELECT • Obter o maior valor de diária SELECT max(valor_diaria) FROM hospedagem.quarto • Obter a soma do número de diárias reservadas SELECT sum(diarias) FROM hospedagem.reserva • Obter o nome do(s) hotel(is) com mais estrelas – NÃO dá para fazer ainda… esperar consultas aninhadas 30 SELECT – uso do WHERE • A cláusula WHERE serve para – Filtrar algumas linhas do resultado, impondo condições (testes booleanos) – Efetuar a junção das tabelas, quando a consulta envolver duas ou mais tabelas • TODAS as tabelas devem estar, de alguma forma, relacionadas • Se não for feita a junção no where, ocorre o produto cartesiano. – Quando houver mais de uma condição / junção no where, devem ser usados os conectivos lógicos AND ou OR 31 SELECT – uso do WHERE • Obter o nome dos hotéis com ao menos 4 estrelas • Obter o código do hotel e o número do quarto com reservas de mais de 2 diárias na data de 2011-11-15 SELECT nome FROM hospedagem.hotel WHERE (estrelas > 3) SELECT hotel, quarto FROM hospedagem.reserva WHERE (data = `2011-11-15`) AND (diarias > 2) 32 SELECT – uso do WHERE • Obter o nome dos hotéis de gramado (GMD) e Bento Gonçalves (BGS) • Quando a comparação é com strings, é possível fazer “aproximações” – Like quer dizer que não precisa ser 100% igual – % indica que pode ser qualquer coisa • No exemplo, deseja-se o nome dos hóspedes que tem email do gmail. SELECT nome FROM hospedagem.hotel WHERE cidade = ‘GMD’ or cidade=‘BGS’ SELECT nome FROM hospedagem.hospede WHERE email like ‘%gmail%’ 33 SELECT – uso do WHERE • Quando mais de uma tabela deve ser consultada, ou uma única tabela deve ser consultada mais de uma vez, é necessário fazer a junção das tabelas • A junção de tabelas SEMPRE é feita da seguinte forma: – Sejam t1 e t2 duas tabelas – A chave primária de t1 é cprim – t2 possui um campo cestr que é uma chave estrangeira para a (chave primária da) tabela t1. – Neste caso, deve-se testar a igualdade t2.cestr = t1.cprim (ou vice- versa, a ordem não importa) 34 SELECT – uso do WHERE • Obter o nome de cada cidade, bem como o nome cada hotel dela e quantas estrelas tem. – O nome da codade está na tabela cidade – O nome ddo hotel e o número de estrelas estão na tabela hotel – 2 tabelas, JUNÇÃO! – A tabela hotel possui chave estrangeira para a tabela cidade, ou vice-versa? SIM, hotel.cidade cidade.codcidade (chave primaria) SELECT ci.nomecidade, ht.nome, ht.estrelas FROM hospedagem.cidade as ci, hospedagem.hotel as ht WHERE ci.codcidade = ht.cidade 35 SELECT – uso do WHERE • Outra estilo para a mesma consulta SELECT ci.nomecidade, ht.nome, ht.estrelas FROM hospedagem.cidade as ci JOIN hospedagem.hotel as ht ON ci.codcidade = ht.cidade 36 SELECT – uso do WHERE • Se, nas 2 tabelas, houver campos com o mesmo nome, deve-se colocar tabela.campo para evitar ambiguidades • É possível renomear (criar aliases) para as tabelas, usando ‘as’. Exemplo, hotel as ht 37 SELECT – uso do WHERE • Se funciona para 2 tabelas, funciona para 3 – Para cada reserva, obter sua data, o número do quarto, o nome do hotel reservado e o valor da diária SELECT ht.nome, qt.numero, qt.valor_diaria, rs.data FROM hospedagem.hotel ht, hospedagem.quarto qt, hospedagem.reserva rs WHERE (ht.codigo = qt.codhotel) AND (qt.codhotel = rs.hotel) AND (qt.numero = rs.quarto) 38 SELECT – uso do WHERE • É possível combinar os dois tipos de WHERE (condição e junção) – Obter as datas em que há reserva de hotel para o hóspede Rafael e o número de diárias reservadas SELECT rs.data, rs.diarias FROM hospedagem.reserva rs, hospedagem.hospede hs WHERE hs.nome = (‘Rafael’) AND (rs.codcliente = hs.codcliente) 39 Exercícios Usando o banco de dados (esquema) filmes, faça as seguintes consultas 1.Obter o nome, ano de nascimento e nacionalidade de cada ator. 2.Obter o título dos filmes feitos após 2005. 3.Obter a soma da bilheteria dos filmes de 2008 4.Obter o nome de cada ator juntamente com o nome dos personagens que ele interpretou. 5.Obter o título dos filmes do gênero Policial 6.Obter o nome dos personagens protagonistas interpretados por atores que tenham nascido antes de 1970. 7.Obter o nome dos filmes em que o ator George Clooney atuou. 40 SELECT – Consultas aninhadas • Quando as colunas a serem mostradas como resultado de uma consulta provém de uma tabela, mas a condição de seleção vem de outra, o mais natural é usar consultas aninhadas – Obter as datas em que há reserva de hotel para o hóspede Rafael e o número de diárias reservadas SELECT rs.data, rs.diarias FROM hospedagem.reserva rs WHERE rs.codcliente IN ( SELECT hs.codcliente FROM hospedagem.hospede hs WHERE hs.nome = (‘Rafael’)) 41 SELECT – Consultas aninhadas • Também se usam quando queremos exibir uma coluna resultante de consulta que utiliza uma função SQL, mas que não é a coluna usada na função – Obter o nome do hotel com mais estrela SELECT codigo, nome FROM hospedagem.hotel WHERE estrelas = ( SELECT max(estrelas) FROM hospedagem.hotel) 42 SELECT – Consultas aninhadas • Ou ainda quando se deve usar quantificadores universal ou existencial – Obter o nome dos hóspedes com ao menos 1 reserva com mais de 2 diárias SELECT hs.nome FROM hospedagem.hospede hs WHERE EXISTS ( SELECT * FROM hospedagem.reserva rs WHERE (rs.codcliente = hs.codcliente) AND (rs.diarias > 2)) 43 SELECT – Consultas aninhadas – Obter o nome dos hotéis que não tem nenhuma reserva para o dia 2011-11-15 SELECT ht.codigo, ht.nome FROM hospedagem.hotel ht WHERE NOT EXISTS ( SELECT * FROM hospedagem.reserva rs, hospedagem.quarto qt WHERE((ht.codigo = qt.codhotel) AND (qt.codhotel = rs.hotel) AND (qt.numero = rs.quarto) AND (rs.data = '2011-11-15'))) 44 SELECT – Consultas aninhadas • Pode-se combinar um quantificador existencial (EXISTS) ou universal (NOT EXISTS) com outras condições no where – Obter o nome dos hoteis da cidade de ‘Gramado’ que não tiveram o ‘Lucas’ como hóspede SELECT ht.nome FROM hospedagem.hotel ht, hospedagem.cidade ci WHERE (ht.cidade = ci.codcidade) AND (ci.nomecidade = 'Gramado') AND NOT EXISTS ( SELECT * FROM hospedagem.reserva rs, hospedagem.quarto qt, hospedagem.hospede hs WHERE (hs.nome = 'Lucas')AND(rs.codcliente = hs.codcliente)AND (ht.codigo = qt.codhotel)AND(qt.codhotel = rs.hotel)AND (qt.numero = rs.quarto)) 45 SELECT - Junção • Opções de junção – tabela1 [INNER] JOIN tabela2 ON condição • Chamado de junção interna • Equivale ao WHERE como visto anteriormente – tabela1 FULL [OUTER] JOIN tabela2 ON condição – tabela1 LEFT [OUTER] JOIN tabela2 ON condição – tabela1 RIGHT [OUTER] JOIN tabela2 on condição 46 SELECT – Junção externa • Pode acontecer de, quando formos consultar mais de uma tabela, queremos que os registros de uma (ou de ambas) sejam retornados mesmo se não tiverem respectivos na outra tabela – Obter o nome de cada hotel e, caso ele tenha quartos reservados para a data de 2011-11-15, mostrar também quais são os quartos reservados e o número de diárias reservadas. • Nestes casos, deve-se executar a operação de junção externa (Outer-join). – Mantém todos os registros de uma das tabela do join, e associa os campos dos respectivos registros da tabela da direita, se hoverem. Se não houver, coloca null para estes campos. 47 SELECT – Junção externa • Existem 3 tipos de outer join – Esquerda: Mantém todos os registros da tabela a esquerdae coloca somente aqueles relacionados da tabela da direita. – Direita: Mantém todos os registros da tabela a direita e coloca somente aqueles relacionados da tabela da esquerda. – Completo: Mantém os registros de ambas as tabelas. Se eles forem relacionados, junta. Se não, coloca NULL nos respectivos campos. 48 Junção externa – Sintaxe • Padrão SQL/2 • No Oracle • No SQL Server SELECT campos FROM TABELA1 LEFT | RIGHT | FULL JOIN TABELA 2 ON TABELA1.Campo = Tabela2.Campo SELECT campos FROM TABELA1, TABELA2 WHERE TABELA1.Campo = TABELA2.Campo(+) SELECT campos FROM TABELA1, TABELA2 WHERE TABELA1.Campo *= TABELA2.Campo 49 Junção externa • Equi-junção – Quando a comparação for por igualdade, pode-se substituir o ON por USING • Natural join – Quando os campos de junção (chave estrangeira e primárias) de ambas as tabelas tiverem o mesmo nome, pode-se usar NATURAL left|right|full JOIN 50 Junção externa – Exemplo • Obter o nome de cada cidade e caso ela tenha algum hotel com 5 estrelas, mostrar também o nome do hotel. SELECT ci.nomecidade, ht.nome FROM hospedagem.cidade ci LEFT JOIN hospedagem.hotel ht ON ht.cidade = ci.codcidade AND ht.estrelas = 5 51 Junção externa – Exemplo • Obter o nome de cada hotel e seus quartos. Caso o quarto tenha alguma reserva, mostrar a data da reserva, o número de diárias e o nome do hóspede. SELECT ht.nome, qt.numero, rs.data, rs.diarias, hs.nome FROM (hospedagem.hotel ht JOIN hospedagem.quarto qt ON ht.codigo = qt.codhotel) LEFT JOIN (hospedagem.reserva rs JOIN hospedagem.hospede hs ON rs.codcliente = hs.codcliente) ON (rs.quarto,rs.hotel) = (qt.numero,qt.codhotel) 52 SELECT – GROUP BY e HAVING • Quando deseja-se agrupar os resultados, pode-se usar funções de grupo – GROUP BY: Cria os agrupamentos, pelo campo escolhido – HAVING: Filtra os grupos. É como se fosse o WHERE para o GROUP BY. Sempre deve ser feito com uma função de agrupamento 53 SELECT – Group By • Mostrar, para cada cidade, quantos hotéis ela tem SELECT ci.nomecidade, count(*) FROM hospedagem.hotel ht, hospedagem.cidade ci WHERE ht.cidade = ci.codcidade GROUP BY ci.nomecidade 54 SELECT – Group By • Listar o numero de diárias reservadas que cada hotel possui SELECT ht.nome, sum(rs.diarias) FROM hospedagem.hotel ht JOIN hospedagem.quarto qt ON ht.codigo = qt.codhotel JOIN hospedagem.reserva rs ON rs.hotel = qt.codhotel AND rs.quarto = qt.numero GROUP BY ht.nome 55 SELECT – Group By e Having • Obter o numero de reservas de cada hotel, mas somente para aqueles hotéis com mais de 2 reservas SELECT ht.nome, count(*) FROM hospedagem.hotel ht JOIN hospedagem.quarto qt ON ht.codigo = qt.codhotel JOIN hospedagem.reserva rs ON rs.hotel = qt.codhotel AND rs.quarto = qt.numero GROUP BY ht.nome HAVING count(*) > 2 56 SELECT – Group By e Having • Obter o numero de reservas dos hotéis da cidade de Banto Gonçalves, mas somente para aqueles hotéis com mais de 2 reservas SELECT ht.nome, count(*) FROM hospedagem.hotel ht, hospedagem.quarto qt, hospedagem.reserva rs, hospedagem.cidade ci WHERE ht.codigo = qt.codhotel AND rs.hotel = qt.codhotel AND rs.quarto = qt.numero AND ht.cidade = ci.codcidade AND ci.nomecidade = 'Bento Gonçalves' GROUP BY ht.nome HAVING count(*) > 2 57 Exercícios Esquema: viagem 58 Exercícios 1. Obter o nome de cada cidade cadastrada 2. Obter o número do passaporte e idade da passageira chamada Debora 3. Obter o nome completo, o numero do passaporte e a idade dos passageiros que tiverem ‘Paulo’ no nome 4. Obter o nome de cada cidade associado com o nome do seu país 5. Obter uma listagem completa das viagens feitas pela passageira ‘Renata’ 6. Obter, para cada viagem da passageira Carolina, o nome da cidade de origem e o nome da cidade de destino, juntamente com o país de origem e o país de destino 7. Obter o nome das cidades cadastradas que pertencem ao país ‘Brasil’ resolver com consultas aninhadas 59 Exercícios 8. Obter o nome do(s) passageiro(s) que fez a(s) viagen(s) que dá mais milhas 9. Obter o nome do(s) passageiro(s) que não efetuaram nenhuma viagem em setembro (mês 9) 10. Obter o nome dos passageiros com pelo menos uma viagem nos meses de agosto ou setembro 11. Obter o nome de cada passageiro bem como a cidade de origem e a cidade de destino de cada viagem que ele fez em março. Se ele não tiver viajado neste mês, deve aparecer na lista igual, mas sem as viagens 12. Obter o número de viagens feitas por cada passageiro 13. Obter o total de milhas voadas pela passageira ‘Renata’ 14. Obter o total de milhas voadas por cada passageiro, se o número de viagens for maior que 3. Subqueries avançadas • Obter a média de reservas por dia entre todos os hotéis 60 SELECT avg(count(*)) FROM hospedagem.reserva GROUP BY data ??? Subqueries avançadas • Obter a média de reservas por dia entre todos os hotéis – Deve-se utilizar subqueries, para poder aplicar uma função sobre um campo de uma tabela 61 SELECT avg(reservas) FROM ( SELECT count(*) as reservas FROM hospedagem.reserva GROUP BY data) as reservas_por_dia; Subqueries avançadas • Obter o nome do hotel que tem mais diárias reservadas, mostrando o número de diárias 62 SELECT ht.nome, sum(diarias) FROM hospedagem.hotel ht, hospedagem.quarto qt, hospedagem.reserva rs WHERE (qt.codhotel = ht.codigo) AND ((qt.codhotel,qt.numero)=(rs.hotel,rs.quarto)) GROUP BY ht.nome HAVING sum(diarias) = ( SELECT max(diarias_total) FROM (SELECT ht.nome, sum(diarias) as diarias_total FROM hospedagem.hotel ht, hospedagem.quarto qt, hospedagem.reserva rs WHERE (qt.codhotel = ht.codigo) AND ((qt.codhotel,qt.numero) = (rs.hotel,rs.quarto)) GROUP BY ht.nome) as diarias_hotel) Union • Usado quando queremos “juntar” (unir) os registros de 2 tabelas / consultas A e B – Não com junção, pois não é associar registros – Tabelas/consultas A e B devem ter o mesmo número de colunas selecionadas – Tipo da i-ésima coluna da tabela/consulta A deve ser o mesmo tipo da i-ésima coluna da tabela/consulta B – Nomes não precisam ser os mesmos costuma prevalecer o nome da primeira consulta/tabela 63 Union – exemplo codcurso titulo horas data_inicio dia ce01 XML 24 15-12-2011 2N ce02 Java básico 30 20-02-2012 4N ce03 Jquery 16 10-08-2012 7M ce04 Oracle 28 05-11-2012 3N coddisc nome horas d01 BD I 60 d02 BD II 60 d03 Padrões Web 30 64 coddisc codturma dia_semana d01 A 4N d01 B 6N d01 C 7M d02 A 2N d03 A 5V Tabela curso_extensao Tabela disciplina Tabela turma FK Union – Exemplo • Obter o nome, carga horária e dia da semana de cada aula, seja ela curso de extensão ou disciplina 65 SELECT e.titulo as nome, e.horas, e.dia as dia_da_semana FROM curso_extensao as e UNION SELECT d.nome, d.horas, t.dia_semana FROM disciplina as d, turma as t WHERE d.coddisc = t.coddisc Union – Exemplo • Obter o nome, carga horária e dia da semana de cada aula, seja ela curso de extensão ou disciplina. Se for curso de extensão, apresentar ainda a data de início. 66 SELECT e.titulo as nome, e.horas, e.dia as dia_da_semana, e.data_inicio FROM curso_extensao as e UNION SELECT d.nome, d.horas, t.dia_semana, NULL FROM disciplina as d, turma as t WHERE d.coddisc = t.coddisc Slide 1 Slide 2 Slide 3 Slide 4 Slide 5 Slide 6 Slide 7 Slide 8 Slide 9 Slide 10 Slide 11 Slide 12 Slide 13 Slide 14 Slide 15 Slide 16 Slide 17 Slide 18 Slide 19 Slide 20 Slide 21 Slide 22 Slide 23 Slide 24 Slide 25 Slide26 Slide 27 Slide 28 Slide 29 Slide 30 Slide 31 Slide 32 Slide 33 Slide 34 Slide 35 Slide 36 Slide 37 Slide 38 Slide 39 Slide 40 Slide 41 Slide 42 Slide 43 Slide 44 Slide 45 Slide 46 Slide 47 Slide 48 Slide 49 Slide 50 Slide 51 Slide 52 Slide 53 Slide 54 Slide 55 Slide 56 Slide 57 Slide 58 Slide 59 Slide 60 Slide 61 Slide 62 Slide 63 Slide 64 Slide 65 Slide 66
Compartilhar