joaopaulofcc

gabarito_aula_subconsultas

Jun 2nd, 2021
1,394
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
MySQL 12.77 KB | None | 0 0
  1. CREATE DATABASE subconsulta;
  2.  
  3. USE subconsulta;
  4.  
  5.  
  6. #----------------------------------------------------------------------------
  7. # CRIAÇÃO DE TABELAS
  8.  
  9. CREATE TABLE profissao (
  10.     id_profissao INTEGER NOT NULL AUTO_INCREMENT,
  11.     nome VARCHAR(45) NOT NULL,
  12.     PRIMARY KEY(id_profissao)
  13. );
  14.  
  15. CREATE TABLE cep (
  16.     num_cep VARCHAR(10) NOT NULL,
  17.     cidade VARCHAR(45) NOT NULL,
  18.     estado VARCHAR(2) NOT NULL,
  19.     PRIMARY KEY(num_cep)
  20. );
  21.  
  22. CREATE TABLE estado_civil (
  23.     id_estado_civil INTEGER NOT NULL AUTO_INCREMENT,
  24.     nome VARCHAR(45) NOT NULL,
  25.     PRIMARY KEY(id_estado_civil)
  26. );
  27.  
  28. CREATE TABLE meus_contatos (
  29.     id_contato INTEGER NOT NULL AUTO_INCREMENT,
  30.     sobrenome VARCHAR(40) NOT NULL,
  31.     prenome VARCHAR(30) NOT NULL,
  32.     telefone VARCHAR(20) NOT NULL,
  33.     email VARCHAR(40),
  34.     sexo VARCHAR(1),
  35.     aniversario DATE,
  36.     id_profissao INTEGER,
  37.     num_cep VARCHAR(10),
  38.     id_estado_civil INTEGER,
  39.     PRIMARY KEY(id_contato),
  40.     FOREIGN KEY(id_profissao) REFERENCES profissao(id_profissao),
  41.     FOREIGN KEY(num_cep) REFERENCES cep(num_cep),
  42.     FOREIGN KEY(id_estado_civil) REFERENCES estado_civil(id_estado_civil)
  43. );
  44.  
  45. CREATE TABLE emprego_desejado (
  46.     id_emprego_desejado INTEGER NOT NULL AUTO_INCREMENT,
  47.     id_contato INTEGER NOT NULL,
  48.     cargo VARCHAR(40) NOT NULL,
  49.     salario_minimo FLOAT NOT NULL,
  50.     salario_maximo FLOAT,
  51.     disponibilidade VARCHAR(40),
  52.     anos_experiencia TINYINT, # 0 a 255 no maximo
  53.     PRIMARY KEY(id_emprego_desejado),
  54.     FOREIGN KEY(id_contato) REFERENCES meus_contatos(id_contato)
  55. );
  56.  
  57. CREATE TABLE emprego_atual (
  58.     id_contato INTEGER NOT NULL,
  59.     cargo VARCHAR(40) NOT NULL,
  60.     salario FLOAT NOT NULL,
  61.     data_inicio DATE,
  62.     PRIMARY KEY(id_contato),
  63.     FOREIGN KEY(id_contato) REFERENCES meus_contatos(id_contato)
  64. );
  65.  
  66. CREATE TABLE interesses (
  67.     id_interesse INTEGER NOT NULL AUTO_INCREMENT,
  68.     interesse VARCHAR(30),
  69.     PRIMARY KEY(id_interesse)
  70. );
  71.  
  72. CREATE TABLE contato_interesse (
  73.     id_contato INTEGER NOT NULL,
  74.     id_interesse INTEGER NOT NULL,
  75.     PRIMARY KEY(id_contato, id_interesse),
  76.     FOREIGN KEY(id_contato) REFERENCES meus_contatos(id_contato),
  77.     FOREIGN KEY(id_interesse) REFERENCES interesses(id_interesse)
  78. );
  79.  
  80. CREATE TABLE procura (
  81.     id_procura INTEGER NOT NULL AUTO_INCREMENT,
  82.     procura VARCHAR(30),
  83.     PRIMARY KEY(id_procura)
  84. );
  85.  
  86. CREATE TABLE contato_procura (
  87.     id_contato INTEGER NOT NULL,
  88.     id_procura INTEGER NOT NULL,
  89.     PRIMARY KEY(id_contato, id_procura),
  90.     FOREIGN KEY(id_contato) REFERENCES meus_contatos(id_contato),
  91.     FOREIGN KEY(id_procura) REFERENCES procura(id_procura)
  92. );
  93.  
  94. CREATE TABLE lista_empregos(
  95.     id_emprego INTEGER NOT NULL AUTO_INCREMENT,
  96.     cargo VARCHAR(40) NOT NULL,
  97.     salario FLOAT NOT NULL,
  98.     num_cep VARCHAR(10),
  99.     descricao TEXT,
  100.     PRIMARY KEY(id_emprego),
  101.     FOREIGN KEY(num_cep) REFERENCES cep(num_cep)
  102. );
  103.  
  104. #----------------------------------------------------------------------------
  105. # INSERÇÃO DE VALORES
  106.  
  107. INSERT INTO profissao (nome) VALUES
  108.     ("Pedreiro"),
  109.     ("Médico"),
  110.     ("Eletricista"),
  111.     ("Carpinteiro");
  112.  
  113. INSERT INTO cep VALUES
  114.     ("35570-000", "Formiga", "MG"),
  115.     ("38459-170", "Sabará", "MG"),
  116.     ("15679-562", "Cubatão", "SP"),
  117.     ("45698-125", "Santos", "SP");
  118.  
  119. INSERT INTO estado_civil (nome) VALUES
  120.     ("Solteiro"),
  121.     ("Casado"),
  122.     ("Viúvo"),
  123.     ("Divorciado");
  124.  
  125. INSERT INTO interesses (interesse) VALUES
  126.     ("Natação"),
  127.     ("Cozinhar"),
  128.     ("Ciclismo"),
  129.     ("Computadores");
  130.  
  131. INSERT INTO meus_contatos
  132. (sobrenome, prenome, telefone, email, sexo, aniversario, id_profissao, num_cep, id_estado_civil) VALUES
  133.     ("da Silva", "Carlos", "3322-1565", "[email protected]", "M", "2000-10-5", 1, "35570-000", 4),
  134.     ("Menezes", "José", "3321-8998", "[email protected]", "M", "1970-10-11", 2, "45698-125", 1),
  135.     ("dos Santos", "Maria", "3321-8998", "[email protected]", "F", "1993-05-20", 3, "38459-170", 2),
  136.     ("Assis", "Joana", "3321-7855", "[email protected]", "F", "1950-03-05", 2, "15679-562", 3),
  137.     ("Seixas", "Raul", "2115-8998", "[email protected]", "M", "1960-03-15", 3, "35570-000", 3),
  138.     ("Camargo", "Marcos", "1587-8989", "[email protected]", "M", "1975-05-20", 3, "38459-170", 3),
  139.     ("das Cruzes", "Beatriz", "1123-6565", "[email protected]", "F", "1992-06-27", 1, "35570-000", 3),
  140.     ("Pereira", "Tatiana", "4545-8978", "[email protected]", "F", "1984-07-19", 1, "15679-562", 3);
  141.    
  142. INSERT INTO contato_interesse (id_contato, id_interesse) VALUES
  143.     (1, 2),
  144.     (2, 3),
  145.     (1, 4),
  146.     (3, 1),
  147.     (4, 4),
  148.     (4, 2);
  149.    
  150. INSERT INTO emprego_atual VALUES
  151. (1, "Assistente", 3500, "2010-10-05"),
  152. (2, "Plantonista", 10750, "2005-09-30"),
  153. (3, "Engenheiro", 7120, "2016-12-05"),
  154. (4, "Cirurgião", 9123, "2000-03-15"),
  155. (5, "Engenheiro", 6535, "2014-05-10"),
  156. (6, "Cirurgião", 10750, "2005-08-20");
  157.  
  158. INSERT INTO emprego_desejado (id_contato, cargo, salario_minimo, salario_maximo, disponibilidade, anos_experiencia) VALUES
  159. (1, "Assistente Senior", 5000, 8000, "Integral", 8),
  160. (2, "Cirurgião", 10000, 15000, "De 13:00 às 20:00", 13),
  161. (3, "Engenheiro Chefe", 8500, 12000, "40 horas semanais", 2),
  162. (4, "Cirurgião Chefe", 15000, 20000, "Integral", 18);
  163.  
  164. INSERT INTO lista_empregos (cargo, salario, num_cep, descricao) VALUES
  165. ("Programador", 7000, "35570-000", "Programador com experiência em Python."),
  166. ("Programador", 5500, "35570-000", "Programador com experiência em Java."),
  167. ("Cirurgião", 11000, "15679-562", "Cirurgião com especialização."),
  168. ("Engenheiro Chefe", 9000, "45698-125", "Engenheiro de minas."),
  169. ("Administrador", 15000, "45698-125", "Administrador com experiência em BD.");
  170.  
  171.  
  172. # -----------------------------------
  173.  
  174.  
  175. # Problema 1
  176.  
  177. # Procura-se Cirurgião com experiência superior a cinco anos. Salário entre R$10.500,00 e R$13.000,00
  178.  
  179. SELECT
  180.     *
  181. FROM
  182.     meus_contatos INNER JOIN emprego_desejado ON meus_contatos.id_contato = emprego_desejado.id_contato
  183. WHERE
  184.     emprego_desejado.cargo = "Cirurgião" AND emprego_desejado.salario_minimo <= 10500 AND emprego_desejado.anos_experiencia >= 5;
  185.  
  186.  
  187. # -----------------------------------
  188.    
  189.    
  190. # Problema 2
  191.  
  192. # Como encontrar a melhor combinação de contatos para uma lista de diferentes empregos?
  193.  
  194. # Passo 01: selecionar todos os cargos disponíveis:
  195. SELECT
  196.     cargo
  197. FROM
  198.     lista_empregos
  199. GROUP BY
  200.     cargo
  201. ORDER BY
  202.     cargo;
  203.    
  204.    
  205. # Passo 02: efetuar uma consulta em emprego_desejado para verificar quais são os interessados nos cargos listados anteriormente:
  206. SELECT
  207.     meus_contatos.prenome, meus_contatos.sobrenome, meus_contatos.telefone, emprego_desejado.cargo
  208. FROM
  209.     meus_contatos INNER JOIN emprego_desejado ON meus_contatos.id_contato = emprego_desejado.id_contato
  210. WHERE
  211.     emprego_desejado.cargo IN ("Programador", "Cirurgião", "Engenheiro Chefe", "Administrador");
  212.  
  213.  
  214. # Como juntar as duas consultas em uma?
  215. SELECT
  216.     meus_contatos.prenome, meus_contatos.sobrenome, meus_contatos.telefone, emprego_desejado.cargo
  217. FROM
  218.     meus_contatos INNER JOIN emprego_desejado ON meus_contatos.id_contato = emprego_desejado.id_contato
  219. WHERE
  220.     emprego_desejado.cargo IN (SELECT cargo FROM lista_empregos);
  221.    
  222.    
  223. # -----------------------------------
  224.  
  225.  
  226. # Problema 3
  227.  
  228. # Selecionar os nomes e sobrenomes dos meus contatos que moram em Formiga.
  229.  
  230. SELECT
  231.     prenome, sobrenome
  232. FROM
  233.     meus_contatos
  234. WHERE
  235.     num_cep = (SELECT num_cep FROM cep WHERE cidade = "Formiga");
  236.    
  237.  
  238. # Poderia ser feito com JOIN também:
  239. SELECT
  240.     prenome, sobrenome
  241. FROM
  242.     meus_contatos JOIN cep ON meus_contatos.num_cep = cep.num_cep
  243. WHERE
  244.     cidade = "Formiga";
  245.    
  246.  
  247. # -----------------------------------
  248.  
  249.  
  250. # Problema 4
  251.  
  252. # Obter o primeiro nome e o sobrenome do contato que possui o maior salário.
  253.  
  254. # Passo 01: selecionar quem ganha o maior salário:
  255. SELECT
  256.     MAX(salario)
  257. FROM
  258.     emprego_atual;
  259.  
  260.    
  261. # Passo 02: conectar as tabelas meus_contatos e emprego_atual e selecionar o maior salário manualmente.
  262. SELECT
  263.     meus_contatos.prenome, meus_contatos.sobrenome, emprego_atual.salario
  264. FROM
  265.     meus_contatos INNER JOIN emprego_atual ON meus_contatos.id_contato = emprego_atual.id_contato
  266. WHERE
  267.     emprego_atual.salario = 10750;
  268.  
  269.  
  270. # Passo 03: utilizar subconsulta para automatizar o processo.
  271. SELECT
  272.     meus_contatos.prenome, meus_contatos.sobrenome, emprego_atual.salario
  273. FROM
  274.     meus_contatos INNER JOIN emprego_atual ON meus_contatos.id_contato = emprego_atual.id_contato
  275. WHERE
  276.     emprego_atual.salario = (SELECT MAX(emprego_atual.salario) FROM emprego_atual);
  277.  
  278.  
  279. # -----------------------------------
  280.  
  281.  
  282. # Subconsultas como colunas
  283.  
  284. SELECT
  285.     meus_contatos.prenome AS Nome,
  286.     meus_contatos.sobrenome AS Sobrenome,
  287.     (SELECT estado FROM cep WHERE meus_contatos.num_cep = num_cep) AS UF
  288. FROM
  289.     meus_contatos;
  290.  
  291.  
  292. # -----------------------------------
  293.  
  294.  
  295. # Problema 05
  296.  
  297. # Localizando pessoas com salario atual maior que o salário da pessoa com determinado e-mail.
  298.  
  299. SELECT
  300.     meus_contatos.prenome, emprego_atual.salario
  301. FROM
  302.     meus_contatos NATURAL JOIN emprego_atual
  303. WHERE
  304.     emprego_atual.salario > (SELECT emprego_atual.salario FROM meus_contatos NATURAL JOIN emprego_atual WHERE email = "[email protected]");
  305.  
  306.  
  307. # -----------------------------------
  308.  
  309.  
  310. # Problema 06
  311.  
  312. # Localizando pessoas com cargo atual igual à lista de empregos disponíveis para emprego:
  313.  
  314. SELECT
  315.     meus_contatos.prenome, emprego_atual.cargo
  316. FROM
  317.     emprego_atual NATURAL JOIN meus_contatos
  318. WHERE
  319.     emprego_atual.cargo IN (SELECT cargo FROM lista_empregos);
  320.  
  321.  
  322. # -----------------------------------
  323.  
  324.  
  325. # Problema 07:
  326.  
  327. # Localizando pessoas com cargo atual não compatível aos cargos da lista de empregos:
  328.  
  329. SELECT
  330.     meus_contatos.prenome, emprego_atual.cargo
  331. FROM
  332.     emprego_atual NATURAL JOIN meus_contatos
  333. WHERE
  334.     emprego_atual.cargo NOT IN (SELECT cargo FROM lista_empregos);
  335.  
  336.  
  337. # -----------------------------------
  338.  
  339. # SUBCONSULTAS CORRELACIONADAS
  340.  
  341. # -----------------------------------
  342.  
  343.  
  344. # Problema 08
  345.  
  346. # Selecionar os contatos que possuem dois interesses:
  347.  
  348. SELECT
  349.     mc.prenome
  350. FROM
  351.     meus_contatos AS mc
  352. WHERE
  353.     2 = (SELECT COUNT(*) FROM contato_interesse WHERE id_contato = mc.id_contato);
  354.    
  355.    
  356. # Problema 09
  357.  
  358. # Precisamos encontrar o nome, sobrenome e email de todos os contatos que não estão na tabela emprego_atual:
  359.  
  360. SELECT
  361.     mc.prenome, mc.sobrenome, mc.email
  362. FROM
  363.     meus_contatos AS mc
  364. WHERE
  365.     NOT EXISTS (SELECT * FROM emprego_atual WHERE mc.id_contato = emprego_atual.id_contato);
  366.  
  367.  
  368. # Problema 10
  369.  
  370. # Precisamos encontrar o nome, sobrenome e email de todos os contatos que estão na tabela emprego_atual:
  371.  
  372. SELECT
  373.     mc.prenome, mc.sobrenome, mc.email
  374. FROM
  375.     meus_contatos AS mc
  376. WHERE
  377.     EXISTS (SELECT * FROM emprego_atual WHERE mc.id_contato = emprego_atual.id_contato);
  378.    
  379.    
  380. # ----------------------------------------
  381.  
  382. # TRANSFORMANDO SUBCONSULTAS EM CONEXÕES
  383.  
  384. # ----------------------------------------
  385.  
  386. # Utilizando subconsulta:
  387.  
  388. SELECT
  389.     meus_contatos.prenome, meus_contatos.sobrenome, meus_contatos.telefone, emprego_atual.cargo
  390. FROM
  391.     emprego_atual INNER JOIN meus_contatos ON emprego_atual.id_contato = meus_contatos.id_contato
  392. WHERE
  393.     emprego_atual.cargo IN (SELECT cargo FROM lista_empregos);
  394.    
  395.    
  396. SELECT
  397.     meus_contatos.prenome, meus_contatos.sobrenome, meus_contatos.telefone, emprego_atual.cargo
  398. FROM
  399.     emprego_atual
  400.     INNER JOIN meus_contatos ON emprego_atual.id_contato = meus_contatos.id_contato
  401.     INNER JOIN lista_empregos ON emprego_atual.cargo = lista_empregos.cargo;
  402.    
  403.    
  404. # ----------------------------------------
  405.  
  406. # OPERAÇÕES DE CONJUNTOS
  407.  
  408. # ----------------------------------------
  409.  
  410. # UNION
  411.  
  412. # Como obter uma lista de todos os cargos que se encontram no banco de dados?
  413.  
  414. # Solução parcial
  415. SELECT cargo FROM emprego_atual;
  416. SELECT cargo FROM emprego_desejado;
  417. SELECT cargo FROM lista_empregos;
  418.  
  419. # Mas, como obter isso em uma lista ordenada pelo cargo?
  420. SELECT cargo FROM emprego_atual
  421. UNION
  422. SELECT cargo FROM emprego_desejado
  423. UNION
  424. SELECT cargo FROM lista_empregos
  425. ORDER BY cargo;
  426.  
  427.  
  428. # UNION ALL
  429.  
  430. # Mesmo exemplo anterior (os cargos que aparecem repetidos não foram removidos)
  431. SELECT cargo FROM emprego_atual
  432. UNION ALL
  433. SELECT cargo FROM emprego_desejado
  434. UNION ALL
  435. SELECT cargo FROM lista_empregos
  436. ORDER BY cargo;
  437.  
  438.  
  439. # Podemos criar uma tabela a partir de qualquer comando select, por exemplo, vamos criar uma tabela com os cargos cadastrados:
  440. CREATE TABLE cargos_completo AS
  441.     SELECT cargo FROM emprego_atual
  442.     UNION
  443.     SELECT cargo FROM emprego_desejado
  444.     UNION
  445.     SELECT cargo FROM lista_empregos
  446.     ORDER BY cargo;
  447.  
  448. SELECT * FROM cargos_completo;
  449.  
  450.  
  451. # Intersecção e Diferença (o MySQL não dá suporte para os operadores Intersect e Except)
  452.  
  453. # Interseção
  454.  
  455. SELECT cargo FROM emprego_atual
  456. WHERE cargo IN
  457. (
  458.     SELECT cargo
  459.     FROM emprego_desejado
  460. )
  461. GROUP BY cargo;
  462.  
  463.  
  464. # Diferença
  465.  
  466. SELECT cargo FROM emprego_atual
  467. WHERE cargo NOT IN
  468. (
  469.     SELECT cargo
  470.     FROM emprego_desejado
  471. )
  472. GROUP BY cargo;
Advertisement
Add Comment
Please, Sign In to add comment