패스트캠퍼스

[패스트캠퍼스] 데이터 분석 부트캠프 17기 - 9주차 (2) MySQL 서브쿼리

geraedo 2025. 2. 7. 09:42

1. SELECT 절의 서브 쿼리

- 스칼라 서브쿼리, 결과 값이 하나의 값이어야 한다.

SELECT [컬럼 이름], 

              ( SELECT [컬럼 이름] FROM [테이블 이름] WHERE 조건식 )

FROM [테이블 이름]

WHERE 조건식;

 

- select a.id, a.name, (select b.name from grade_info b where b.code = a.grade_code) as grade

   from customers a; 

= select a.id, a.name, b.name from customers a left join grage_info b on b.code = a.grade_code;

 

2. FROM 절의 서브 쿼리

- 인라인 뷰 서브쿼리, 결과 값이 하나의 테이블이어야 한다, 별명을 붙여줘야 한다.

SELECT [컬럼 이름]

FROM (SELECT [컬럼 이름] FROM [테이블 이름]) AS A

WHERE 조건식;

 

- select m.group_name, m.name, g.debut

   from idol_member m,

           (select group_name, debut from idol_group where type = 'boy') g

   where m.group_name = g.group_name;

= select m.group_name, m.name, g.debut

   from idol_member m, idol_group g

   where m.group_name = g.group_name

   and g.type = 'boy';

 

- 임의의 테이블을 만들어 출력 가능

   select tmp.hello, m.name

   from (select '안녕!' as hello from dual ) tmp, idol_member m;

 

 

3. WHERE 절의 서브 쿼리

- 중첩 서브쿼리, 결과 값이 하나의 컬럼이어야 한다, 연산자와 함께 사용한다.

SELECT [컬럼 이름]

FROM (SELECT [컬럼 이름] FROM [테이블 이름]) AS A

WHERE 조건식;

- 비교연산자만 사용시, 결과값은 하나의 값 

- IN, ALL, ANY : 결과값이 하나의 컬럼

- EXISTS,  NOT EXISTS : 결과값이 여러 칼럼이어도 됨

 

- select * from idol_member a

   where exists (select 1 from melon_chart b where b.singer like concat ('%', a.name, '%'));

 

 

4. 실습[1]

MISSION (1)

SELECT number 

FROM ability

WHERE weight = (SELECT max(weight) FROM ability);

 

MISSION (2)

SELECT number 

FROM ability

WEHRE speed  < ANY(SELECT attack FROM ability WHERE type='electric');

 

MISSION (3)

SELECT  name

FROM mypokemon

WHERE EXISTS (SELECT number FROM ability WHERE attack>defense);

 

5. 실습[2]

MISSION (1)

SELECT name, (SELECT height FORM ability WEHRE number=133) as height,

                          (SELECT weight FORM ability WEHRE number=133) as weight

FROM mypokemon

WHERE number=133;

 

MISSION (2)

SELECT number, speed

FROM (SELECT number, speed, rank() over(order by speed desc) as rack

             FROM ability) as A

WHERE rack=2;

 

MISSION (3)

SELECT name

FROM mypokemon

WHERE number IN (SELECT number FROM ability WHERE defense >

                                  ALL (SELECT defense FROM ability WHERE type = 'electric'));

 


SQL 함수

 

1. Stiring Functions

- select substring/substr('문자열', 시작위치, 출력개수) from dual;

- select length('') from dual; # bite크기로 출력, 한글은 3bit

- concat, upper, lower, trim(공백제거)

- instr('문자열','문자') # 문자위치 반환, replace, lpad('문자열',채워야할 문자열 길이,'대체문자') 

 

2. Number Functions

- round 반올림, 음수에 대해서 양수와 같은 방식의 반올림 적용

  (-82.78의 반올림은 -82.8)

- floor 버림, ceil 올림, 음수에 대해서 수학적 방식 적용

  (-82.8의 버림은 -83, 올림은 -82)

- abs, sign 양수1/음수-1, mod 나머지

 

3. Data Functions

- now(), sql이 실행되는 현재시각, 중간에 sleep이 껴도 같은 시각

- sysdate(), 해당 함수가 실행되는 현재 시각, 중간에 sleep이 끼면 다른 시각

- current_date(), 현재날짜

- adddate(now(), 10) 현재날짜에서 10일 더함

- last_day(날짜) 해당 날짜 달의 마지막 날 반환

- year(날짜), month(), day()

 

4. Null Functions            

- ifnull('data', '대체값) data 존재하면 data, null이면 대체값

- coalesce(data1, data2, data3) 주어진 data들 중 null이 아닌 최초값 반환

- nullif(data1, data2) 두개의 data가 같으면 null, 다르면 data1출력

- isnull(data) data 존재하면 0, null이면 1