가장 기본적인 쿼리문인 SELECT의 조건, 중복 제거 등 여러가지 예제를 살펴보자. 연습용 툴은 SQLite를 사용할 것이고 DB는 Chadwick Baseball Bureau에서 제공하는 DB를 사용할 것이다(관련 내용은 지난 글을 참조하면 된다).
좀 더 나아가서 윈도우 함수와 함께 데이터를 뽑고 싶다면: SQL QUALIFY – 윈도우 함수로 데이터를 더욱 정밀하게 필터링하기
■ SELECT문 기본
기본 구문은 다음과 같다.
SELECT 조회하고-싶은-컬럼-이름 FROM 데이터베이스-이름
데이터의 컬럼 이름이란 쉽게 말해 헤더를 말한다. 예를 들어 “People”이란 DB는 아래와 같은 형식으로 구성되어 있는데 이 DB의 최상단 헤더가 데이터의 컬럼 값이다.
Link | rowid | playerID | birthYear | birthMonth |
1 | 1 | aardsda01 | 1981 | 12 |
2 | 2 | aaronha01 | 1934 | 2 |
DB가 어떻게 구성되었는지는 SQLite Studio 왼쪽 DB 목록에서 개략적으로 확인할 수 있으며, 상세 데이터까지 보기 원한다면 링크에서 확인할 수 있다.
People이란 DB에서 playerID와 birthYear를 조회하고 싶다면 아래와 같이 쿼리문을 작성하고 초록색 재생 버튼을 누르면 조회가 완료된다.
조회하고 싶은 컬럼이름은 ‘,’로 계속 추가할 수 있고 마지막에 ‘;’를 씀으로써 이 문장이 끝남을 알려준다. 만약 특정 컬럼을 지정하지 않고 모든 컬럼을 불러오고 싶다면 ‘*’을 컬럼이름으로 사용하면 된다.
--People DB에서 playerID와 birthYear 조회하기 SELECT playerID, birthYear FROM People; --People DB에서 모든 컬럼 이름 조회하기 SELECT * FROM People;
참고로 select로 쓰나 SELECT로 쓰나 명령 실행에는 아무런 문제가 없다. 다만 일반적으로 SQL 쿼리문을 대문자로 쓰는 이유는 가독성을 위해서 이다. 즉, select가 데이터의 값인지 쿼리문인지 구분하기 위함이다.
■ SELECT문 – LIMIT: 출력 개수 지정하기
데이터양이 방대할 경우, LIMIT으로 조회하고자 하는 데이터의 숫자를 제한해줄 수 있다. 이때는 LIMIT 뒤에 숫자에 따라 출력양이 정해지게 된다. 조회되는 순서는 DB가 저장된 순서이다.
-- 조회하는 데이터 5개로 한정하기 SELECT playerID, birthYear FROM People LIMIT 5;
■ SELECT문 – ORDER BY: 오름차순/내림차순으로 정렬하기
오름차순은 영어 ASCENDING에서 따온 ASC를 사용하면 되고, 내림차순은 DESCENDING에서 따온 DESC를 사용하면 된다. 순서는 보통 가장 마지막에 온다고 생각하면 쉽다.
DB에서 몸무게가 가장 많이 나가는 선수를 찾고 싶다면, ORDER BY를 사용해서 내림차순으로 정렬하면 된다.
-- 정렬하기 SELECT 컬럼이름 FROM DB이름 ORDER BY 기준컬럼 ASC(또는 DESC); -- 'weight' 기준으로 오름차순 정렬 SELECT * FROM People ORDER BY weight ASC; -- 'weight' 기준으로 내림차순 정렬 SELECT * FROM People ORDER BY weight DESC LIMIT 10;
마지막 쿼리문을 보면 줄바꿈 처리가 되어 있음을 알 수 있다. 명령 실행에는 아무런 문제가 없다. 모든 문장은 ‘;’끝나기 전까지 한 문장으로 인식하기 때문. 예제문은 간단하여 한 문장으로 표현해도 보기에 어렵지 않지만 실제로 사용할 때는 쿼리문의 가독성을 위해 적절히 줄바꿈처리를 해주면 된다.
쿼리문을 실행하면 위와 같이, DB 상 가장 몸무게가 많이 나가는 선수는 Walter Young으로 320 파운드 (약 145 kg)가 나가고 몸무게를 기준으로 정렬이 잘 되어 있음을 확인할 수 있다.
■ SELECT문 – WHERE: 조건을 걸어 필터링
WHERE은 특정 데이터를 조회할 때 유용하다.
WHERE에는 기본적인 비교 연산자(=, !=, >, <, >=, <= 등) 사용이 가능하다. 각 조건은 ‘AND’로 추가할 수 있고, 조건 값이 문자일 경우엔 ” 안에 넣으면 된다(숫자는 상관없음).
예를 들어 brithYear이 1990년이고 birthCountry가 USA인 선수를 조회하고 싶다면 아래와 같이 사용하면 된다.
-- 조건 걸기 SELECT 컬럼이름 FROM DB이름 WHERE 기준컬럼 = '조건값'; -- 1990년 미국에서 태어난 선수 필터링 SELECT * FROM People WHERE birthYear = '1990' AND birthCountry = 'USA' ORDER BY weight DESC LIMIT 10;
■ SELECT문 – 집계함수(SUM, AVG, MIN, MAX, COUNT)
비교 연산자와 함께 기본적인 집계함수도 사용 가능하다. 엑셀 함수를 떠올리면 된다.
-- 조건 걸기 SELECT 집계함수(컬럼이름) FROM DB이름; -- 출생지가 미국인 선수의 전체 몸무게 합산(SUM)하기 SELECT SUM(weight) FROM People WHERE birthCountry = 'USA'; -- 출생지가 미국인 선수의 전체 몸무게 평균(AVG)내기 SELECT AVG(weight) FROM People WHERE birthCountry = 'USA'; -- 출생지가 미국인 선수의 전체 몸무게 최소값(MIN)내기 SELECT MIN(weight) FROM People WHERE birthCountry = 'USA'; -- 출생지가 미국인 선수의 전체 몸무게 최대값(MAX)내기 SELECT MAX(weight) FROM People WHERE birthCountry = 'USA'; -- 출생지가 미국인 선수의 전체 몸무게 데이터 개수(COUNT) 세기 SELECT COUNT(weight) FROM People WHERE birthCountry = 'USA';
■ SELECT문 – ||: 2개 이상의 컬럼을 합쳐서 조회하기
People DB를 살펴보면 성과 이름이 별도의 구분되어 저장되어 있음을 알 수 있다. 이렇게 나눠진 컬럼 이름을 합쳐서 조회하고 싶을 때는 ‘||’을 사용하면 된다.
-- 2개 이상 컬럼을 합쳐서 조회하기, (컬럼과 컬럼 사이는 공백(' ')으로 연결하기) SELECT 컬럼이름1 || ' ' || 컬럼이름2 FROM DB이름; -- 몸무게가 300 파운드 이상인 선수의 전체 이름 조회하기 SELECT nameFirst || ' ' || nameLast AS full_name -- 컬럼 이름을 full_name으로 저장한다. AS를 사용하지 않으면 컬럼 이름은 nameFirst || ' ' || nameLast 을 기본으로 저장된다. FROM People WHERE weight >= '300' LIMIT 5;
위의 결과 값을 보면, full_name 만 보인다. 더 여러가지 컬럼을 조회하고 싶다면 SELECT 뒤에 ‘,’로 연결하면 된다.
■ SELECT문 – DISTINCT: 고유값(중복 제거) 조회
마지막으로 데이터의 중복을 제거하고 싶다면 DISTINCT를 사용하면 된다. DISTINCT는 COUNT(*)에는 사용할 수 없다는 것을 주의하자. SELECT DISTINCT에 대한 더 자세한 설명은 SQL SELECT문 – 중복 제거와 특정 컬럼 제외하기
-중복 제거하기 SELECT DISTINCT(컬럼이름) FROM DB이름; -- 전체 이름이 중복되는 데이터 삭제하기 SELECT DISTINCT(full_name) FROM People ;