SQL 작성형식

준우·2024년 7월 4일

iOS 그외의 이야기

목록 보기
1/3
post-thumbnail

최근 SQLite라는 라이브러리를 프로젝트에 도입하게되었습니다.
그 과정에서 SQL에 대한 기억이 희미해져, 블로그 포스팅 + SQL 정리를 할겸 남깁니다. ㅎ 추후, CRUD, Join 같은 것도 다룰예정

1. SQL 문 끝에는 항상 세미콜론을 써줘야합니다.

  • 하나의 SQL 문 끝에는 세미콜론을 써줘야합니다. SQL 문법 상 세미콜론이 하나의 SQL 문을 종결하는 단위이기 때문입니다.

2. SQL 문 안에는 공백이나 개행 등을 자유롭게 넣을 수 있습니다.

// 엄청 많은 공백을 주기
SELECT * FROM copang_main.member            WHERE email = 'jakkujakku98@gmail.com'

// SQL문의 일부분을 한 줄 내리고, 탭을 입력한 후에 쓰는 것도 가능함
SELECT * FROM copang_main.member
	WHERE emil = 'jakkujakku98@gmail.com'

/*
어떤 방식으로 쓰든, 
구분되어야할 키워드들이 최소한 하나 이상의 공백으로 구분되어 있고, 
세미콜론으로 마무리되어 있으면 실행에는 문제가 없습니다. 
이런 점을 이용해서 길이가 긴 SQL 문을 쓸 때는 개행(줄바꿈), 
탭 등을 적절하게 활용해서 가독성을 높이는 것이 좋습니다.
*/

3. SQL 문의 대소문자 구분 문자

SELECT * FROM coapng_main.member WHERE email = 'jakkujakku98@gamil.com';
/*
지금 빨간색 박스가 MySQL에 원래부터 존재하는 예약어, 파란색 박스가 사용자가 지정한 부분입니다.
일단 빨간색 박스에서 보이는 것처럼 MySQL의 예약어는 대문자로 적는 것이 관례이고, 보기에도 좋습니다.
그리고 파란색 부분에 등장하는 데이터베이스 이름, 테이블 이름, 
컬럼 이름 등은 대소문자를 가리지 않고, 
실제로 존재하는 것의 이름을 적어주면 됩니다.
*/

4.데이터베이스 이름과 테이블 이름

USE copang_main;
SELECT * FROM member;
/*
USE copang_main; 은 copang_main이라는 데이터베이스를 사용하겠다고 확실히 선언하는 것입니다. 
그리고 그 뒤로는 그냥 테이블 이름만 써도 괜찮습니다.
*/

알아야할 조건 표현식

1.같지 않음(≠, <>)

  • '같지 않음'를 표현하려면 어떻게 해야할까요? != 기호나 <> 기호를 사용하면 됩니다. member 테이블의 회원들 중 남자가 '아닌' 회원들만 조회해보겠습니다.
SELECT * FROM copang_main.member WHERE gender != 'm';
// 남성이 아닌, 여성 회원들만 잘 조회되었습니다.

SELECT * FROM copang_main.member WHERE gender <> 'm';
// 마찬가지로, 여성 회원들만 조회되었습니다.

2.이 중에 있는~(IN)

  • 만약 여러 값들 중에서 해당하는 값이 있는 row들만 추려야할 때도 있는데요. 예를 들어, 현재 회원 중에서 나이가 딱 20살, 또는 딱 30살인 회원들만 조회하려면 어떻게 해야 할까요?
SELECT * FROM copang_main.member WHERE age IN (20, 30);
// 지금 WHERE age IN (20, 30)은 age 컬럼의 값이 20이거나, 30이어야 한다는 조건을 의미합니다

3.한 글자를 나타내는 _

  • 문자열 패턴 매칭 조건을 배울 때 LIKE 뒤의 ‘%’는 임의의 길이를 가진 문자열(0자도 포함)을 나타낸다고 했습니다. 그런데 %말고 언더바(_) 하나 기호도 있는데요. LIKE 뒤의 언더바 하나는 문자 하나를 나타냅니다.
  • 잠깐 member 테이블에서 이메일 주소가 c로 시작하고, 그 뒤에 여섯 글자가 있는 row들을 조회해볼까요?
SELECT * FROM copang_main.member WHERE email LIKE 'c____@%';
/*
지금 LIKE 뒤의 'c_____@%' 부분이 이해되시나요? 
지금 언더바가 소문자 c 뒤에 5개가 있는 상태인데요. 
이 표현식은 c로 시작하고, 
그 뒤에 다섯 글자 그리고 골뱅이 하나, 
그 뒤에 임의의 길이를 가진 문자열이 있는 문자열 패턴을 나타냅니다. 
그리고 이 패턴에 해당하는 문자열인 codeit@naver.com과 cowboy@codeit.kr을 email 주소로 가진 회원들만 잘 조회됐습니다.
*/

DATE 데이터 타입 관련 함수들

1. 연도, 월, 일 추출하기

  • DATE 타입의 값에서 연도(year)만, 혹은 월(month)만, 혹은 일(day)만 추출할 수 있습니다.
// 1.1992년에 태어난 회원들만 조회하기
SELECT * FROM copang_main.member WHERE YEAR(birthday) = '1992'
// 위처럼 YEAR 함수를 사용하면 날짜 값에서 연도만 뽑아낼 수 있습니다.

// 2.여름(6,7,8월)에 가입한 회원들만 조회하기
SELECT * FROM copang_main.member WHERE MONTH(sing_up_day) IN (6,7,8);
// DAYOFMONTH 함수는 날짜값에서 일만 뽑아낼 수 있습니다. 
// 그 뒤에는 이전에 배운 BETWEEN a AND b 구문을 사용해봤습니다. 
// 각 달의 후반부(15일~31일) 사이에 가입한 회원들만 잘 조회되네요.

2. 날짜 간의 차이 구하기

  • 날짜 간의 차이를 구하는 함수도 있습니다. DATEDIFF라는 함수인데요. 여기서 DATE는 날짜, DIFF는 Difference의 줄임말로 '차이'라는 뜻입니다.
  • DATEDIFF(날짜 a, 날짜 b)를 사용하면 '날짜 a - 날짜 b'를 해서 그 차이 일수를 알려줍니다. 예를 들어,
  • DATEDIFF(’2018-01-05’, ’2018-01-03’)의 값은 2입니다.
// member 테이블에서 각 회원이 가입한 일자가 2019년 1월 1일을 기준으로 몇 일 이후인지를 알아보겠습니다.
SELECT email, sign_up_day, DATEDIFF(sign_up_day, '2019-01-01') FROM copang_main.member;
/*
실행결과에는 총 3개의 컬럼이 보입니다. 
email, sign_up_day, 
그리고 sign_up_day에서 2019년 1월 1일을 뺀 값이 담긴 컬럼, 
이렇게 3개인데요. 
꼭 테이블에 원래 있던 컬럼이 아니더라도 조회할 때는 이런 식으로 새로운 컬럼을 붙여서 볼 수도 있습니다. 
지금 보니까 가장 최근에는 cowboy라는 회원이 가입했고, 
가입한지 가장 오래된 회원은 2011년에 가입한 xMan_series라는 회원이라는 것을 알 수 있습니다.
*/

// 오늘 날짜를 기준으로 살펴보는 것도 가능한데요. 오늘 날짜를 구하는 함수는 CURDATE()입니다.
SELECT email, sign_up_day, CURDATE(), DATEDIFF(sign_up_day, CURDATE()) FROM copang_main.member;
/*
이 노트가 작성된 날짜는 2020년 6월 2일입니다.
*/

// 이번엔 회원들이 몇 살이었을 때 코팡에 가입했는지를 알아볼까요? 
가입일(sign_up_day)-생일(birthday) 값을, 1년이 365일이니까 365로 나눠주면 각 회원이 몇 살일 때, 코팡에 가입했는지 알 수 있습니다.
SELECT 
	email, 
	sign_up_day,
	DATEDIFF(sign_up_day, birthday) / 365
FROM copang_main.member;
//결과를 보니까 많은 회원들이 20대, 30대일 때 많이 가입을 했네요.

3.날짜 더하기 빼기

  • 날짜에서 며칠을 더하고 빼는 것도 가능한데요. 더하는 함수는 DATE_ADD(), 빼는 함수는 DATE_SUB()입니다.
// 가입일(sign_up_day) 기준으로 300일 이후의 날짜를 구하려면 이렇게 쓰면 됩니다.
SELECT
	email,
	sign_up_day,
	DATE_ADD(sign_up_day, INTERVAL 300 DAY)
FROM copang_main.member;
// 지금 DATE_ADD(sign_up_day, INTERVAL 300 DAY)라고 적힌 부분은 sign_up_day 컬럼의 값에 300일을 더한 날짜를 나타냅니다.

// 만약 가입일(sign_up_day) 기준 250일 이전의 날짜를 구하고 싶으면 이렇게 쓰면 됩니다.
SELECT 
	email,
	sign_up_day,
	DATE_SUB(sign_up_day, INTERVAL 250 DAY)
FROM copang_main.member;
// 특정 날짜에서 몇 일 후, 몇 일 전 날짜를 구해야할 때 이 함수들을 쓰면 유용하겠죠?

4.UNIX Timestamp 값

  • 지금 member 테이블에서 날짜를 나타내는 컬럼(birthday, sign_up_day)은 있지만, 시간을 별도로 나타내는 컬럼은 없습니다. 날짜뿐만 아니라 시간까지 포함하는 컬럼이라면 DATETIME이라는 데이터 타입을 사용해야하는데요. DATETIME 타입의 컬럼에는 보통 '2018-12-31 23:54:59’ 이런 식으로 값들이 저장되어 있습니다.
  • 그런데 문제는 어떤 테이블에는 날짜와 시간이 이렇게 예쁜 형식으로 적혀있는게 아니라, 1553526000 이런 식으로 상당히 큰 숫자값이 적혀있는 경우들이 꽤 많다는 겁니다. 이것 또한 날짜와 시간을 나타내는 값인데요. 이런 형식의 날짜시간 값을 UNIX Timestamp라고 합니다. UNIX Timestamp는 특정 날짜의 특정 시간을, 1970년 1월 1일을 기준으로, 총 몇 초가 지났는지로 나타낸 값입니다.
// DATE 타입의 값을 Unix Timestamp로 바꿔주는 함수가 있는데요. 
// sign_up_day 컬럼의 날짜값을 한번 Unix Timestamp로 변환해보겠습니다.
SELECT 
	email,
	sign_up_day,
	UNIX_TIMESTAMP(sign_up_day)
FROM copang_main.member;
/*
UNIX_TIMESTAMP라는 함수를 쓰면 되는데요. 
지금 빨간 박스 안에 상당히 큰 숫자값들이 보입니다. 
이 값들은 모두 각 날짜가 1970년 1월 1일을 기준으로 몇 초가 지난 것인지를 나타냅니다. 
실무에서 여러분은 깔끔한 형식의 날짜 또는 시간뿐만 아니라 이런 Unix Timestamp를 보게될 수도 있습니다.
만약 여러분이 테이블에서 이런 Unix timestamp를 보게 된다면 이걸 사람이 읽을 수 있는 날짜 형태로 바꿔서 보면 되는데요.
*/

// FROM_UNIXTIME 함수를 사용하면 됩니다.
SELECT 
	email,
	sign_up_day,
	FROM_UNIXTIME(UNIX_TIMESTAMP(sign_up_day))
FROM copang_main.member;
/*
Unix timestamp를 다시 집어넣었더니 원래 날짜가 그대로 잘 나왔습니다. 
대신 이번엔 시간 정보도 포함해서(00:00:00) 출력되었네요. 
혹시 날짜와 시간을 나타내는 컬럼이라고 하는데 뭔가 큰 숫자가 들어있다면, 
Unix timestamp가 아닌지 의심해보세요. 
그리고 방금 배운 함수로 DATETIME 형식으로 변환해서 보시면 됩니다.
<참고 사이트>
날짜, 시간 관련 데이터 타입 : https://dev.mysql.com/doc/refman/8.0/en/date-and-time-types.html
날짜, 시간 관련 함수 : https://dev.mysql.com/doc/refman/8.0/en/date-and-time-functions.html
*/

여러 조건을 걸 때 주의사항

1.OR를 사용할 때의 주의사항

SELECT * FROM copang_main.member WHERE id = 1 OR id = 2
/*
WHERE id = 1 OR id = 2 라고 적었어야할 부분에, WHERE id = 1 OR 2 라고 적어버리는 실수인데요. 
이렇게 쓰면 지금 그림에 보이는 것처럼 테이블의 모든 row가 출력되어 버립니다. 
왜 그럴까요?
지금 실수로 쓴 WHERE id = 1 OR 2를 분해해서 보면 크게
(1) id = 1 이 TRUE
(2) 2
이 두 부분으로 나눌 수 있습니다.
문제는 (2) 부분입니다. 
MySQL에서는 0을 False, 0 이외의 숫자는 모두 True로 간주합니다. 
따라서 (2) 부분은 항상 True가 되어버립니다. 
즉, WHERE id = 1 OR 2는 곧
WHERE id = 1 OR TRUE
와 같은 뜻이라는 건데요. 
이렇게 되면 결국 어떤 row든 다 이 조건을 만족하게 되버립니다. 
그래서 위 그림에 보이는 것처럼 모든 row가 출력되는 거죠. 
OR을 사용할 때, 이런 실수를 하지 않도록 조심하세요.
*/

2.AND와 OR 간의 우선순위

SELECT * FROM copang_main.member
WHERE gender = 'f' OR age < 30 AND height > 180
/*
(1) 성별이 여자이거나(OR) 나이가 30세 미만 
‘이면서’(AND)
(2) 키는 180 이상인 회원들을
조회하려고 합니다. 
그런데 지금 실행 결과를 보면 height 컬럼의 값이 180 이하인 회원들도 많이 보입니다. 
(2) 키는 180 이상이라는 조건을 만족하는 row들이 조회되어야 하는데 어떻게 된 걸까요? 
이런 결과가 출력된 이유는, SQL 문이 실행될 때, AND가 OR보다 우선순위가 더 높기 때문입니다. 
즉, AND가 OR보다 먼저 실행된다는 거죠.
*/

SELECT * FROM copang_main.member
WHERE gender = 'f' OR age < 30 AND height > 180
/*
(1) 성별이 여자이거나(OR)
(2) 나이가 30세 미만이면서(AND) 키가 180 이상인 회원들을
조회하는 것으로 해석되는 겁니다.
AND가 OR보다 우선순위가 높다는 사실을 모르면 이런 실수를 하기 쉬운데요. 
그럼 매번 이런 우선순위 정보를 기억해야할까요? 그럴 필요는 없습니다.
이런 우선순위를 신경쓰는 것보다는 사용자가 그냥 ‘먼저 실행되기를 원하는 조건’을 괄호로 씌워주는 게 좋습니다. 
그 이유는 괄호는 AND보다도 우선순위가 높기 때문입니다.
*/

// 만약 원래 의도했던 결과를 얻으려면 아래 그림처럼
SELECT * FROM copang_main.member
WHERE (gender = 'f' OR age < 30) AND height > 180;
/*
먼저 실행되기를 원하는 부분에 괄호를 씌워주면 됩니다. 
실행 결과를 보니 제가 의도한 결과가 잘 출력되었네요. 
이렇게 조건에 괄호를 씌워주면 AND와 OR 사이의 우선순위를 신경쓰지 않아도 되고, 나중에 SQL 문을 다시 읽었을 때도 이해하기 편하다는 장점이 있습니다. 
여러 조건을 걸 때는 이렇게 조건 단위로 괄호를 씌워주는 습관을 들이시면 좋습니다.
*/

문자열 패턴 매칭 조건을 사용할 때 주의사항

  • LIKE : 문자열 패턴 매칭 조건을 걸기 위해 사용되는 키워드
  • % : 임의의 길의를 가진 문자열(0자도 포함)
  • _ : 한 자리의 문자

1.이스케이핑(escaping) 문제

SELECT * FROM copang_main.test;
/*
%, ', -, "와 같은 문자들이 있습니다.
그런데 이런 문자들은 일반적인 문자임과 동시에 '어떤 것이 문자열이라는 것을 나타내거나(' / "), 문자열의 특정 패턴을 나타내는' 표현식(%, _)들인데요.
*/

// 잠깐 이 테이블에서 sentence 컬럼에 퍼센트 기호(%)가 포함된 row를 찾아야한다고 해봅시다.
SELECT * FROM copang_main.test WHERE sentence LIKE '%%%';
/*
우리가 이전에 배운대로 먼저 %를 써주고 그 앞 뒤로 임의의 길이의 문자열을 나타내는 %를 또 써준 뒤, 실행했습니다. 
하지만 위 결과를 보니 우리가 예상했던 ‘For 51%’만 나온 게 아니라 전체 row가 조회되어버렸습니다. 
그 이유는 바로 정가운데 %가 우리가 원하는 '문자로서의 %'가 아니라 'LIKE에서 쓰이는 표현식'으로 간주되어, 
‘임의의 길이를 가진 문자열’을 나타내는 것으로 해석되었기 때문입니다.
*/

// 이런 표혁식이 아니라 '문자로서의 %'를 나타내려면?
SELECT * FROM copang_main.test WHERE sentence LIKE '%\%%';
/*
위 그림을 보면 가운데 % 앞에 역슬래쉬(백슬래쉬, backslash) 기호를 붙여주니까, 
우리가 원하는 대로 'For 51%'만 조회됐습니다. 
가운데 %가 '문자로서의 %'로 해석이 잘 된 겁니다.
방금 한 것처럼 원래 특정 의미('임의의 길이를 가진 문자열')를 나타내던 문자(%)를 그 특정 의미가 아니라, 
일반적인 문자처럼 취급하는 행위를 이스케이핑(escaping)이라고 합니다. 
이스케이핑은 IT 분야에서 자주 등장하는 단어인데요. 
어떤 문자가 그것에 부여된 특정한 의미, 기능으로 해석되는 게 아니라 그냥 단순한 문자 하나로 해석되도록 하는 것을 이스케이핑이라고 하는 거죠.
*/

// 1.'(작은따옴표)이스케이핑
SELECT * FROM copang_main.test WHERE sentence LIKE '%\%';

// 2. _(언더바)이스케이핑
SELECT * FROM copang_main.test WHERE sentence LIKE '%\%_%';

// 3."(큰따옴표)이스케이핑
SELECT * FROM copang_main.test WHERE sentence LIKE '%\"%\"%';

2. 대소문자 구분 문제

  • 방금 전 사용한 테이블에서 이번에는 소문자 g가 포함된 값들을 찾아보겠습니다.
SELECT * FROM copang_main.test WHERE sentence LIKE BINARY '%g%';
/*
지금 '%g%' 앞에 BINARY라는 단어를 붙였죠? 
실행 결과를 보니 소문자 g가 포함된 문자열만 잘 조회되었네요. 
BINARY란 ‘이진의, 0과 1로 된’이라는 뜻을 가집니다. 
혹시 ‘컴퓨터에서 숫자, 문자 등 모든 것들은 0 또는 1로 표현된다’라는 말은 들어보신 적 있나요? 
BINARY를 붙여준다는 것은 해당 0과 1이 정확히 일치하는 것을 찾으라는 뜻입니다. 
소문자 g와 대문자 G는 같은 알파벳이긴 하지만, 컴퓨터에서 0과 1의 조합으로 저장될 때 다른 값으로 저장됩니다. 
그리고 BINARY를 붙이는 건 단지 알파벳 비교 뿐만 아니라 대소문자 구분까지 할 수 있도록 0과 1을 보는 수준까지 문자열 비교를 하라는 뜻인 거죠.
*/

SELECT * FROM copang_main.test WHERE sentence LIKE BINARY '%G%';
/*
이번에도 역시 대문자 G가 있는 문자열만 잘 조회됩니다. 
이 대소문자 구분 문제는 문자열 패턴 조건을 사용하시는 많은 분들이 처음에 당황해하는 부분입니다. 
MySQL 설정에 상관없이 대소문자를 명확하게 구분하고 싶다면 BINARY를 잘 활용해보세요.
*/

정렬할 때 주의할 점

  • 이전 영상에서 정렬에 대해 잘 배우셨나요? 그런데 정렬을 할 때는 주의해야할 점이 있습니다. 그건 바로 정렬 기준의 데이터 타입이
  • (1) 숫자형(INT 등)인 경우와,
  • (2) 문자열형(TEXT 등)인지에 따라
  • 정렬 결과가 달라진다는 점입니다.
// ordering_test라는 테이블에서 data 컬럼을 기준으로 오름차순 정렬을 하고 있습니다.
SELECT * FROM FOR_TEST.ordering_test ORDER BY data ASC;

/*
그건 INT 타입과 TEXT 타입의 정렬 방식이 다르기 때문입니다.
INT 타입의 값은 숫자의 대소(크고 작음)를 기준으로 정렬이 수행되지만,
TEXT 타입의 값은 숫자의 대소가 아니라 한 문자, 한 문자씩 그 문자 순서를 비교해서 정렬이 수행됩니다. 
예를 들어 지금 ’120’이 ’19’보다 먼저 나오게 된 것은, 일단 맨 앞의 1을 비교했더니 같았지만, 그 바로 뒷 자리는 문자 2가 문자 9보다 문자 순서상 더 앞에 있는 것이기 때문에 '120'이 더 먼저 나온 겁니다. 
그리고 '230'과 '27'을 보면 앞 자리의 2는 같지만 그 다음은 3과 7로, 7이 문자 순서상 더 뒤이기 때문에 27이 더 뒤에 나온 겁니다. 
TEXT 타입처럼 문자열을 나타내는 데이터 타입들이 정렬 기준으로 사용될 때는 이런 원리가 적용됩니다. 
그러니까 숫자값이 담긴 컬럼을 정렬 기준으로 할 때는 그 컬럼의 데이터 타입이 숫자형인지, 문자열형인지를 잘 살펴봐야 하죠. 
그런데 이미 TEXT 타입인 컬럼에 있는 숫자값들을, 그냥 INT 등의 숫자형 타입으로 보고 정렬할 수는 없을까요? 가능합니다. 
정렬할 때 그 컬럼의 값들의 데이터 타입을 일시적으로 변경해주면 되는데요. 
이걸 하기 위해서는 CAST라는 함수를 써야합니다. 
CAST는 ‘틀을 만들다', '틀을 정하다'라는 뜻을 가진 영어 단어인데요. 
보통 프로그래밍 세계에서 어떤 변수의 데이터 타입을 바꿀 때 사용되는 단어입니다. SQL에서도 같은 의미로 사용되는데요.
지금 아래 그림의 SQL문을 보면 CAST(data AS signed)라는 표현식이 있죠? 
이 부분이 바로 data 컬럼에 존재하는 값들의 데이터 타입을 일시적으로 signed라는 데이터 타입으로 변환하라는 뜻입니다.
*/

// signed는 처음 보는 데이터 타입인데요. signed는 양수와 음수를 포함한 모든 정수를 나타낼 수 있는 데이터 타입입니다.
SELECT * FROM FOR_TEST.ordering_test ORDER BY CAST(data AS signed) ASC;
/*
이 SQL 문을 실행해보면, 이렇게 data 컬럼의 타입이 INT였을 때와 같은 결과가 나옵니다. 
방금 말한대로 data 컬럼의 값들이 일시적으로 signed 타입으로 변환되어 해석되었기 때문입니다.
*/

집계 함수와 산술 함수

  • 개수(COUNT)
  • 최댓값(MAX)
  • 최솟값(MIN)
  • 평균값(AVG)
  • 모든 값의 합을 구하는 SUM 함수
  • 모든 값의 표준편차를 구하는 STD 함수
  • 이 함수들처럼 어떤 컬럼의 값들을 대상으로 원하는 특징값을 구해주는 함수Aggregate Function, 우리말로는 집계 함수라고 합니다.
// 1.SUM 함수 - 합계
SELECT SUM(age) FROM copang_main.member;

// 2.STD 함수 - 표준편차
SELECT STD(age) FROM copang_main.member;
  • ABS 함수 - 절대값을 구하는 함수
  • SQRT 함수 - 제곱근을 구하는 함수
  • CEIL 함수 - 올림 함수
  • 이 함수들처럼 단순한 산술 연산을 해주는 Mathematical Function들도 있습니다. 우리 말로 '산술 함수'라고 할 수 있는데요.
SELECT CEIL(height) FROM copang_main.member;
  • FLOOR 함수 - 내림 함수
SELECT FLOOR(height) FROM copang_main.member;
  • ROUND 함수 - 반올림 함수
SELECT ROUND(height) FROM copang_main.member;

집계 함수와 산술 함수는 정확히 어떤 차이점이 있을까요?

둘의 차이점은

(1) 집계 함수는 특정 컬럼의 여러 row의 값들을 동시에 고려해서 실행되는 함수이고

(2) 산술 함수는 특정 컬럼의 각 row의 값마다 실행되는 함수

라는 점입니다.

예를 들어 집계 함수인 MAX 함수를 생각해보세요. 특정 컬럼의 값 중에서 최댓값을 구하려면 당연히 여러 row의 값들을 동시에 고려해야겠죠?

하지만 ABS, ROUND 같은 산술 함수들은 그렇지 않습니다. 이 함수들은 그냥 특정 컬럼의 각 row의 값들에 대해 각각 실행될 뿐입니다.

0개의 댓글