Aggregate Functions, Scalar Functions, SQL Subquery

JoQuri(조규리)·2024년 1월 3일
0

MySQL

목록 보기
5/5

Aggregate Functions(집계함수)

  • count (총 갯수 계산) / sum (합계) / avg (평균)
  • min (가장 적은 값 찾아줌) / max (가장 큰 값)
  • first (첫번째 결과값 리턴) / last (마지막 값)
select count(컬럼명 (*가능)) from 테이블명 where ~ ;
select count(distinct 컬럼) from 테이블명;
  • GROUP BY 그룹화하여 데이터를 조회(저절로 DISTINCT됨)
    BUT!!!- DISTINCT로 사용하는 경우 -> ORDER BY 를 사용할 수 없음
select 컬럼명(*가능) from 테이블명
where  group by 컬럼명1, 2 ,..  
order by ...

# 예
select p.name, c.police_station
    -> from police_station p, crime_status c
    -> where p.name like concat("서울",c.police_station,"경찰서")
    -> group by c.police_station, p.name;

update crime_status c, police_station p
    -> set c.reference = p.name
    -> where p.name like concat('서울',c.police_station,'경찰서');
  • 조건에 집계함수가 포함되는 경우 WHERE 대신 HAVING 사용

Scalar Functions

  • UCASE 영문을 대문자로 반환 / LCASE 소문자

  • MID(string, start, length) 문자열 부분을 반환
    • string : 원본 문자열 / length : 반환할 문자열 길이
    • start : 문자열 반환 시작 위치. (첫글자는 1, 마지막글자는 -1)

  • LENGTH 문자열의 길이를 반환하는 함수 ''(0) / ' '(1) / NULL(NULL)

  • ROUND(number, decimals) 지정한 자리에서 숫자를 반올림
    • decimals : 반올림할 소수점 위치(Option) 디폴트값有 0 / -1: 일 단위, -2: 십 단위 올림

  • NOW 현재 날짜 및 시간을 반환

select now();
  • FORMAT(number(or문자), decimals) 숫자를 천단위 콤마가 있는 형식으로 반환(디폴트X)
    -> 문자로 반환 / ROUND함수(->숫자로 반환)
select format(가격,0) from 테이블명 where round(가격,-2)>2000      #100원 단위 올림
< 또 다른 FORMAT vs ROUND 차이 >

SQL Subquery

: 하나의 SQL문(메인쿼리) 안에 또 다른 SQL문(서브쿼리) -> 종속적인 관계

  • 서브쿼리는 메인쿼리의 칼럼 사용 가능(BUT메인쿼리는 서브쿼리의 칼럼 사용X)
  • Subquery 는 괄호로 묶어서 사용(바로 뒤 alias별칭 사용가능)

스카라 서브쿼리 (Scalar Subquery) - SELECT 절에 사용

• 단일 행 혹은 복수 행 비교 연산자와 함께 사용 가능
• subquery 에서는 order by 를 사용X
• 결과는 하나의 Column 이어야 한다.

select 컬럼1, (select 컬럼2 from 테이블명2 where 조건) from 테이블명1 where 조건;

인라인 뷰 (Inline View) - FROM 절(테이블)에 사용

• 서브쿼리 실행 결과가 데이터셋으로 나와야 되고, 하나의 테이블로 인지 후 join 등 테이블로 쓰임
• 메인쿼리에서는 인라인 뷰에서 조회한 Column 만 사용가능

중첩 서브쿼리 (Nested Subquery) - WHERE 절에 사용

<타입>
Single Row - 하나의 열을 검색하는 서브쿼리
: 비교연산자와 사용되는 경우, 서브쿼리의 검색 결과는 한 개의 결과값을 가져야 한다.

Multiple Row - 하나 이상의 열을 검색(반환)하는 서브쿼리

  • IN과 사용되는 경우 / EXISTS
    cf. in보다 조인이 효율적이긴 함
  • Any 어느하나라도 만족시 참 / ALL

Multiple Column(연관서브쿼리) - 하나 이상의 행을 검색하는 서브쿼리

select name from police_station p 
    -> where exists 
    -> (select police_station from crime_status c 
    	where c.reference=p.name and case_number > 2000);
    
select name from celeb
    -> where name = any (select host from snl_show);

select o.상호, o.상표, s.max_가격
    -> from oil_price o, (select 상표, max(가격) as max_가격 from oil_price group by 상표) s 
    -> where o.상표 = s.상표 and o.가격 = s.max_가격;

select 이름, 주유소, 주유일 from refueling
    -> where 주유소 in (select 상호 from oil_price 
    	where 가격 > (select avg(가격) from oil_price));

select r.이름, o.상호 , o.상표 , r.금액, o.가격 from oil_price o,
    -> (select 이름, 주유소,  금액 from refueling where 금액>100000) r
    -> where o.상호 = r.주유소;

0개의 댓글