DATE_FORMATE(값, 형식)
: 날짜 데이터를 입력한 형식대로 출력 (형식 참조)
SELECT MEMBER_ID, MEMBER_NAME, GENDER,
DATE_FORMAT(DATE_OF_BIRTH, '%Y-%m-%d') AS DATE_OF_BIRTH
FROM MEMBER_PROFILE
WHERE TLNO IS NOT NULL
AND MONTH(DATE_OF_BIRTH) = 3
AND GENDER = 'W'
ORDER BY MEMBER_ID;
EXTRACT(추출할 데이터 FROM 컬럼명)
: 날짜 데이터에서 년/월/일/시/분/초 값 추출
TO_CHAR()
: 날짜/숫자 데이터를 문자열로 변환 (형식 참조)
SELECT MEMBER_ID, MEMBER_NAME, GENDER,
TO_CHAR(DATE_OF_BIRTH, 'YYYY-MM-DD') AS BIRTH_OF_DATE
FROM MEMBER_PROFILE
WHERE TLNO IS NOT NULL
AND EXTRACT(MONTH FROM DATE_OF_BIRTH) = 3
AND GENDER = 'W'
ORDER BY MEMBER_ID;
IFNULL(표현식1, 표현식2)
: 표현식1이NULL
이면 표현식2 출력
SELECT PT_NAME, PT_NO, GEND_CD, AGE, IFNULL(TLNO, 'NONE') AS TLNO
FROM PATIENT
WHERE AGE <= 12 AND GEND_CD = 'W'
ORDER BY AGE DESC, PT_NAME ASC;
NVL(표현식1, 표현식2)
: 표현식1이NULL
이면 표현식2 출력NVL2(표현식, 값1, 값2)
: 표현식이NULL
이면 값2, 아니면 값1 출력
SELECT PT_NAME, PT_NO, GEND_CD, AGE, NVL(TLNO, 'NONE') AS TLNO
FROM PATIENT
WHERE AGE <= 12 AND GEND_CD = 'W'
ORDER BY AGE DESC, PT_NAME ASC;
✏️
ROUND(값, n)
: 소수를 n번째 자리까지 반올림
SELECT ROUND(AVG(DAILY_FEE), 0) AS AVEGAGE_FEE
FROM CAR_RENTAL_COMPANY_CAR
WHERE CAR_TYPE = 'SUV';
SELECT FLAVOR
FROM FIRST_HALF
ORDER BY TOTAL_ORDER DESC, SHIPMENT_ID ASC;
SELECT BOOK_ID,
DATE_FORMAT(PUBLISHED_DATE, '%Y-%m-%d') AS PUBLISED_DATE
FROM BOOK
WHERE YEAR(PUBLISHED_DATE) = 2021
AND CATEGORY = '인문'
ORDER BY PUBLISHED_DATE;
SELECT BOOK_ID,
TO_CHAR(PUBLISHED_DATE, 'YYYY-MM-DD') AS PUBLISED_DATE
FROM BOOK
WHERE EXTRACT(YEAR FROM PUBLISHED_DATE) = 2021
AND CATEGORY = '인문'
ORDER BY PUBLISHED_DATE;
SUBSTR(문자열, N, M)
: N번째 문자열 ~ M번째 문자열 추출
SELECT TITLE, B.BOARD_ID, 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 SUBSTR(B.CREATED_DATE, 1, 7) = '2022-10'
ORDER BY R.CREATED_DATE, TITLE;
SELECT TITLE, B.BOARD_ID, REPLY_ID, R.WRITER_ID, R.CONTENTS,
TO_CHAR(R.CREATED_DATE, 'YYYY-MM-DD') AS CREATED_DATE
FROM USED_GOODS_BOARD B JOIN USED_GOODS_REPLY R
ON B.BOARD_ID = R.BOARD_ID
WHERE TO_CHAR(B.CREATED_DATE, 'YYYY-MM') = '2022-10'
ORDER BY R.CREATED_DATE, TITLE;
SELECT F.FLAVOR
FROM FIRST_HALF F JOIN ICECREAM_INFO I
ON F.FLAVOR = I.FLAVOR
WHERE TOTAL_ORDER > 3000
AND INGREDIENT_TYPE = 'fruit_based'
ORDER BY TOTAL_ORDER DESC;
SELECT I.REST_ID, REST_NAME, FOOD_TYPE, FAVORITES, ADDRESS,
ROUND(AVG(REVIEW_SCORE), 2) AS SCORE
FROM REST_INFO I INNER JOIN REST_REVIEW R
ON I.REST_ID = R.REST_ID
WHERE ADDRESS LIKE '서울%'
GROUP BY R.REST_ID
ORDER BY SCORE DESC, FAVORITES DESC;
ORA-00979: not a GROUP BY expression
: 오라클에서 Group By절을 사용하려면 SELECT절에 사용된 모든 컬럼을 적어줘야 한다. (집계함수에 사용된 컬럼은 안적어줘도 됨!)
SELECT R.REST_ID, REST_NAME, FOOD_TYPE, FAVORITES, ADDRESS,
ROUND(AVG(REVIEW_SCORE), 2) AS SCORE
FROM REST_INFO I INNER JOIN REST_REVIEW R
ON I.REST_ID = R.REST_ID
WHERE ADDRESS LIKE '서울%'
GROUP BY R.REST_ID, REST_NAME, FOOD_TYPE, FAVORITES, ADDRESS
ORDER BY SCORE DESC, FAVORITES DESC;
SELECT DR_NAME, DR_ID, MCDP_CD,
DATE_FORMAT(HIRE_YMD, '%Y-%m-%d') AS HIRE_YDM
FROM DOCTOR
WHERE MCDP_CD = 'CS' OR MCDP_CD = 'GS'
ORDER BY HIRE_YMD DESC, DR_NAME;
SELECT DR_NAME, DR_ID, MCDP_CD,
TO_CHAR(HIRE_YMD, 'YYYY-MM-DD') AS HIRE_YDM
FROM DOCTOR
WHERE MCDP_CD = 'CS' OR MCDP_CD = 'GS'
ORDER BY HIRE_YMD DESC, DR_NAME;
SELECT FACTORY_ID, FACTORY_NAME, ADDRESS
FROM FOOD_FACTORY
WHERE ADDRESS LIKE '%강원도%'
ORDER BY FACTORY_ID;
(USER_ID, PRODUCT_ID)
그룹의COUNT()
결과가 2 이상이여야 하므로 WHERE절이 아닌 HAVING(그룹의 조건)절을 사용해야 함
SELECT USER_ID, PRODUCT_ID
FROM ONLINE_SALE
GROUP BY USER_ID, PRODUCT_ID
HAVING COUNT(*) >= 2
ORDER BY USER_ID, PRODUCT_ID DESC;
SELECT *
FROM ANIMAL_INS
ORDER BY ANIMAL_ID;
(SELECT DATE_FORMAT(SALES_DATE, '%Y-%m-%d') AS SALES_DATE,
PRODUCT_ID, USER_ID, SALES_AMOUNT
FROM ONLINE_SALE
WHERE MONTH(SALES_DATE) = 3
UNION
SELECT DATE_FORMAT(SALES_DATE, '%Y-%m-%d') AS SALES_DATE,
PRODUCT_ID, NULL AS USER_ID, SALES_AMOUNT
FROM OFFlINE_SALE
WHERE MONTH(SALES_DATE) = 3)
ORDER BY SALES_DATE, PRODUCT_ID, USER_ID;
- 오라클의 ORDER BY절에서는 컬럼명 대신 컬럼의 인덱스를 명시해도 된다. 컬럼명 + 인덱스의 조합도 가능!
(SELECT TO_CHAR(SALES_DATE, 'YYYY-MM-DD') AS SALES_DATE,
PRODUCT_ID, USER_ID, SALES_AMOUNT
FROM ONLINE_SALE
WHERE EXTRACT(MONTH FROM SALES_DATE) = 3
UNION
SELECT TO_CHAR(SALES_DATE, 'YYYY-MM-DD') AS SALES_DATE,
PRODUCT_ID, NULL AS USER_ID, SALES_AMOUNT
FROM OFFlINE_SALE
WHERE EXTRACT(MONTH FROM SALES_DATE) = 3)
ORDER BY 1, 2, 3;
SELECT NAME, DATETIME
FROM ANIMAL_INS
ORDER BY ANIMAL_ID DESC;
SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
WHERE INTAKE_CONDITION = 'Sick'
ORDER BY ANIMAL_ID;
SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
WHERE INTAKE_CONDITION != 'Aged'
ORDER BY ANIMAL_ID;
SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
ORDER BY ANIMAL_ID;
SELECT ANIMAL_ID, NAME, DATETIME
FROM ANIMAL_INS
ORDER BY NAME, DATETIME DESC;
LIMIT n
: 상위 n개의 행만 출력
SELECT NAME
FROM ANIMAL_INS
ORDER BY DATETIME
LIMIT 1;
ROWNUM
: 추출할 행 인덱스 ➡️ 서브쿼리를 사용하지 않고 ORDER BY절을 WHERE절 뒤에 쓰면 WHERE절을 먼저 수행한 후에 ORDER BY절을 수행하여 의도한 값이 나오지 않는다!
SELECT NAME
FROM (SELECT NAME
FROM ANIMAL_INS
ORDER BY DATETIME)
WHERE ROWNUM = 1;
SELECT COUNT(*) AS USERS
FROM USER_INFO
WHERE YEAR(JOINED) = 2021
AND AGE >= 20 AND AGE <=29;
SELECT COUNT(*) AS USERS
FROM USER_INFO
WHERE EXTRACT(YEAR FROM JOINED) = 2021
AND AGE >= 20 AND AGE <=29;