가상 테이블 구조
이 문제들은 아래와 같은 가상의 테이블을 사용한다고 가정합니다.
members(회원 테이블)member_id(회원 아이디, CHAR(8), 기본 키)member_name(회원 이름, VARCHAR(10))join_date(가입일, DATE)city(거주 도시, VARCHAR(10))points(보유 포인트, INT)
products(상품 테이블)product_id(상품 번호, INT, 자동 증가, 기본 키)product_name(상품명, VARCHAR(50))category(상품 분류, VARCHAR(20))price(가격, INT)stock(재고, INT)
orders(주문 테이블)order_id(주문 번호, INT, 자동 증가, 기본 키)member_id(주문한 회원 아이디, CHAR(8))product_id(주문된 상품 번호, INT)order_quantity(주문 수량, INT)order_date(주문일, DATETIME)
DDL (데이터 정의어) 예상 문제
문제 1: CREATE TABLE 기본
요구사항: 위 products 테이블 명세에 맞게 테이블을 생성하는 SQL문을 완성하세요.
product_id는 자동 증가하는 기본 키입니다.product_name은 빈 값을 허용하지 않습니다.price는 값을 입력하지 않으면 기본값으로 0이 들어가야 합니다.
CREATE TABLE products (
product_id INT [___] [___],
product_name VARCHAR(50) [___],
category VARCHAR(20) NULL,
price INT [___] 0,
stock INT
);
정답 및 해설 보기
정답:
CREATE TABLE products (
product_id INT [AUTO_INCREMENT] [PRIMARY KEY],
product_name VARCHAR(50) [NOT NULL],
category VARCHAR(20) NULL,
price INT [DEFAULT] 0,
stock INT
);
핵심 개념:
AUTO_INCREMENT: 새로운 행이 추가될 때마다 자동으로 1씩 증가하는 값을 생성합니다.PRIMARY KEY와 함께 자주 사용됩니다.PRIMARY KEY: 테이블의 각 행을 고유하게 식별하는 기본 키 제약조건입니다.NOT NULL: 해당 컬럼에 반드시 값이 있어야 함을 의미합니다.DEFAULT: 값을 명시적으로 지정하지 않았을 때 자동으로 입력될 기본값을 설정합니다.
문제 2: CREATE TABLE (FOREIGN KEY 포함)
요구사항: 위 orders 테이블 명세에 맞게 테이블을 생성하세요. member_id는 members 테이블의 member_id를 참조하는 외래 키(Foreign Key)입니다.
CREATE TABLE orders (
order_id INT AUTO_INCREMENT PRIMARY KEY,
member_id CHAR(8) NOT NULL,
product_id INT NOT NULL,
order_quantity INT NOT NULL,
order_date DATETIME,
[___] KEY (member_id) [___] members(member_id)
);
정답 및 해설 보기
정답:
CREATE TABLE orders (
order_id INT AUTO_INCREMENT PRIMARY KEY,
member_id CHAR(8) NOT NULL,
product_id INT NOT NULL,
order_quantity INT NOT NULL,
order_date DATETIME,
[FOREIGN] KEY (member_id) [REFERENCES] members(member_id)
);
핵심 개념:
FOREIGN KEY ... REFERENCES ...: 한 테이블의 컬럼이 다른 테이블의 키(주로 기본 키)를 참조하도록 하여 데이터의 무결성을 보장하는 외래 키 제약조건을 설정합니다.
문제 3: ALTER TABLE (컬럼 추가 및 제약조건)
요구사항: 기존 members 테이블에 email이라는 컬럼을 추가하려고 합니다. 이메일은 최대 50자의 가변 길이 문자열이며, 값은 중복될 수 없습니다.
[___] TABLE members
[___] COLUMN email VARCHAR(50) [___];
정답 및 해설 보기
정답:
[ALTER] TABLE members
[ADD] COLUMN email VARCHAR(50) [UNIQUE];
참고: ADD COLUMN에서 COLUMN 키워드는 생략 가능할 때도 있습니다. ADD email ...
핵심 개념:
ALTER TABLE ... ADD COLUMN: 기존 테이블의 구조를 변경하여 새로운 컬럼을 추가하는 명령어입니다.UNIQUE: 해당 컬럼의 모든 값이 고유해야 한다는 제약조건입니다.
DML (데이터 조작어) 예상 문제
문제 4: INSERT
요구사항: members 테이블에 'apple'이라는 아이디의 '김사과' 회원을 '서울' 거주자로 추가하세요. (가입일과 포인트는 지정하지 않음)
[___] INTO members (member_id, member_name, city)
[___] ('apple', '김사과', '서울');
정답 및 해설 보기
정답:
[INSERT] INTO members (member_id, member_name, city)
[VALUES] ('apple', '김사과', '서울');
핵심 개념:
INSERT INTO ... VALUES: 테이블에 새로운 데이터를 한 행씩 추가하는 가장 기본적인 구문입니다. 컬럼 목록을 지정하고,VALUES뒤에 그 순서에 맞는 값들을 넣어줍니다.
문제 5: UPDATE
요구사항: members 테이블에서 member_id가 'apple'인 회원의 거주 도시를 '부산'으로, 포인트를 1000점으로 수정하세요.
[___] members
[___] city = '부산', points = 1000
[___] member_id = 'apple';
정답 및 해설 보기
정답:
[UPDATE] members
[SET] city = '부산', points = 1000
[WHERE] member_id = 'apple';
핵심 개념:
UPDATE ... SET ... WHERE:WHERE절의 조건을 만족하는 행의 데이터를SET절에 명시된 값으로 변경합니다.WHERE를 생략하면 모든 행이 변경되므로 매우 주의해야 합니다.
문제 6: SELECT (WHERE 조건 - AND, 비교 연산자)
요구사항: products 테이블에서 category가 '전자제품'이면서 price가 1,000,000원 이상인 상품의 이름과 가격을 조회하세요.
SELECT product_name, price
FROM products
WHERE category = '전자제품' [___] price [___] 1000000;
정답 및 해설 보기
정답:
SELECT product_name, price
FROM products
WHERE category = '전자제품' [AND] price [>=] 1000000;
핵심 개념:
WHERE [조건1] AND [조건2]: 두 조건을 모두 만족하는 데이터를 필터링합니다.>=: '크거나 같다'는 의미의 비교 연산자입니다.
문제 7: SELECT (WHERE 조건 - IN, LIKE)
요구사항: members 테이블에서 거주 도시(city)가 '서울' 또는 '경기' 또는 '인천'에 해당하고, 이름(member_name)이 '이'씨인 회원의 모든 정보를 조회하세요.
SELECT *
FROM members
WHERE city [___] ('서울', '경기', '인천') AND member_name [___] '이%';
정답 및 해설 보기
정답:
SELECT *
FROM members
WHERE city [IN] ('서울', '경기', '인천') AND member_name [LIKE] '이%';
핵심 개념:
IN:OR연산을 여러 번 사용하는 것보다 간결하게 목록에 포함된 값들 중 하나와 일치하는 데이터를 찾습니다.LIKE: 문자열의 패턴 매칭에 사용됩니다.%는 0개 이상의 모든 문자를 의미하므로 '이%'는 '이'로 시작하는 모든 이름을 찾습니다.
문제 8: SELECT (ORDER BY, LIMIT)
요구사항: products 테이블에서 상품을 가격(price)이 비싼 순서대로 정렬하여 상위 5개만 조회하세요.
SELECT product_name, price
FROM products
[___] BY price [___]
[___] 5;
정답 및 해설 보기
정답:
SELECT product_name, price
FROM products
[ORDER] BY price [DESC]
[LIMIT] 5;
핵심 개념:
ORDER BY: 조회된 결과를 특정 컬럼 기준으로 정렬합니다.DESC: 내림차순(큰 값부터 작은 값 순)으로 정렬합니다. (오름차순은ASC)LIMIT: 조회 결과의 행 수를 제한합니다.ORDER BY와 함께 사용하면 상위 N개를 가져오는 데 유용합니다.
문제 9: SELECT (GROUP BY, 집계 함수)
요구사항: orders 테이블에서 각 회원(member_id)별로 총 주문 수량(order_quantity의 합계)을 계산하여 조회하세요.
SELECT member_id, [___](order_quantity)
FROM orders
[___] BY member_id;
정답 및 해설 보기
정답:
SELECT member_id, [SUM](order_quantity)
FROM orders
[GROUP] BY member_id;
핵심 개념:
GROUP BY: 지정된 컬럼을 기준으로 데이터를 그룹화합니다.SUM(): 그룹화된 각 그룹에 대해 지정된 컬럼의 합계를 계산하는 집계 함수입니다.
문제 10: SELECT (GROUP BY, HAVING)
요구사항: 각 회원(member_id)별로 총 주문 수량이 10개를 초과하는 회원들만 찾아서, 그 회원의 아이디와 총 주문 수량을 조회하세요.
SELECT member_id, SUM(order_quantity)
FROM orders
GROUP BY member_id
[___] [___](order_quantity) > 10;
정답 및 해설 보기
정답:
SELECT member_id, SUM(order_quantity)
FROM orders
GROUP BY member_id
[HAVING] [SUM](order_quantity) > 10;
핵심 개념:
HAVING:GROUP BY로 그룹화된 결과에 대해 조건을 적용하여 필터링합니다.WHERE는 그룹화 이전에 개별 행에 대한 조건을,HAVING은 그룹화 이후에 그룹 자체에 대한 조건을 적용한다는 차이점이 매우 중요합니다.
'SQL' 카테고리의 다른 글
| SQL 시험 범위 정리 노트 (0) | 2025.06.20 |
|---|---|
| *두 번째 시험 예상 문제 (0) | 2025.06.20 |
| 6/18 SQL 시험 범위 요약표 (0) | 2025.06.16 |
| 스토어드 프로시저 (0) | 2025.06.13 |
| [SQL][25.06.12] 176p 내부 조인 ~ 312p (0) | 2025.06.12 |