개요
데이터베이스를 효율적으로 다루기 위해서는 SQL문의 이해와 활용이 필수입니다! 그 중에서도 SELECT 문은 데이터를 조회하고 원하는 정보를 가져오는 데에 사용되며, 데이터베이스의 가장 기본적인 기능 중 하나입니다. 이번 포스팅에서는 프로그래머스 SQL 고득점 Kit문제와 함께 SELECT 문에 대해 자세히 알아보고자 합니다.
진행에 앞서 SELECT 문의 가장 기본이 되는 형식입니다. 잘 기억 해주세요 :)
SELECT [열] FROM [테이블] WHERE [조건]
문제
FOOD_FACTORY 테이블에서 강원도에 위치한 식품공장의 공장 ID, 공장 이름, 주소를 조회하는 SQL문을 작성해주세요. 이때 결과는 공장 ID를 기준으로 오름차순 정렬해주세요.
우선 가장 기본이 되는 명령어 부터 입력 해볼까요?
SELECT * FROM FOOD_FACTORY
참고로 *은 모든 것 을 의미합니다. 여기서는 [열] 에 해당하는 위치에 *이 있으니 모든 열을 다 출력하라는 의미가 되겠네요! 다시 말해 위 명령문은 “FOOD_FACTORY 테이블에 있는 모든 열을 선택해줘~” 라는 의미가 됩니다.
FACTORY_ID FACTORY_NAME ADDRESS TLNO
FT19980001 (주)맛있는라면 경기도 동두천시 강변로850번길 120 031-231-1032
FT19980002 (주)맛있는기름 충청북도 음성군 생극면 음성로 1506-275 043-641-9900
FT19980003 (주)맛있는라면 강원도 정선군 남면 칠현로 679 033-431-3122
FT19980004 (주)맛있는기름 경기도 평택시 포승읍 포승공단순환로 245 031-651-2410
FT20000001 (주)맛있는소스 경기도 안양시 동안구 흥안대로 405 031-221-7211
FT20000002 (주)맛있는통조림 경기도 파주시 파주읍 파발로 65 031-641-1900
FT20010001 (주)맛있는소스 경상북도 구미시 1공단로7길 58-11 054-231-2121
FT20010002 (주)맛있는통조림 전라남도 영암군 미암면 곤미현로 1336 061-341-5210
FT20020001 (주)맛있는차 충청남도 논산시 은진면 관촉로58번길 138 041-241-1420
FT20020002 (주)맛있는김치 경기도 평택시 포승읍 포승공단로 2 031-541-5400
FT20040001 (주)맛있는음료 경기도 평택시 안중읍 서해로 1427 031-722-2430
FT20040002 (주)맛있는국 경상남도 거제시 사등면 거제대로 5382 055-351-1240
FT20070001 (주)맛있는라면 경상북도 경산시 하양읍 대경로 541 054-423-3122
FT20070002 (주)맛있는기름 대전광역시 대덕구 신일서로67번길 57 042-121-2410
FT20070009 (주)맛있는소스 부산광역시 영도구 봉래길 113 051-551-7721
FT20080002 (주)맛있는통조림 부산광역시 사하구 다대로170번길 051-841-5810
FT20080003 (주)맛있는차 전라남도 무안군 삼향읍 왕산로 91 061-221-9920
FT20090001 (주)맛있는밥 경기도 안성시 공단2로 29 031-761-1359
FT20090002 (주)맛있는과자 부산광역시 강서구 녹산산단261로73번길 48 051-821-4259
FT20100001 (주)맛있는차 전라남도 장성군 서삼면 장산리 233-1번지 061-661-1420
FT20100002 (주)맛있는김치 충청남도 아산시 탕정면 탕정면로 485 041-241-5421
FT20100003 (주)맛있는음료 강원도 원주시 문막읍 문막공단길 154 033-232-7630
FT20100004 (주)맛있는국 강원도 평창군 봉평면 진조길 227-35 033-323-6640
FT20110001 (주)맛있는밥 경기도 화성시 팔탄면 가재리 34번지 031-661-1532
FT20110002 (주)맛있는과자 광주광역시 북구 하서로 222 062-211-7759
FT20150004 (주)맛있는김치 전라북도 익산시 석암로7길 31-17 063-981-5421
FT20150005 (주)맛있는음료 전라북도 익산시 석암로11길 99 063-932-1672
FT20160005 (주)맛있는국 전라남도 광양시 옥곡면 신금산단1길 4 061-923-6940
FT20180005 (주)맛있는밥 충청남도 천안시 서북구 성거읍 천흥8길 67 041-861-1432
FT20200005 (주)맛있는과자 충청북도 청주시 흥덕구 공단로 48 043-911-5759
Java
복사
그렇다면 강원도에 위치한 식품공장은 어떻게 출력할까요? 바로 WHERE 뒤 [조건]을 이용해야 합니다.
SELECT * from FOOD_FACTORY WHERE ADDRESS LIKE '%강원도%’
LIKE 연산자는 문자열의 패턴을 검색하는데 사용됩니다. 또한 여기서 사용한 %는 모든 문자를 의미하는데요 예를 들어 %강원도라면 어떤 문자가 오던지 끝이 강원도로 끝나야 하고, 강원도%라면 어떤 문자가 오던지 시작이 강원도여야 합니다.
따라서 %강원도% 는 문자열에 강원도라는 단어가 포함되어 있다면 다 조건에 부합하다고 생각하면 됩니다.
다음 명령어를 사용하면 출력결과는 다음과 같습니다.
FT19980003 (주)맛있는라면 강원도 정선군 남면 칠현로 679 033-431-3122
FT20100003 (주)맛있는음료 강원도 원주시 문막읍 문막공단길 154 033-232-7630
FT20100004 (주)맛있는국 강원도 평창군 봉평면 진조길 227-35 033-323-6640
Java
복사
문제에서는 강원도 말고도 다른 조건이 있는데요, 바로 공장 ID, 공장 이름, 주소만 조회하며, ID를 기준으로 오름차순 정렬을 해야합니다.
이제는 *을 건드려줄 차례인데요, SELECT [열] 에 해당하는 자리에 * (모든 것) 을 넣는게 아니라 조회하고 싶은 열만 추가해주어야 합니다. 추가적으로 정렬은 ORDER BY [열] [ASC|DESC] 로 해결할 수 있습니다.
최종 명령어는 다음과 같습니다.
SELECT FACTORY_ID, FACTORY_NAME, ADDRESS
FROM FOOD_FACTORY
WHERE ADDRESS LIKE '%강원도%'
ORDER BY FACTORY_ID ASC;
그러면 다음과 같은 출력 결과가 생성됩니다.
FT19980003 (주)맛있는라면 강원도 정선군 남면 칠현로 679
FT20100003 (주)맛있는음료 강원도 원주시 문막읍 문막공단길 154
FT20100004 (주)맛있는국 강원도 평창군 봉평면 진조길 227-35
Java
복사
추가
•
SELECT ANIMAL_ID, NAME FROM ANIMAL_INS WHERE INTAKE_CONDITION NOT LIKE 'Aged';
•
SELECT COUNT(*) AS USERS FROM USER_INFO WHERE JOINED LIKE '%2021%' AND AGE>=20 AND AGE <30;
COUNT(*)은 테이블의 모든 행을 세는 것을 의미하며, AS USERS는 결과의 컬럼명을 'USERS'로 지정하는 역할
•
SELECT DR_NAME, DR_ID, MCDP_CD, DATE_FORMAT(HIRE_YMD,'%Y-%m-%d')
FROM DOCTOR
WHERE MCDP_CD LIKE 'CS' OR MCDP_CD LIKE 'GS' ORDER BY HIRE_YMD DESC, DR_NAME ASC;
MCDP_CD IN ('CS', 'GS') 은 MCDP_CD LIKE 'CS' OR MCDP_CD LIKE 'GS' 와 동일
•
SELECT NAME FROM ANIMAL_INS ORDER BY DATETIME ASC LIMIT 1;
LIMIT를 통해 조회 개수를 제한할 수 있다.
•
SELECT DATETIME AS 시간 FROM ANIMAL_INS ORDER BY DATETIME DESC LIMIT 1;
AS를 통해 Column 제목을 변경할 수 있다.
SELECT COUNT(*) AS count FROM ANIMAL_INS
Count는 뭘까?
예를 들어, 아래와 같은 ANIMAL 테이블이 있다고 가정해보자.
ID | NAME | SPECIES
------------------------
1 | Jack | Dog
2 | Bella | Cat
3 | Max | Dog
4 | Lucy | Dog
Markdown
복사
1.
COUNT(ID): ID 컬럼의 레코드 개수를 세면 4가 됩니다.
2.
COUNT(NAME): NAME 컬럼의 레코드 개수를 세면 4가 됩니다.
3.
COUNT(SPECIES): SPECIES 컬럼의 레코드 개수를 세면 4가 됩니다.
4.
COUNT(*): 모든 레코드의 개수를 세면 4가 됩니다.
PATIENT 테이블에서 12세 이하인 여자환자의 환자이름, 환자번호, 성별코드, 나이, 전화번호를 조회하는 SQL문을 작성해주세요. 이때 전화번호가 없는 경우, 'NONE'으로 출력시켜 주시고 결과는 나이를 기준으로 내림차순 정렬하고, 나이 같다면 환자이름을 기준으로 오름차순 정렬해주세요.
SELECT PT_NAME, PT_NO, GEND_CD, AGE, IFNULL(TLNO,'NONE') FROM PATIENT
WHERE GEND_CD = 'W' and AGE<=12
ORDER BY AGE DESC, PT_NAME ASC;
SQL
복사
USED_GOODS_BOARD와 USED_GOODS_REPLY 테이블에서 2022년 10월에 작성된 게시글 제목, 게시글 ID, 댓글 ID, 댓글 작성자 ID, 댓글 내용, 댓글 작성일을 조회하는 SQL문을 작성해주세요. 결과는 댓글 작성일을 기준으로 오름차순 정렬해주시고, 댓글 작성일이 같다면 게시글 제목을 기준으로 오름차순 정렬해주세요.
SELECT b.TITLE, b.BOARD_ID, r.REPLY_ID, r.WRITER_ID, r.CONTENTS, DATE_FORMAT(r.CREATED_DATE, '%Y-%m-%d') as CREATED_DATE FROM USED_GOODS_BOARD b
JOIN USED_GOODS_REPLY r ON b.BOARD_ID = r.BOARD_ID
WHERE YEAR(b.CREATED_DATE) = 2022 and MONTH(b.CREATED_DATE) = 10
ORDER BY r.CREATED_DATE ASC, b.TITLE ASC;
SQL
복사
날짜를 조회하는 방법은 다음과 같다.
WHERE b.CREATED_DATE BETWEEN '2022-10-01' AND '2022-10-31'
WHERE b.CREATED_DATE BETWEEN '2022-09-01' AND '2022-10-31'
SQL
복사
ONLINE_SALE 테이블과 OFFLINE_SALE 테이블에서 2022년 3월의 오프라인/온라인 상품 판매 데이터의 판매 날짜, 상품ID, 유저ID, 판매량을 출력하는 SQL문을 작성해주세요. OFFLINE_SALE 테이블의 판매 데이터의 USER_ID 값은 NULL 로 표시해주세요. 결과는 판매일을 기준으로 오름차순 정렬해주시고 판매일이 같다면 상품 ID를 기준으로 오름차순, 상품ID까지 같다면 유저 ID를 기준으로 오름차순 정렬해주세요.
-- 온라인 판매 데이터
(SELECT DATE_FORMAT(SALES_DATE,"%Y-%m-%d")as SALES_DATE, PRODUCT_ID, USER_ID, SALES_AMOUNT
FROM ONLINE_SALE
WHERE SALES_DATE BETWEEN '2022-03-01' AND '2022-03-31')
UNION
-- 오프라인 판매 데이터
(SELECT DATE_FORMAT(SALES_DATE,"%Y-%m-%d")as SALES_DATE, PRODUCT_ID, NULL AS USER_ID, SALES_AMOUNT
FROM OFFLINE_SALE
WHERE SALES_DATE BETWEEN '2022-03-01' AND '2022-03-31')
-- 결과 정렬
ORDER BY SALES_DATE ASC, PRODUCT_ID ASC, USER_ID ASC;
SQL
복사
동물 보호소에 들어온 동물의 이름은 몇 개인지 조회하는 SQL 문을 작성해주세요. 이때 이름이 NULL인 경우는 집계하지 않으며 중복되는 이름은 하나로 칩니다.
SELECT COUNT(DISTINCT NAME) as count
FROM ANIMAL_INS
WHERE NAME IS NOT NULL;
SQL
복사