[DB] SUBQUERY

๋‚˜๋ฌด๋‚˜๋ฌดยท2025๋…„ 3์›” 28์ผ

DB

๋ชฉ๋ก ๋ณด๊ธฐ
8/9

๐Ÿ’ก SUBQUERY
ํ•œ SQL ๋ฌธ ๋‚ด ๋‹ค๋ฅธ SQL๋ฌธ์ด ๋“ค์–ด ์žˆ๋Š” ๊ฒฝ์šฐ

์„œ๋ธŒ์ฟผ๋ฆฌ ๊ตฌ๋ถ„

๋‹จ์ผํ–‰ ์„œ๋ธŒ ์ฟผ๋ฆฌ

- ์„œ๋ธŒ ์ฟผ๋ฆฌ ์กฐํšŒ ๊ฒฐ๊ณผ๊ฐ€ 1์ธ ๊ฒฝ์šฐ
< *์˜ˆ์ œ ์ฝ”๋“œ* >
     -- 1) ๋‹จ์ผํ–‰ ์„œ๋ธŒ ์ฟผ๋ฆฌ
     --    ์„œ๋ธŒ ์ฟผ๋ฆฌ์˜ ์กฐํšŒ ๊ฒฐ๊ณผ ๊ฐ’์˜ ๊ฐœ์ˆ˜๊ฐ€ 1
     
     -- ์ „ ์ง์›์˜ ํ‰๊ท  ๊ธ‰์—ฌ๋ณด๋‹ค ๋” ๋งŽ์€ ๊ธ‰์—ฌ๋ฅผ ๋ฐ›๊ณ  ์žˆ๋Š” ์ง์›๋“ค์˜ ์‚ฌ๋ฒˆ, ์ง์›๋ช…, ์ง๊ธ‰ ์ฝ”๋“œ, ๊ธ‰์—ฌ
     SELECT emp_no,
     		emp_name,
     		dept_code,
     		salary
     FROM employee
     WHERE salary > (
     		SELECT AVG(salary)
     		FROM employee
     		);
     
     -- ๋…ธ์˜น์ฒ  ์‚ฌ์›๋ณด๋‹ค ๊ธ‰์—ฌ๋ฅผ ๋” ๋งŽ์ด ๋ฐ›๋Š” ์ง์›์˜ ์‚ฌ๋ฒˆ ์ง์›๋ช… ๋ถ€์„œ๋ช… ๊ธ‰์—ฌ ์กฐํšŒ
     SELECT e.emp_id AS '์‚ฌ๋ฒˆ',
     		e.emp_name AS '์ง์›๋ช…',
     		d.dept_title AS '๋ถ€์„œ๋ช…',
     		e.salary AS '๊ธ‰์—ฌ'
     FROM employee AS e
     INNER JOIN department AS d ON e.dept_code = d.dept_id
     WHERE e.salary > (
     	SELECT salary
     	FROM employee
     	WHERE emp_name LIKE '๋…ธ์˜น์ฒ '
     	);
         


๋‹ค์ค‘ํ–‰ ์„œ๋ธŒ ์ฟผ๋ฆฌ

  • ์„œ๋ธŒ์ฟผ๋ฆฌ์˜ ์กฐํšŒ ๊ฒฐ๊ณผ ๊ฐ’์˜ ๊ฐœ์ˆ˜๊ฐ€ ์—ฌ๋Ÿฌ ํ–‰
    < ์˜ˆ์ œ ์ฝ”๋“œ >
        -- 2) ๋‹ค์ค‘ํ–‰ ์„œ๋ธŒ ์ฟผ๋ฆฌ
        -- 	์„œ๋ธŒ ์ฟผ๋ฆฌ์˜ ์กฐํšŒ ๊ฒฐ๊ณผ ๊ฐ’์˜ ๊ฐœ์ˆ˜๊ฐ€ ์—ฌ๋Ÿฌ ํ–‰
        
        -- ๊ฐ ๋ถ€์„œ๋ณ„ ์ตœ๊ณ  ๊ธ‰์—ฌ๋ฅผ ๋ฐ›๋Š” ์ง์›์˜ ์ด๋ฆ„, ์ง๊ธ‰ ์ฝ”๋“œ, ๋ถ€์„œ์ฝ”๋“œ, ๊ธ‰์—ฌ ์กฐํšŒ
        
        SELECT MAX(salary)
        FROM employee
        GROUP BY dept_code;  -- ๋ถ€์„œ ๋ณ„ ์ตœ๊ณ  ๊ธ‰์—ฌ ์กฐํšŒ
        
        SELECT emp_name,
        		job_code,
        		dept_code,
        		salary
        FROM employee
        WHERE salary IN (
        	SELECT MAX(salary)
        	FROM employee
        	GROUP BY dept_code
        );
        
        -- ์ง์›๋“ค์˜ ์‚ฌ๋ฒˆ, ์ง์›๋ช…, ๋ถ€์„œ ์ฝ”๋“œ, ๊ตฌ๋ถ„(์‚ฌ์›/์‚ฌ์ˆ˜) ์กฐํšŒ
        SELECT DISTINCT manager_id
        FROM employee
        WHERE manager_id IS NOT NULL
        ;
        
        SELECT emp_id,
        		emp_name,
        		dept_code,
        		manager_id,
        		IF(manager_id IN(
        				SELECT DISTINCT manager_id
        				FROM employee
        				WHERE manager_id IS NOT NULL
        		      ), '์‚ฌ์›', '์‚ฌ์ˆ˜') AS '๊ตฌ๋ถ„(์‚ฌ์›/์‚ฌ์ˆ˜)'
        FROM employee;
        
        SELECT emp_id,
        		emp_name,
        		dept_code,
        		manager_id,
        		CASE
        			WHEN emp_id IN (
        				SELECT DISTINCT manager_id
        				FROM employee
        				WHERE manager_id IS NOT NULL
        		      ) THEN '์‚ฌ์ˆ˜'
        			ELSE '์‚ฌ์›'
        		   END AS '๊ตฌ๋ถ„'
        FROM employee;
        
        -- ๋Œ€๋ฆฌ ์ง๊ธ‰์ž„. ๊ณผ์žฅ ์ง๊ธ‰๋“ค์˜ ์ตœ์†Œ ๊ธ‰์—ฌ๋ณด๋‹ค ๊ธ‰์—ฌ๊ฐ€ ๋งŽ์ด ๋ฐ›๋Š” ๋Œ€๋ฆฌ ์ง์›์˜ ์‚ฌ๋ฒˆ, ์ด๋ฆ„ , ์ง๊ธ‰ , ๊ธ‰์—ฌ
        
        SELECT e.job_code,
        		j.job_name,
        		MIN(salary)
        FROM employee AS e
        INNER JOIN job AS j ON e.job_code = j.job_code
        GROUP BY j.job_code;
        
        SELECT emp_id,
        		emp_name,
        		job_code,
        		salary
        FROM employee
        WHERE job_code LIKE 'J6' AND salary >= (
        		SELECT MIN(salary)
        		FROM employee
        		GROUP BY job_code
        		HAVING job_code LIKE 'J5'
        		);
        		
        SELECT emp_id,
        		emp_name,
        		job_code,
        		salary
        FROM employee
        WHERE job_code = 'J6' 
        		AND salary > ANY(2200000, 2500000, 3760000);
        		
        -- ANY ์—ฐ์‚ฐ์ž๋Š” ๊ฐ’์˜ ๋ชฉ๋ก ์ค‘ ํ•˜๋‚˜๋ผ๋„ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋ฉด ์ฐธ์ด ๋จ.
        -- ANY ์ค‘์—์„œ 220, 250, 376๋งŒ์› ์ค‘ ์–ด๋А ํ•˜๋‚˜๋ผ๋„ ํฌ๋ฉด ์กฐํšŒ ๊ฐ€๋Šฅ
        
        SELECT emp_id,
        		emp_name,
        		job_code,
        		salary
        FROM employee
        WHERE job_code = 'J6' AND
        		salary > ANY(
        			SELECT salary
        			FROM employee
        			WHERE job_code = 'J5');
        -- ๊ณผ์žฅ ์ง๊ธ‰์˜ ๊ธ‰์—ฌ๋“ค ์ค‘์—์„œ ์–ด๋А ํ•˜๋‚˜์—์„œ๋ผ๋„ salary๊ฐ€ ๋†’์€ ๋Œ€๋ฆฌ ์ง๊ธ‰์ด ์žˆ๋Š” ๊ฒฝ์šฐ ์ฐธ
        -- ๋Œ€๋ฆฌ ์ง๊ธ‰ ์ค‘์— ๊ณผ์žฅ ์ง๊ธ‰์˜ salary ์ค‘์—์„œ ํ•˜๋‚˜๋ผ๋„ ๋†’์€ ๊ฐ’์ด ์žˆ์œผ๋ฉด ์ฐธ
        
        -- ๊ณผ์žฅ ์ง๊ธ‰์ž„์—๋„ ์ฐจ์žฅ ์ง๊ธ‰์˜ ์ตœ๋Œ€ ๊ธ‰์—ฌ๋ณด๋‹ค ๋” ๋งŽ์ด ๋ฐ›๋Š” ์ง์›๋“ค์˜ 
        -- ์‚ฌ๋ฒˆ, ์ง์›๋ช…, ์ง๊ธ‰ ์ฝ”๋“œ, ๊ธ‰์—ฌ ์กฐํšŒ
        
        -- 1. ์ฐจ์žฅ ์ง๊ธ‰์˜ ๊ธ‰์—ฌ ์กฐํšŒ
        SELECT emp_id,
        		emp_name,
        		job_code,
        		salary
        FROM employee
        WHERE job_code = 'J4'; -- 280, 155, 249, 248๋งŒ์›์”ฉ
        
        -- ์ด ์ค‘์—์„œ  280๋งŒ์›๋ณด๋‹ค ๋งŽ์ด ๋ฐ›๋Š” ์‚ฌ์›์„ ์กฐํšŒํ•  ์˜ˆ์ •
        -- ์•ž์—์„œ๋Š” ANY๋ผ๋Š” ์—ฐ์‚ฐ์ž ์ผ์œผ๋‹ˆ -> ์ด๋ฒˆ์—๋Š” ALL() ์ด๋ผ๋Š” ์—ฐ์‚ฐ์ž ์‚ฌ์šฉํ•  ์˜ˆ์ •
        
        SELECT emp_id,
        		emp_name,
        		job_code,
        		salary
        FROM employee
        WHERE job_code = 'J5' 
        		AND salary > ALL (
        				SELECT salary
        				FROM employee
        				WHERE job_code = 'J4'
        		);


๋‹ค์ค‘์—ด ์„œ๋ธŒ ์ฟผ๋ฆฌ

  • ์„œ๋ธŒ ์ฟผ๋ฆฌ ์กฐํšŒ ๊ฒฐ๊ณผ ๊ฐ’์˜ ๊ฐœ์ˆ˜๊ฐ€ ํ–‰์€ 1๊ฐœ, ์—ด์€ ์—ฌ๋Ÿฌ ๊ฐœ
    < ์˜ˆ์ œ ์ฝ”๋“œ >
   
        -- 3) ๋‹ค์ค‘์—ด ์„œ๋ธŒ ์ฟผ๋ฆฌ
        -- 	์„œ๋ธŒ ์ฟผ๋ฆฌ์˜ ์กฐํšŒ ๊ฒฐ๊ณผ ๊ฐ’์€ ํ•œ ํ–‰, ์—ด์˜ ์ˆ˜๊ฐ€ ์—ฌ๋Ÿฌ๊ฐœ
        
        -- ํ•˜์ด์œ  ์‚ฌ์›๊ณผ ๊ฐ™์€ ๋ถ€์„œ ์ฝ”๋“œ, ๊ฐ™์€ ์ง๊ธ‰ ์ฝ”๋“œ์— ํ•ด๋‹นํ•˜๋Š” ์‚ฌ์›๋“ค์„ ์กฐํšŒ
        SELECT emp_name, 
        		job_code,
        		dept_code
        FROM employee
        WHERE emp_name LIKE 'ํ•˜์ด์œ ';  -- J5, D5์ธ ์‚ฌ์› ์กฐํšŒ
        
        SELECT emp_name,
        		job_code,
        		dept_code
        FROM employee
        WHERE (dept_code, job_code) IN (
        		SELECT dept_code,
        				job_code
        		FROM employee
        		WHERE emp_name LIKE 'ํ•˜์ด์œ ');
        -- ํ•˜๋‚˜์˜ ์Œ์œผ๋กœ ๋ฌถ์–ด์„œ ์‹คํ–‰์‹œํ‚ด 
        
        -- ๋ฐ•๋‚˜๋ผ ์‚ฌ์›๊ณผ ์ง๊ธ‰ ์ฝ”๋“œ๊ฐ€ ์ผ์น˜ํ•˜๋ฉด์„œ ๊ฐ™์€ ์‚ฌ์ˆ˜๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์‚ฌ์›๋“ค์˜
        -- ์‚ฌ๋ฒˆ, ์ง์›๋ช…, ์ง๊ธ‰ ์ฝ”๋“œ, ์‚ฌ์ˆ˜์˜ ์‚ฌ๋ฒˆ 
        
        SELECT emp_no,
        		emp_name,
        		job_code,
        		manager_id
        FROM employee
        WHERE (job_code, manager_id) IN (
        			SELECT job_code,
        					manager_id
        			FROM employee
        			WHERE emp_name = '๋ฐ•๋‚˜๋ผ'
        	);
        

๋‹ค์ค‘ํ–‰ ๋‹ค์ค‘์—ด ์„œ๋ธŒ ์ฟผ๋ฆฌ

  • ์„œ๋ธŒ ์ฟผ๋ฆฌ์˜ ์กฐํšŒ ๊ฒฐ๊ณผ๊ฐ€ ์—ฌ๋Ÿฌ ํ–‰, ์—ฌ๋Ÿฌ ์—ด
  • ์˜ˆ์ œ ์ฝ”๋“œ
        -- 4) ๋‹ค์ค‘ํ–‰ ๋‹ค์ค‘์—ด ์„œ๋ธŒ ์ฟผ๋ฆฌ
        -- 	์„œ๋ธŒ ์ฟผ๋ฆฌ์˜ ์กฐํšŒ ๊ฒฐ๊ณผ๊ฐ€ ์—ฌ๋Ÿฌ ํ–‰, ์—ฌ๋Ÿฌ ์—ด
        -- ๊ฐ ๋ถ€์„œ ๋ณ„ ์ตœ๊ณ  ๊ธ‰์—ฌ๋ฅผ ๋ฐ›๋Š” ์ง์›์˜ ์‚ฌ๋ฒˆ, ์ง์›๋ช…, ๋ถ€์„œ ์ฝ”๋“œ, ๊ธ‰์—ฌ ์กฐํšŒ
        
        SELECT emp_id,
        		emp_name,
        		dept_code,
        		salary
        FROM employee
        WHERE (IFNULL(dept_code, 0), salary) IN (
        		SELECT IFNULL(dept_code, 0),
        				MAX(salary)
        		FROM employee
        		GROUP BY dept_code
        	)
        ORDER BY dept_code;
        
        -- ๊ฐ ์ง๊ธ‰๋ณ„๋กœ ์ตœ์†Œ ๊ธ‰์—ฌ๋ฅผ ๋ฐ›๋Š” ์‚ฌ์›๋“ค์˜ ์‚ฌ๋ฒˆ, ์ง์›๋ช…, ์ง๊ธ‰ ์ฝ”๋“œ, ๊ธ‰์—ฌ ์กฐํšŒ
        SELECT emp_id,
        		emp_name,
        		job_code,
        		salary
        FROM employee 
        WHERE (IFNULL(job_code, 0), salary) IN (
        	SELECT IFNULL(job_code, 0),
        			MIN(salary)
        	FROM employee
        	GROUP BY job_code
        )
        ORDER BY job_code;

์ธ๋ผ์ธ ๋ทฐ

  • FROM ์ ˆ์—์„œ ํ…Œ์ด๋ธ” ์ด๋ฆ„ ๋Œ€์‹  ๊ฒฐ๊ณผ๋ฅผ ๋งˆ์น˜ ํ…Œ์ด๋ธ”์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ
  • ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ ์ค‘ ํ•˜๋‚˜๋ผ๋„ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ๊ฒฝ์šฐ ANY()
  • ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ ์ค‘ ๋ชจ๋“  ์กฐ๊ฑด์„ ๋งŒ์กฑํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ALL()
profile
๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž ๋‚˜๋ฌด์ž…๋‹ˆ๋‹ค

0๊ฐœ์˜ ๋Œ“๊ธ€