
18 : IN() :
IN()은 SQL에서 사용되는 조건 연산자 중 하나로, 특정 값이 리스트나 서브쿼리에 속하는지를 검사하는 데 사용됩니다.
예를 들어, 다음은 IN() 연산자를 사용하여 특정 도시에 속하는 고객을 선택하는 쿼리입니다:
SELECT * FROM 고객
WHERE 도시 IN ('서울', '부산', '대구');
이 쿼리는 "고객" 테이블에서 도시가 '서울', '부산', '대구' 중 하나에 속하는 모든 고객을 선택합니다.
또한, IN()을 사용하여 서브쿼리를 활용할 수도 있습니다. 예를 들어, 다음은 주문 중에서 특정 제품에 해당하는 주문을 선택하는 쿼리입니다:
SELECT * FROM 주문
WHERE 제품ID IN (SELECT 제품ID FROM 제품 WHERE 카테고리 = '전자제품');
이 쿼리는 "주문" 테이블에서 제품이 '전자제품' 카테고리에 속하는 주문을 선택합니다. 여기서 IN() 연산자를 사용하여 서브쿼리의 결과에 해당하는 값을 검사하고 있습니다.
19 : CURDATE() : 현재 날짜를 가져오는 함수
CURDATE()는 MySQL에서 사용되는 날짜 함수 중 하나입니다. 이 함수는 현재 날짜를 반환합니다.
간단한 예를 들어보겠습니다:
SELECT CURDATE();
이 쿼리는 현재 날짜를 조회하게 됩니다. 반환되는 형식은 'YYYY-MM-DD'입니다. 결과 예시:
2023-12-28
CURDATE() 함수는 현재 날짜를 사용하여 데이터베이스에서 날짜를 필터링하거나 날짜 연산을 수행하는 데 유용하게 사용됩니다.
20 : DATEDIFF() : 날짜 차이를 나타내는 함수
DATEDIFF()는 MySQL에서 사용되는 날짜 함수 중 하나로, 두 날짜 간의 차이를 일(day) 단위로 계산합니다.
DATEDIFF() 함수는 다음과 같은 구조를 가지고 있습니다:
DATEDIFF(end_date, start_date)
여기서 end_date와 start_date는 비교하려는 두 날짜이며, end_date에서 start_date를 뺀 결과를 반환합니다.
예를 들어, 현재 날짜와 특정 날짜 간의 차이를 계산하려면 다음과 같이 사용할 수 있습니다:
SELECT DATEDIFF('2023-12-31', CURDATE()) AS 날짜_차이;
이 쿼리는 현재 날짜에서 '2023-12-31' 날짜까지의 차이를 일(day) 단위로 계산하여 반환합니다.
참고로, 음수 값은 현재 날짜보다 이전의 날짜를 나타냅니다.
21 : RANK() OVER (ORDER BY rating DESC)
RANK() OVER (ORDER BY rating DESC)는 SQL에서 사용되는 창 함수(window function) 중 하나입니다. 이 쿼리는 특정 컬럼(여기서는 rating)을 기준으로 내림차순으로 정렬한 후, 그 순서에 따른 레코드의 순위를 부여합니다. 즉, rating이 높은 순서대로 레코드에 순위를 부여하는 것입니다.
예를 들어, 다음과 같은 테이블이 있다고 가정해봅시다:
CREATE TABLE 영화 (
id INT,
title VARCHAR(255),
rating DECIMAL(3, 1)
);
INSERT INTO 영화 (id, title, rating) VALUES
(1, '영화1', 8.5),
(2, '영화2', 9.2),
(3, '영화3', 7.8),
(4, '영화4', 8.9);
그리고 다음과 같은 쿼리를 실행하면:
SELECT id, title, rating, RANK() OVER (ORDER BY rating DESC) AS rank
FROM 영화;
결과는 다음과 같을 것입니다:
| id | title | rating | rank |
|----|-------|--------|------|
| 2 | 영화2 | 9.2 | 1 |
| 4 | 영화4 | 8.9 | 2 |
| 1 | 영화1 | 8.5 | 3 |
| 3 | 영화3 | 7.8 | 4 |
이 결과에서 RANK() 열은 rating이 높은 순으로 순위를 부여한 것을 나타내고 있습니다.
22 : LIMIT 1 : 개수만큼만 나타내는 방법
LIMIT 1은 SQL 쿼리에서 사용되는 절 중 하나로, 결과 집합에서 반환되는 행(row)의 수를 제한하는 데 사용됩니다. 특히, LIMIT 절은 처음 몇 개의 행만을 선택하거나, 조회된 행 중에서 특정 범위의 행을 선택하는 데에 유용합니다.
간단한 예를 들어보겠습니다. 다음은 특정 테이블에서 첫 번째 행만을 선택하는 쿼리입니다:
SELECT * FROM 테이블이름
LIMIT 1;
이렇게 하면 결과 집합에서 첫 번째 행만을 반환합니다.
LIMIT는 주로 정렬된 결과 집합에서 특정 순서의 행을 선택하거나, 특정 조건에 맞는 행 중에서 일부만을 선택할 때 사용됩니다.
35 : DATE_SUB + INTERVAL : 내가 원하는 날짜로 이동할 수 있음
DATE_SUB과 INTERVAL은 각각 MySQL에서 사용되는 날짜 함수 중의 하나입니다. 이 두 함수를 함께 사용하여 날짜를 계산하고 조작할 수 있습니다.
DATE_SUB 함수는 특정 날짜에서 일정 기간을 뺄 때 사용됩니다. 구문은 다음과 같습니다:
DATE_SUB(date, INTERVAL expr type)
여기서:
date: 기준이 되는 날짜 또는 날짜/시간 값입니다.expr: 뺄 값을 나타내는 수치 표현식입니다.type: expr의 단위를 지정하는 부분으로, 예를 들어 'DAY', 'MONTH', 'YEAR' 등이 올 수 있습니다.INTERVAL은 날짜나 시간에 일정한 간격을 더하거나 뺄 때 사용되는 키워드로, 특정 값에 일정한 간격을 더하거나 빼는 데에 유용합니다.
예를 들어, 현재 날짜에서 5일을 빼고 그 결과에 3개월을 더하는 쿼리는 다음과 같습니다:
SELECT DATE_SUB(CURDATE(), INTERVAL 5 DAY) + INTERVAL 3 MONTH;
이러한 조작을 통해 특정 날짜를 계산하고 필요에 따라 조작할 수 있습니다.
오답노트로 작성하였지만 어떻게 식을 도출해야 할지 생각조차 하지 못한 것이 아닌 많이 사용해보지 않은 함수가 더 간편하게 결과를 나타내어 추가로 정리한 함수들이다.
강의 내용은 별도 정리하였고 마지막 과제에 대한 소감만 남겨보았다
소감 및 생긴 문제점 해결
package org.example;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
/*
입력
내가 좋아하는 요리 제목을 먼저 입력합니다.
요리 별점을 1~5 사이의 소수점이 있는 실수로 입력해주세요. (ex. 3.5)
이어서 내가 좋아하는 요리 레시피를 한 문장씩 10문장을 입력합니다.
*/
System.out.print("좋아하는 요리 제목을 입력해주세요 : ");
String foodName = sc.nextLine();
System.out.print("요리 별점을 1~5사이 소수점이 있는 실수로 입력해주세요 : ");
float foodScore = Float.parseFloat(sc.nextLine());
System.out.println("해당 요리의 레시피를 한 문장씩 10문장을 입력해주세요 : ");
String[] recipe = new String[10];
for (int i=0; i< recipe.length; i++){
recipe[i] = sc.nextLine();
}
/*
출력값
입력이 종료되면 요리 제목을 괄호로 감싸서 먼저 출력 해줍니다.
이어서, 요리 별점을 소수점을 제외한 정수로만 출력해줍니다. (ex. 3)
바로 뒤에 정수별점을 5점만점 퍼센트로 표현했을 때 값을 실수로 출력해줍니다. (ex. 60.0%)
이어서, 입력한 모든 문장 앞에 번호를 붙여서 모두 출력 해줍니다.
*/
System.out.println("(" + foodName + ")");
int intFoodScore = (int)foodScore;
System.out.println("별점 : " + intFoodScore + " (" + intFoodScore*20 + "%)");
for (int i=1; i<recipe.length+ 1; i++){
System.out.println(i + ". " + recipe[i] );
}
}
}
기존 코드
System.out.print("요리 별점을 1~5사이 소수점이 있는 실수로 입력해주세요 : ");
float foodScore = sc.nextFloat(); // 오류 발생
수정 후 코드
System.out.print("요리 별점을 1~5사이 소수점이 있는 실수로 입력해주세요 : ");
float foodScore = Float.parseFloat(sc.nextLine());
오류의 원인은 nextFloat()입력 이후 ‘\0’ 문자가 남아있어 다음 입력을 방해한 것이었다.
nextLine()을 사용하여 문자열로 입력받고 float 강제 형변환을 사용하면 버퍼에 널문자가 남지 않아 문제가 생기지 않는다.