--q1 select pnome, nome, ano_n, cid_res from jogadores where pais = 'BRA' order by pnome --q2 select * from jogadores --q3 select ano_n from jogadores --q4 select distinct ano_n from jogadores --q5 select distinct cid_res, ano_p from jogadores --q6 ``Obtenha o nome dos jogadores que se tornaram profissionais com --menos de 22 anos" select nome from jogadores where ano_p - ano_n < 22 select nome from jogadores where (ano_p - ano_n < 22 and pais = 'BRA') or cid_res = 'Florianopolis' --q7``Obtenha o nome e ano de nascimento dos jogadores nascidos --entre 1975 e 1981" select nome, ano_n from jogadores where ano_n between 75 and 81 --q8 select numj from jogadores where cid_res in ('Las Vegas', 'Monte Carlo', 'Los Angeles') --q9``Dê o nome dos jogadores que não moram nem em Las Vegas nem em Los Angeles". --q10 select nome from jogadores where nome like 'B%' --q11 select nome from jogadores where nome like '%n' --q12 select nome from jogadores where nome like '%e_' --q13``Dê o nome de cada jogador cujo nome contem a seqüência de letras 'is'" --q14``Dê o nome de cada jogador cujo nome possui exatamente 5 caracteres" --q15``Dê o nome de cada jogador cujo nome possui pelo menos 5 caracteres" --q16``Dê o nome de cada jogador cujo nome tem a letra a como a segunda e penúltima letra" --q17``Para cada torneio, dê o seu nome, ano e o número do seu vencedor. -- A tabela Torneios tem do torneio, apenas o seu número; para obter o seu nome -- temos que "olhar" a tabela Lista_torneios: select nomet, ano, numj from torneios, lista_torneios where torneios.numt = lista_torneios.numt --q18``obter os nomes dos jogadores mais velhos que Kuerten". Abaixo, j1 e j2 são --sinônimos de Jogadores: select j1.nome from jogadores j1, jogadores j2 where j2.nome = 'Kuerten' and j1.ano_n < j2.ano_n --q19``Para cada jogador que venceu algum torneio obtenha o seu nome, o nome do -- torneio e o ano da vitória no torneio" select j.nome, lt.nomet, t.ano from jogadores j, lista_torneios lt, torneios t where j.numj = t.numj and t.numt = lt.numt --q20 select * from jogadores where natp = NULL --q21 select * from jogadores where natp = natp --q22 select * from jogadores where natp IS NULL --q23 select * from jogadores where natp IS NOT NULL --q24``dê o nome de todos os jogadores exceto daquele cujo natp é 1271" select nome from jogadores where natp <> 1271 or natp IS NULL --q25 Obtenha uma solução correta para a consulta: -- ``dê o nome de todos os jogadores exceto daquele cujo natp é 1271" --q26 Qual o resultado do comando?: select numj, natp from jogadores where natp >= natp --q27``Obtenha o nome de cada jogador que venceu pelo menos um torneio." select nome from jogadores where numj in (select numj from torneios) --q28 select distinct nome from jogadores, torneios where jogadores.numj = torneios.numj --q29``Obter os nomes dos jogadores que venceram uma ou mais vezes o torneio 1": select nome from jogadores where numj in (select numj from torneios where numt = 1) --q30 O exemplo acima poderia também ser feito com uma junção (tente!) --q31``Para cada jogador que venceu torneios, obtenha o seu nome, o número do torneio e o ano". select nome, numt, ano from jogadores, torneios where jogadores.numj = torneios.numj --q32``obtenha os nomes dos jogadores que não venceram torneios": select nome from jogadores where numj not in (select numj from torneios) --q33 o que resultaria se usássemos para aconsulta anterior a seguinte junção intuitiva? select nome from jogadores, torneios where jogadores.numj <> torneios.numj --q34``Obtenha o pre-nome e o nome do jogador que ganhou o torneio 2 em 1997". select pnome, nome from jogadores where numj = (select numj from Torneios where numt=2 and ano= 1997 --q35``Obtenha o nome de cada jogador que é mais velho que Kuerten". select nome from jogadores where ano_n < (select ano_n from jogadores where nome = 'Kuerten') --q36``Obtenha o(s) nome(s) do(s) jogador(es) mais velho(s) que todos os outros jogadores". select nome from jogadores where ano_n <= all (select ano_n from jogadores) --q37`` obter o nome da cada jogador que não pertence ao grupo dos mais velhos" select nome from jogadores where ano_n > any (select ano_n from jogadores) --q38``obtenha o nome de cada jogador que venceu algum torneio". select nome from jogadores where exists (select * from torneios where torneios.numj = jogadores.numj) --q39``obtenha o nome de todos os jogadores que não foram vencedores de torneio". select nome from jogadores where not exists (select * from torneios where torneios.numj = jogadores.numj) --q40``Obtenha o nome de cada jogador que venceu o torneio de Wimbledon". --q41``Obtenha o nome de cada jogador que não foi vencedor de torneios vencidos pelo -- jogador Sampras (numj = 812)". --q42``Dê o número e nome de todos os jogadores". select numj, nome from jogadores_aposentados union select numj, nome from jogadores_ativos --q43 especificando múltiplas colunas para ordenação select numj, ano from torneios order by numj, ano --q44 idem select nome, cid_res from jogadores order by cid_res asc, nome desc --q45 ordenação envolvendo nulos depende do SGBD! select natp from jogadores order by natp --q46``Quantos torneios existem?". select count (*) from lista_torneios --q47``Qual foi o prêmio de valor máximo?". select max(premio) from torneios --q48`` Quantas cidades de residência distintas existem?". select count (distinct cid_res) from jogadores --q49`` Quantos jogadores vivem em Monte Carlo?". select count (*) from jogadores where cid_res = 'Monte Carlo' --50``* Quantos prêmios são iguais ao mínimo prêmio?". select count (premio) from torneios where premio = (select min (premio) from torneios) --q51``Obtenha para cada jogador que venceu torneios, o valor do seu maior prêmio, -- o número do torneio e o ano em que foi ganho". select numj, premio, numt,ano from torneios t1 where premio = ( select max(premio ) from torneios t2 where t2.numj = t1.numj ) --q52 Qual a diferença entre os comandos?: select avg (premio) from torneios --e select sum (premio) / count ( * ) from torneios --q53 O que há de errado no comando? : select count (*), numj from jogadores --q54 Qual o prêmio médio para jogadores que venceram o torneio 1 ? --q55 * Obtenha o valor médio de jogadores por cidade de residência, i. é, total -- de jogadores / total de cidades de residência --q56 Obtenha as seguintes estatísticas de desempenho dos jogadores: -- Qual a porcentagem de vitórias de cada jogador em relação ao número total -- de torneios disputados, isto é: vits*100/(vits + derrs) -- Apresente os jogadores em ordem decrescente dessa métrica. --q57 Qual jogador obteve o melhor desempenho segundo a métrica acima? --q58 Qual a porcentagem de vitórias em torneios de simples e duplas de cada jogador, -- em relação ao número total de torneios disputados? Apresente-os em ordem decrescente dessa medida. --q59 Qual o jogador que obteve o melhor desempenho segundo essa métrica? --q60 Quais jogadores tiveram mais derrotas que vitórias em torneios da ATP? --q61 Qual jogador obteve a maior soma de vitórias em torneios de simples e duplas? --q62 * Obtenha os nomes dos jogadores cujas vitórias são maiores que o dobro das -- derrotas, em ordem decrescente dessa métrica. --q63 comando para inserir uma só linha insert torneios (numt, ano, numj) values (2, 2003, 910) --q64 idem insert torneios values (2, 2003, 910) --q65 idem insert into torneios (numt, ano, numj) values (2, 2003, 910) --q66 inserção de várias linhas a partir de outra tabela insert into jogadores_aposentados (numj, nome, cidade, pais) select numj, nome, cidade, pais from jogadores where natp is null --q67 Inserção com coluna calculada: insert maiores_premios select numj, ano, premio*1.33 from torneios --q68 exemplo do comando update update jogadores set natp = '2000' where numj = 1272 --q69 idem update jogadores set cid_res= 'Los Angeles', pais = 'EUA' where nome = 'Agassi' --q70 idem update torneios set premio = premio * 1.5 --q71 inserção em tabela a partir de comando select insert into vencedores select torneios.numj, nome, numt, ano, premio from jogadores, torneios where jogadores.numj = torneios. numj --q72 comando delete para remover linhas de um tabela delete from torneios where numj = 224 --remove as linhas da tabela Torneios, correspondentes ao jogador 224. --q73 idem delete torneios --remove todas as linhas da tabela torneios. --q74 group by retorna uma única linha por grupo -- esta consulta apresenta os torneios agrupados pelos seus vencedores: select numj from torneios group by numj --q75 nesta consulta temos repetição de numj: select numj from torneios --q76 agrupamento com duas colunas select numj, numt from torneios group by numj, numt --q77 obtenha para cada jogadr o número total de torneios que ele venceu select numj, count(*) from torneios group by numj --q78 para cada cidade de residência dê o número total de jogadores select cid_res, count (numj) from jogadores group by cid_res --q79 * ``Para cada jogador dê o seu nome, o número total de torneios que ele -- ganhou, em ordem decrescente desse número" select nome, count(*) as num_vitorias from torneios t, jogadores j where t.numj=j.numj group by nome order by num_vitorias desc, nome asc --q80``Dê o número de cada jogador que venceu mais de um torneio". select numj from torneios group by numj having count(*) > 1 --q81* ``Dê o número de cada jogador que venceu pelo menos dois torneios distintos". select numj from torneios group by numj having count(distinct numt) > 1 --q82``Dê os números dos jogadores que receberam prêmios cuja média foi superior a 400 KUS$". select numj from premios group by numj having avg (premio) > 400 -- Obs: avg = sum (valores não Nulos) / count (valores não Nulos) --q83`` Para cada jogador que venceu mais de um torneio dê a soma total dos prêmios recebidos". select numj, sum(premio) from torneios group by numj having count(*) > 1 --q84`` Quantos torneios foram vencidos no mesmo ano por cada jogador?" select numj,ano, count(*) from torneios group by numj,ano order by count(*) desc, numj --q84.1 ``* Obtenha os números dos jogadores que ganharam pelo menos k torneios distintos". select numj, count(distinct numt) as ct from torneios group by numj having count(distinct numt) >= k order by ct desc --q85`` Dê o nome de cada cidade de residência que tem apenas um jogador ativo". select cid_res from jogadores group by cid_res having count(natp) = 1 -q86 Para a coluna ano_n da tabela Jogadores determine o valor retornado por: -- 1. count (ano_n) -- 2. min (ano_n) -- 3. max (ano_n) -- 4. sum (ano_n) -- 5. avg (ano_n) -- 6. count (distinct (ano_n) -- 7. min (distinct (ano_n) -- 8. max (distinct (ano_n) --q87 Encontre as cidades em que mais de 2 jogadores vivem. --q88 Dê o nome de cada jogador que venceu mais de um torneio --q89 O que está errado no comando abaixo? : select numj, premio from torneios group by numj --q90 Para cada cidade de residência dê a quantidade de jogadores nascidos após 1975. --q91 Dê o nome e ano de nascimento de cada jogador nascido após o ano médio de -- nascimento de todos os jogadores. --q92 Para cada jogador que ganhou algum prêmio acima de 400 KUS$, dê o seu número -- e o máximo prêmio que êle ganhou. --q93 * ``Obtenha o nome do jogador, o número de torneios de simples, tit_s, -- e o número de torneios de Grand Slam por êle vencidos. Apresente o resultado -- em ordem decrescente do número de torneios de simples vencidos". --q94 * Para cada joador que venceu algum torneio, obtenha a porcentagem de torneios -- por ele vencidos, em relação ao número total de torneios. --q95``Obtenha a média do número de materiais fornecidos por fornecedor", isto é, -- número de fornecimentos / número de fornecedores. --q96 Obtenha a média do número de torneios vencidos por jogador, isto é, -- SOMA do número de torneios vencidos por todos os jogadores) / -- (número de jogadores que venceram torneios) --q97 * ``Para cada jogador dê o seu nome e o número de torneios distintos que êle venceu". --q98 * ``Dê o nome dos jogadores que venceram pelo menos k torneios distintos". --q99 * ``Dê o nome do(s) jogador(es) que venceu o maior numero de torneios distintos". --q100 * `` Apresente cada jogador que ganhou a maior soma de prêmios e qual esse valor". select numj, sum(premio) from torneios group by numj having sum(premio) >= ALL (select sum(premio) from torneios group by numj) --q101 * Para cada torneio, quais jogadores o venceram mais vezes ? select t.numt, t.numj,count(*) from torneios t group by t.numj,t.numt having count(*) >= all (select count(*) from torneios where numt=t.numt group by numj) order by t.numt --q102 * Dê o nome de cada torneio e dos jogadores que o venceram mais vezes --q103 * ``Para cada ano, qual(is) jogador(es) venceu(ram) o maior número de torneios nesse ano, -- e quantos torneios ele venceu? select ano,numj, count(*) from torneios t1 group by ano,numj having count(*) >= all (select count(*) from torneios where ano=t1.ano group by numj) order by ano,numj --q104 ** ``Para cada vencedor de torneio apresente o seu nome, o nome do torneio e -- o número de vezes que venceu esse torneio". --q105 * `` Obtenha os jogadores que tiveram o maior intervalo de tempo entre -- vitórias (medido em anos), e qual foi esse intervalo". select numj, (max(ano) - min(ano)) from torneios group by numj having (max(ano) - min(ano)) >= all (select max(ano) - min(ano) from torneios group by numj) --q106 * ``Dê o nome e número de torneios ganhos pelos jogadores que venceram o -- maior número de torneios em quadras rápidas ('D', 'G', 'T') select nome, count(*) from torneios t, lista_torneios lt, jogadores j where t.numt = lt.numt and j.numj = t.numj and quadra in ('D', 'G', 'T') group by nome having count(*) >= all (select count(*) from torneios t, lista_torneios lt where t.numt=lt.numt and quadra in ('D','G','T') group by t.numj) --q107 Repita o problema acima, para ``obter o maior vencedor de quadras `lentas' -- (são as de `Saibro')". --q108 ** ``Obtenha uma lista dos jogadores em ordem decrescente da seguinte métrica: -- número de títulos em torneios de simples / intervalo em anos em que os títulos foram obtidos -- (se maior do que zero)". --q109 * ``Considere a tabela D(p, f) do exercício 4.3.3, representando o -- relacionamento entre pais e filhos. Expresse em SQL as consultas daquele exercício". --q110 * Verifique se a BD está consistente no sentido de não possuir registros de -- filhos com apenas um dos pais presentes naBD. Obtenha soluções com e sem -- subconsultas correlacionadas -- Considere novamente a tabela D(p, f). Expresse em SQL a seguintes consulta -- (V. deve evitar a repetição de linhas no resultado): --q111 * ``Para cada casal (avô, avó) dê a lista dos seus netos sob a forma de -- triplas (avô, avó, neto) " -- OBS.: não considere literalmente o sexo, pois este dado não está disponível na tabela D --q112 Considere novamente a tabela D(p, f). Expresse em SQL a seguintes consulta -- (V. deve evitar a repetição de linhas no resultado): -- ** ``Para cada avô, obtenha o número de seus netos". --q113 Considere novamente a tabela D(p, f). Expresse em SQL a seguintes consulta -- (V. deve evitar a repetição de linhas no resultado): -- ** ``Obtenha o avô ou avós que possuem o maior número de netos, e qual esse número" --q114 Considere novamente a tabela D(p, f). Expresse em SQL a seguintes consulta --(V. deve evitar a repetição de linhas no resultado): -- ** ``Obtenha pares de pessoas (p1, p2) onde p1 é sobrinho de p2". --q114.1 Considere novamente a tabela D(p, f). Expresse em SQL a seguintes consulta -- (V. deve evitar a repetição de linhas no resultado): -- ** ``Para cada sobrinho, obtenha a lista dos seus tios". --q114.2 Considere novamente a tabela D(p, f). Expresse em SQL a seguintes consulta -- (V. deve evitar a repetição de linhas no resultado): -- ** ``Obtenha pares de pessoas que são primos em 1o grau". --q115 Considere novamente a tabela D(p, f). Expresse em SQL a seguintes consulta --(V. deve evitar a repetição de linhas no resultado): -- ** ``Obtenha pares de pessoas que são meio-irmãos (isto é, apenas um dos pais é comum a ambos)". --q116 ** ``Apresente uma lista em ordem alfabética com os nomes dos torneios; -- acrescente uma numeração aos itens da lista". -- A dificuldade desse problema reside na numeração; para obte-la vamos fazer uma -- auto-junção de Lista_Torneios, comparando a coluna nome consigo mesma, seguida -- de um group by numa das colunas e contando as ocorrências do grupo, que conterá -- a numeração desejada: select count(*), t1.nome from lista_torneios t1, lista_torneios t2 where t1.nomet >= t2.nomet group by t1.nomet order by count(*) -- Para esse truque funcionar é preciso que a coluna de ordenação não tenha -- elementos repetidos ( Exercício: por que? ). -- Se quiséssemos mostrar apenas os k primeiros itens da lista, bastaria acrescentar -- a cláusula: having count(*) <= k. --q117``* Apresente uma lista numerada contendo em ordem decrescente os k maiores números da ATP." select count(*), j1.natp from jogadores j1, jogadores j2 where j1.natp <= j2.natp group by j1.natp having count(*) <= k order by j1.natp desc