- 따로 만들어 둔 서브 프로그램이라 생각하면 편함
- 호출을 통해 필요한 값 전달, 결과를 반환
형 변환 함수
CAST(expression AS target_data_type)CONVERT(expression, target_data_type)CAST, CONVERT는 매우 유용하지만 모든 데이터로의 형 변환이 가능한 것은 아님.-- 형 변환 함수 실습
SELECT 123456789; -- 이거 그냥 실행시키면 숫자 형태 데이터 그대로 출력됨ㅇㅇ
-- tool에서 숫자 데이터는 파란색으로 표현됨
-- 숫자 -> 문자 형 변환
SELECT CONVERT(123456789, CHAR); -- 함수 호출
-- 위의 쿼리 실행 시 문자열인 녹색으로 표현됨.
SELECT CAST(123456789 AS CHAR);
-- usertbl에서 birthYear 열의 데이터를 형변환 할 예정
SELECT NAME,
CONVERT(birthYear, CHAR)
FROM usertbl;
-- 위의 방식은 각 행마다 실행됨.
-- 실수 데이터(소숫점 O) 를 정수 데이터(소숫점 X) 로 형변환
-- buytbl에서 구입 개수의 평균을 정수로 변환(반올림)
SELECT CAST(AVG(amount) AS INT)
FROM buytbl;
-- 문자 데이터를 숫자 데이터로 형 변환
-- 숫자로 바꿀 때는 문자열도 숫자 형태를 띄어야 함
-- 그러나 모든 유형으로의 형 변환이 가능하지는 않다. (10000000 -> TINY로의 변환은 x)
SELECT CONVERT('10000000', INT);
-- 아래처럼 3자리마다 ','를 붙이면 결과는 10으로 나오게 됨.
SELECT CONVERT('10,000,000', INT);
SELECT CONVERT( REPLACE('10,000,000', ',', ''), INT) AS '결과';
-- REPLACE(바꿀 문자 데이터, 바꿀 문자들, 뭘로 바꿀지?)
-- 아래의 쿼리가 정상적으로 연산되도록 쿼리문 작성
SELECT '1,000,000' - '500,000';
/* 위의 경우 - 연산자는 피연산자로 숫자를 받아야 하기 때문에 자동으로 1,000,000에 CONVERT 연산을 하게 됨.
위의 경우 CONVERT(1,000,000) -> 1 / CONVERT(500,000) -> 500의 결과를 갖기 때문에 최종 결과가 -449로 나타나게 된다.
-> <묵시적 형변환> */
SELECT CONVERT(REPLACE('1,000,000', ',' ,''), INT) -
CONVERT(REPLACE('500,000', ',' ,''), INT);
SELECT '1000000' - '500000';
SELECT REPLACE('1,000,000', ',' , '') - REPLACE('500,000', ',' , '');
SELECT *
FROM usertbl;
-- mobile1의 데이터를 숫자 데이터로 변경
SELECT NAME,
CONVERT(mobile1, INT)
FROM usertbl;
-- 숫자 형태로 바꿀 경우 -> 앞의 0은 전부 생략됨
-- 문자 데이터를 날짜 데이터로의 형변환
SELECT CONVERT('2024-12-16', DATE);
-- 빨간색은 날짜 데이터를 의미
SELECT CONVERT('2024/12/16', DATE);
SELECT CONVERT('2024%12%16', DATE);
SELECT CONVERT('20241216', DATE);
SELECT CONVERT('2024-12-16 12:36:17', DATETIME);
SELECT CONVERT(20241216, DATE);
SELECT CONVERT(123517, TIME);
SELECT CONVERT(20241216123517, DATETIME);
-- 얘네들은 다 오류 남
SELECT CONVERT(2024, SMALLINT);
SELECT CONVERT(2024, TINYINT);
SELECT CONVERT(2024, YEAR);
-- < 묵시적 형변환 >
SELECT 100 + 200; -- 아무런 형 변환도 일어나지 않음
SELECT '100' + 200;
SELECT '100' + '200';
-- mariaDB에서는 산술 연산만(피연산자가 숫자밖에 없는) 형변환 가능
-- 피연산자가 숫자로 바뀌는지 확인한 뒤, 이들끼리 더하기 연산을 실행.
SELECT CONCAT('100', '200'); -- 문자와 문자 연결
SELECT CONCAT(100, '200'); -- 정수가 문자로 변환되어 연결됨.
SELECT 1 > '2mega' ; -- 실행 결과로 0이 나옴.
-- 산술연산에서 크기 비교 -> 두 번째는 뮨자인데 숫자로 바꿀 수 있는 부분까지는 바꿔서 비교
-- 결과적으로 1 > 2 의 비교 연산을 실행 -> 결과는 0(거짓)이 나오게 됨.
SELECT 3 > '2mega' ;
-- 아래의 결과는 참을 의미하는 1이 출력되게 됨.
SELECT 0 = '0mega' ;
-- 문자는 0으로 변환됨 -> 참을 의밀하는 1이 출력됨.
제어 흐름 함수
IF(수식, 참일 때 출력할 값, 거짓일 때 출력할 값); : 실제 반환되는 값은 두 번째 인자나 세 번째 인자에 해당됨.IFNULL(수식1, 수식2) : 수식1이 NULL이 아니면 수식1을 그대로, NULL이면 수식2가 출력됨 (NVL도 동일함)NVL2(수식1, 수식2, 수식3) : 수식1이 NULL이면 수식3으로, NULL이 아니면 수식2로 나타남-- 제어 흐름 함수 실습
-- IF(수식, 참, 거짓)
SELECT IF(100 > 200, '참', '거짓'); -- 거짓
SELECT IF(100 < 200, '참', '거짓'); -- 참
-- buytbl에서 userID로 그룹으로 묶은 뒤, 구매 개수가 10개 이상이면 VIP, 10개 미만이면 일반
SELECT userID,
SUM(amount) AS '고객 별 구매개수',
IF(SUM(amount) > 10, 'VIP 고객', '일반 고객') AS '고객등급'
FROM buytbl
GROUP BY userID
ORDER BY `고객 별 구매개수` DESC;
-- 별칭으로 정렬할 땐 backtik으로
-- IFNULL 함수
SELECT IFNULL(NULL, '값이 없음');
SELECT IFNULL(100, '값이 없음');
SELECT NVL(100, ' 값이 없음'); -- 얘도 똑같은 애. 버전에 따라 사용 가능할 수도, 불가능할 수 도 있음.
-- buytbl에서 모든 데이터 출력, 단 GROUPNAME 값이 NULL 인 경우 없음으로 출력되도록
SELECT num,
userID,
prodName,
IFNULL(groupName, '없음') AS 'groupName',
price,
amount
FROM buytbl;
-- NVL2 함수
SELECT NVL2(NULL, 100, 200), NVL2(300, 100, 200);
USE employees_db;
-- 기존의 보너스가 있던 사람만 0.1로, NULL 이었던 사람은 그대로 NULL로
-- 직원명, 보너스율, 보너스가 포함된 연봉
-- NVL2는 NULL인 경우와 NULL이 아닌 경우를 나눠서 설정이 가능함
SELECT emp_name,
NVL2(bonus, 0.1, 0),
salary,
salary * 12,
((salary * NVL2(bonus, 0.1, 0)) + salary) * 12 AS '보너스 포함 연봉'
FROM employee;CASE ~ `WHEN ~ THEN ~`
`ELSE ~` END : if ~ else 구문과 같은 사용-- CASE 연산자
SELECT CASE 10
WHEN 1 THEN '일'
WHEN 5 THEN '오'
WHEN 10 THEN '십'
ELSE '모름'
END AS '결과';
-- else ~ if 구문과 같이 사용
SELECT CASE
WHEN 10 > 20 THEN '10 > 20'
WHEN 20 >= 10 THEN '20 >= 10'
ELSE '모름'
END AS '결과';
-- 급여가 500만원을 초과할 경우 1등급 /
SELECT emp_name,
salary,
CASE
WHEN salary > 5000000 THEN '1등급'
WHEN salary > 3500000 THEN '2등급'
WHEN salary > 2000000 THEN '3등급'
ELSE '4등급'
END AS 'GRADE'
FROM employee
ORDER BY `GRADE`, salary DESC;문자열 함수
함수표
| 함수 | 설명 |
|---|---|
ASCII(문자) | 문자의 아스키코드를 반환하는 함수이다. |
CHAR(숫자) | 아스키코드값에 해당하는 문자를 반환하는 함수이다. |
BIT_LENGTH(문자열) | 문자열에 할당된 bit의 크기를 반환하는 함수이다. |
CHAR_LENGTH(문자열) | 문자열에 문자의 개수를 반환한다. |
LENGTH(문자열) | 문자열에 할당된 Byte 수를 리턴한다. |
| `CONCAT(문자열 1, 문자열 2, ... ) | |
| CONCAT_WS(구분자, 문자열 1, 문자열 2, ... )` | 문자열을 이어주는 함수이다.CONCAT_WS 함수는 구분자와 함께 문자열을 이어준다. |
ELT(위치, 문자열 1, 문자열 2, ...) | 위치 번째에 해당하는 문자열을 반환한다. 해당 문자가 없으면 0 을 반환하게 됨. |
FIELD(찾을 문자열, 문자열 1, 문자열 2, ...) | 찾을 문자열의 위치를 찾아서 반환한다.매치되는 문자열이 없으면 0을 반환한다. |
FIND_IN_SET(찾을 문자열, 문자열 리스트) | 찾을 문자열을 문자열 리스트에서 찾아서 위치를 반환한다.문자열 리스트는 콤마(,)로 구분되어 있어야 하며 공백은 없어야 한다. |
INSTR(기준 문자열, 부분 문자열) | 기준 문자열에서 부분 문자열을 찾아서 그 시작 위치를 반환한다. |
LOCATE(부분 문자열, 기준 문자열) | INSTR() 함수와 동일하지만 파라미터의 순서가 반대로 되어 있다.LOCATE() 함수와 POSITION() 함수는 동일한 함수이다. |
FORMAT(숫자, 소수점 자릿수) | 숫자를 지정한 소수점 자릿수까지 표현하는 함수이다.또한 1000단위마다 콤마(,)를 표시해 준다. |
BIN(숫자) | 숫자의 2진수 값을 반환한다. |
HEX(숫자) | 숫자의 16진수 값을 반환한다. |
OCT(숫자) | 숫자의 8진수 값을 반환한다. |
INSERT(기준 문자열, 위치, 길이, 삽입할 문자열) | 기준 문자열의 위치부터 길이만큼을 지우고 삽입할 문자열을 끼워 넣는다. |
LEFT(문자열, 길이) | 왼쪽에서 문자열의 길이만큼 반환한다. |
RIGHT(문자열, 길이) | 오른쪽에서 문자열의 길이만큼 반환한다. |
UPPER(문자열) | 소문자를 대문자로 변경하는 함수이다.UPPER() 함수는 UCASE() 함수와 동일한 함수이다. |
LOWER(문자열) | 대문자를 소문자로 변경하는 함수이다.LOWER() 함수는 LCASE() 함수와 동일한 함수이다. |
LPAD(문자열, 길이, 채울 문자열) | 문자열을 길이만큼 왼쪽을 늘린 후에, 빈 곳을 채울 문자열로 채운다. |
RPAD(문자열, 길이, 채울 문자열) | 문자열을 길이만큼 오른쪽을 늘린 후에, 빈 곳을 채울 문자열로 채운다. |
LTRIM(문자열) | 문자열의 왼쪽 공백을 제거한다중간의 공백은 제거되지 않는다. |
RTRIM(문자열) | 문자열의 오른쪽 공백을 제거한다.중간의 공백은 제거되지 않는다. |
TRIM(문자열) | 문자열의 앞/뒤 공백을 모두 제거한다. |
TRIM(방향 자를 문자열 FROM 문자열) | 방향을 지정하면 해서 자를 문자열을 제거할 수 있다.방향은 LEADING(앞), TRAILING(뒤), BOTH(양쪽)로 지정한다. |
REPEAT(문자열, 횟수) | 문자열을 횟수만큼 반복한다. |
REPLACE(문자열, 원래 문자열, 바꿀 문자열) | 문자열에서 원래 문자열을 찾아서 바꿀 문자열로 바꿔준다. |
REVERSE(문자열) | 문자열의 순서를 거꾸로 만든다. |
SPACE(길이) | 길이 만큼의 공백을 반환한다. |
SUBSTRING(문자열, 시작 위치, 길이)SUBSTRING(문자열 FROM 시작 위치 FOR 길이) | 시작 위치부터 길이만큼 문자를 반환한다.길이가 생략되면 문자열의 끝까지 반환한다.SUBSTRING() 함수, SUBSTR() 함수, MID() 함수는 모두 동일한 함수이다. |
SUBSTRING_INDEX(문자열, 구분자, 횟수) | 문자열에서 구분자가 왼쪽부터 횟수 번째 나오면 그 이후의 오른쪽은 버린다.횟수가 음수이면 오른쪽부터 세고 왼쪽을 버린다. |
MariaDB는 UTF-8 코드를 사용하기 때문에 영문자 하나 당 1byte(8bit), 그 외 언어의 경우 문자 하나당 3byte(24bit)를 사용함
<예제 코드>
SELECT ASCII('A'), CHAR(65), ASCII('문'), CHAR(1);
-- ascii에 문자를 주면 해당하는 아스키코드 수가 나오게 됨
-- CHAR에 아스키코드를 넣으면 문자가 나오게 됨
-- 16진수가 나오는 경우 : 그리드 뷰 옵션 -> 텍스트로 바이너리 조회
-- BIT LENGTH, CHAR LENGTH, LENGHT 함수에 대해 봄
-- mariaDB는 UTF-8 코드를 사용함.
SELECT BIT_LENGTH('ABC'), CHAR_LENGTH('ABC'), LENGTH('ABC'); -- > 24, 3, 3
SELECT BIT_LENGTH('가나다'), CHAR_LENGTH('가나다'), LENGTH('가나다'); -- > 72, 3, 9
-- CHAR_LENGTH는 그냥 길이
-- 영분자는 1byte(8byte), 다른 언어는 3byte(24bit)할당.
-- CONCAT, CONCAT_WS
SELECT CONCAT('2024','12','16'); -- -> 하나의 문자 데이터로 출력해줌
SELECT CONCAT_WS('-','2024','12','16'); -- -> 첫 번째 인자로 각 문자열들을 구분해주는 구분자를 지정,
USE test_db;
-- usertbl에서 아이디, 이름 전화번호
SELECT userID,
NAME,
mobile1,
mobile2,
CONCAT(mobile1, mobile2) AS '전체 전화번호',
CONCAT_WS('-', mobile1, SUBSTRING(mobile2, 1, 4), SUBSTRING(mobile2, 5, 8)) AS '-전화번호'
FROM usertbl;
-- employee 테이블에서 급여 조회
USE employees_db;
SELECT emp_name,
salary,
CONCAT(emp_name, '님의 급여는 ', salary, '원 입니다.')
FROM employee;
-- ELT, FIELD, FIND_IN_SET, INSTR, LOCATE
-- ELT : 지정한 위치의 매개변수 값 반환. 범위를 넘어서면 NULL 값이 반환됨.
SELECT ELT(2, '하나' , '둘', '셋' ) ; -- > 범위를 넘어서면 NULL 값 반환
SELECT FIELD('둘', '하나', '둘', '셋'); -- > 두 번째 위치에 '둘'이 있네? -> 2라는 값 반환 / 없으면 0 반환
SELECT FIND_IN_SET('둘', '하나,둘,셋'); -- > 콤마로 구분한 문자열 리스트에서 위치를 반환
SELECT INSTR('하나둘셋', '둘'); -- > 글자 하나하나씩 보면서 처음으로 나오는 위치를 반환
SELECT LOCATE('둘', '하나 둘 셋'); -- > 위의 INSTR이랑 매개변수 위치만 반대임
-- email의 @위치값 출력
-- 추후 문자열 자르기를 할 때 이 위치반환값이 유용하게 쓰일테니 기억해두자
SELECT emp_name,
email,
INSTR(email, '@')
FROM employee;
-- FOMRAT 함수
SELECT CONVERT(1234567, CHAR);
SELECT FORMAT(1234567, 0); -- 1000 단위마다 ,를 찍어줌
SELECT FORMAT(1234.567, 2); -- > 지정한 소숫점 자리까지만 표현(반올림)
SELECT FORMAT(1234.567, 0); -- > 소숫점은 반올림, 나머지 1000 단위 별로 , 찍기
-- INSERT 함수
SELECT INSERT('abcdefghi', 3, 4, '####'); -- > 3번째 문자열부터 4개의 문자열을 전부 #으로 바꿔줌
-- 주민등록번호에서 성별 코드를 제외한 나머지 masking 처리가 가능함
USE employees_db;
-- 사원명 주민등록번호 조회(뒷자리 마스킹 처리)
SELECT emp_name,
INSERT(emp_no, 9, 6, '******')
FROM employee;
-- LEFT, RIGHT -> 각 방향 별로 주어진 길이만큼 잘라서 반환하는 함수
SELECT LEFT('abcdefghi', 3), RIGHT('abcdefghi', 3);
-- email에서 @ 이전의 아이디 값을 조회
SELECT emp_name,
email,
LEFT(email, INSTR(email, '@') -1) AS 'id'
FROM employee;
-- UPPER, LOWER 함수
SELECT UPPER('abcdefghi'); -- > 소문자들을 대문자로 바꿈
SELECT LOWER('ABCDEFGHI'); -- > 대문자들을 소문자로 바꿈
<예제 코드>
SELECT ASCII('A'), CHAR(65), ASCII('문'), CHAR(1);
-- ascii에 문자를 주면 해당하는 아스키코드 수가 나오게 됨
-- CHAR에 아스키코드를 넣으면 문자가 나오게 됨
-- 16진수가 나오는 경우 : 그리드 뷰 옵션 -> 텍스트로 바이너리 조회
-- BIT LENGTH, CHAR LENGTH, LENGHT 함수에 대해 봄
-- mariaDB는 UTF-8 코드를 사용함.
SELECT BIT_LENGTH('ABC'), CHAR_LENGTH('ABC'), LENGTH('ABC'); -- > 24, 3, 3
SELECT BIT_LENGTH('가나다'), CHAR_LENGTH('가나다'), LENGTH('가나다'); -- > 72, 3, 9
-- CHAR_LENGTH는 그냥 길이
-- 영분자는 1byte(8byte), 다른 언어는 3byte(24bit)할당.
-- CONCAT, CONCAT_WS
SELECT CONCAT('2024','12','16'); -- -> 하나의 문자 데이터로 출력해줌
SELECT CONCAT_WS('-','2024','12','16'); -- -> 첫 번째 인자로 각 문자열들을 구분해주는 구분자를 지정,
USE test_db;
-- usertbl에서 아이디, 이름 전화번호
SELECT userID,
NAME,
mobile1,
mobile2,
CONCAT(mobile1, mobile2) AS '전체 전화번호',
CONCAT_WS('-', mobile1, SUBSTRING(mobile2, 1, 4), SUBSTRING(mobile2, 5, 8)) AS '-전화번호'
FROM usertbl;
-- employee 테이블에서 급여 조회
USE employees_db;
SELECT emp_name,
salary,
CONCAT(emp_name, '님의 급여는 ', salary, '원 입니다.')
FROM employee;
-- ELT, FIELD, FIND_IN_SET, INSTR, LOCATE
-- ELT : 지정한 위치의 매개변수 값 반환. 범위를 넘어서면 NULL 값이 반환됨.
SELECT ELT(2, '하나' , '둘', '셋' ) ; -- > 범위를 넘어서면 NULL 값 반환
SELECT FIELD('둘', '하나', '둘', '셋'); -- > 두 번째 위치에 '둘'이 있네? -> 2라는 값 반환 / 없으면 0 반환
SELECT FIND_IN_SET('둘', '하나,둘,셋'); -- > 콤마로 구분한 문자열 리스트에서 위치를 반환
SELECT INSTR('하나둘셋', '둘'); -- > 글자 하나하나씩 보면서 처음으로 나오는 위치를 반환
SELECT LOCATE('둘', '하나 둘 셋'); -- > 위의 INSTR이랑 매개변수 위치만 반대임
-- email의 @위치값 출력
-- 추후 문자열 자르기를 할 때 이 위치반환값이 유용하게 쓰일테니 기억해두자
SELECT emp_name,
email,
INSTR(email, '@')
FROM employee;
-- FOMRAT 함수
SELECT CONVERT(1234567, CHAR);
SELECT FORMAT(1234567, 0); -- 1000 단위마다 ,를 찍어줌
SELECT FORMAT(1234.567, 2); -- > 지정한 소숫점 자리까지만 표현(반올림)
SELECT FORMAT(1234.567, 0); -- > 소숫점은 반올림, 나머지 1000 단위 별로 , 찍기
-- INSERT 함수
SELECT INSERT('abcdefghi', 3, 4, '####'); -- > 3번째 문자열부터 4개의 문자열을 전부 #으로 바꿔줌
-- 주민등록번호에서 성별 코드를 제외한 나머지 masking 처리가 가능함
USE employees_db;
-- 사원명 주민등록번호 조회(뒷자리 마스킹 처리)
SELECT emp_name,
INSERT(emp_no, 9, 6, '******')
FROM employee;
-- LEFT, RIGHT -> 각 방향 별로 주어진 길이만큼 잘라서 반환하는 함수
SELECT LEFT('abcdefghi', 3), RIGHT('abcdefghi', 3);
-- email에서 @ 이전의 아이디 값을 조회
SELECT emp_name,
email,
LEFT(email, INSTR(email, '@') -1) AS 'id'
FROM employee;
-- UPPER, LOWER 함수
SELECT UPPER('abcdefghi'); -- > 소문자들을 대문자로 바꿈
SELECT LOWER('ABCDEFGHI'); -- > 대문자들을 소문자로 바꿈
```
수학 함수
| 함수 | 설명 |
|---|---|
ABS(숫자) | 숫자의 절댓값을 계산한다. |
ACOS(숫자)ASIN(숫자)ATAN(숫자)ATAN2(숫자 1, 숫자 2)SIN(숫자)COS(숫자)TAN(숫자) | 삼각 함수와 관련된 함수를 제공한다. |
CEILING(숫자) | 숫자를 올림하여 반환한다.CEILING()과 CEIL()은 동일한 함수이다. |
FLOOR(숫자) | 숫자를 내림하여 반환한다. |
ROUND(숫자) | 숫자를 반올림을 반환한다. |
TRUNCATE(숫자, 정수) | 숫자를 소수점을 기준으로 정수 위치까지 구하고 나머지는 버린다. |
CONV(숫자, 원래 진수, 변환할 진수) | 숫자를 원래 진수에서 변환할 진수로 계산한다. |
DEGREES(숫자) | 라디안 값을 각도 값으로 변환한다. |
RADIANS(숫자) | 각도 값을 라디안 값으로 변환한다. |
PI() | PI 값인 3.141592를 반환한다. |
EXP(X)LN(숫자)LOG(숫자)LOG(밑수, 숫자)LOG2(숫자)LOG10(숫자) | 지수, 로그와 관련된 함수를 제공한다. |
MOD(숫자 1, 숫자 2)숫자 1 % 숫자 2숫자 1 MOD 숫자 2 | 숫자 1을 숫자 2로 나눈 나머지 값을 구한다. |
POW(숫자) | 숫자의 거듭제곱 값을 반환한다.POW()와 POWER() 함수는 동일한 함수다. |
SQRT(숫자) | 숫자의 제곱근을 반환한다. |
RAND() | 0 이상 1 미만의 실수를 구한다. |
SIGN(숫자) | 숫자가 양수, 0, 음수인지를 구한다.결과는 1, 0, -1 셋 중에 하나를 반환한다. |
-- 수학 함수
SELECT CEILING(4.3); -- 숫자 올림
SELECT FLOOR(4.7); -- 숫자 내림
SELECT ROUND(3.5); -- 숫자 반올림
SELECT ROUND(3.2);
SELECT ROUND(4.3555, 0); -- 정수부분만 출력
SELECT ROUND(4.3522, 2); -- 소숫점 2자리까지 출력
SELECT ROUND(12.3134515, -1); -- 소수점 왼쪽(일의 자리)에서 반올림한다는 의미.
SELECT TRUNCATE(123.3456, 0); -- 소수점 첫 째자리에서부터 버림
SELECT TRUNCATE(123.2336, 2); -- 소수점 두 번째 자리까지만 출력, 그 뒤는 전부 버림
SELECT TRUNCATE(123.2342345, -1); -- 일의자리부터 버림
SELECT TRUNCATE(12345.234245, -3); -- 백의 자리부터 버림
SELECT MOD(157, 10); -- 157을 10으로 나눈 나머지
SELECT RAND(); -- 0부터 1사이의 랜덤 값이 출력됨
SELECT RAND() * 100 ; -- 0부터 100 사이의 임의의 값이 출력됨
SELECT ROUND (RAND() * 1000); -- 0부터 1000까지 임의의 정수 출력