๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ’ป/ORACLE

[ORACLE] 9์ผ์ฐจ : ์„œ๋ธŒ ์ฟผ๋ฆฌ

by ๋”ฐ๊ถˆ 2024. 3. 21.

 

 

์„œ๋ธŒ์ฟผ๋ฆฌ๋ž€?
subquery๋Š” SELECT,INSERT,UPDATE,DELETE๋ฌธ์ด๋‚˜ ๋‹ค๋ฅธ ํ•˜์œ„ ์ฟผ๋ฆฌ ๋‚ด๋ถ€์— ์ค‘์ฒฉ๋œ SELECT ์ฟผ๋ฆฌ
์‹์ด ํ—ˆ์˜๋˜๋Š” ๋ชจ๋“  ์œ„์น˜์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋‹จ๋…์œผ๋กœ ์‹คํ–‰์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

 

subquery 

 

 

WITH 

์„œ๋ธŒ์ฟผ๋ฆฌ๋ฅผ ๋ธ”๋กํ™”ํ•ด์„œ ์‚ฌ์šฉํ•˜๊ธฐ

 

WITH tmp AS(
        SELECT TO_CHAR(sDate,'YYYY')๋…„๋„,s.cNum,cName,SUM(bPrice*qty)๊ธˆ์•ก,
        RANK()OVER(PARTITION BY TO_CHAR(sDate,'YYYY')ORDER BY SUM(bPrice*qty)DESC)์ˆœ์œ„
        FROM book b
        JOIN dsale d ON b.bCode = d.bCode
        JOIN sale s ON d.sNum = s.sNum
        JOIN cus c ON s.cNum = c.cNum
        GROUP BY TO_CHAR(sDate,'YYYY'),s.cNum,cName
        )
SELECT ๋…„๋„,cNum,cName,๊ธˆ์•ก FROM tmp WHERE ์ˆœ์œ„ = 1;

 

 

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

  • ์„œ๋ธŒ ์ฟผ๋ฆฌ ์ˆ˜ํ–‰ ๊ฒฐ๊ณผ ํ•˜๋‚˜์˜ ํ–‰๊ณผ ํ•˜๋‚˜์˜ ๊ฐ’์„ ๋ฐ˜ํ™˜ ๋ฐ›๋Š”๋‹ค. 
SELECT empNO,name,sal,sal-AVG(sal)OVER()์ฐจ์ด 
FROM emp;

SELECT empNO,name,sal,sal-(SELECT AVG(sal)FROM emp)์ฐจ์ด 
FROM emp;
--์„œ๋ธŒ ์ฟผ๋ฆฌ ์‚ฌ์šฉ

 

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

  • ์„œ๋ธŒ ์ฟผ๋ฆฌ ์ˆ˜ํ–‰ ๊ฒฐ๊ณผ ๋‘๊ฐœ ์ด์ƒ์˜ ๊ฐ’์„ ๋ฐ˜ํ™˜ ๋ฐ›๋Š”๋‹ค. 
SELECT bCode,bName
FROM book 
WHERE bCode IN(SELECT DISTINCT bCode FROM dsale);

 

 

 

ANY(some)

๋น„๊ต ์กฐ๊ฑด์ด ์„œ๋ธŒ ์ฟผ๋ฆฌ์˜ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ์™€ ํ•˜๋‚˜ ์ด์ƒ์ด ์ผ์น˜ํ•˜๋ฉด ์ฐธ์ธ ์—ฐ์‚ฐ์ž 

 

SELECT empNo,name,sal
FROM emp
WHERE sal>ANY(2000000,2500000,3000000);

 

 

EXISTS

๋น„๊ต ์กฐ๊ฑด์ด ์„œ๋ธŒ ์ฟผ๋ฆฌ์˜ ๊ฒฐ๊ณผ ์ค‘์—์„œ ๋งŒ์กฑํ•˜๋Š” ๊ฐ’์ด ํ•˜๋‚˜๋ผ๋„ ์กด์žฌํ•˜๋ฉด ์ฐธ์ธ ์—ฐ์‚ฐ์ž 

SELECT * FROM book 
WHERE EXISTS(SELECT * FROM dsale WHERE qty >= 10);

 

 

UPDATE

UPDATE JOIN VIEW ์ด์šฉํ•˜์—ฌ ๋น ๋ฅธ ์—…๋ฐ์ดํŠธ(์„œ๋ธŒ์ฟผ๋ฆฌ ๋ณด๋‹ค ํ›จ์”ฌ ๋น ๋ฅด๋‹ค.) ํ…Œ์ด๋ธ”์„ ์กฐ์ธํ•˜์—ฌ UPDATE
 tb_a ํ…Œ์ด๋ธ”์˜ ๋‚ด์šฉ(new_addr1, new_addr2)์„ tb_b์— ์กด์žฌํ•˜๋Š” ๋‚ด์šฉ(n_addr1, n_addr2)์œผ๋กœ ์ˆ˜์ • ์กฐ์ธ ์กฐ๊ฑด์˜ ์ปฌ๋Ÿผ์ด UNIQUE ์†์„ฑ์ด์–ด์•ผ ๊ฐ€๋Šฅํ•˜๋ฉฐ(๊ด€๊ณ„๊ฐ€ 1:1) ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ORA-01779 ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

 

        CREATE TABLE tb_a (
             num  NUMBER PRIMARY KEY
            ,addr1  VARCHAR2(255)
            ,addr2 VARCHAR2(255)
            ,new_addr1 VARCHAR2(255)
            ,new_addr2 VARCHAR2(255)
       ); --ํ…Œ์ด๋ธ” a์ƒ์„ฑ
       

      CREATE TABLE tb_b (
           num  NUMBER PRIMARY KEY
          ,n_addr1 VARCHAR2(255)
          ,n_addr2 VARCHAR2(255)
      );--ํ…Œ์ด๋ธ” b์ƒ์„ฑ

      INSERT INTO tb_a VALUES(1,'์„œ์šธ1-1', '์„œ์šธ1-2','๋„๋กœ1-1', '๋„๋กœ1-2');
      INSERT INTO tb_a VALUES(2,'์„œ์šธ2-1', '์„œ์šธ2-2','๋„๋กœ2-1', '๋„๋กœ2-2');
      INSERT INTO tb_a VALUES(3,'์„œ์šธ3-1', '์„œ์šธ3-2','๋„๋กœ3-1', '๋„๋กœ3-2');
      INSERT INTO tb_a VALUES(4,'์„œ์šธ4-1', '์„œ์šธ4-2','๋„๋กœ4-1', '๋„๋กœ4-2');
      INSERT INTO tb_a VALUES(5,'์„œ์šธ5-1', '์„œ์šธ5-2','๋„๋กœ5-1', '๋„๋กœ5-2');

      INSERT INTO tb_b VALUES(1,'์„ธ์ข…1-1', '์„ธ์ข…1-2');
      INSERT INTO tb_b VALUES(3,'์„ธ์ข…3-1', '์„ธ์ข…3-2');
      INSERT INTO tb_b VALUES(5,'์„ธ์ข…5-1', '์„ธ์ข…5-2');
      COMMIT;
      --๋ฐ์ดํ„ฐ ์‚ฝ์ž… 

SELECT a.new_addr1,a.new_addr2,b.n_addr1,b.n_addr2
FROM tb_a a, tb_b b
WHERE a.num = b.num;

--UPDATE ํ…Œ์ด๋ธ”๋ช… SET ์ปฌ๋Ÿผ๋ช… = ๊ฐ’, ์ปฌ๋Ÿผ๋ช… = ๊ฐ’ WHERE ์กฐ๊ฑด;

UPDATE
(
    SELECT a.new_addr1,a.new_addr2,b.n_addr1,b.n_addr2
    FROM tb_a a, tb_b b
    WHERE a.num = b.num
)
SET new_addr1 = n_addr1,new_addr2 = n_addr2;