레코드
- 삽입하기
- 테이블에 레코드를 삽입하기 위해 아래 쿼리를 실행한다.
INSERT INTO `스키마 이름`.`테이블 이름`([열 이름, ...])
VALUES ([값 ...]);
- 위 쿼리에서 명시한 열의 순서와 값의 순서는 반드시 일치해야 한다.
- 명시하는 열의 순서는 테이블이 실제로 가지고 있는 열의 순서와 반드시 일치할 필요는 없다.
- 명시되지 않은 열의 값에 대해서는 해당 열의 기본 값(DEFAULT)을 사용한다. 그러므로 NOT NULL 이며 DEFAULT 가 없는 열은 반드시 명시되어야만 한다. (NOT NULL 이며 DEFAULT 가 없는 열은 실질적으로 NOT NULL DEFAULT NULL이고, 레코드 삽입시 해댱 열을 명시하지 않는다면 누락된 기본 값인 NULL을 NOT NULL 인 열에 삽입하려 하는 것 이기 때에 레코드가 삽입되지 않는다.
-- 1. NULL 허용, 기본값 없음
`email` VARCHAR(100) NULL;
-- 2. NULL 허용, 기본값 NULL
`email` VARCHAR(100) NULL DEFAULT NULL;
-- 3. NULL 불가, 기본값 있음
`population` BIGINT NOT NULL DEFAULT 0;
-- 4. NULL 불가, 기본값 없음
`name` VARCHAR(50) NOT NULL;
- 열 이름을 명시하지 않을 경우 테이블이 가지고 있는 모든 열을 순서대로 적은 것과 같은 효과를 가진다.
- 하나의 쿼리로 여러개의 레코드를 한 번에 삽입하기 위해 아래 쿼리를 실행한다.
- INSERT INTO `스키마 이름`.`테이블 이름`([열 이름,...])
VALUES ([값,...]),
([값,...]),
([값,...]),...)
- INSERT INTO `스키마 이름`.`테이블 이름`([열 이름,...])
INSERT INTO `study1104`.`countries` (`code_a2`, `code_a3`, `name_native`, `population`)
VALUES
('KR', 'KOR', '대한민국', 52000000),
('JP', 'JPN', '日本', 125000000),
('US', 'USA', 'United States', 331000000);
- 선택하기
- 테이블이 가지고 있는 레코드를 조회하기 위해 아래 쿼리를 실행한다.
SELECT {*|열,...|리터럴,...}
[FROM `스키마 이름`.`테이블 이름`]?
[JOIN...]?
[WHERE [조건]?]
[GROUP BY [기준 열,...]]
ORDER BY [기준 열,...][ASC][DESC]?]?
[LIMIT [개수]OFFSET [개수]?]?]
* : 테이블이 가지고 있는 모든 열을 의미한다.
-WHERE과 ORDER BY를 같이 사용할 경우 WHERE 무조건 먼저임
WHERE : 명시된 조건에 참(TRUE)인 레코드만 선택한다.
GROUP BY: 통계 함수를 사용할 때 레코드를 묶어낼 기준 열을 명시한다. 명시하지 않을 경우,
선택되는 모든 레코드를 통계 기준으로 한다.
ORDER BY : 선택 결과를 정렬하기 위해 사용한다. 정렬에 사용할 값을 가지고 있는 열을 명시한다.
선택 결과를 정렬하지 않는 경우, 기본 키(PRIMARY KEY)가 있는 테이블의 경우 이를 기준으로
오름차순 정렬하고, 그렇제 않은 경우 삽입된 순서대로, 별도로 정렬하지 않는다.
- ASC : 오름 차순 정렬, 생략시 기본 값.
- DESC : 내림차순 정렬
LIMIT ? OFFSET ?
- LIMIT : 본래 SELECT 에 의해 선택될 결과에서 명시한 개수의 상위 레코드만 선택한다.
-OFFSET : 본래 SELECT 에 의해 선택될 결과에서 명시한 개수의 상위 레코드르 생략한다. LIMIT
보다 선행한다.
-LIMIT 을 사용하지 않고 OFFSET을 사용할 수는 없으며, 이를 위해서는 엄청나게 큰 수에 대해 LIMIT
처리한 후 OFFSET 을 사용한다.
EX)
SELECT *
FROM study1104.countries
ORDER BY population DESC;
서브쿼리
- 조인과 마찬가리고 다른 테이블에서 데이터를 가져오기 위한 목적으로도 사용한다. SELECT의 열을 나열하는 구문에서 또 다른 SELECT 구문을 활용하며, 단 하나의 열을 나타낼 수 있다는 점이 다르다.
- SELECT 하는 열 뿐만 아니라, FROM, WHERE 등의 대상이 될 수도 있다.
select `c1`,
`c2`,
(select `sqc1`
from `schema`.`t2`
where `t1`.`c1` = `t2`.`sqc1`
limit 1) as `sqr`,
`c3`
from `schema`.`t1`
위 커리에서 서브쿼리의 결과 열인 sqr은 하나의 열만 가져야 하며, 하나의 레코드에 하나의 레코드만
반환할 수 있는 조건(혹은 limit ) 을 작성하여야 한다.
유니온
- 유니온(Union)은 선택 결과의 열의 개수가 같은 두 개 이상의 select 결과를 하라노 합치기 위해 사용한다.
(select 1,2,3)
union
(select 4,5,6)
(select country_code,
value
from study1106.populatinos
where as_of = 2023
order by value asc
limit 1 )
union
(select country_code,
value
from study1106.populatinos
where as_of = 2023
order by value asc
limit 1 )
union 여러개 가능
- 수정하기
- 레코드가 가지고 있는 값을 수정하기 위해 아래 쿼리를 실행한다.
UPDATE `스키마 이름`,`테이블 이름`
SET [열 이름] = [새로운 값],...;
- 위 쿼리는 조건 없이 모든 레코드의 값을 수정하는 쿼리임으로 일반적으로 사용하지 않는다.
주로 아래와 같이 WHERE 키워드를 사용하여 수정하고자 하는 레코드를 특정한다.
EX)
UPDATE `study1104`.`countries`
SET `population` = 52000000,
`gdp` = 1.713
WHERE `code_a2` = 'KR';
- 삭제하기
- 레코드를 삭제하기 위해 아래 쿼리를 실행한다.
DELETE
FROM `스키마 이름`.`테이블 이름`;
- 위 쿼리는 조건 없이 모든 레코드를 삭제하는 쿼리임으로 일반적으로 사용하지 않는다.
- 주로 아래와 같이 WHERE 키워드를 사용해 삭제하고자 하는 레코드를 특정한다.
DELETE
FROM `스키마 이름`.`테이블 이름`
WHERE [조건]
LIMIT [개수];
EX)
DELETE FROM `study1104`.`countries`
WHERE `continent` = 'Asia'
LIMIT 1;
👉 만약 continent = 'Asia'인 행이 30개 있다면
👉 그중 딱 1개만 삭제됩니다. 나머지 29개는 그대로 남아요.
MySQL은 기본적으로 문자열을 비교할 때 대소문자를 구분하지 않습니다.
예를 들어 👇
SELECT 'abc' = 'ABC'; -- 결과: 1 (같다고 판단)
하지만 실제로는 'abc' 와 'ABC' 는 다른 문자열이죠.
이럴 때 BINARY 키워드를 사용하면 바이트 단위(binary level) 로 비교해서
대소문자를 구분하게 됩니다.
연산자
- 사칙 연산자
- + : a + b 꼴에서 a와 b 의 합니다.
- - : a - b 꼴에서 a와 b 의 차이다.
- * : a * b 꼴에서 a와 b 의 곱이다.
- / : a / b 꼴에서 a와 b 의 나눈 몫이다.
- % 혹은 mod : a % b 혹은 a mod b에서 a와 b 의 나눈 나머지이다.
- 비교 연산자
- = : a = b 꼴에서 a 와 b 가 같은가의 여부이다.
- != 혹은 <> : a!=b 혹은 a<>b 꼴에서 a와b가 다른가의 여부이다.
- > : a > b 꼴에서 a 가 b 보다 큰가의 여부이다.
- < : a < b 꼴에서 a 가 b 보다 작은가의 여부이다.
- >= : a >= b 꼴에서 a 가 b 보다 크거나 같은가의 여부이다.
- <= : a <= b 꼴에서 a 가 b 보다 작거나 같은가의 여부이다.
- 논리 연산자
- && 혹은 and : a&&b 혹은 a and b 에서 ab 모두가 참이냐의 여부이다
- || 혹은 or : a||b 혹은a or b 에서 ab 모두가 거짓이냐 여부이다
- ! 혹은 not : !a 혹은 not a 에서 논리 a 를 부정(반전) 한다.
- 기타 연산자
- IN : a in (b,...)꼴에서 a 가 후행하는 값의 나열에 포함되는가의 여부이다.
- not in : a not in(b,...)
- BETWEEN AND : a BETWEEN b AND c 꼴에서 a가 b 이상이고 c 이하인가의 여부이다. a>= b and a< =c와 같다.
- NOT BETWEEN AND : a not between b and c
- IS NULL : a is null 꼴에서 a 가 null 인가의 여부이다.
- iIS NOT NULL : a is not null
- 어떠한 값이 null 인지 감시하기 이해 비교 연산자(=,!= 혹은 <>)하지 않음에 유의한다.
- like : a like b 꼴에서 a가 b 패턴에 부합하는가의 여부이다.
- NOT LIKE :A NOT LIKE B
- 패턴은 문자열로 작성한다.
- 패턴에서 _ 는 1개의 아무 문자이다.
- 패턴에서 %는 0개 이상의 아무 문자이다.
- 퍼센트를 표현하고싶을때 55% -> '_ _ \%' , 리터럴 \ 는 \\로 escape 하여 체크한다( 그 자체(퍼센트 기호)로 검색하고 싶을 때는 이스케이프(Escape) 처리 -> / )
- REGEXP : A REGEXPB 꼴에서 A 가 정규표현식 B 를 만족하는가의 여부이다.
- NOT REGEXP : A NOT REGEXP
- IN : a in (b,...)꼴에서 a 가 후행하는 값의 나열에 포함되는가의 여부이다.
SELECT *
FROM contacts
WHERE phone_number REGEXP '^[0-9]{2,3}-[0-9]{3,4}-[0-9]{4}$';
^ : 문자열 시작
[0-9]{2,3} : 숫자 2~3자리 (지역번호)
- : 하이픈 문자
[0-9]{3,4} : 숫자 3~4자리 (중간 번호)
[0-9]{4} : 숫자 4자리 (끝 번호)
$ : 문자열 끝
RECEXP '^010-\\d{4}-\\{4}' -> 이것도 가능
SELECT *
FROM countries
WHERE continent IN ('Asia', 'Europe', 'Africa');
SELECT *
FROM countries
WHERE continent NOT IN ('Asia', 'Europe');
like 예시
1-1) _ 사용
SELECT *
FROM users
WHERE username LIKE 'A_';
'A_' → A로 시작하고 총 2글자인 문자열
1-2) % 사용
SELECT *
FROM users
WHERE username LIKE 'Kim%';
'Kim%' → Kim으로 시작하는 모든 문자열
1-3)
SELECT *
FROM users
WHERE username LIKE '%Kim%';
'Kim'이 어디에든 포함된 문자열 조회
수학함수
- ABS(x) :x 의 절대값을 반환한다.
- MOD(x,y) :x mod y의 결과를 반환한다.
- POW(x,y) : x의 y 제곱을 반환한다.
- SQLRT(x) : x 의 제곱근을 반환한다.
- CEIL(x) :x를 정수부까지 올림하여 반환한다.
- FLOOR(x) : x를 정수부까지 내림해 반환한다.
- ROUND
- ROUND(x) : x를 정수부까지 반올림해 반환한다.
- ROUND(x,y) : x를 소수점 y자리까지 반올림해 반환한다.
- TRUNCATE(x,y) :x가 가진 y자리 미만의 소수점을 버리고 반환한다. TRUNCATE(x)꼴의 함수가 없음에 유의한다.
- RAND() : 0이상 1 미만의 무작위 실수를 반환한다.
논리함수
- IF (c,t,f) : 조건 c가 참일 때, t를 거짓일때 f 를 반환한다. -> 삼항 연산자와 비슷 c ? t : f
- IF NULL : x가 null 이라면 a 를 아니라면 x 를 반환한다.
문자함수
- LENGTH(x) : 문자열 x 의 바이트 크기를 반환한다.
- CHAR_LENGTH (x) : 문자열 x 의 문자 개수를 반환한다.
- CONCAT(x,...) : 한 개 이상의 인자 x 를 이어 붙인 문자열을 반환한다.
- CONCAT_WS(d,x,...) : 한 개 이상의 인자를 x를 d로 이어 붙인 문자열을 반환한다.
- LCASE(x) 혹은 LOWERCASE(x) : 문자열 x 가 가지는 라틴 문자를 소문자화하여 반환한다.
- UCASE(x) 혹은 UPPER(x) : 문자열 x 가 가지는 라틴 문자를 대문자화하여 반환한다.
- MID (x,y,z) 혹은 SUBSTAR (x,y,z) 혹은 SUBSTING (x,y,z) :문자열 x가 가지는 문자 중 y번 째 문자를 포함, 후행하는 z개의 문자를 반환한다.
- 단, 첫번째 인자(x)인 문자열에서 문자의 순번은 1번부터 시작함에 유의한다.
- 선택할 문자의 개수를 의미하는 세번째 인자(z)를 생략할 경우 끝까지 선택한다.
<js>
let str = "database";
let result = str.substring(2, 5); // 인덱스 2~4까지 (end=5는 포함 안 됨)
console.log(result); // "tab"
<sql>
SELECT SUBSTRING('database' FROM 3 FOR 3) AS result;
- LEFT(x,y) : 문자열 x 의 선행 문자 y 개를 반환한다.
- RIGHT(x,y) : 문자열 x 의 후행문자 y 개를 반환한다
- REPEAT(x,y) :인자 x 를 y 번 반복한 문자열을 반환한다.
- REPLACE(x,f,t) : 문자열 x에서 f를 찾아 t로 치환하여 반환한다.
- REVERSE (x) :문자열 x를 뒤집어서 반환한다.
- TRIM(x): 문자열 x의 선/후행 공백을 제거해 반환한다.
- LTRIM(x): 문자열 x의 선행 공백을 제거해 반환한다.
- RTRIM(x): 문자열 x의 후행 공백을 제거해 반환한다.
날짜 및 시간 함수
- CURDATE() 혹은 CURRENT_DATE():현재 날짜를 반환한다.
- CURTIME (x) 혹은 CURRENT_TIME(x) : 현재 시간을 반환한다. 여기서 x는 마이크로초의 자리수를 의미하며 생략하면 결과값은 마이크로초를 포함하지 않는다. 최대값은6이다. 단, 클라이언트의 접속 정보에 따라 마이크로초가 누락될 수 있음으로 유의한다.
- CURRENT_TIMESTAMP(x)혹은 NOW(x) 혹은 SYSDATE(x) : 현재 날짜와 시간을 반환한다. 여기서 x는 마이크로초의 자리수를 의미하며 생략하면 결과값은 마이크로초를 포함하지 않는다. 최대값은 6이다.
- CURRENT_TIMESTAMP 와 NOW 는 동일한 함수이다.
- CURRENT_TIMESTAMP 와 NOW 가 현재 일시를 반환하는 시점은 이를 포함하는 쿼리가 실행되는 시점이다.
- SYSDATE 가 현재 일시를반환하는 시점은 이를 포함하는 쿼리가 아닌, 해당 함수가 호출되는 시점이다.

- YEAR(x) : 전달 받은 날짜 혹은 일시인 x 의 년을 반환한다.
- MONTH(x) : 전달 받은 날짜 혹은 일시인 x의 월을 반환한다.
- DAY(x) : 전달 받은 날짜 혹은 일시인 x의 일을 반환한다.
- HOUR(x) : 전달 받은 시간 혹은 일시인 x 의 시를 반환한다.
- MINUTE(x) : 전달 받은 시간 혹은 일시인 x 의 분을 반환한다.
- SECOND(x) : 전달 받은 시간 혹은 일시인 x 의 초를 반환한다.
- MICROSECOND(x) : 전달 받은 시간 혹은 일시인 x 의 마이크로초를 반환한다.
- DATE(x) : 전달 받은 시간 혹은 일시의 날짜를 반환한다.
- TIME(x) : 전달 받은 시간 혹은 일시의 시간을 반환한다.
- DAYOFWEEK(x) : 전달 받은 날짜 혹은 일시x 의 요일을 숫자로 반환한다. 일요일부터 1로 시작하여 1씩 증가한다. 토요일은 7이다.
- DAYOFYEAR(x) : 전달 받은 날짜 혹은 일시 x가 당해의 몇 번째 날이가를 반환한다.
- DATE_ADD(x , INTERVAL y z ) : 일시 x에 z 주기인 y만큼을 더한다. 주기는 YEAR, QUATER , MONTH , WEEK, DAY,HOUR, MINUTE,SECOND 등을 사용 할 수 있다.
SELECT
DATE_ADD('2025-11-05', INTERVAL 10 DAY) AS plus_10_days,
DATE_ADD('2025-11-05', INTERVAL 2 MONTH) AS plus_2_months,
DATE_ADD('2025-11-05 14:30:00', INTERVAL 3 HOUR) AS plus_3_hours;
| plus_10_days | plus_2_months | plus_3_hours |
| ------------ | ------------- | ------------------- |
| 2025-11-15 | 2026-01-05 | 2025-11-05 17:30:00 |
- DATE_SUB(x , INTERVAL y z ) : 일시 x에 z 주기인 y만큼을 뺀다. 주기는 YEAR, QUATER , MONTH , WEEK, DAY,HOUR, MINUTE,SECOND 등을 사용 할 수 있다.
'DATABASE > DBMS' 카테고리의 다른 글
| 231105 | DBMS -JOIN (0) | 2025.11.05 |
|---|---|
| 251103 | DBMS ( 스키마 , 테이블) (0) | 2025.11.03 |