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