반응형

https://www.acmicpc.net/problem/1051

 

1051번: 숫자 정사각형

N×M크기의 직사각형이 있다. 각 칸에는 한 자리 숫자가 적혀 있다. 이 직사각형에서 꼭짓점에 쓰여 있는 수가 모두 같은 가장 큰 정사각형을 찾는 프로그램을 작성하시오. 이때, 정사각형은 행

www.acmicpc.net

 

💡 숫자 정사각형
N×M크기의 직사각형이 있다. 각 칸에는 한 자리 숫자가 적혀 있다. 이 직사각형에서 꼭짓점에 쓰여 있는 수가 모두 같은 가장 큰 정사각형을 찾는 프로그램을 작성하시오. 이때, 정사각형은 행 또는 열에 평행해야 한다.

예제 입력

3 5
42101
22100
22101

출력

9

 

✅ 문제 풀이

주어진 행렬에서 가능한 모든 정사각형을 구해야 함을 알 수 있다. 따라서 이 문제는 무식하게 다 접근하는 브루트포스 알고리즘을 이용해야 한다.

 

  • 먼저 입력의 형태를 보자. 입력으로 들어오는 행렬 값이 공백으로 구분되어 있지않고 붙어있다.
    => 따라서 string으로 받고, 한 문자씩 잘라서 숫자로 바꾸어준 후 벡터에 값을 반영할 것이다.
  • 벡터가 다 채워졌으면, 이제 왼쪽 상단 꼭지점을 기준으로, 배열을 순회할 것이다.
    => 무슨말이냐 하면, 배열의 각 점을 정사각형의 왼쪽 상단 꼭지점으로 생각하고, 정사각형을 찾아보는 것이다.
  • 그런데, 입력을 받을 때 행과 열의 크기를 받았다. 정사각형은 가로와 세로의 길이가 같아야 하기 때문에 행과 열 중에서 더 작은 값이 정사각형의 최대 길이가 될 수 있다.
  • 따라서 행과 열 중 최소의 길이가 1이었다면, 최대 정사각형 길이는 1이기 때문에 크기가 1이다. 
  • 그리고 행과 열 중 최소의 길이가 1이 아니라면 그 값을 m에 저장해 두고, 다음 절차를 통해 최대 길이를 찾아낼 수 있다.
  • 먼저 정사각형의 한변의 길이가 2인 것부터 찾아볼 것이다.
  • 현재 왼쪽 상단 꼭지점의 위치를 (i,j)라고 할 때 길이가 2인 정사각형의 꼭짓점은 (i+1, j) (i,j+1), (i+1, j+1)이 된다.
  • 따라서 k가 1일 때부터 m보다 작을 때까지 정사각형을 키워가면서 조건을 만족하는지 보면 된다.
  • i+k<N이고, j+k<M이면, 해당 정사각형은 행렬안에 유효한 것이다. 따라서 이런 경우에는 (i,j)가 (i+1, j) (i,j+1), (i+1, j+1)각각과 값이 동일한지 비교해주면 된다. 
    => 값이 동일하면, answer의 기존 값과 비교해서 더 큰 값으로 answer를 갱신해주면된다.
  • 참고로 answer는 행렬을 순회하기 전에 1로 초기화 하여 생성해두어야 한다.
  • 모든 순회가 끝난 후 최종 answer값을 제곱한 값을 출력해주면 된다. (문제에서 정사각형의 크기를반환하라고 하였기 때문이다.)

 

전체 코드는 아래와 같다.

#include<iostream>
#include<algorithm>
#include<string>
#include<vector>

using namespace std;

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	int N, M;
	cin >> N >> M;

	int m = min(N, M);//작은 값이 정사각형의 한 변의 max가 됨

	vector<vector<int>> rec(N, vector<int>(M, 0));

	for (int i = 0; i < N; i++) {
		string str;
		cin >> str;

		for (int j = 0; j < str.length(); j++) {
			rec[i][j] = str[j]-'0'; //char 문자를 숫자로 바꾸는 함수는 atoi를 쓰지만, string으로 되어 있는 경우엔 인자가 맞지 않으므로,'0'을 뻬주어서 구한다.
		}
	}

	if (m == 1) {
		cout << 1;
		return 0;
	}

	int answer = 1;

	for (int i = 0; i < N; i++) {
		for (int j = 0; j < M; j++) {
			for (int k = 1; k < m; k++) {
				if (i + k < N && j + k < M) {//사각형이 범위에 들어오는지 확인
					int t = rec[i][j];//기준이 되는 값을 저장
					if (rec[i][j + k] == t && rec[i + k][j] == t && rec[i + k][j + k] == t) {
						answer = max(k + 1, answer);
					}
				}
			}
		}
	}

	cout << answer * answer;//크기는 변의 제곱

	return 0;
}

 


✏ c++ 문법 알고 넘어가기!
  • 2차원 벡터 선언하기 : vector<vector<int>> vec(행크기, vector<int>(열크기, 초기값));
  • string의 각 문자를 숫자로 변환 : string의 각 문자를 변환할 때는 그냥 str[i]-'0'을 해주면 숫자 값을 얻을 수 있다.
    만약 char로 선언된 문자라면, atoi(문자) 메서드를 사용하면 된다.
    => string의 한 문자를 위 메서드 쓸 수 없는 이유는 인자 형태가 맞지 않아서이다.
반응형
반응형

https://www.acmicpc.net/problem/1032

 

1032번: 명령 프롬프트

첫째 줄에 파일 이름의 개수 N이 주어진다. 둘째 줄부터 N개의 줄에는 파일 이름이 주어진다. N은 50보다 작거나 같은 자연수이고 파일 이름의 길이는 모두 같고 길이는 최대 50이다. 파일이름은

www.acmicpc.net

 

💡 명령 프롬프트
시작 -> 실행 -> cmd를 쳐보자. 검정 화면이 눈에 보인다. 여기서 dir이라고 치면 그 디렉토리에 있는 서브디렉토리와 파일이 모두 나온다. 이때 원하는 파일을 찾으려면 다음과 같이 하면 된다.
dir *.exe라고 치면 확장자가 exe인 파일이 다 나온다. "dir 패턴"과 같이 치면 그 패턴에 맞는 파일만 검색 결과로 나온다. 예를 들어, dir a?b.exe라고 검색하면 파일명의 첫 번째 글자가 a이고, 세 번째 글자가 b이고, 확장자가 exe인 것이 모두 나온다. 이때 두 번째 문자는 아무거나 나와도 된다. 예를 들어, acb.exe, aab.exe, apb.exe가 나온다.
이 문제는 검색 결과가 먼저 주어졌을 때, 패턴으로 뭘 쳐야 그 결과가 나오는지를 출력하는 문제이다. 패턴에는 알파벳과 "." 그리고 "?"만 넣을 수 있다. 가능하면 ?을 적게 써야 한다. 그 디렉토리에는 검색 결과에 나온 파일만 있다고 가정하고, 파일 이름의 길이는 모두 같다.

 

=> 주어지는 파일들을 한번의 패턴 명령으로 모두 조회할 수 있도록 만드는 것이다.

 

✅ 풀이 방법

 

  • 이 문제를 풀기 위해 "두 가지"를 생각했다.
  • 한가지는 , 첫 번째로 받는 문자열을 "기준"으로 잡아야 겠다는 것
  • 또 다른 한가지는, 인덱스 정보를 저장할 자료 구조로 중복을 허용하지 않는 "set"을 이용해야겠다는 것

 

이 두가지를 유념해 두고 풀이를 보자.

 

  • 첫번 째 문자열을 먼저 받고, 만약 입력 받은 문자열이 하나가 끝이라면, 패턴은 그 문자열 자체가 될 수 있다.
    따라서 그 문자열 자체를 출력하고 return 0을 통해 프로그램을 종료한다.
  • 문자열의 길이와, 인덱스를 저장할 set 자료구조를 생성해 놓는다.
  • 만약 입력 받는 문자열이 하나가 아니라면, T-1번 문자열을 받는다.
  • 문자열을 받을 때마다, 받고 난 뒤, 기준 문자열인 첫번째 문자열과 한 글자씩 비교한다.
  • 문자가 다르면, 해당 문자 위치인 인덱스를 set에 넣는다.
  • 문자열을 모두 받고 나면, set에는 패턴에서 ?가 되어야 할 인덱스들이 들어 있는 것과 같다.
  • set을 순회하면서, 첫번 째 문자열에 replace함수를 사용하여, set에 있는 인덱스의 문자는 모두 ?로 대체해준다.
  • 최종 패턴 문자열이 된 첫번 째 문자열을 출력해준다.

전체 코드는 아래와 같다.

#include<iostream>
#include<string>
#include<set>

using namespace std;

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	int T;
	cin >> T;

	string str;//기준이 되는 str
	cin >> str;

	if (T == 1) {
		cout << str;
		return 0;
	}

	int len = str.length();

	//중복값을 넣지 않는 set을 선언해서, 값이 다른 인덱스를 넣는다
	set<int> index;

	for (int i = 1; i < T; i++) {
		string s;
		cin >> s;
		for (int j = 0; j < len; j++) {
			if (str[j] != s[j]) {
				index.insert(j);
			}
		}
	}

	for (auto it = index.begin(); it != index.end(); it++) {
		str.replace(*it, 1, "?");
	}
	//replace(인덱스, 몇글자, "대체문자")

	cout << str;

	return 0;
}

 

✏ c++ 문법 알고 넘어가기
  • set : 자료 구조 중 하나로, 중복 값을 허용하지 않는다.
    <set> 헤더에 정의되어 있다.
    insert로 값을 넣는다.
    set에 있는 값을 가져올 때는 iterator를 반환하기 때문에, 앞에 *을 붙혀서 값을 가져온다.
  • string.replace() : string의 문자열 대체 함수이다.
    replace(인덱스, 문자개수, "대체 문자")의 인자를 갖는다. 
반응형
반응형

https://www.acmicpc.net/problem/1158

 

1158번: 요세푸스 문제

첫째 줄에 N과 K가 빈 칸을 사이에 두고 순서대로 주어진다. (1 ≤ K ≤ N ≤ 5,000)

www.acmicpc.net

 

💡 요세푸스 문제
1번부터 N번까지 N명의 사람이 원을 이루면서 앉아있고, 양의 정수 K(≤ N)가 주어진다. 이제 순서대로 K번째 사람을 제거한다. 한 사람이 제거되면 남은 사람들로 이루어진 원을 따라 이 과정을 계속해 나간다. 이 과정은 N명의 사람이 모두 제거될 때까지 계속된다. 원에서 사람들이 제거되는 순서를 (N, K)-요세푸스 순열이라고 한다. 예를 들어 (7, 3)-요세푸스 순열은 <3, 6, 2, 7, 5, 1, 4>이다.

N과 K가 주어지면 (N, K)-요세푸스 순열을 구하는 프로그램을 작성하시오.

 

✅ 문제풀이
  • 간단하게 queue를 이용
  • queue에 1부터 N까지 값을 차례로 넣은 후, 앞에서부터 K-1번 빼서 뒤로 다시 넣는다.
  • 그럼 K번째 값이 queue의 맨 앞에 위치하게 되고, 해당 값을 answer에 넣어주고, queue에서 삭제한다.
  • 위 과정을 queue의 크기가 1이 될때까지 반복한다.
  • queue에 하나의 값만 남게 되면, 그 값을 answer에 넣어준다.
  • 그리고 출력 형식에 맞게, answer에 있는 값을 차례로 출력해주면 된다.

 

아래 그림처럼 동작하게 된다. (예제로 예를 들어보자)

 

1. queue에 1부터 7까지 넣은 모습이다.

 

2. 3번 째 값을 제거하기 위해서 앞에서부터 뒤로 넘겨주어야 한다.

1번 째 값을 queue에서 pop하고, 다시 동일한 queue에 push하여 뒤로 넘어가게 한다.

 

3. 2번 째 값을 queue에서 pop하고, 다시 동일한 queue에 push하여 뒤로 넘어가게 한다.

 

4. 드디어 3(=K)번 째 값에 도달했으니, 이 값은 answer에 넣어주고, queue에서 삭제해준다.

 

5. 위의 과정을 아래 queue의 길이가 1이 될 때까지(=마지막 하나만 남을때까지) 반복해주면 된다.

 

 

최종 코드는 아래와 같다.

#include<iostream>
#include<queue>

using namespace std;

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	int N, K;

	cin >> N >> K;

	queue<int> q;
	queue<int> answer;

	for (int i = 1; i <= N; i++) {
		q.push(i);
	}

	while (q.size() > 1) {
		for (int i = 1; i < K; i++) {
			int temp = q.front();
			q.pop();
			q.push(temp);
		}
		answer.push(q.front());//k번 째 빼기
		q.pop();
	}

	answer.push(q.front());
	q.pop();

	cout << "<"<<answer.front();
	answer.pop();
	while (!answer.empty()) {
		cout << ", " << answer.front();
		answer.pop();
	}
	cout << ">";

}
반응형

반응형
💡 GROUP BY
  • GROUP BY 컬럼
    컬럼의 값 중 NULL도 있다면 NULL도 하나의 그룹이 될수 있음
    => 사원, 대리, 과장, 차장, 부장, 직급이 정해지지 않은(NULL)이 있을 때, 이를 직급 별로 group화 하면, 6개로 그룹화 가능
  • GROUP BY 절에서는 SELECT 절과는 달리 ALIAS 명을 사용할 수 없음
  • 집계 함수는 WHERE 절에 올 수 없음
    =>집계 함수는 GROUP BY 절에서 사용 가능
  • WHERE 절은 전체 데이터를 GROUP으로 나누기 전에 행들을 미리 제거하는 역할 

 

💡 GROUP BY - HAVING 절 [53]
  • GROUP BY가 없다고 해서 HAVING에 오류가 발생하지는 않는다
    예시)
SELECT SUM(주문금액) AS 합계
FROM 주문
HAVING AVG(주문금액) > 100;

 

=> GROUP BY가 생략된 경우, 적절한 PK로 그룹핑 되고, 그 그룹의 주문 금액 평균이 100보다 크다면 해당 주문금액들의 총합을 출력하는 쿼리이다.

주문ID | 주문금액
-----------------
1      | 80
2      | 120
3      | 90
4      | 110
5      | 95


 이와 같은 테이블이 있다면, 주문ID에 대해 자동 그룹핑될 것이고, 해당 그룹마다 평균 주문금액이 100보다 큰 것은, 주문ID 2와 4의 그룹이므로, 해당 그룹의 주문 금액 합은 120+110=230이다.

합계
-----
230

 

 

  • COUNT와 같은 집계함수를 AVG함수로 감싸 평균을 구할 수 없다
    COUNT는 말 그대로 카운트 한 값을 한 레코드로 출력하는 것이고, 이의 평균이랄 것으로 나눌 값이 명시되지 않기 때문에 AVG함수와 함께 쓸 수 없다
    예시)
SELECT 메뉴ID, 사용유형코드, AVG(COUNT(*)) AS AVGCNT
FROM 시스템사용이력
GROUP BY 메뉴ID, 사용유형코드;

 

 

💡 ORDER BY [56] [57]
  • GROUP BY를 사용할 경우 GROUP BY 표현식이 아닌 값은 기술될 수 없음
    예시)
SELECT 지역, SUM(매출금액) AS 매출금액
FROM 지역별매출
GROUP BY 지역
ORDER BY 년 DESC;

=> 지역에 대해서 그룹핑 되어 매출금액의 SUM을 구하기 때문에, 이를 년이라는 컬럼으로 ORDER할 수 없다

 

  • ORACLE에서는 NULL값을 가장 큰 값으로 간주
    => 오름차순 정렬 시 NULL이 가장 마지막에
    => 내림차순 정렬 시 NULL이 가장 먼저
  • SQL server에서는 NULL을 가장 작은 값으로 간주
    => 오름차순 정렬 시 NULL이 가장 먼저
    => 내림차순 정렬 시 NULL이 가장 마지막에
  • ORDER BY정레 컬럼명 대신 ALIAS 명이나 컬럼 순서를 나타내는 정수를 혼용하여 사용할 수 있음

 

💡 SELECT 문장 실행 순서 [59]

FROM > WHERE > GROUP BY > HAVING > SELECT > ORDER BY

 

 

💡 TOP() 질의문 
  • SQL server의 TOP N 질의문에서 N에 해당하는 값이 동일한 경우 함께 출력되도록 하는 WITH TIES 옵션을 ORDER BY 절과 함께 사용해야 함
  • 예시)
    SELECT TOP(3) WITH TIES 팀명, 승리건수
    FROM 팀별성적
    ORDER BY 승리건수 DESC;

    =>팀별성적에서 팀명과 높은 순으로 승리건수를 조회하는데, 가장 위 3개를 조회한다. 단 3위의 승리건수와 동일한 팀이 있다면 해당 팀까지도 같이 출력한다.
     

 

💡 EQUI JOIN 문장
  • SELECT 테이블1.칼럼명, 테이블2.칼럼명,...
    FROM 테이블1, 테이블2
    WHERE 테이블1.칼럼명1=테이블2.칼럼명2;
    => WHERE 절에 JOIN 조건을 넣음
  • SELECT 테이블1.칼럼명, 테이블2.칼럼명,...
    FROM 테이블1 INNER JOIN 테이블2
    ON 테이블1.칼럼명1=테이블2.칼럼명2;
    => ON 절에 JOIN 조건을 넣음

 

💡 JOIN
  • 일반적으로 JOIN은 PK와 FK 값의 연관성에 의해 성립됨
  • DBMS 옵티마이저는 FROM 절에 나열된 테이블들을 임의로 2개씩 묶어서 JOIN을 처리함
  • EQUI JOIN은 JOIN에 관여하는 테이블 간의 컬럼 값들이 정확하게 일치하는 경우에 사용되는 방법임
  • EQUI JOIN은 = 연산자에 의해서만 수행되며, 그 이외의 비교 연산자를 사용하는 경우에는 모두 NON EQUI JOIN임
  • 대부분 NON EQUI JOIN을 수행할 수 있지만, 때로는 설계상의 이유로 수행이 불가능한 경우도 있음
반응형
반응형
💡 isolation level이 낮은 경우 발생할 수 있는 문제점
  • Dirty read : 다른 트랜잭션에 의해 수정되었지만 아직 커밋되지 않은 데이터를 읽는 것
  • Phantom read : 한 트랙잭션 내에서 같은 쿼리를 두 번 수행했는데, 첫번째 쿼리에서 없던 유령 레코드가 두번째 쿼리에서 나타나는 현상
  • Non-Repeatable read : 한 트랜잭션 내에서 같은 쿼리를 두 번 수행했는데, 그 사이에 다른 트랜잭션이 값을 수정 또는 삭제하는 바람에 두 쿼리 결과가 다르게 나타나는 현상

 

💡 ORACLE과 SQL server에서의 commit과 rollback [29]
  • ORACLE에서는 DDL(create, drop, alter..) 문장 수행 후 자동으로 commit을 수행
  • SQL server에서는 DDL 문장 수행 후 자동으로 commit을 수행하지 않음
  • SQL server에서는 CREATE TABLE 문장도 TRANSACTION의 범주에 포함
    => ROLLBACK 문장에 의해서 최종적으로 B 테이블은 생성되지 않음

 

💡 저장점(SAVEPOINT)
  • 저장점을 정의하면 롤백 할 때 트랜잭션에 포함된 전체 작업을 롤백하는 것이 아니라 현 시점에서 savepoint 까지 트랜잭션의 일부만 롤백할 수 있음
  • [ORACLE]
    SAVEPOINT SVPT1;
    ...
    ROLLBACK TO SVPT1;
    => ...에 있던 부분은 모두 ROLLBACK
  • [SQL server]
    SAVE TRANSACTION SVPT1;
    ...
    ROLLBACK TRANSACTION SVPT1;
    => ...에 있던 부분은 모두 ROLLBACK

 

💡 논리연산자의 우선순위
  • NOT > AND > OR

 

💡 NULL 
  • NULL 값이 포함된 사칙 연산의 결과는 NULL
  • NULL 값을 조건절에서 사용하는 경우 IS NULL / IS NOT NULL 이란 키워드를 사용해야 함

 

💡 [37]
  • [SQL]
    ㄱ. SELECT * FROM 서비스 WHERE 서비스번호 = 1;
    ㄴ. INSERT INTO 서비스 VALUES ('999', '', '2015-11-11');
    ㄷ. SELECT * FROM 서비스 WHERE 서비스명 = '';
    ㄹ. SELECT * FROM 서비스 WHERE 서비스명 IS NULL;
  • ㄴ과 같이 데이터를 입력하면, 서비스명 컬럼의 데이터에 대해서 ORACLE에서는 NULL로 입력됨
  • ㄴ과 같이 데이터가 입력되어있을 때, ORACLE에서 데이터를 조회하려면 서비스명 IS NULL 조건으로 조회해야 함
  • ㄴ과 같이 데이터가 입력되어있을 때, SQL server에서 데이터를 조회하려면 서비스명=''로 조회해야 함

 

💡 내장함수 [40]
  • 함수는 벤더에서 제공하는 함수인 내장 함수와 사용자가 정의할 수 있는 함수로 나눌 수 있음
  • 내장 함수는 다시 단일행함수와 다중행함수로 나눌 수 있음
  • 다중행 함수는 집계함수, 그룹함수, 윈도우 함수로 구분
  • 함수의 입력 행수에 따라 단일행 함수와 다중행 함수로 구분
  • 단일행 함수 예 : =, >, <...
  • 다중행 함수 예 : IN, EXIST...
  • 단일행 함수는 select, where, order by, update의 set절에 사용이 가능
  • 일대다 조인이라 하더라도 다쪽에서 출력된 행이 하나씩 단일행 함수의 입력값으로 사용되므로 단일행 함수 사용가능
  • 다중행 함수와 단일행 함수는 동일하게 단일 값만을 반환

 

💡 라인 수 구하기 sql [41]

 

TAB1

ROWNUM C1
1 A

A
2 B

B

B

 

SELECT SUM(CC)
FROM(

           SELECT(LENGTH(C1)-LENGTH(REPLACE(C1, CHR(10)))+1) CC FROM TAB1

)

 

LENGTH : 문자열의 길이를 반환하는 함수

CHR : 주어진 ASCII 코드에 대한 문자를 반환하는 함수 (CHR(10)-> 줄바꿈)

REPLACE : 문자열을 치환하는 함수 (REPLACE(C1, CHR(10))-> 줄바꿈 제거)

 

함수 결과 값

ROWNUM C1 LENGTH(C1) REPLACE(C1, CHR(10)) LENGTH(REPLACE(C1, CHR(10)))
1 A
A
3(A+줄바꿈+A) 변경 전
A
A
변경 후
AA
2
2 B
B
B
5 변경 전
B
B
B
변경 후
BBB
3

 

2+3 =5

 

답 5

 

 

💡 ORACLE 에서의 날짜 연산 [42]

 

SELECT TO_CHAR(TO_DATE('2015.01.10 10', 'YYYY.MM.DD HH24')+1/24/(60/10), 'YYYY.MM.DD HH24:MI:SS') FROM DUAL;

 

  • 오라클에서 날짜의 연산은 숫자의 연산과 같음
  • 특정 날짜에 1을 더하면 하루를 더한 결과와 같으므로 1/24/60 = 1분을 의미
    1=하루
    1/24 = 하루를 24로 나눈다= 한시간
    1/24/60 = 한시간을 60으로 나눈다 = 1분
    1/24/(60/10) = 한시간을 6으로 나눈다 = 10분
  • 따라서 10분 더해주면 된다.

답 : 2015.01.10 10:10:00

 

 

💡 SEARCHED_CASE_EXPRESSION -> SIMPLE_CASE_EXPRESSION 으로 변환 [43]

 

[ SEARCHED_CASE_EXPRESSION ]

WHEN LOC = 'NEW YORK' THEN 'EAST'

 

[ SIMPLE_CASE_EXPRESSION ]

LOC WHEN 'NEW YORK' THEN 'EAST'

 

=> SIMPLE은 부등호를 없앤다

 

 

💡 ISNULL함수 [45]
  • ISNULL 함수는 결과값이 NULL일 경우 지정된 값을 반환
    ISNULL(COL2,'X')
    => COL2값이 NULL이면 'X'를 반환
  • WHERE 절안에서 컬럼의 NULL 값을 확인할 때는 IS NULL을 사용해야 함

 

💡 단일행 NULL 관련 함수 [46]
  • NVL(표현식1, 표현식2) / ISNULL(표현식1, 표현식2)
    => 표현식1의 결과값이 NULL이면 표현식2의 값을 출력
    => 단 표현식1과 표현식2의 결과 데이터 타입이 같아야 함
    => NULL 관련 가장 많이 사용되는 함수로 상당히 중요
  • NULLIF(표현식1, 표현식2) 
    => 표현식1이 표현식2와 같으면 NULL을, 같지 않으면 표현식1을 반환
  • COALESCE(표현식1, 표현식2, ...)
    => 임의의 개수 표현식에서 NULL이 아닌 최초의 표현식을 나타냄
    => 모든 표현식이 NULL이라면 NULL 리턴

사원 테이블에서 MGR의 값이 7698과 같으면 NULL을 표시하고, 같지 않으면 MGR을 표시하려고 한다. 

=> NULLIF(MGR, 7698) 사용

 

 

💡 NULL AVG 연산
  • NULL은 AVG 연산 대상에서 제외, COUNT도 마찬가지.

 

 

반응형

+ Recent posts