SQL이란?
SQL (Structured Query Language)이란 쉽게 말해서 데이터베이스와 소통하기 위한 언어이다. SQL을 통해서 데이터베이스 내 저장된 데이터를 읽고, 쓰고, 삭제하는 것이 가능하다.
예를 들자면, A라는 학교에서 학생들을 관리하기 위해 학생 ID, 이름, 학년 등 학생 정보를 저장하는 학생 DB를 관리할 것이다.
아래의 표를 A학교 DB 내 학생 테이블이라고 하자:
ID | 이름 | 성별 | 학년 |
1 | AAA | 남 | 1 |
2 | BBB | 녀 | 2 |
3 | CCC | 녀 | 3 |
4 | DDD | 남 | 1 |
위에서 이름, 성별, 학년 등의 정보는 서로 중복되는 내용이 있다. 이때 "1학년 남자 학생 정보를 보여줘"라고 했을 때, 돌아오는 값은 AAA, DDD 두 명의 학생일 것이다.
반대로, ID는 절대 중복되지 않는다, 이를 관계형 데이터베이스에서는 Primary Key라고 부른다. "1번 학생 정보를 보여줘"라고 했을 때, 당연히 1번 학생 한 명에 대한 값만 돌아올 것이다.
이처럼 SQL을 사용할 때에는, 정확한 조건을 입력해야지 원하는 결과를 받을 수 있다. 학교만 해도 학생만 존재하는 게 아니라 선생, 학년 등 다양한 정보를 보유하고 있기 때문에 데이터베이스의 양은 더욱 거대하다. 이런
복잡한 데이터베이스와 통신하기 위해서, SQL에는 다양한 문법과 커맨드가 존재한다.
SELECT
데이터베이스에서 특정 데이터를 선택하는 것이다. SELECT를 통해 선택된 데이터는 Result Table이라는 별도의 테이블 형식으로 반환된다.
SELECT * FROM 학생;
SELECT ID, NAME FROM 학생;
기본적으로 SELECT [칼럼 명] FROM [테이블 명]의 문법을 따른다. 칼럼 명 대신 *을 사용하면 전체 칼럼을 반환한다.
WHERE
데이터를 필터링할 때 쓰는 커맨드이다. 데이터를 SELECT 할 때, 특정 조건을 추가하고 싶다면 WHERE 구절을 사용하면 된다.
SELECT * FROM 학생 WHERE 성별='남';
SELECT * FROM 학생 WHERE 성별='남' AND 학년='1';
SELECT * FROM 학생 WHERE 학년='1' OR 학년='2';
SELECT * FROM 학생 WHERE NOT 학년='1';
SELECT [칼럼 명] FROM [테이블 명] WHERE [칼럼 명]='조건'의 문법을 따른다.
일반적으로 조건을 입력할 때 따옴표를 붙여준다. = 뿐만 아니라 <, >와 같은 조건을 붙여줘도 괜찮다.
또한, 여러 개의 조건을 붙여주고 싶을 때는 AND를 사용하고, 여러 값에 대한 조건을 주고 싶을 때는 OR, 조건 외의 데이터를 선택하고 싶을 때는 NOT을 사용해서 데이터를 선택한다.
LIKE
WHERE 구절을 사용할 때 특정한 패턴을 가진 데이터를 구할 때 사용하는 구절이다.
SELECT * FROM 학생 WHERE 이름 LIKE 'A%'; --A로 시작하는 이름
SELECT * FROM 학생 WHERE 이름 NOT LIKE 'A%'; --A로 시작하지 않는 이름
SELECT * FROM 학생 WHERE 이름 LIKE '%A'; --A로 끝나는 이름
SELECT * FROM 학생 WHERE 이름 LIKE '%A%'; --A가 포함된 이름
SELECT * FROM 학생 WHERE 이름 LIKE '_A%'; --A가 두번째 글자에 있는 이름
SELECT * FROM 학생 WHERE 이름 LIKE 'A__%'; --A로 시작하면서 적어도 3글자인 이름
SELECT * FROM 학생 WHERE 이름 LIKE 'A%B'; --A로 시작하고 B로 끝나는 이름
SELECT * FROM 학생 WHERE 이름 LIKE 'A[ABC]A'; --AAA, ABA, ACA등 AxA에서 x가 ABC인 이름
SELECT * FROM 학생 WHERE 이름 LIKE 'A[^ABC]A'; --AxA에서 x가 ABC가 아닌 이름
SELECT * FROM 학생 WHERE 이름 LIKE 'A[A-C]A'; --AAA, ABA, ACA등 AxA에서 x가 A에서C인 이름
SELECT [칼럼 명] FROM [테이블 명] WHERE [칼럼 명] LIKE '조건'의 문법을 따른다.
LIKE 앞에 NOT을 붙여서 패턴에 따르지 않는 데이터를 선택할 수도 있고.
위의 예시에서 %,_,[],^처럼 다양한 패턴을 만들어서 데이터를 선택할 수 있다.
IN, BETWEEN
WHERE 구절에서 복수의 조건을 다룰 때 유용한 구절이다. IN은 OR조건 대신, BETWEEN은 AND 조건 대신 사용할 수 있다.
SELECT * FROM 학생 WHERE NAME IN ('AAA','BBB','CCC');
SELECT * FROM 학생 WHERE NAME NOT IN ('AAA','BBB','CCC');
SELECT * FROM 학생 WHERE ID BETWEEN 2 AND 4;
SELECT * FROM 학생 WHERE ID NOT BETWEEN 2 AND 4;
SELECT [컬럼 명] FROM [테이블 명] WHERE [칼럼 명] IN ('조건 1', '조건 2') / SELECT [컬럼 명] FROM [테이블 명] WHERE [칼럼 명] BETWEEN '조건 1' AND '조건 2'의 문법을 따른다.
위의 구절을 통해서 SQL문을 훨씬 짧고 효과적으로 짤 수 있다. 또한, 경우에 따라 NOT 조건을 붙여서 사용할 수 있다.
INSERT INTO
새로운 데이터를 추가, 입력할 때 쓰는 구절이다.
INSERT INTO 학교(ID, 이름, 성별, 학년) VALUES ('5', 'EEE', '여', '2');
INSERT INTO 학교 VALUES ('5', 'EEE', '여', '2');
INSERT INTO 학교(ID, 이름, 성별) VALUES ('5', 'EEE', '여');
INSERT INTO [테이블 명](칼럼 명) VALUES ('값')의 문법을 따른다.
테이블 명 뒤에 칼럼 명을 명시하고, 해당하는 값을 VALUES 뒤에 적는다. 전체 칼럼에 대한 값을 추가할 때에는 칼럼 명을 생략해도 된다. 특정 칼럼에 대한 값만 입력하고 싶을 땐 원하는 칼럼 명과 값만 적으면 된다. 하지만 데이터베이스가 미리 정해둔 NULL값이 들어올 수 없는 칼럼에 대해서는 무조건 값을 입력해 줘야 한다.
[NULL: 비어있는 값, 아무런 정보가 없다고 생각하면 된다. 0이나 ''과는 다르다]
ORDER BY
특정 칼럼에 대해 오름차 혹은 내림차 순으로 정렬하는 구절이다.
SELECT * FROM 학생 ORDER BY 학년 ASC;
SELECT * FROM 학생 ORDER BY 학년 DESC, ID ASC;
SELECT [칼럼 명] FROM [테이블 명] ORDER BY [칼럼 명]의 문법을 따른다.
ORDER BY 뒤에 정렬하고 싶은 칼럼을 입력 후 오름차[ASC], 내림차[DESC]를 정한다, 순서 생략 시 기본 값으로 오름차순 정렬한다.
위의 2번째 예시는 학년이 같을 경우 ID 순으로 정렬한다. 이처럼, 칼럼 값이 같을 경우를 대비해 다른 칼럼을 지정해 정렬할 수 있다. 쉼표로 구분한다.
UPDATE
테이블 내에 이미 존재하는 값을 수정할 때 쓰는 구절이다.
UPDATE 학생 SET 학년 = '2' WHERE ID = '1';
UPDATE [테이블 명] SET [칼럼 명 = '값'] WHERE [조건]의 문법을 따른다.
위의 예시는 ID가 1번인 학생의 학년을 2로 업데이트하는 SQL문이다. 쉼표로 여러 개의 칼럼을 지정해 동시에 바꿔도 괜찮다. 또한, WHERE 구절을 통해 여러 개의 데이터를 동시에 바꿀 수도 있다 (예: WHERE 학년 = '1' 이면 1학년이면 다 업데이트된다). 다만, WHERE 구절을 빼먹고 조건을 안 넣어준다면 테이블 내 모든 데이터가 동시에 업데이트되는 불상사가 일어난다.
DELETE
테이블 내에 이미 존재하는 값을 제거할 때 쓰는 구절이다.
DELETE FROM 학생 WHERE ID='1';
DELETE FROM [테이블 명] WHERE [조건]의 문법을 따른다.
조건에 대한 데이터만 선택해서 지워준다. 다만, WHERE 구절이 없다면 테이블 내 전체 데이터가 지워지니 조건을 잘 입력해야 한다. (테이블과 테이블 구조 자체는 지워지지 않는다)
LIMIT
특정 갯수만큼의 데이터를 선택할 때 쓴다.
SELECT * FROM 학생 LIMIT 3;
SELECT * FROM 학생 ORDER BY 학년 DESC LIMIT 1;
SELECT [칼럼 명] FROM [테이블 명] LIMIT [숫자]의 문법을 따른다.
원하는 숫자만큼의 데이터를 선택할 때에도 쓰이지만, 데이터를 선택할 때 ORDER BY로 데이터 정렬 후 LIMIT을 사용하면 상위 몇 개의 데이터 혹은 하위 몇 개의 데이터를 선택할 때도 쓸 수 있다. 위의 예제는 학년이 제일 높은 학생 1명을 선택한 것이다.
MIN(), MAX()
특정 칼럼에서 최솟값, 최댓값을 가진 데이터를 선택할 때 쓰는 SQL 집계 함수이다.
SELECT MIN(학년) FROM 학생;
SELECT MAX(학년) FROM 학생;
SELECT MIN(학년) AS 최소학년 FROM 학생;
SELECT MIN([칼럼 명])/MAX([칼럼 명]) FROM [테이블 명]의 문법을 따른다.
지정하는 칼럼에 대해 최솟값, 최댓값을 가진 데이터를 선택한다. 다만 Return Table에서 칼럼이 MIN(학년)으로 뜨니 AS를 통해서 이름을 바꿔 줄 수 있다.
COUNT(), AVG(), SUM()
조건에 부합하는 데이터의 숫자를 세거나, 특정 칼럼의 평균값 혹은 총합을 구해주는 SQL 집계 함수이다.
SELECT COUNT(ID) FROM 학생;
SELECT COUNT(ID) FROM 학생 WHERE 학년='1';
SELECT AVG(학년) FROM 학생;
SELECT SUM(나이) FROM 학생;
SELECT COUNT([칼럼 명])/AVG([칼럼 명])/SUM([칼럼 명]) FROM [테이블 명]의 문법을 따른다.
보통 COUNT를 사용할 때 WHERE 구절을 추가해 특정 조건에 맞는 데이터의 수를 구한다.
AVG는 평균 학년, 나이; SUM은 보통 가격 같은 데이터에 대해 많이 사용한다.
AVG와 SUM은 숫자 데이터를 저장한 칼럼에 대해서만 쓸 수 있다. (이름의 평균값과 총합을 구할 수는 없으니 말이다)
GROUP BY
GROUP BY는 같은 칼럼 값을 가지고 있는 데이터를 요약된 한 줄로 선택해주는 구절이다.
SELECT * FROM 학생 GROUP BY 학년;
SELECT COUNT(ID) FROM 학생 GROUP BY 학년;
SELECT COUNT(ID) FROM 학생 GROUP BY 성별;
SELECT [칼럼 명] FROM [테이블 명] GROUP BY [칼럼 명]의 문법을 따른다.
중복된 값을 가지고 있는 칼럼을 묶어서 데이터를 처리할 때 많이 사용한다. 위의 예시로 보면, 학년별 학생의 수를 세거나, 남녀 학생의 수를 셀 때 GROUP BY구절을 사용해서 구할 수 있다.
HAVING
WHERE 구절은 COUNT, AVG, SUM과 같은 집계 함수와 같이 사용할 수 없기 때문에 HAVING 구절을 사용한다.
SELECT * FROM 학생 GROUP BY 성별 HAVING COUNT(ID) > 2;
SELECT [칼럼 명] FROM [테이블 명] GROUP BY [칼럼 명] HAVING [조건]의 문법을 따른다.
보통 GROUP BY와 같이 자주 쓰인다. 위의 예시에서는 남자, 여자 학생으로 나눴을 때 인원이 3 이상인 데이터를 선택한다.
JOIN
다른 두 개 혹은 그 이상의 테이블의 데이터를 합칠 때 JOIN 구절을 사용한다. 단, 두 개의 테이블에는 연관성이 있어야 한다.
예를 들면 중학교와 고등학교 테이블이 있다고 가정하면, 학생의 이름이 두 개의 테이블에 동시에 사용된다면 연관성이 있고, JOIN을 할 수 있다.
SELECT * FROM 중학교 JOIN 고등학교 ON 중학교.NAME = 고등학교.NAME;
SELECT [칼럼 명] FROM [테이블 1] [테이블 1. 칼럼 = 테이블 2. 칼럼]의 문법을 따른다.
위의 예시에서 JOIN을 통해 중학교와 고등학교가 겹치는 학생의 데이터를 선택할 수 있다. 또한, SELECT 구절에서 테이블 1. 칼럼 혹은 테이블 2. 칼럼의 문법에 따라 두 테이블의 특정 칼럼을 선택할 수 있다.
목적에 따라 다양한 JOIN이 사용될 수 있다.
여기까지 SQL의 개념과 기본적인 사용법을 살펴보았다. 요즘에는 코딩 테스트에 간혹 SQL 1문제씩 껴있기도 하고, 데이터를 다룰 때에는 필수이기 때문에 개발자이든 아니든 SQL은 배워두면 좋다고 생각한다.
물론 SQL에는 더 다양한 문법과 함수들이 있지만 다양한 문제를 해결하면서 그에 맞는 커맨드와 함수를 사용해야 한다고 생각한다.
프로그래머스와 HackerRank 등 다양한 사이트에서 SQL문제를 풀어볼 수 있으니 체험해보면서 배우면 좋을 것이다.
코딩테스트 연습
기초부터 차근차근, 직접 코드를 작성해 보세요.
programmers.co.kr
Solve SQL Code Challenges
A special-purpose language designed for managing data held in a relational database.
www.hackerrank.com
'SQL' 카테고리의 다른 글
[프로그래머스 SQL 고득점 Kit] GROUP BY (0) | 2022.04.08 |
---|---|
[프로그래머스 SQL 고득점 Kit] SUM, MAX, MIN (0) | 2022.04.01 |
[프로그래머스 SQL 고득점 Kit] SELECT (0) | 2022.03.28 |