MySQL 100단계OneCompiler 온라인 실습 전자교재
OneCompiler 열기

설치 없이 배우는
MySQL 예제 100개

각 예제는 가능한 한 독립 실행형으로 구성했습니다. 코드를 복사하여 OneCompiler MySQL 편집기에 붙여 넣고 Run을 누른 뒤 결과와 상세 설명을 비교하세요.

1. MySQL 편집기 열기
2. 예제 코드 복사
3. Run으로 실행
4. 결과·설명 비교
100개 예제 표시 중기초 → 중급 → 고급
#001기초SELECT

첫 SELECT

상세 설명

테이블 없이도 SELECT로 문자열을 출력할 수 있습니다. AS는 결과 열의 별칭입니다.

예상 결과: Hello, MySQL!
OneCompiler에 복사하여 실행
SELECT 'Hello, MySQL!' AS message;
#002기초SELECT

숫자 계산

상세 설명

SELECT 안에서 산술 연산을 수행할 수 있습니다. 쉼표로 여러 계산 결과를 한 행에 표시합니다.

예상 결과: 30 / 200 / 5
OneCompiler에 복사하여 실행
SELECT 10+20 AS sum_value, 10*20 AS product_value, 20/4 AS quotient_value;
#003기초함수

CONCAT 문자열 결합

상세 설명

CONCAT()은 여러 문자열을 순서대로 이어 붙입니다.

예상 결과: MySQL / 안녕 데이터베이스
OneCompiler에 복사하여 실행
SELECT CONCAT('My','SQL') AS word, CONCAT('안녕',' ','데이터베이스') AS greeting;
#004기초함수

대소문자 변환

상세 설명

UPPER()는 대문자, LOWER()는 소문자로 바꿉니다.

예상 결과: MYSQL / database
OneCompiler에 복사하여 실행
SELECT UPPER('mysql') AS upper_text, LOWER('DATABASE') AS lower_text;
#005기초함수

문자열 길이

상세 설명

CHAR_LENGTH()는 문자 수를, LENGTH()는 바이트 수를 반환합니다. 한글에서는 두 개념의 차이를 관찰하기 좋습니다.

OneCompiler에 복사하여 실행
SELECT CHAR_LENGTH('데이터베이스') AS chars, LENGTH('MySQL') AS bytes;
#006기초함수

ROUND CEIL FLOOR

상세 설명

ROUND()는 반올림, CEIL()은 올림, FLOOR()는 내림입니다.

예상 결과: 3.14 / 4 / 3
OneCompiler에 복사하여 실행
SELECT ROUND(3.141592,2) AS r, CEIL(3.14) AS c, FLOOR(3.99) AS f;
#007기초연산자

나머지 MOD

상세 설명

MOD(a,b)와 %는 모두 나머지를 구합니다.

예상 결과: 2 / 2
OneCompiler에 복사하여 실행
SELECT MOD(17,5) AS r1, 17 % 5 AS r2;
#008기초날짜

현재 날짜와 시간

상세 설명

CURDATE(), CURTIME(), NOW()를 이용해 실행 시점의 날짜와 시간을 확인합니다.

학습 포인트: 실행할 때마다 값이 달라질 수 있습니다.
OneCompiler에 복사하여 실행
SELECT CURDATE() AS today, CURTIME() AS current_time, NOW() AS current_datetime;
#009기초조건

IF 조건식

상세 설명

IF(조건, 참값, 거짓값)는 간단한 조건 분기를 표현합니다.

예상 결과: PASS
OneCompiler에 복사하여 실행
SELECT IF(85>=60,'PASS','FAIL') AS result;
#010기초조건

CASE 다중 조건

상세 설명

CASE는 여러 WHEN 조건을 위에서부터 검사해 첫 번째 참인 결과를 반환합니다.

예상 결과: A
OneCompiler에 복사하여 실행
SELECT CASE WHEN 92>=90 THEN 'A' WHEN 92>=80 THEN 'B' ELSE 'C' END AS grade;
#011기초DDL

학생 테이블 만들기

상세 설명

CREATE TABLE로 열과 자료형을 정의합니다. PRIMARY KEY는 행을 유일하게 식별하고 NOT NULL은 필수 입력을 뜻합니다.

OneCompiler에 복사하여 실행
DROP TABLE IF EXISTS student; CREATE TABLE student(id INT PRIMARY KEY,name VARCHAR(20) NOT NULL,grade INT,score INT); SHOW TABLES;
#012기초INSERT

한 행 INSERT

상세 설명

INSERT INTO ... VALUES로 한 행을 삽입합니다. 열 이름을 명시하면 값의 의미가 분명합니다.

OneCompiler에 복사하여 실행
DROP TABLE IF EXISTS student; CREATE TABLE student(id INT PRIMARY KEY,name VARCHAR(20),score INT); INSERT INTO student(id,name,score) VALUES(1,'홍길동',95); SELECT * FROM student;
#013기초INSERT

여러 행 INSERT

상세 설명

VALUES 뒤에 여러 괄호를 쉼표로 이어 여러 행을 한 번에 삽입합니다.

OneCompiler에 복사하여 실행
DROP TABLE IF EXISTS student; CREATE TABLE student(id INT PRIMARY KEY,name VARCHAR(20),score INT); INSERT INTO student VALUES (1,'홍길동',95),(2,'김철수',88),(3,'이영희',76); SELECT * FROM student;
#014기초DDL

AUTO_INCREMENT

상세 설명

AUTO_INCREMENT는 행 삽입 시 자동 증가 번호를 생성합니다.

OneCompiler에 복사하여 실행
DROP TABLE IF EXISTS book; CREATE TABLE book(id INT AUTO_INCREMENT PRIMARY KEY,title VARCHAR(50) NOT NULL); INSERT INTO book(title) VALUES('데이터베이스 입문'),('SQL 실습'); SELECT * FROM book;
#015기초DDL

DEFAULT 값

상세 설명

DEFAULT는 값을 생략했을 때 자동으로 사용할 기본값입니다.

학습 포인트: MySQL의 BOOLEAN은 보통 TINYINT(1) 형태로 다뤄집니다.
OneCompiler에 복사하여 실행
DROP TABLE IF EXISTS member; CREATE TABLE member(id INT PRIMARY KEY,name VARCHAR(20),active BOOLEAN DEFAULT TRUE); INSERT INTO member(id,name) VALUES(1,'민수'); SELECT * FROM member;
#016기초NULL

NULL 저장

상세 설명

NULL은 값이 없거나 알 수 없음을 나타냅니다. 빈 문자열이나 숫자 0과 다릅니다.

OneCompiler에 복사하여 실행
DROP TABLE IF EXISTS member; CREATE TABLE member(id INT PRIMARY KEY,name VARCHAR(20),email VARCHAR(50)); INSERT INTO member VALUES(1,'민수',NULL),(2,'서연','seo@example.com'); SELECT * FROM member;
#017기초DDL

UNIQUE 제약조건

상세 설명

UNIQUE는 지정한 열에 중복값이 들어가는 것을 막습니다.

OneCompiler에 복사하여 실행
DROP TABLE IF EXISTS account; CREATE TABLE account(id INT PRIMARY KEY,username VARCHAR(30) UNIQUE); INSERT INTO account VALUES(1,'alpha'),(2,'beta'); SELECT * FROM account;
#018기초DDL

CHECK 제약조건

상세 설명

CHECK는 허용할 값의 조건을 테이블 정의에 포함합니다. 여기서는 점수를 0~100으로 제한합니다.

OneCompiler에 복사하여 실행
DROP TABLE IF EXISTS student; CREATE TABLE student(id INT PRIMARY KEY,name VARCHAR(20),score INT CHECK(score BETWEEN 0 AND 100)); INSERT INTO student VALUES(1,'홍길동',95); SELECT * FROM student;
#019기초DDL

DESC 테이블 구조

상세 설명

DESC 또는 DESCRIBE는 열 이름, 자료형, NULL 허용 여부, 키 정보를 보여 줍니다.

OneCompiler에 복사하여 실행
DROP TABLE IF EXISTS student; CREATE TABLE student(id INT PRIMARY KEY,name VARCHAR(20),score INT); DESC student;
#020기초DDL

ALTER TABLE 열 추가

상세 설명

ALTER TABLE ... ADD로 기존 테이블에 새 열을 추가합니다.

OneCompiler에 복사하여 실행
DROP TABLE IF EXISTS student; CREATE TABLE student(id INT PRIMARY KEY,name VARCHAR(20)); ALTER TABLE student ADD score INT; DESC student;
#021기초SELECT

전체 행 조회

상세 설명

SELECT *는 모든 열을 조회합니다.

OneCompiler에 복사하여 실행
DROP TABLE IF EXISTS student;
CREATE TABLE student (
  id INT PRIMARY KEY,
  name VARCHAR(20) NOT NULL,
  grade INT,
  score INT,
  club VARCHAR(20)
);
INSERT INTO student VALUES
(1,'홍길동',1,95,'과학'),
(2,'김철수',2,88,'코딩'),
(3,'이영희',1,76,'과학'),
(4,'박민수',3,64,'로봇'),
(5,'최서연',2,91,'코딩');
SELECT * FROM student;
#022기초SELECT

필요한 열만 조회

상세 설명

필요한 열만 지정하면 결과가 간결하고 의도가 분명합니다.

OneCompiler에 복사하여 실행
DROP TABLE IF EXISTS student;
CREATE TABLE student (
  id INT PRIMARY KEY,
  name VARCHAR(20) NOT NULL,
  grade INT,
  score INT,
  club VARCHAR(20)
);
INSERT INTO student VALUES
(1,'홍길동',1,95,'과학'),
(2,'김철수',2,88,'코딩'),
(3,'이영희',1,76,'과학'),
(4,'박민수',3,64,'로봇'),
(5,'최서연',2,91,'코딩');
SELECT name,score FROM student;
#023기초SELECT

열 별칭 AS

상세 설명

AS는 결과에 표시될 열 이름을 바꿉니다. 원본 열 이름은 그대로입니다.

OneCompiler에 복사하여 실행
DROP TABLE IF EXISTS student;
CREATE TABLE student (
  id INT PRIMARY KEY,
  name VARCHAR(20) NOT NULL,
  grade INT,
  score INT,
  club VARCHAR(20)
);
INSERT INTO student VALUES
(1,'홍길동',1,95,'과학'),
(2,'김철수',2,88,'코딩'),
(3,'이영희',1,76,'과학'),
(4,'박민수',3,64,'로봇'),
(5,'최서연',2,91,'코딩');
SELECT name AS 학생이름,score AS 점수 FROM student;
#024기초WHERE

WHERE 90점 이상

상세 설명

WHERE는 조건을 만족하는 행만 선택합니다.

OneCompiler에 복사하여 실행
DROP TABLE IF EXISTS student;
CREATE TABLE student (
  id INT PRIMARY KEY,
  name VARCHAR(20) NOT NULL,
  grade INT,
  score INT,
  club VARCHAR(20)
);
INSERT INTO student VALUES
(1,'홍길동',1,95,'과학'),
(2,'김철수',2,88,'코딩'),
(3,'이영희',1,76,'과학'),
(4,'박민수',3,64,'로봇'),
(5,'최서연',2,91,'코딩');
SELECT * FROM student WHERE score>=90;
#025기초WHERE

AND 조건

상세 설명

AND는 모든 조건이 참이어야 합니다.

OneCompiler에 복사하여 실행
DROP TABLE IF EXISTS student;
CREATE TABLE student (
  id INT PRIMARY KEY,
  name VARCHAR(20) NOT NULL,
  grade INT,
  score INT,
  club VARCHAR(20)
);
INSERT INTO student VALUES
(1,'홍길동',1,95,'과학'),
(2,'김철수',2,88,'코딩'),
(3,'이영희',1,76,'과학'),
(4,'박민수',3,64,'로봇'),
(5,'최서연',2,91,'코딩');
SELECT * FROM student WHERE grade=2 AND score>=85;
#026기초WHERE

OR 조건

상세 설명

OR는 하나 이상의 조건이 참이면 선택합니다.

OneCompiler에 복사하여 실행
DROP TABLE IF EXISTS student;
CREATE TABLE student (
  id INT PRIMARY KEY,
  name VARCHAR(20) NOT NULL,
  grade INT,
  score INT,
  club VARCHAR(20)
);
INSERT INTO student VALUES
(1,'홍길동',1,95,'과학'),
(2,'김철수',2,88,'코딩'),
(3,'이영희',1,76,'과학'),
(4,'박민수',3,64,'로봇'),
(5,'최서연',2,91,'코딩');
SELECT * FROM student WHERE club='과학' OR club='로봇';
#027기초WHERE

NOT 조건

상세 설명

NOT은 조건의 결과를 반대로 만듭니다.

OneCompiler에 복사하여 실행
DROP TABLE IF EXISTS student;
CREATE TABLE student (
  id INT PRIMARY KEY,
  name VARCHAR(20) NOT NULL,
  grade INT,
  score INT,
  club VARCHAR(20)
);
INSERT INTO student VALUES
(1,'홍길동',1,95,'과학'),
(2,'김철수',2,88,'코딩'),
(3,'이영희',1,76,'과학'),
(4,'박민수',3,64,'로봇'),
(5,'최서연',2,91,'코딩');
SELECT * FROM student WHERE NOT club='코딩';
#028기초WHERE

BETWEEN 범위

상세 설명

BETWEEN은 양 끝값을 포함하는 범위를 검사합니다.

OneCompiler에 복사하여 실행
DROP TABLE IF EXISTS student;
CREATE TABLE student (
  id INT PRIMARY KEY,
  name VARCHAR(20) NOT NULL,
  grade INT,
  score INT,
  club VARCHAR(20)
);
INSERT INTO student VALUES
(1,'홍길동',1,95,'과학'),
(2,'김철수',2,88,'코딩'),
(3,'이영희',1,76,'과학'),
(4,'박민수',3,64,'로봇'),
(5,'최서연',2,91,'코딩');
SELECT name,score FROM student WHERE score BETWEEN 70 AND 90;
#029기초WHERE

IN 여러 후보

상세 설명

IN은 여러 후보값 중 하나와 일치하는지 검사합니다.

OneCompiler에 복사하여 실행
DROP TABLE IF EXISTS student;
CREATE TABLE student (
  id INT PRIMARY KEY,
  name VARCHAR(20) NOT NULL,
  grade INT,
  score INT,
  club VARCHAR(20)
);
INSERT INTO student VALUES
(1,'홍길동',1,95,'과학'),
(2,'김철수',2,88,'코딩'),
(3,'이영희',1,76,'과학'),
(4,'박민수',3,64,'로봇'),
(5,'최서연',2,91,'코딩');
SELECT * FROM student WHERE club IN('과학','로봇');
#030기초WHERE

LIKE 패턴 검색

상세 설명

%는 길이에 상관없이 임의의 문자열을 뜻합니다.

OneCompiler에 복사하여 실행
DROP TABLE IF EXISTS student;
CREATE TABLE student (
  id INT PRIMARY KEY,
  name VARCHAR(20) NOT NULL,
  grade INT,
  score INT,
  club VARCHAR(20)
);
INSERT INTO student VALUES
(1,'홍길동',1,95,'과학'),
(2,'김철수',2,88,'코딩'),
(3,'이영희',1,76,'과학'),
(4,'박민수',3,64,'로봇'),
(5,'최서연',2,91,'코딩');
SELECT * FROM student WHERE name LIKE '김%';
#031기초정렬

ORDER BY 오름차순

상세 설명

ASC는 작은 값부터 큰 값 순입니다.

OneCompiler에 복사하여 실행
DROP TABLE IF EXISTS student;
CREATE TABLE student (
  id INT PRIMARY KEY,
  name VARCHAR(20) NOT NULL,
  grade INT,
  score INT,
  club VARCHAR(20)
);
INSERT INTO student VALUES
(1,'홍길동',1,95,'과학'),
(2,'김철수',2,88,'코딩'),
(3,'이영희',1,76,'과학'),
(4,'박민수',3,64,'로봇'),
(5,'최서연',2,91,'코딩');
SELECT name,score FROM student ORDER BY score ASC;
#032기초정렬

ORDER BY 내림차순

상세 설명

DESC는 큰 값부터 작은 값 순입니다.

OneCompiler에 복사하여 실행
DROP TABLE IF EXISTS student;
CREATE TABLE student (
  id INT PRIMARY KEY,
  name VARCHAR(20) NOT NULL,
  grade INT,
  score INT,
  club VARCHAR(20)
);
INSERT INTO student VALUES
(1,'홍길동',1,95,'과학'),
(2,'김철수',2,88,'코딩'),
(3,'이영희',1,76,'과학'),
(4,'박민수',3,64,'로봇'),
(5,'최서연',2,91,'코딩');
SELECT name,score FROM student ORDER BY score DESC;
#033기초정렬

여러 열 정렬

상세 설명

앞 열부터 정렬하고 동률일 때 다음 열을 사용합니다.

OneCompiler에 복사하여 실행
DROP TABLE IF EXISTS student;
CREATE TABLE student (
  id INT PRIMARY KEY,
  name VARCHAR(20) NOT NULL,
  grade INT,
  score INT,
  club VARCHAR(20)
);
INSERT INTO student VALUES
(1,'홍길동',1,95,'과학'),
(2,'김철수',2,88,'코딩'),
(3,'이영희',1,76,'과학'),
(4,'박민수',3,64,'로봇'),
(5,'최서연',2,91,'코딩');
SELECT grade,name,score FROM student ORDER BY grade ASC,score DESC;
#034기초정렬

LIMIT 상위 3명

상세 설명

ORDER BY와 LIMIT를 결합해 상위 N개 행을 얻습니다.

OneCompiler에 복사하여 실행
DROP TABLE IF EXISTS student;
CREATE TABLE student (
  id INT PRIMARY KEY,
  name VARCHAR(20) NOT NULL,
  grade INT,
  score INT,
  club VARCHAR(20)
);
INSERT INTO student VALUES
(1,'홍길동',1,95,'과학'),
(2,'김철수',2,88,'코딩'),
(3,'이영희',1,76,'과학'),
(4,'박민수',3,64,'로봇'),
(5,'최서연',2,91,'코딩');
SELECT name,score FROM student ORDER BY score DESC LIMIT 3;
#035기초SELECT

DISTINCT 중복 제거

상세 설명

DISTINCT는 중복 결과를 제거합니다.

OneCompiler에 복사하여 실행
DROP TABLE IF EXISTS student;
CREATE TABLE student (
  id INT PRIMARY KEY,
  name VARCHAR(20) NOT NULL,
  grade INT,
  score INT,
  club VARCHAR(20)
);
INSERT INTO student VALUES
(1,'홍길동',1,95,'과학'),
(2,'김철수',2,88,'코딩'),
(3,'이영희',1,76,'과학'),
(4,'박민수',3,64,'로봇'),
(5,'최서연',2,91,'코딩');
SELECT DISTINCT club FROM student;
#036기초UPDATE

UPDATE 한 행

상세 설명

UPDATE는 기존 값을 수정합니다. WHERE가 없으면 모든 행이 바뀔 수 있습니다.

OneCompiler에 복사하여 실행
DROP TABLE IF EXISTS student;
CREATE TABLE student (
  id INT PRIMARY KEY,
  name VARCHAR(20) NOT NULL,
  grade INT,
  score INT,
  club VARCHAR(20)
);
INSERT INTO student VALUES
(1,'홍길동',1,95,'과학'),
(2,'김철수',2,88,'코딩'),
(3,'이영희',1,76,'과학'),
(4,'박민수',3,64,'로봇'),
(5,'최서연',2,91,'코딩');
UPDATE student SET score=90 WHERE id=2; SELECT * FROM student WHERE id=2;
#037기초UPDATE

UPDATE 여러 열

상세 설명

SET에서 쉼표로 여러 열을 동시에 수정할 수 있습니다.

OneCompiler에 복사하여 실행
DROP TABLE IF EXISTS student;
CREATE TABLE student (
  id INT PRIMARY KEY,
  name VARCHAR(20) NOT NULL,
  grade INT,
  score INT,
  club VARCHAR(20)
);
INSERT INTO student VALUES
(1,'홍길동',1,95,'과학'),
(2,'김철수',2,88,'코딩'),
(3,'이영희',1,76,'과학'),
(4,'박민수',3,64,'로봇'),
(5,'최서연',2,91,'코딩');
UPDATE student SET grade=2,score=80 WHERE id=3; SELECT * FROM student WHERE id=3;
#038기초DELETE

DELETE 조건 삭제

상세 설명

DELETE는 조건에 맞는 행을 삭제합니다. WHERE 생략에 특히 주의합니다.

OneCompiler에 복사하여 실행
DROP TABLE IF EXISTS student;
CREATE TABLE student (
  id INT PRIMARY KEY,
  name VARCHAR(20) NOT NULL,
  grade INT,
  score INT,
  club VARCHAR(20)
);
INSERT INTO student VALUES
(1,'홍길동',1,95,'과학'),
(2,'김철수',2,88,'코딩'),
(3,'이영희',1,76,'과학'),
(4,'박민수',3,64,'로봇'),
(5,'최서연',2,91,'코딩');
DELETE FROM student WHERE score<70; SELECT * FROM student;
#039기초NULL

IS NULL 검사

상세 설명

NULL은 = NULL이 아니라 IS NULL로 검사합니다.

OneCompiler에 복사하여 실행
DROP TABLE IF EXISTS member; CREATE TABLE member(id INT PRIMARY KEY,name VARCHAR(20),phone VARCHAR(20)); INSERT INTO member VALUES(1,'민수',NULL),(2,'서연','010-1234'); SELECT * FROM member WHERE phone IS NULL;
#040기초NULL

COALESCE NULL 대체

상세 설명

COALESCE는 왼쪽부터 첫 번째 NULL이 아닌 값을 반환합니다.

OneCompiler에 복사하여 실행
DROP TABLE IF EXISTS member; CREATE TABLE member(id INT PRIMARY KEY,name VARCHAR(20),phone VARCHAR(20)); INSERT INTO member VALUES(1,'민수',NULL),(2,'서연','010-1234'); SELECT name,COALESCE(phone,'미등록') AS phone FROM member;
#041중급집계

COUNT 행 개수

상세 설명

COUNT(*)는 전체 행 수를 셉니다.

OneCompiler에 복사하여 실행
DROP TABLE IF EXISTS student;
CREATE TABLE student (
  id INT PRIMARY KEY,
  name VARCHAR(20) NOT NULL,
  grade INT,
  score INT,
  club VARCHAR(20)
);
INSERT INTO student VALUES
(1,'홍길동',1,95,'과학'),
(2,'김철수',2,88,'코딩'),
(3,'이영희',1,76,'과학'),
(4,'박민수',3,64,'로봇'),
(5,'최서연',2,91,'코딩');
SELECT COUNT(*) AS student_count FROM student;
#042중급집계

SUM AVG

상세 설명

SUM은 합계, AVG는 평균입니다.

OneCompiler에 복사하여 실행
DROP TABLE IF EXISTS student;
CREATE TABLE student (
  id INT PRIMARY KEY,
  name VARCHAR(20) NOT NULL,
  grade INT,
  score INT,
  club VARCHAR(20)
);
INSERT INTO student VALUES
(1,'홍길동',1,95,'과학'),
(2,'김철수',2,88,'코딩'),
(3,'이영희',1,76,'과학'),
(4,'박민수',3,64,'로봇'),
(5,'최서연',2,91,'코딩');
SELECT SUM(score) AS total,AVG(score) AS average FROM student;
#043중급집계

MIN MAX

상세 설명

MIN과 MAX는 최솟값과 최댓값입니다.

OneCompiler에 복사하여 실행
DROP TABLE IF EXISTS student;
CREATE TABLE student (
  id INT PRIMARY KEY,
  name VARCHAR(20) NOT NULL,
  grade INT,
  score INT,
  club VARCHAR(20)
);
INSERT INTO student VALUES
(1,'홍길동',1,95,'과학'),
(2,'김철수',2,88,'코딩'),
(3,'이영희',1,76,'과학'),
(4,'박민수',3,64,'로봇'),
(5,'최서연',2,91,'코딩');
SELECT MIN(score) AS min_score,MAX(score) AS max_score FROM student;
#044중급GROUP BY

학년별 평균

상세 설명

GROUP BY로 학년별 그룹을 만들고 각 그룹 평균을 계산합니다.

OneCompiler에 복사하여 실행
DROP TABLE IF EXISTS student;
CREATE TABLE student (
  id INT PRIMARY KEY,
  name VARCHAR(20) NOT NULL,
  grade INT,
  score INT,
  club VARCHAR(20)
);
INSERT INTO student VALUES
(1,'홍길동',1,95,'과학'),
(2,'김철수',2,88,'코딩'),
(3,'이영희',1,76,'과학'),
(4,'박민수',3,64,'로봇'),
(5,'최서연',2,91,'코딩');
SELECT grade,ROUND(AVG(score),1) AS avg_score FROM student GROUP BY grade;
#045중급GROUP BY

동아리별 인원

상세 설명

같은 동아리를 그룹으로 묶어 인원 수를 계산합니다.

OneCompiler에 복사하여 실행
DROP TABLE IF EXISTS student;
CREATE TABLE student (
  id INT PRIMARY KEY,
  name VARCHAR(20) NOT NULL,
  grade INT,
  score INT,
  club VARCHAR(20)
);
INSERT INTO student VALUES
(1,'홍길동',1,95,'과학'),
(2,'김철수',2,88,'코딩'),
(3,'이영희',1,76,'과학'),
(4,'박민수',3,64,'로봇'),
(5,'최서연',2,91,'코딩');
SELECT club,COUNT(*) AS people FROM student GROUP BY club;
#046중급GROUP BY

HAVING 그룹 조건

상세 설명

HAVING은 GROUP BY 결과 그룹을 조건으로 거릅니다.

OneCompiler에 복사하여 실행
DROP TABLE IF EXISTS student;
CREATE TABLE student (
  id INT PRIMARY KEY,
  name VARCHAR(20) NOT NULL,
  grade INT,
  score INT,
  club VARCHAR(20)
);
INSERT INTO student VALUES
(1,'홍길동',1,95,'과학'),
(2,'김철수',2,88,'코딩'),
(3,'이영희',1,76,'과학'),
(4,'박민수',3,64,'로봇'),
(5,'최서연',2,91,'코딩');
SELECT club,AVG(score) AS avg_score FROM student GROUP BY club HAVING AVG(score)>=80;
#047중급GROUP BY

WHERE 후 GROUP BY

상세 설명

WHERE가 먼저 행을 거른 뒤 GROUP BY가 실행됩니다.

OneCompiler에 복사하여 실행
DROP TABLE IF EXISTS student;
CREATE TABLE student (
  id INT PRIMARY KEY,
  name VARCHAR(20) NOT NULL,
  grade INT,
  score INT,
  club VARCHAR(20)
);
INSERT INTO student VALUES
(1,'홍길동',1,95,'과학'),
(2,'김철수',2,88,'코딩'),
(3,'이영희',1,76,'과학'),
(4,'박민수',3,64,'로봇'),
(5,'최서연',2,91,'코딩');
SELECT grade,COUNT(*) AS people,AVG(score) AS avg_score FROM student WHERE score>=70 GROUP BY grade;
#048중급GROUP BY

집계 결과 정렬

상세 설명

집계 별칭을 ORDER BY에서 사용할 수 있습니다.

OneCompiler에 복사하여 실행
DROP TABLE IF EXISTS student;
CREATE TABLE student (
  id INT PRIMARY KEY,
  name VARCHAR(20) NOT NULL,
  grade INT,
  score INT,
  club VARCHAR(20)
);
INSERT INTO student VALUES
(1,'홍길동',1,95,'과학'),
(2,'김철수',2,88,'코딩'),
(3,'이영희',1,76,'과학'),
(4,'박민수',3,64,'로봇'),
(5,'최서연',2,91,'코딩');
SELECT club,ROUND(AVG(score),1) AS avg_score FROM student GROUP BY club ORDER BY avg_score DESC;
#049중급집계

COUNT DISTINCT

상세 설명

중복을 제거한 값의 개수를 셉니다.

OneCompiler에 복사하여 실행
DROP TABLE IF EXISTS student;
CREATE TABLE student (
  id INT PRIMARY KEY,
  name VARCHAR(20) NOT NULL,
  grade INT,
  score INT,
  club VARCHAR(20)
);
INSERT INTO student VALUES
(1,'홍길동',1,95,'과학'),
(2,'김철수',2,88,'코딩'),
(3,'이영희',1,76,'과학'),
(4,'박민수',3,64,'로봇'),
(5,'최서연',2,91,'코딩');
SELECT COUNT(DISTINCT club) AS club_types FROM student;
#050중급집계

조건부 집계

상세 설명

CASE를 SUM 안에 넣으면 여러 조건별 개수를 한 번에 셀 수 있습니다.

OneCompiler에 복사하여 실행
DROP TABLE IF EXISTS student;
CREATE TABLE student (
  id INT PRIMARY KEY,
  name VARCHAR(20) NOT NULL,
  grade INT,
  score INT,
  club VARCHAR(20)
);
INSERT INTO student VALUES
(1,'홍길동',1,95,'과학'),
(2,'김철수',2,88,'코딩'),
(3,'이영희',1,76,'과학'),
(4,'박민수',3,64,'로봇'),
(5,'최서연',2,91,'코딩');
SELECT SUM(CASE WHEN score>=90 THEN 1 ELSE 0 END) AS high_count,SUM(CASE WHEN score<70 THEN 1 ELSE 0 END) AS low_count FROM student;
#051중급JOIN

INNER JOIN

상세 설명

INNER JOIN은 양쪽에서 조건이 일치하는 행만 결합합니다.

OneCompiler에 복사하여 실행
DROP TABLE IF EXISTS enrollment;
DROP TABLE IF EXISTS course;
DROP TABLE IF EXISTS student;
CREATE TABLE student(id INT PRIMARY KEY,name VARCHAR(20));
CREATE TABLE course(course_id INT PRIMARY KEY,course_name VARCHAR(30));
CREATE TABLE enrollment(student_id INT,course_id INT,score INT);
INSERT INTO student VALUES (1,'홍길동'),(2,'김철수'),(3,'이영희'),(4,'박민수');
INSERT INTO course VALUES (101,'데이터베이스'),(102,'파이썬'),(103,'인공지능');
INSERT INTO enrollment VALUES (1,101,95),(1,102,90),(2,101,85),(3,103,88);
SELECT s.name,c.course_name,e.score FROM enrollment e INNER JOIN student s ON e.student_id=s.id INNER JOIN course c ON e.course_id=c.course_id;
#052중급JOIN

LEFT JOIN

상세 설명

LEFT JOIN은 왼쪽의 모든 행을 유지하므로 수강 기록이 없는 학생도 나타납니다.

OneCompiler에 복사하여 실행
DROP TABLE IF EXISTS enrollment;
DROP TABLE IF EXISTS course;
DROP TABLE IF EXISTS student;
CREATE TABLE student(id INT PRIMARY KEY,name VARCHAR(20));
CREATE TABLE course(course_id INT PRIMARY KEY,course_name VARCHAR(30));
CREATE TABLE enrollment(student_id INT,course_id INT,score INT);
INSERT INTO student VALUES (1,'홍길동'),(2,'김철수'),(3,'이영희'),(4,'박민수');
INSERT INTO course VALUES (101,'데이터베이스'),(102,'파이썬'),(103,'인공지능');
INSERT INTO enrollment VALUES (1,101,95),(1,102,90),(2,101,85),(3,103,88);
SELECT s.name,e.course_id,e.score FROM student s LEFT JOIN enrollment e ON s.id=e.student_id ORDER BY s.id;
#053중급JOIN

RIGHT JOIN

상세 설명

RIGHT JOIN은 오른쪽 테이블의 모든 행을 유지합니다.

OneCompiler에 복사하여 실행
DROP TABLE IF EXISTS enrollment;
DROP TABLE IF EXISTS course;
DROP TABLE IF EXISTS student;
CREATE TABLE student(id INT PRIMARY KEY,name VARCHAR(20));
CREATE TABLE course(course_id INT PRIMARY KEY,course_name VARCHAR(30));
CREATE TABLE enrollment(student_id INT,course_id INT,score INT);
INSERT INTO student VALUES (1,'홍길동'),(2,'김철수'),(3,'이영희'),(4,'박민수');
INSERT INTO course VALUES (101,'데이터베이스'),(102,'파이썬'),(103,'인공지능');
INSERT INTO enrollment VALUES (1,101,95),(1,102,90),(2,101,85),(3,103,88);
SELECT c.course_name,e.student_id FROM enrollment e RIGHT JOIN course c ON e.course_id=c.course_id;
#054중급JOIN

JOIN 후 WHERE

상세 설명

JOIN으로 결합한 뒤 WHERE로 필요한 행만 고릅니다.

OneCompiler에 복사하여 실행
DROP TABLE IF EXISTS enrollment;
DROP TABLE IF EXISTS course;
DROP TABLE IF EXISTS student;
CREATE TABLE student(id INT PRIMARY KEY,name VARCHAR(20));
CREATE TABLE course(course_id INT PRIMARY KEY,course_name VARCHAR(30));
CREATE TABLE enrollment(student_id INT,course_id INT,score INT);
INSERT INTO student VALUES (1,'홍길동'),(2,'김철수'),(3,'이영희'),(4,'박민수');
INSERT INTO course VALUES (101,'데이터베이스'),(102,'파이썬'),(103,'인공지능');
INSERT INTO enrollment VALUES (1,101,95),(1,102,90),(2,101,85),(3,103,88);
SELECT s.name,c.course_name,e.score FROM enrollment e JOIN student s ON e.student_id=s.id JOIN course c ON e.course_id=c.course_id WHERE e.score>=90;
#055중급JOIN

JOIN + GROUP BY

상세 설명

결합한 결과를 과목별로 다시 그룹화합니다.

OneCompiler에 복사하여 실행
DROP TABLE IF EXISTS enrollment;
DROP TABLE IF EXISTS course;
DROP TABLE IF EXISTS student;
CREATE TABLE student(id INT PRIMARY KEY,name VARCHAR(20));
CREATE TABLE course(course_id INT PRIMARY KEY,course_name VARCHAR(30));
CREATE TABLE enrollment(student_id INT,course_id INT,score INT);
INSERT INTO student VALUES (1,'홍길동'),(2,'김철수'),(3,'이영희'),(4,'박민수');
INSERT INTO course VALUES (101,'데이터베이스'),(102,'파이썬'),(103,'인공지능');
INSERT INTO enrollment VALUES (1,101,95),(1,102,90),(2,101,85),(3,103,88);
SELECT c.course_name,COUNT(*) AS people,ROUND(AVG(e.score),1) AS avg_score FROM enrollment e JOIN course c ON e.course_id=c.course_id GROUP BY c.course_id,c.course_name;
#056중급JOIN

수강하지 않은 학생

상세 설명

LEFT JOIN 뒤 오른쪽 키가 NULL인 행을 찾으면 대응 데이터가 없는 왼쪽 행을 찾을 수 있습니다.

OneCompiler에 복사하여 실행
DROP TABLE IF EXISTS enrollment;
DROP TABLE IF EXISTS course;
DROP TABLE IF EXISTS student;
CREATE TABLE student(id INT PRIMARY KEY,name VARCHAR(20));
CREATE TABLE course(course_id INT PRIMARY KEY,course_name VARCHAR(30));
CREATE TABLE enrollment(student_id INT,course_id INT,score INT);
INSERT INTO student VALUES (1,'홍길동'),(2,'김철수'),(3,'이영희'),(4,'박민수');
INSERT INTO course VALUES (101,'데이터베이스'),(102,'파이썬'),(103,'인공지능');
INSERT INTO enrollment VALUES (1,101,95),(1,102,90),(2,101,85),(3,103,88);
SELECT s.id,s.name FROM student s LEFT JOIN enrollment e ON s.id=e.student_id WHERE e.student_id IS NULL;
#057중급JOIN

과목별 최고점

상세 설명

LEFT JOIN을 쓰면 수강생이 없는 과목도 남길 수 있습니다.

OneCompiler에 복사하여 실행
DROP TABLE IF EXISTS enrollment;
DROP TABLE IF EXISTS course;
DROP TABLE IF EXISTS student;
CREATE TABLE student(id INT PRIMARY KEY,name VARCHAR(20));
CREATE TABLE course(course_id INT PRIMARY KEY,course_name VARCHAR(30));
CREATE TABLE enrollment(student_id INT,course_id INT,score INT);
INSERT INTO student VALUES (1,'홍길동'),(2,'김철수'),(3,'이영희'),(4,'박민수');
INSERT INTO course VALUES (101,'데이터베이스'),(102,'파이썬'),(103,'인공지능');
INSERT INTO enrollment VALUES (1,101,95),(1,102,90),(2,101,85),(3,103,88);
SELECT c.course_name,MAX(e.score) AS max_score FROM course c LEFT JOIN enrollment e ON c.course_id=e.course_id GROUP BY c.course_id,c.course_name;
#058중급JOIN

세 테이블 JOIN

상세 설명

연결 테이블을 통해 학생·수강·과목 정보를 하나로 합칩니다.

OneCompiler에 복사하여 실행
DROP TABLE IF EXISTS enrollment;
DROP TABLE IF EXISTS course;
DROP TABLE IF EXISTS student;
CREATE TABLE student(id INT PRIMARY KEY,name VARCHAR(20));
CREATE TABLE course(course_id INT PRIMARY KEY,course_name VARCHAR(30));
CREATE TABLE enrollment(student_id INT,course_id INT,score INT);
INSERT INTO student VALUES (1,'홍길동'),(2,'김철수'),(3,'이영희'),(4,'박민수');
INSERT INTO course VALUES (101,'데이터베이스'),(102,'파이썬'),(103,'인공지능');
INSERT INTO enrollment VALUES (1,101,95),(1,102,90),(2,101,85),(3,103,88);
SELECT s.name,c.course_name,e.score FROM student s JOIN enrollment e ON s.id=e.student_id JOIN course c ON e.course_id=c.course_id ORDER BY s.name,c.course_name;
#059중급JOIN

CROSS JOIN

상세 설명

CROSS JOIN은 가능한 모든 조합을 만들어 2×3=6행을 만듭니다.

OneCompiler에 복사하여 실행
DROP TABLE IF EXISTS size_tbl; DROP TABLE IF EXISTS color_tbl; CREATE TABLE color_tbl(color VARCHAR(10)); CREATE TABLE size_tbl(size VARCHAR(10)); INSERT INTO color_tbl VALUES('Red'),('Blue'); INSERT INTO size_tbl VALUES('S'),('M'),('L'); SELECT * FROM color_tbl CROSS JOIN size_tbl;
#060중급JOIN

Self JOIN

상세 설명

Self JOIN은 같은 테이블에 서로 다른 별칭을 붙여 자기 자신과 결합합니다.

OneCompiler에 복사하여 실행
DROP TABLE IF EXISTS employee; CREATE TABLE employee(id INT PRIMARY KEY,name VARCHAR(20),manager_id INT); INSERT INTO employee VALUES(1,'대표',NULL),(2,'팀장',1),(3,'사원A',2),(4,'사원B',2); SELECT e.name AS employee,m.name AS manager FROM employee e LEFT JOIN employee m ON e.manager_id=m.id;
#061중급서브쿼리

평균보다 높은 점수

상세 설명

서브쿼리가 전체 평균을 먼저 계산하고 바깥 쿼리가 그보다 높은 학생을 찾습니다.

OneCompiler에 복사하여 실행
DROP TABLE IF EXISTS student;
CREATE TABLE student (
  id INT PRIMARY KEY,
  name VARCHAR(20) NOT NULL,
  grade INT,
  score INT,
  club VARCHAR(20)
);
INSERT INTO student VALUES
(1,'홍길동',1,95,'과학'),
(2,'김철수',2,88,'코딩'),
(3,'이영희',1,76,'과학'),
(4,'박민수',3,64,'로봇'),
(5,'최서연',2,91,'코딩');
SELECT name,score FROM student WHERE score>(SELECT AVG(score) FROM student);
#062중급서브쿼리

최고 점수 학생

상세 설명

서브쿼리의 단일 값과 바깥 행을 비교합니다.

OneCompiler에 복사하여 실행
DROP TABLE IF EXISTS student;
CREATE TABLE student (
  id INT PRIMARY KEY,
  name VARCHAR(20) NOT NULL,
  grade INT,
  score INT,
  club VARCHAR(20)
);
INSERT INTO student VALUES
(1,'홍길동',1,95,'과학'),
(2,'김철수',2,88,'코딩'),
(3,'이영희',1,76,'과학'),
(4,'박민수',3,64,'로봇'),
(5,'최서연',2,91,'코딩');
SELECT name,score FROM student WHERE score=(SELECT MAX(score) FROM student);
#063중급서브쿼리

IN 서브쿼리

상세 설명

여러 id가 반환되므로 IN으로 비교합니다.

OneCompiler에 복사하여 실행
DROP TABLE IF EXISTS enrollment;
DROP TABLE IF EXISTS course;
DROP TABLE IF EXISTS student;
CREATE TABLE student(id INT PRIMARY KEY,name VARCHAR(20));
CREATE TABLE course(course_id INT PRIMARY KEY,course_name VARCHAR(30));
CREATE TABLE enrollment(student_id INT,course_id INT,score INT);
INSERT INTO student VALUES (1,'홍길동'),(2,'김철수'),(3,'이영희'),(4,'박민수');
INSERT INTO course VALUES (101,'데이터베이스'),(102,'파이썬'),(103,'인공지능');
INSERT INTO enrollment VALUES (1,101,95),(1,102,90),(2,101,85),(3,103,88);
SELECT name FROM student WHERE id IN(SELECT student_id FROM enrollment WHERE score>=90);
#064중급서브쿼리

EXISTS

상세 설명

EXISTS는 관련 행의 존재 여부만 검사합니다.

OneCompiler에 복사하여 실행
DROP TABLE IF EXISTS enrollment;
DROP TABLE IF EXISTS course;
DROP TABLE IF EXISTS student;
CREATE TABLE student(id INT PRIMARY KEY,name VARCHAR(20));
CREATE TABLE course(course_id INT PRIMARY KEY,course_name VARCHAR(30));
CREATE TABLE enrollment(student_id INT,course_id INT,score INT);
INSERT INTO student VALUES (1,'홍길동'),(2,'김철수'),(3,'이영희'),(4,'박민수');
INSERT INTO course VALUES (101,'데이터베이스'),(102,'파이썬'),(103,'인공지능');
INSERT INTO enrollment VALUES (1,101,95),(1,102,90),(2,101,85),(3,103,88);
SELECT s.id,s.name FROM student s WHERE EXISTS(SELECT 1 FROM enrollment e WHERE e.student_id=s.id);
#065중급서브쿼리

NOT EXISTS

상세 설명

NOT EXISTS는 관련 데이터가 하나도 없는 행을 찾습니다.

OneCompiler에 복사하여 실행
DROP TABLE IF EXISTS enrollment;
DROP TABLE IF EXISTS course;
DROP TABLE IF EXISTS student;
CREATE TABLE student(id INT PRIMARY KEY,name VARCHAR(20));
CREATE TABLE course(course_id INT PRIMARY KEY,course_name VARCHAR(30));
CREATE TABLE enrollment(student_id INT,course_id INT,score INT);
INSERT INTO student VALUES (1,'홍길동'),(2,'김철수'),(3,'이영희'),(4,'박민수');
INSERT INTO course VALUES (101,'데이터베이스'),(102,'파이썬'),(103,'인공지능');
INSERT INTO enrollment VALUES (1,101,95),(1,102,90),(2,101,85),(3,103,88);
SELECT s.id,s.name FROM student s WHERE NOT EXISTS(SELECT 1 FROM enrollment e WHERE e.student_id=s.id);
#066중급서브쿼리

상관 서브쿼리

상세 설명

바깥 행의 course_id를 안쪽 쿼리가 참조해 같은 과목 평균과 비교합니다.

OneCompiler에 복사하여 실행
DROP TABLE IF EXISTS enrollment;
DROP TABLE IF EXISTS course;
DROP TABLE IF EXISTS student;
CREATE TABLE student(id INT PRIMARY KEY,name VARCHAR(20));
CREATE TABLE course(course_id INT PRIMARY KEY,course_name VARCHAR(30));
CREATE TABLE enrollment(student_id INT,course_id INT,score INT);
INSERT INTO student VALUES (1,'홍길동'),(2,'김철수'),(3,'이영희'),(4,'박민수');
INSERT INTO course VALUES (101,'데이터베이스'),(102,'파이썬'),(103,'인공지능');
INSERT INTO enrollment VALUES (1,101,95),(1,102,90),(2,101,85),(3,103,88);
SELECT e.student_id,e.course_id,e.score FROM enrollment e WHERE e.score>(SELECT AVG(e2.score) FROM enrollment e2 WHERE e2.course_id=e.course_id);
#067중급서브쿼리

FROM 안 서브쿼리

상세 설명

FROM 안의 파생 테이블은 임시 결과처럼 사용할 수 있으며 MySQL에서는 별칭이 필요합니다.

OneCompiler에 복사하여 실행
DROP TABLE IF EXISTS student;
CREATE TABLE student (
  id INT PRIMARY KEY,
  name VARCHAR(20) NOT NULL,
  grade INT,
  score INT,
  club VARCHAR(20)
);
INSERT INTO student VALUES
(1,'홍길동',1,95,'과학'),
(2,'김철수',2,88,'코딩'),
(3,'이영희',1,76,'과학'),
(4,'박민수',3,64,'로봇'),
(5,'최서연',2,91,'코딩');
SELECT grade,avg_score FROM (SELECT grade,AVG(score) AS avg_score FROM student GROUP BY grade) AS g WHERE avg_score>=80;
#068중급서브쿼리

스칼라 서브쿼리

상세 설명

한 값만 반환하는 서브쿼리를 SELECT 목록에 넣을 수 있습니다.

OneCompiler에 복사하여 실행
DROP TABLE IF EXISTS student;
CREATE TABLE student (
  id INT PRIMARY KEY,
  name VARCHAR(20) NOT NULL,
  grade INT,
  score INT,
  club VARCHAR(20)
);
INSERT INTO student VALUES
(1,'홍길동',1,95,'과학'),
(2,'김철수',2,88,'코딩'),
(3,'이영희',1,76,'과학'),
(4,'박민수',3,64,'로봇'),
(5,'최서연',2,91,'코딩');
SELECT name,score,(SELECT ROUND(AVG(score),1) FROM student) AS overall_avg FROM student;
#069중급서브쿼리

두 번째 높은 점수

상세 설명

최고점보다 작은 값 중 최댓값을 다시 구합니다.

OneCompiler에 복사하여 실행
DROP TABLE IF EXISTS student;
CREATE TABLE student (
  id INT PRIMARY KEY,
  name VARCHAR(20) NOT NULL,
  grade INT,
  score INT,
  club VARCHAR(20)
);
INSERT INTO student VALUES
(1,'홍길동',1,95,'과학'),
(2,'김철수',2,88,'코딩'),
(3,'이영희',1,76,'과학'),
(4,'박민수',3,64,'로봇'),
(5,'최서연',2,91,'코딩');
SELECT MAX(score) AS second_highest FROM student WHERE score<(SELECT MAX(score) FROM student);
#070중급서브쿼리

서브쿼리 UPDATE

상세 설명

같은 테이블을 읽어 갱신할 때 파생 테이블을 한 단계 두는 MySQL 실습 예제입니다.

OneCompiler에 복사하여 실행
DROP TABLE IF EXISTS student;
CREATE TABLE student (
  id INT PRIMARY KEY,
  name VARCHAR(20) NOT NULL,
  grade INT,
  score INT,
  club VARCHAR(20)
);
INSERT INTO student VALUES
(1,'홍길동',1,95,'과학'),
(2,'김철수',2,88,'코딩'),
(3,'이영희',1,76,'과학'),
(4,'박민수',3,64,'로봇'),
(5,'최서연',2,91,'코딩');
UPDATE student SET score=score+2 WHERE id IN(SELECT id FROM (SELECT id FROM student WHERE score<80) AS x); SELECT * FROM student;
#071중급문자열 함수

SUBSTRING

상세 설명

문자열의 일부를 추출합니다. 위치는 1부터 시작합니다.

예상 결과: DATA / BASE
OneCompiler에 복사하여 실행
SELECT SUBSTRING('DATABASE',1,4) AS p1,SUBSTRING('DATABASE',5) AS p2;
#072중급문자열 함수

TRIM

상세 설명

양끝 공백을 제거합니다.

예상 결과: [MySQL]
OneCompiler에 복사하여 실행
SELECT CONCAT('[',TRIM('   MySQL   '),']') AS trimmed;
#073중급문자열 함수

REPLACE

상세 설명

특정 문자열을 다른 문자열로 치환합니다.

예상 결과: I like MySQL
OneCompiler에 복사하여 실행
SELECT REPLACE('I like Java','Java','MySQL') AS result;
#074중급문자열 함수

LPAD RPAD

상세 설명

정해진 길이가 될 때까지 왼쪽 또는 오른쪽을 채웁니다.

예상 결과: 00025 / SQL...
OneCompiler에 복사하여 실행
SELECT LPAD('25',5,'0') AS left_pad,RPAD('SQL',6,'.') AS right_pad;
#075중급날짜 함수

DATE_ADD DATE_SUB

상세 설명

날짜에 지정 기간을 더하거나 뺍니다.

OneCompiler에 복사하여 실행
SELECT DATE_ADD('2026-08-13',INTERVAL 7 DAY) AS after7,DATE_SUB('2026-08-13',INTERVAL 1 MONTH) AS before1m;
#076중급날짜 함수

DATEDIFF

상세 설명

두 날짜 사이의 일수 차이를 반환합니다.

예상 결과: 7
OneCompiler에 복사하여 실행
SELECT DATEDIFF('2026-08-20','2026-08-13') AS days;
#077중급날짜 함수

YEAR MONTH DAY

상세 설명

날짜에서 연·월·일을 추출합니다.

예상 결과: 2026 / 8 / 13
OneCompiler에 복사하여 실행
SELECT YEAR('2026-08-13') AS y,MONTH('2026-08-13') AS m,DAY('2026-08-13') AS d;
#078중급날짜 함수

DATE_FORMAT

상세 설명

날짜를 원하는 문자열 형식으로 표시합니다.

OneCompiler에 복사하여 실행
SELECT DATE_FORMAT('2026-08-13','%Y년 %m월 %d일') AS formatted;
#079중급날짜 함수

TIMESTAMPDIFF

상세 설명

지정 단위로 두 날짜/시각의 차이를 계산합니다.

OneCompiler에 복사하여 실행
SELECT TIMESTAMPDIFF(YEAR,'2008-03-15','2026-08-13') AS years;
#080중급NULL

IFNULL

상세 설명

첫 인수가 NULL이면 두 번째 값을 반환합니다.

예상 결과: 대체값 / MySQL
OneCompiler에 복사하여 실행
SELECT IFNULL(NULL,'대체값') AS r1,IFNULL('MySQL','대체값') AS r2;
#081고급VIEW

VIEW 만들기

상세 설명

VIEW는 SELECT 결과에 이름을 붙여 가상 테이블처럼 사용합니다.

OneCompiler에 복사하여 실행
DROP TABLE IF EXISTS student;
CREATE TABLE student (
  id INT PRIMARY KEY,
  name VARCHAR(20) NOT NULL,
  grade INT,
  score INT,
  club VARCHAR(20)
);
INSERT INTO student VALUES
(1,'홍길동',1,95,'과학'),
(2,'김철수',2,88,'코딩'),
(3,'이영희',1,76,'과학'),
(4,'박민수',3,64,'로봇'),
(5,'최서연',2,91,'코딩');
DROP VIEW IF EXISTS high_score_student; CREATE VIEW high_score_student AS SELECT id,name,score FROM student WHERE score>=90; SELECT * FROM high_score_student;
#082고급VIEW

VIEW 교체

상세 설명

CREATE OR REPLACE VIEW는 기존 뷰 정의를 새 쿼리로 바꿉니다.

OneCompiler에 복사하여 실행
DROP TABLE IF EXISTS student;
CREATE TABLE student (
  id INT PRIMARY KEY,
  name VARCHAR(20) NOT NULL,
  grade INT,
  score INT,
  club VARCHAR(20)
);
INSERT INTO student VALUES
(1,'홍길동',1,95,'과학'),
(2,'김철수',2,88,'코딩'),
(3,'이영희',1,76,'과학'),
(4,'박민수',3,64,'로봇'),
(5,'최서연',2,91,'코딩');
DROP VIEW IF EXISTS student_summary; CREATE VIEW student_summary AS SELECT id,name,score FROM student; CREATE OR REPLACE VIEW student_summary AS SELECT id,name,grade,score FROM student; SELECT * FROM student_summary;
#083고급INDEX

INDEX 생성

상세 설명

인덱스는 검색을 빠르게 할 수 있지만 저장 공간과 쓰기 비용이 추가됩니다.

OneCompiler에 복사하여 실행
DROP TABLE IF EXISTS student;
CREATE TABLE student (
  id INT PRIMARY KEY,
  name VARCHAR(20) NOT NULL,
  grade INT,
  score INT,
  club VARCHAR(20)
);
INSERT INTO student VALUES
(1,'홍길동',1,95,'과학'),
(2,'김철수',2,88,'코딩'),
(3,'이영희',1,76,'과학'),
(4,'박민수',3,64,'로봇'),
(5,'최서연',2,91,'코딩');
CREATE INDEX idx_student_score ON student(score); SHOW INDEX FROM student;
#084고급INDEX

복합 INDEX

상세 설명

복합 인덱스는 여러 열을 함께 인덱싱하며 열 순서가 중요합니다.

OneCompiler에 복사하여 실행
DROP TABLE IF EXISTS student;
CREATE TABLE student (
  id INT PRIMARY KEY,
  name VARCHAR(20) NOT NULL,
  grade INT,
  score INT,
  club VARCHAR(20)
);
INSERT INTO student VALUES
(1,'홍길동',1,95,'과학'),
(2,'김철수',2,88,'코딩'),
(3,'이영희',1,76,'과학'),
(4,'박민수',3,64,'로봇'),
(5,'최서연',2,91,'코딩');
CREATE INDEX idx_grade_score ON student(grade,score); SHOW INDEX FROM student;
#085고급제약조건

FOREIGN KEY

상세 설명

FOREIGN KEY는 다른 테이블의 키를 참조해 관계 무결성을 유지합니다.

OneCompiler에 복사하여 실행
DROP TABLE IF EXISTS enrollment_fk; DROP TABLE IF EXISTS student_fk; CREATE TABLE student_fk(id INT PRIMARY KEY,name VARCHAR(20)); CREATE TABLE enrollment_fk(id INT PRIMARY KEY,student_id INT,subject VARCHAR(20),FOREIGN KEY(student_id) REFERENCES student_fk(id)); INSERT INTO student_fk VALUES(1,'홍길동'); INSERT INTO enrollment_fk VALUES(1,1,'MySQL'); SELECT * FROM enrollment_fk;
#086고급제약조건

ON DELETE CASCADE

상세 설명

부모 행 삭제 시 참조하는 자식 행도 함께 삭제됩니다.

OneCompiler에 복사하여 실행
DROP TABLE IF EXISTS child_tbl; DROP TABLE IF EXISTS parent_tbl; CREATE TABLE parent_tbl(id INT PRIMARY KEY,name VARCHAR(20)); CREATE TABLE child_tbl(id INT PRIMARY KEY,parent_id INT,FOREIGN KEY(parent_id) REFERENCES parent_tbl(id) ON DELETE CASCADE); INSERT INTO parent_tbl VALUES(1,'부모'); INSERT INTO child_tbl VALUES(10,1); DELETE FROM parent_tbl WHERE id=1; SELECT * FROM child_tbl;
#087고급트랜잭션

트랜잭션 COMMIT

상세 설명

여러 SQL을 하나의 논리 작업 단위로 묶고 COMMIT으로 확정합니다.

OneCompiler에 복사하여 실행
DROP TABLE IF EXISTS bank_account; CREATE TABLE bank_account(id INT PRIMARY KEY,balance INT); INSERT INTO bank_account VALUES(1,10000),(2,5000); START TRANSACTION; UPDATE bank_account SET balance=balance-1000 WHERE id=1; UPDATE bank_account SET balance=balance+1000 WHERE id=2; COMMIT; SELECT * FROM bank_account;
#088고급트랜잭션

트랜잭션 ROLLBACK

상세 설명

ROLLBACK은 아직 확정하지 않은 변경을 취소합니다.

OneCompiler에 복사하여 실행
DROP TABLE IF EXISTS bank_account; CREATE TABLE bank_account(id INT PRIMARY KEY,balance INT); INSERT INTO bank_account VALUES(1,10000); START TRANSACTION; UPDATE bank_account SET balance=balance-3000 WHERE id=1; ROLLBACK; SELECT * FROM bank_account;
#089고급트랜잭션

SAVEPOINT

상세 설명

SAVEPOINT를 이용하면 트랜잭션 전체가 아니라 특정 지점 이후만 되돌릴 수 있습니다.

OneCompiler에 복사하여 실행
DROP TABLE IF EXISTS t; CREATE TABLE t(id INT PRIMARY KEY,value INT); INSERT INTO t VALUES(1,10); START TRANSACTION; UPDATE t SET value=20 WHERE id=1; SAVEPOINT s1; UPDATE t SET value=30 WHERE id=1; ROLLBACK TO s1; COMMIT; SELECT * FROM t;
#090고급DDL

TRUNCATE

상세 설명

테이블 구조는 유지하면서 모든 행을 제거합니다.

예상 결과: 0
OneCompiler에 복사하여 실행
DROP TABLE IF EXISTS temp_data; CREATE TABLE temp_data(id INT); INSERT INTO temp_data VALUES(1),(2),(3); TRUNCATE TABLE temp_data; SELECT COUNT(*) AS row_count FROM temp_data;
#091고급CTE

WITH CTE

상세 설명

WITH로 이름 붙인 임시 결과를 만들어 복잡한 쿼리를 단계적으로 읽기 쉽게 합니다.

OneCompiler에 복사하여 실행
DROP TABLE IF EXISTS student;
CREATE TABLE student (
  id INT PRIMARY KEY,
  name VARCHAR(20) NOT NULL,
  grade INT,
  score INT,
  club VARCHAR(20)
);
INSERT INTO student VALUES
(1,'홍길동',1,95,'과학'),
(2,'김철수',2,88,'코딩'),
(3,'이영희',1,76,'과학'),
(4,'박민수',3,64,'로봇'),
(5,'최서연',2,91,'코딩');
WITH high_score AS(SELECT id,name,score FROM student WHERE score>=90) SELECT * FROM high_score ORDER BY score DESC;
#092고급CTE

CTE + 집계

상세 설명

집계 결과를 CTE에 넣은 뒤 바깥 쿼리에서 다시 조건을 적용합니다.

OneCompiler에 복사하여 실행
DROP TABLE IF EXISTS student;
CREATE TABLE student (
  id INT PRIMARY KEY,
  name VARCHAR(20) NOT NULL,
  grade INT,
  score INT,
  club VARCHAR(20)
);
INSERT INTO student VALUES
(1,'홍길동',1,95,'과학'),
(2,'김철수',2,88,'코딩'),
(3,'이영희',1,76,'과학'),
(4,'박민수',3,64,'로봇'),
(5,'최서연',2,91,'코딩');
WITH grade_avg AS(SELECT grade,AVG(score) AS avg_score FROM student GROUP BY grade) SELECT grade,ROUND(avg_score,1) AS avg_score FROM grade_avg WHERE avg_score>=80;
#093고급윈도 함수

ROW_NUMBER

상세 설명

정렬 기준에 따라 각 행에 고유 순번을 부여합니다.

OneCompiler에 복사하여 실행
DROP TABLE IF EXISTS student;
CREATE TABLE student (
  id INT PRIMARY KEY,
  name VARCHAR(20) NOT NULL,
  grade INT,
  score INT,
  club VARCHAR(20)
);
INSERT INTO student VALUES
(1,'홍길동',1,95,'과학'),
(2,'김철수',2,88,'코딩'),
(3,'이영희',1,76,'과학'),
(4,'박민수',3,64,'로봇'),
(5,'최서연',2,91,'코딩');
SELECT name,score,ROW_NUMBER() OVER(ORDER BY score DESC) AS row_num FROM student;
#094고급윈도 함수

RANK

상세 설명

동점자에게 같은 순위를 주고 다음 순위를 건너뜁니다. 예: 1,2,2,4.

OneCompiler에 복사하여 실행
DROP TABLE IF EXISTS score_tbl; CREATE TABLE score_tbl(name VARCHAR(20),score INT); INSERT INTO score_tbl VALUES('A',100),('B',90),('C',90),('D',80); SELECT name,score,RANK() OVER(ORDER BY score DESC) AS rank_no FROM score_tbl;
#095고급윈도 함수

DENSE_RANK

상세 설명

동점 다음 순위를 건너뛰지 않습니다. 예: 1,2,2,3.

OneCompiler에 복사하여 실행
DROP TABLE IF EXISTS score_tbl; CREATE TABLE score_tbl(name VARCHAR(20),score INT); INSERT INTO score_tbl VALUES('A',100),('B',90),('C',90),('D',80); SELECT name,score,DENSE_RANK() OVER(ORDER BY score DESC) AS rank_no FROM score_tbl;
#096고급윈도 함수

PARTITION BY

상세 설명

PARTITION BY를 쓰면 학년별로 순위를 따로 계산합니다.

OneCompiler에 복사하여 실행
DROP TABLE IF EXISTS student;
CREATE TABLE student (
  id INT PRIMARY KEY,
  name VARCHAR(20) NOT NULL,
  grade INT,
  score INT,
  club VARCHAR(20)
);
INSERT INTO student VALUES
(1,'홍길동',1,95,'과학'),
(2,'김철수',2,88,'코딩'),
(3,'이영희',1,76,'과학'),
(4,'박민수',3,64,'로봇'),
(5,'최서연',2,91,'코딩');
SELECT grade,name,score,RANK() OVER(PARTITION BY grade ORDER BY score DESC) AS grade_rank FROM student;
#097고급윈도 함수

누적 합계

상세 설명

윈도 SUM은 원래 행을 유지하면서 누적 합계를 계산합니다.

OneCompiler에 복사하여 실행
DROP TABLE IF EXISTS student;
CREATE TABLE student (
  id INT PRIMARY KEY,
  name VARCHAR(20) NOT NULL,
  grade INT,
  score INT,
  club VARCHAR(20)
);
INSERT INTO student VALUES
(1,'홍길동',1,95,'과학'),
(2,'김철수',2,88,'코딩'),
(3,'이영희',1,76,'과학'),
(4,'박민수',3,64,'로봇'),
(5,'최서연',2,91,'코딩');
SELECT name,score,SUM(score) OVER(ORDER BY id ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS running_total FROM student;
#098고급윈도 함수

LAG 이전 행

상세 설명

LAG는 이전 행 값을 가져와 전후 비교에 사용합니다.

OneCompiler에 복사하여 실행
DROP TABLE IF EXISTS student;
CREATE TABLE student (
  id INT PRIMARY KEY,
  name VARCHAR(20) NOT NULL,
  grade INT,
  score INT,
  club VARCHAR(20)
);
INSERT INTO student VALUES
(1,'홍길동',1,95,'과학'),
(2,'김철수',2,88,'코딩'),
(3,'이영희',1,76,'과학'),
(4,'박민수',3,64,'로봇'),
(5,'최서연',2,91,'코딩');
SELECT id,name,score,LAG(score) OVER(ORDER BY id) AS previous_score FROM student;
#099고급재귀 CTE

재귀 CTE 1~10

상세 설명

재귀 CTE는 이전 단계 결과를 다시 참조합니다. 종료 조건이 반드시 필요합니다.

예상 결과: 1부터 10까지
OneCompiler에 복사하여 실행
WITH RECURSIVE numbers AS(SELECT 1 AS n UNION ALL SELECT n+1 FROM numbers WHERE n<10) SELECT * FROM numbers;
#100고급재귀 CTE

재귀 CTE 조직도

상세 설명

루트에서 시작해 manager_id 관계를 따라 자식 노드를 반복 탐색합니다. 트리 구조를 SQL로 학습하기 좋은 예입니다.

OneCompiler에 복사하여 실행
DROP TABLE IF EXISTS employee_tree; CREATE TABLE employee_tree(id INT PRIMARY KEY,name VARCHAR(20),manager_id INT); INSERT INTO employee_tree VALUES(1,'대표',NULL),(2,'개발팀장',1),(3,'연구팀장',1),(4,'개발자A',2),(5,'개발자B',2); WITH RECURSIVE org AS(SELECT id,name,manager_id,0 AS depth FROM employee_tree WHERE manager_id IS NULL UNION ALL SELECT e.id,e.name,e.manager_id,org.depth+1 FROM employee_tree e JOIN org ON e.manager_id=org.id) SELECT * FROM org ORDER BY depth,id;