SQL 공부 (2번째)/+ 문제

 

 

문법형식 예시
INSERT INSERT INTO 테이블 VALUES (...);
UPDATE UPDATE 테이블 SET 컬럼 = 값 WHERE 조건;
DELETE DELETE FROM 테이블 WHERE 조건;
SELECT + ORDER SELECT * FROM 테이블 ORDER BY 컬럼 DESC;
GROUP + HAVING GROUP BY 컬럼 HAVING COUNT(*) >= 2;
LIMIT ORDER BY 가격 DESC LIMIT 1;
형변환 CAST(컬럼 AS 타입) or CONVERT(컬럼, 타입)
INNER JOIN FROM A INNER JOIN B ON A.id = B.id
VIEW
CREATE VIEW 뷰명 AS SELECT ...

---

 

키가 문자형인데 숫자 비교해야 함 WHERE CAST(height AS UNSIGNED) >= ...
숫자를 문자로 바꿀 때 CAST(price AS CHAR)
날짜로 바꿀 때 CAST('2024-01-01' AS DATE)

--

 

SELECT 그룹기준, 집계함수(컬럼) AS 별명
FROM 테이블
GROUP BY 그룹기준

GROUP BY 만나면 *은 금지!
→ 대신 그룹 기준 컬럼, SUM(), COUNT() 같은 집계함수만


집계함수 종류:

  • COUNT(*) ← 갯수
  • SUM(price) ← 합계
  • AVG(height) ← 평균
  • MAX(date) ← 최대값
  • MIN(qnt) ← 최소값

상황 1: "데이터를 조회/검색하시오."

무조건 SELECT

1-1. 그냥 테이블 전체를 보여달라고 할 때

  • 문제 예시: "member 테이블의 모든 데이터를 조회하시오."
  • 공식: SELECT * FROM 테이블명;
  • 정답: SELECT * FROM member;

1-2. 특정 조건에 맞는 데이터만 보여달라고 할 때

  • 문제 예시: "buy 테이블에서 상품(product)이 '신발'인 데이터만 조회하시오."
  • 공식: SELECT * FROM 테이블명 WHERE 조건컬럼 = '값';
  • 정답: SELECT * FROM buy WHERE product = '신발';

1-3. 두 개 테이블을 합쳐서 보여달라고 할 때

  • 문제 예시: "회원 이름(name)과 그 회원이 구매한 상품(product)을 함께 조회하시오."
  • 핵심: 두 테이블을 연결하려면 INNER JOINON이 짝꿍처럼 따라다닌다!
  • 공식:
  • SELECT 보고싶은거1, 보고싶은거2 FROM 테이블1 INNER JOIN 테이블2 ON 테이블1.연결고리 = 테이블2.연결고리;
  • 정답:
  • SELECT member.name, buy.product FROM member INNER JOIN buy ON member.id = buy.id;
  • -- 두 테이블의 연결고리는 id 컬럼

상황 2: "데이터를 삽입/추가하시오."

이건 새로운 데이터 한 줄을 통째로 넣는 겁니다. 무조건 INSERT를 떠올리세요.

  • 문제 예시: "member 테이블에 id는 'ddd', name은 'son'인 회원을 추가하시오."
  • 핵심: INSERT INTOVALUES 는 한 세트!
  • 공식: INSERT INTO 테이블명 (컬럼1, 컬럼2) VALUES ('값1', '값2');
  • 정답: INSERT INTO member (id, name) VALUES ('ddd', 'son');

상황 3: "데이터를 수정/변경하시오."

이건 기존에 있던 데이터의 일부만 바꾸는 겁니다. UPDATE

  • 문제 예시: "id가 'ddd'인 회원의 주소(address)를 'London'으로 변경하시오."
  • 핵심: UPDATESET 은 한 세트! WHERE 안 쓰면 큰일 남!
  • 공식: UPDATE 테이블명 SET 바꿀컬럼 = '새로운값' WHERE 누구의_것인지_알려주는_조건;
  • 정답: UPDATE member SET address = 'London' WHERE id = 'ddd';

상황 4: "데이터를 삭제하시오."

이건 기존에 있던 데이터 한 줄을 통째로 지움. DELETE.

  • 문제 예시: "id가 'ddd'인 회원의 데이터를 삭제하시오."
  • 핵심: WHERE 안 쓰면 큰일 남!
  • 공식: DELETE FROM 테이블명 WHERE 누구의_것인지_알려주는_조건;
  • 정답: DELETE FROM member WHERE id = 'ddd';
하고 싶은 것 명령어 (짝꿍 키워드) 예시
데이터 찾기 SELECT ... FROM SELECT * FROM member;
조건 걸어 찾기 SELECT ... FROM ... WHERE SELECT * FROM member WHERE name='kim';
연결해서 찾기 SELECT ... FROM ... INNER JOIN ... ON SELECT * FROM member INNER JOIN buy ON member.id=buy.id;
데이터 한 줄 넣기 INSERT INTO ... VALUES INSERT INTO member (id) VALUES ('eee');
데이터 일부 바꾸기 UPDATE ... SET ... WHERE UPDATE member SET name='park' WHERE id='eee';
데이터 한 줄 지우기 DELETE FROM ... WHERE DELETE FROM member WHERE id='eee';
(보너스) 컬럼(틀) 추가 ALTER TABLE ... ADD COLUMN ALTER TABLE member ADD COLUMN gender VARCHAR(1);
(보너스) 컬럼(틀) 삭제 ALTER TABLE ... DROP COLUMN ALTER TABLE member DROP COLUMN gender;

 

"이름이 kim인 사람을 찾아라" -> SELECT 서랍을 열고 WHERE를 꺼낸다.
"새로운 회원을 가입시켜라" -> INSERT 서랍을 열고 VALUES를 꺼낸다.
"기존 회원의 주소를 바꿔라" -> UPDATE 서랍을 열고 SETWHERE를 꺼낸다.

--


SQL 짝꿍 공식 암기 세트 (10문제)

가정: member(id, name, address, tel, date) 테이블과 buy(no, id, product, price, qnt) 테이블을 사용합니다.


1. WHERE의 짝꿍: 컬럼명 = '값'

  • member 테이블에서 address가 '서울'인 모든 회원의 name을 조회하려고 합니다. WHERE 뒤에 와야 할 조건식을 채우시오.
  • SELECT name FROM member WHERE ________;

정답 보기**정답:** `address = '서울'`


2. SET의 짝꿍: 컬럼명 = '새로운 값'

  • member 테이블에서 id가 'apple'인 회원의 tel 번호를 '010-1234-5678'로 변경하려고 합니다. SET 뒤에 와야 할 변경식을 채우시오.
  • UPDATE member SET ________ WHERE id = 'apple';

정답 보기**정답:** `tel = '010-1234-5678'`


3. ORDER BY의 짝꿍: 컬럼명 [ASC|DESC]

  • buy 테이블의 상품들을 price가 낮은 순서(오름차순)대로 정렬하려고 합니다. ORDER BY 뒤에 와야 할 정렬 기준을 채우시오.
  • SELECT * FROM buy ORDER BY ________;

정답 보기**정답:** `price ASC` (또는 `price`만 써도 됩니다. ASC는 기본값이라 생략 가능)


4. GROUP BY의 짝꿍: 그룹화할 컬럼명

  • buy 테이블에서 product별로 그룹을 묶어, 각 상품의 개수를 세려고 합니다. GROUP BY 뒤에 와야 할 그룹화 기준 컬럼을 채우시오.
  • SELECT product, COUNT(*) FROM buy GROUP BY ________;

정답 보기**정답:** `product`


5. INNER JOIN의 짝꿍: ON 테이블1.컬럼 = 테이블2.컬럼

  • member 테이블(별칭 m)과 buy 테이블(별칭 b)을 id 컬럼을 기준으로 조인하려고 합니다. ON 뒤에 와야 할 조인 연결 조건을 채우시오.
  • SELECT * FROM member m INNER JOIN buy b ON ________;

정답 보기**정답:** `m.id = b.id`


6. HAVING의 짝꿍: 집계함수(컬럼) 조건

  • product별로 그룹화한 뒤, 평균 가격(AVG(price))이 50,000원을 넘는 그룹만 남기려고 합니다. HAVING 뒤에 와야 할 그룹 조건을 채우시오.
  • SELECT product, AVG(price) FROM buy GROUP BY product HAVING ________;

정답 보기**정답:** `AVG(price) > 50000`


7. LIKE의 짝꿍: '패턴'

  • member 테이블에서 tel 번호가 '010'으로 시작하는 회원을 찾으려고 합니다. LIKE 뒤에 와야 할 검색 패턴을 채우시오.
  • SELECT * FROM member WHERE tel LIKE ________;

정답 보기**정답:** `'010%'`


8. IN의 짝꿍: (값1, 값2, ...) 또는 (서브쿼리)

  • member 테이블에서 address가 '서울' 또는 '경기'인 회원을 찾으려고 합니다. IN 뒤에 와야 할 값 목록을 채우시오.
  • SELECT * FROM member WHERE address IN ________;

정답 보기**정답:** `('서울', '경기')`


9. CAST의 짝꿍: (컬럼 AS 데이터타입)

  • buy 테이블의 price(숫자)를 정수형(SIGNED INTEGER)으로 타입을 변환하려고 합니다. CAST 뒤에 와야 할 변환 규칙을 채우시오.
  • SELECT CAST________ FROM buy;

정답 보기**정답:** `(price AS SIGNED INTEGER)`


10. CREATE VIEW의 짝꿍: 뷰이름 AS SELECT ...

  • v_top_price라는 이름의 뷰를 만들려고 합니다. 이 뷰는 buy 테이블에서 price가 100만원 이상인 상품만 보여줍니다. AS 뒤에 와야 할 SELECT 문을 채우시오.
  • CREATE VIEW v_top_price AS ________;

정답 보기**정답:** `SELECT * FROM buy WHERE price >= 1000000`



SQL 핵심 구조 파악 문제 (10문제)

가정: member(id, name, address, tel, date) 테이블과 buy(no, id, product, price, qnt) 테이블을 사용합니다.


1. INNER JOINWHERE

  • 목표: '서울'에 사는 회원의 이름(name)과 그가 구매한 상품명(product)을 조회.
  • SELECT m.name, b.product FROM member m ________ buy b ON m.id = b.id WHERE m.address = '서울';
정답 보기 **정답:** `INNER JOIN`

2. WHERE LIKE

  • 목표: member 테이블에서 name이 '김'으로 시작하고 두 글자인 회원(예: 김씨)을 조회.
  • SELECT * FROM member WHERE name ________ '김_';
정답 보기 **정답:** `LIKE`

3. GROUP BYORDER BY

  • 목표: 상품(product)별로 평균 가격을 계산하고, 그 평균 가격이 높은 순으로 정렬하여 조회.
  • SELECT product, AVG(price) AS avg_p FROM buy ________ BY product ORDER BY avg_p DESC;
정답 보기 **정답:** `GROUP`

4. 서브쿼리 (IN 사용)

  • 목표: buy 테이블에서 '노트북'을 구매한 기록이 있는 회원의 id를 찾아서, member 테이블에서 그 회원들의 name을 조회.
  • SELECT name FROM member WHERE id ________ (SELECT id FROM buy WHERE product = '노트북');
정답 보기 **정답:** `IN`

5. VIEW 생성

  • 목표: buy 테이블에서 수량(qnt)이 5개 이상인 구매 내역만 보여주는 v_many_items 뷰를 생성.
  • CREATE ________ v_many_items AS SELECT * FROM buy WHERE qnt >= 5;
정답 보기 **정답:** `VIEW`

6. GROUP BYHAVING

  • 목표: 회원(id)별로 총 구매 금액을 계산하되, 총 구매 금액이 100만원 이상인 회원만 조회.
  • SELECT id, SUM(price * qnt) FROM buy GROUP BY id ________ SUM(price *qnt) >= 1000000;
정답 보기 **정답:** `HAVING`

7. ORDER BY (두 개 이상의 컬럼)

  • 목표: member 테이블의 모든 회원을 address 오름차순으로 먼저 정렬하고, 같은 address 내에서는 name 내림차순으로 정렬.
  • SELECT * FROM member ________ BY address ASC, name DESC;
정답 보기 **정답:** `ORDER`

8. INNER JOIN (연결 조건 ON)

  • 목표: member(m) 테이블과 buy(b) 테이블을 조인하여 회원의 name과 구매한 price 조회.
  • SELECT m.name, b.price FROM member m INNER JOIN buy b ________ m.id = b.id;
정답 보기 **정답:** `ON`

9. 서브쿼리 (= 사용, 단일 값 반환)

  • 목표: buy 테이블에서 가장 비싼(MAX) 상품의 price를 알아내고, 그 가격과 동일한 가격의 상품을 조회.
  • SELECT product, price FROM buy WHERE price = (________ MAX(price) FROM buy);
정답 보기 **정답:** `SELECT`

10. VIEW 사용

  • 목표: 위 5번에서 만든 v_many_items 뷰에서 product가 '볼펜'인 데이터를 조회.
  • SELECT * ________ v_many_items WHERE product = '볼펜';
정답 보기 **정답:** `FROM`


CREATE VIEW 집중 훈련 문제

가정: member(id, name, address, tel, date) 테이블과 buy(no, id, product, price, qnt) 테이블을 사용합니다.


1. CREATE VIEW (기본 구조)

  • 목표: buy 테이블의 모든 정보를 담고 있는 v_buy_all 이라는 이름의 뷰를 생성.
  • ________ VIEW v_buy_all ________ SELECT * FROM buy;
정답 보기 **정답:** `CREATE`, `AS`

2. CREATE VIEW (WHERE 조건 포함)

  • 목표: member 테이블에서 address가 '부산'인 회원들의 정보만 보여주는 v_busan_members 뷰를 생성.
  • CREATE VIEW v_busan_members AS ________ id, name, tel FROM member WHERE address = '부산';
정답 보기 **정답:** `SELECT`

3. CREATE VIEW (JOIN 포함)

  • 목표: memberbuy 테이블을 조인하여, 회원의 name, 구매한 product, price 정보를 보여주는 v_purchase_info 뷰를 생성.
  • CREATE VIEW v_purchase_info AS SELECT m.name, b.product, b.price FROM member m ________ ________ buy b ON m.id = b.id;
정답 보기 **정답:** `INNER JOIN`

4. CREATE VIEW (GROUP BY 포함)

  • 목표: buy 테이블에서 product별 총 판매액(price*qnt)을 계산하여 보여주는 v_sales_by_product 뷰를 생성.
  • CREATE VIEW v_sales_by_product AS SELECT product, SUM(price*qnt) AS total_sales FROM buy ________ ________ product;
정답 보기 **정답:** `GROUP BY`

5. CREATE VIEW (복합 쿼리 - 완성형 문제)

  • 목표: 다음 요구사항을 만족하는 v_vip_customer_purchase 뷰를 생성하는 전체 SQL 문을 작성하시오.
    • member 테이블과 buy 테이블을 조인.
    • 회원 name과 구매한 product를 보여줌.
    • 단, 구매 가격(price)이 50만원 이상인 구매 건만 포함.
정답 보기 **정답 SQL:** `CREATE VIEW v_vip_customer_purchase AS SELECT m.name, b.product FROM member m INNER JOIN buy b ON m.id = b.id WHERE b.price >= 500000;`


데이터 형변환 핵심 개념 + 실전 문제


1. 숫자 -> 문자 변환 (가장 기본)

  • 핵심 개념: CAST 함수를 사용하여 숫자 데이터를 문자열(CHAR 또는 VARCHAR) 데이터로 바꿀 수 있습니다. 이렇게 변환된 데이터는 문자열 함수(CONCAT 등)와 함께 사용하거나, 특정 형식의 텍스트로 표현할 때 유용합니다.
  • 문제 시나리오: buy 테이블의 price(숫자) 컬럼을 10자리 문자열(CHAR(10)) 타입으로 변환하여 product명과 함께 조회하려고 합니다.
  • 문제:
    SELECT product, ________(price AS CHAR(10)) FROM buy;
정답 보기 **정답:** `CAST`

2. 실수 -> 정수 변환 (소수점 버리기)

  • 핵심 개념: CAST 함수를 사용하여 실수(FLOAT, DOUBLE, DECIMAL) 데이터를 정수(INTEGER, SIGNED) 데이터로 바꿀 수 있습니다. 이 과정에서 소수점 이하의 값은 반올림 없이 버려집니다.
  • 문제 시나리오: buy 테이블에 있는 모든 상품 가격의 평균(AVG(price))을 구하고, 그 결과에서 소수점 이하를 버린 정수 부분만 조회하려고 합니다.
  • 문제:
    SELECT ________(AVG(price) AS SIGNED INTEGER) FROM buy;
정답 보기 **정답:** `CAST`

3. 문자열 -> 숫자 변환 (계산을 위해)

  • 핵심 개념: 때로는 문자열로 저장된 숫자(예: '12345')를 실제 숫자 타입으로 변환하여 덧셈, 뺄셈 등의 산술 연산을 해야 할 때가 있습니다. 이때도 CAST를 사용합니다.
  • 문제 시나리오: buy 테이블의 qnt(수량) 컬럼이 어떤 이유로 문자열(CHAR) 타입으로 저장되어 있다고 가정합니다. 이 문자열 qnt를 숫자로 변환하여 1을 더한 값을 조회하려고 합니다.
  • 문제:
    SELECT product, ________(qnt AS SIGNED INTEGER) + 1 FROM buy;
정답 보기 **정답:** `CAST`

4. 날짜 -> 문자 변환 (출력 형식 변경)

  • 핵심 개념: 날짜(DATE) 또는 날짜시간(DATETIME) 타입의 데이터를 특정 형식의 문자열로 바꿀 때 사용합니다. CAST를 사용하면 'YYYY-MM-DD' 형태의 기본 문자열로 변환됩니다.
  • 문제 시나리오: member 테이블의 date(날짜) 컬럼을 일반적인 문자열로 변환하여 name과 함께 조회하려고 합니다.
  • 문제:
    SELECT name, ________(date AS CHAR) FROM member;
정답 보기 **정답:** `CAST`


SQL 실전 대비 문제 세트 1 (10문제)

가정: market 데이터베이스의 member(id, name, address, tel, date) 테이블과 buy(no, id, product, price, qnt) 테이블을 사용합니다.


1. [INSERT] 다음 요구사항에 맞는 데이터를 buy 테이블에 삽입하는 SQL 문을 작성하시오.

  • 구매자 id: 'apple'
  • 상품명(product): '노트북'
  • 가격(price): 1200000
  • 수량(qnt): 1

정답 및 해설 보기**정답 SQL:** INSERT INTO buy (id, product, price, qnt) VALUES ('apple', '노트북', 1200000, 1);

해설:
INSERT INTO 구문을 사용하여 buy 테이블에 새로운 구매 데이터를 추가합니다. 각 컬럼명에 맞는 값을 순서대로 VALUES 뒤에 명시합니다.


2. [UPDATE] member 테이블에서 address가 '서울'인 모든 회원의 tel 번호를 '미등록'이라는 문자열로 변경하는 SQL 문을 작성하시오.

정답 및 해설 보기**정답 SQL:** UPDATE member SET tel = '미등록' WHERE address = '서울';

해설:
UPDATE 구문과 WHERE 절을 사용하여 특정 조건(address가 '서울')을 만족하는 모든 행의 tel 컬럼 값을 '미등록'으로 일괄 변경합니다.


3. [DELETE] buy 테이블에서 구매 수량(qnt)이 10개 이상인 모든 구매 내역을 삭제하는 SQL 문을 작성하시오.

정답 및 해설 보기**정답 SQL:** DELETE FROM buy WHERE qnt >= 10;

해설:
DELETE 구문과 WHERE 절을 사용하여 qnt 컬럼의 값이 10 이상인 모든 행을 buy 테이블에서 삭제합니다.


4. [ORDER BY] buy 테이블에서 price가 비싼 순서대로 모든 구매 내역을 정렬하여 product, price 컬럼을 조회하는 SQL 문을 작성하시오.

정답 및 해설 보기**정답 SQL:** SELECT product, price FROM buy ORDER BY price DESC;

해설:
ORDER BY 절을 사용하여 결과를 정렬합니다. DESC는 내림차순(Descendant)을 의미하며, 큰 값부터 작은 값 순서로 정렬합니다. (오름차순은 ASC)


5. [GROUP BY] buy 테이블에서 상품(product)별로 총 판매된 수량(qnt의 합계)을 계산하여, 상품명과 총 판매 수량을 조회하는 SQL 문을 작성하시오.

정답 및 해설 보기**정답 SQL:** SELECT product, SUM(qnt) AS total_qnt FROM buy GROUP BY product;

해설:
GROUP BY product를 사용하여 데이터를 상품별로 그룹화하고, SUM(qnt) 집계 함수를 이용해 각 그룹의 수량 합계를 계산합니다. AS는 결과 컬럼의 이름을 지정합니다.


6. [INNER JOIN] member 테이블과 buy 테이블을 내부 조인하여, id가 'apple'인 회원의 name과 그 회원이 구매한 모든 product 목록을 조회하는 SQL 문을 작성하시오.

정답 및 해설 보기**정답 SQL:** SELECT m.name, b.product FROM member m INNER JOIN buy b ON m.id = b.id WHERE m.id = 'apple';

해설:
두 테이블을 id 컬럼으로 INNER JOIN한 후, WHERE 절을 이용해 member 테이블의 id가 'apple'인 데이터만 필터링하여 원하는 정보를 조회합니다.


7. [형변환] buy 테이블의 price 컬럼(숫자)을 '가격: 1200000원'과 같은 형식의 문자열로 만들어 product와 함께 조회하시오. (MySQL의 CONCAT 함수 활용)

정답 및 해설 보기**정답 SQL:** SELECT product, CONCAT('가격: ', price, '원') AS price_info FROM buy;

해설:
CONCAT 함수는 여러 문자열이나 컬럼 값을 하나로 합쳐줍니다. 숫자 타입인 price 컬럼은 문자열과 합쳐지는 과정에서 자동으로 문자열로 형변환됩니다. 이 문제는 암시적 형변환과 문자열 함수를 동시에 테스트합니다.


8. [서브쿼리] buy 테이블에서 한번이라도 '노트북'을 구매한 기록이 있는 모든 회원의 name을 member 테이블에서 조회하는 SQL 문을 작성하시오. (단, IN과 서브쿼리를 사용할 것)

정답 및 해설 보기**정답 SQL:** SELECT name FROM member WHERE id IN (SELECT id FROM buy WHERE product = '노트북');

해설:
서브쿼리 (SELECT id FROM buy WHERE product = '노트북')가 먼저 실행되어 '노트북'을 구매한 모든 회원의 id 목록을 만듭니다. 메인 쿼리는 이 id 목록에 포함된(IN) 회원의 name을 member 테이블에서 찾아냅니다.


9. [VIEW 생성] member 테이블에서 address가 '경기'인 회원들의 id, name, tel 정보만 담고 있는 v_gyeonggi_members라는 이름의 뷰(VIEW)를 생성하는 SQL 문을 작성하시오.

정답 및 해설 보기**정답 SQL:** CREATE VIEW v_gyeonggi_members AS SELECT id, name, tel FROM member WHERE address = '경기';

해설:
CREATE VIEW 구문을 사용하여 특정 SELECT 문을 가상의 테이블(뷰)로 저장합니다. 이렇게 하면 복잡한 쿼리를 단순하게 재사용할 수 있습니다.


10. [VIEW 사용] 위 9번에서 생성한 v_gyeonggi_members 뷰를 사용하여, tel 번호가 '미등록'인 회원의 name을 조회하는 SQL 문을 작성하시오.

정답 및 해설 보기**정답 SQL:** SELECT name FROM v_gyeonggi_members WHERE tel = '미등록';

해설:
뷰는 생성된 후 일반 테이블처럼 SELECT 문의 FROM 절에서 사용할 수 있습니다. 이미 '경기' 지역 회원으로 필터링된 뷰를 대상으로 추가 조건을 적용하여 데이터를 간단하게 조회합니다.



SQL 기초 다지기 문제 세트 1 (10문제)

가정: member(id, name, address, tel, date) 테이블과 buy(no, id, product, price, qnt) 테이블을 사용합니다.


1. INSERT (기본)

  • member 테이블에 id는 'apple', name은 '김사과'인 데이터를 삽입하려고 합니다. 빈칸을 채우시오.
  • ________ INTO member (id, name) ________ ('apple', '김사과');

정답 보기 **정답:** `INSERT INTO member (id, name) VALUES ('apple', '김사과');`


2. UPDATE (기본)

  • member 테이블에서 id가 'apple'인 회원의 address를 '부산'으로 변경하려고 합니다. 빈칸을 채우시오.
  • ________ member ________ address = '부산' ________ id = 'apple';

정답 보기 **정답:** `UPDATE member SET address = '부산' WHERE id = 'apple';`


3. DELETE (기본)

  • buy 테이블에서 product가 '휴지'인 모든 구매 내역을 삭제하려고 합니다. 빈칸을 채우시오.
  • ________ FROM buy ________ product = '휴지';

정답 보기 **정답:** `DELETE FROM buy WHERE product = '휴지';`


4. SELECTORDER BY

  • member 테이블의 모든 회원을 name의 역순(내림차순)으로 정렬하여 nametel을 조회하려고 합니다. 빈칸을 채우시오.
  • SELECT name, tel FROM member ________ ____ name ________;

정답 보기 **정답:** `SELECT name, tel FROM member ORDER BY name DESC;`


5. SELECTGROUP BY

  • buy 테이블에서 각 id별로 총 몇 번 구매했는지(구매 건수)를 세려고 합니다. id와 구매 건수를 조회하시오. 빈칸을 채우시오.
  • SELECT id, ________(*) AS '구매건수' FROM buy ________ ____ id;

정답 보기 **정답:** `SELECT id, COUNT(*) AS '구매건수' FROM buy GROUP BY id;`


6. INNER JOIN (기본)

  • member 테이블(별칭 m)과 buy 테이블(별칭 b)을 내부 조인하여, 회원의 name과 구매한 product를 조회하려고 합니다. 두 테이블의 연결고리는 id 컬럼입니다. 빈칸을 채우시오.
  • SELECT m.name, b.product FROM member m ________ ________ buy b ____ m.id = b.id;

정답 보기 **정답:** `SELECT m.name, b.product FROM member m INNER JOIN buy b ON m.id = b.id;`


7. 데이터 형 변환 (CAST)

  • buy 테이블의 price(숫자)를 문자열(CHAR)로 변환하여 조회하려고 합니다. 빈칸을 채우시오.
  • SELECT ________(price ____ CHAR) FROM buy;

정답 보기 **정답:** `SELECT CAST(price AS CHAR) FROM buy;`


8. 서브쿼리 (WHERE 절)

  • '김사과'라는 회원의 idmember 테이블에서 찾고, 그 id를 이용해 buy 테이블에서 해당 회원의 구매 내역을 조회하려고 합니다. 빈칸을 채우시오.
  • SELECT * FROM buy WHERE id = (________ id FROM member ________ name = '김사과');

정답 보기 **정답:** `SELECT * FROM buy WHERE id = (SELECT id FROM member WHERE name = '김사과');`


9. VIEW 생성 (기본)

  • '서울'에 사는 회원들만 보여주는 v_seoul_user라는 이름의 뷰를 생성하려고 합니다. 빈칸을 채우시오.
  • ________ ________ v_seoul_user ____ SELECT * FROM member WHERE address = '서울';

정답 보기 **정답:** `CREATE VIEW v_seoul_user AS SELECT * FROM member WHERE address = '서울';`


10. GROUP BYHAVING

  • id별로 구매한 총 금액(price의 합계)을 계산하되, 그 총 금액이 100,000원을 초과하는 id만 조회하려고 합니다. 빈칸을 채우시오.
  • SELECT id, SUM(price) FROM buy GROUP BY id ________ SUM(price) > 100000;

정답 보기 **정답:** `SELECT id, SUM(price) FROM buy GROUP BY id HAVING SUM(price) > 100000;`


SQL 공식 암기 세트 2 (10문제)

가정: member(id, name, address, tel, date) 테이블과 buy(no, id, product, price, qnt) 테이블을 사용합니다.


1. UPDATE (특정 값으로 변경)

  • buy 테이블에서 product가 '모니터'인 모든 상품의 price를 200000으로 변경하려고 합니다.
  • ________ buy ________ price = 200000 ________ product = '모니터';

정답 보기 **정답:** `UPDATE buy SET price = 200000 WHERE product = '모니터';`


2. ORDER BY (두 가지 조건으로 정렬)

  • member 테이블에서 모든 회원을 address 순으로 먼저 정렬하고, 같은 address 내에서는 name의 역순으로 정렬하여 모든 정보를 조회하려고 합니다.
  • SELECT * FROM member ________ ________ address ASC, name ________;

정답 보기 **정답:** `SELECT * FROM member ORDER BY address ASC, name DESC;`


3. GROUP BY 와 집계 함수 (AVG)

  • buy 테이블에서 상품(product)별 평균 가격(price)을 계산하여 조회하려고 합니다.
  • SELECT product, ________(price) FROM buy ________ ________ product;

정답 보기 **정답:** `SELECT product, AVG(price) FROM buy GROUP BY product;`


4. INNER JOIN (별칭 사용)

  • 회원(member, 별칭 m)의 name과, 그 회원이 구매한 상품의 price를 조회하려고 합니다.
  • SELECT m.name, b.price ________ member m ________ ________ buy b ________ m.id = b.id;

정답 보기 **정답:** `SELECT m.name, b.price FROM member m INNER JOIN buy b ON m.id = b.id;`


5. WHERELIKE

  • member 테이블에서 name이 '김'으로 시작하는 모든 회원의 정보를 조회하려고 합니다.
  • SELECT * FROM member ________ name ________ '김%';

정답 보기 **정답:** `SELECT * FROM member WHERE name LIKE '김%';`


6. 서브쿼리 와 IN

  • buy 테이블에서 price가 100만원 이상인 상품을 구매한 회원의 id 목록을 먼저 찾고, 그 회원들의 namemember 테이블에서 조회하려고 합니다.
  • SELECT name FROM member WHERE id ________ (________ id FROM buy ________ price >= 1000000);

정답 보기 **정답:** `SELECT name FROM member WHERE id IN (SELECT id FROM buy WHERE price >= 1000000);`


7. VIEW 사용

  • 미리 만들어진 v_seoul_user 라는 뷰에서 name이 '박서울'인 사람의 정보를 조회하려고 합니다.
  • ________ * ________ v_seoul_user ________ name = '박서울';

정답 보기 **정답:** `SELECT * FROM v_seoul_user WHERE name = '박서울';`


8. 데이터 형 변환 (CONVERT)

  • buy 테이블의 qnt(수량, 숫자)를 문자열(CHAR)로 변환하여 조회하려고 합니다.
  • SELECT ________(qnt, ________) FROM buy;

정답 보기 **정답:** `SELECT CONVERT(qnt, CHAR) FROM buy;`


9. DELETEWHERE

  • member 테이블에서 tel 정보가 없는(NULL) 모든 회원을 삭제하려고 합니다.
  • ________ ________ member ________ tel IS ________;

정답 보기 **정답:** `DELETE FROM member WHERE tel IS NULL;`


10. GROUP BY, HAVING, ORDER BY 모두 사용

  • id별로 구매한 총 금액(price 합계)을 계산하고, 그 총액이 50,000원 이상인 id만 골라내어, 총액이 적은 순서대로 정렬하여 조회하려고 합니다.
  • SELECT id, SUM(price) AS total FROM buy ________ ________ id ________ SUM(price) >= 50000 ________ ________ total ASC;

정답 보기 **정답:** `SELECT id, SUM(price) AS total FROM buy GROUP BY id HAVING SUM(price) >= 50000 ORDER BY total ASC;`




SQL 실전 대비 문제 세트 1 (10문제)

가정: market 데이터베이스의 member(id, name, address, tel, date) 테이블과 buy(no, id, product, price, qnt) 테이블을 사용합니다.


1. [INSERT] 다음 요구사항에 맞는 데이터를 buy 테이블에 삽입하는 SQL 문을 작성하시오.

  • 구매자 id: 'apple'
  • 상품명(product): '노트북'
  • 가격(price): 1200000
  • 수량(qnt): 1

정답 및 해설 보기 **정답 SQL:** INSERT INTO buy (id, product, price, qnt) VALUES ('apple', '노트북', 1200000, 1);

해설:
INSERT INTO 구문을 사용하여 buy 테이블에 새로운 구매 데이터를 추가합니다. 각 컬럼명에 맞는 값을 순서대로 VALUES 뒤에 명시합니다.


2. [UPDATE] member 테이블에서 address가 '서울'인 모든 회원의 tel 번호를 '미등록'이라는 문자열로 변경하는 SQL 문을 작성하시오.

정답 및 해설 보기 **정답 SQL:** UPDATE member SET tel = '미등록' WHERE address = '서울';

해설:
UPDATE 구문과 WHERE 절을 사용하여 특정 조건(address가 '서울')을 만족하는 모든 행의 tel 컬럼 값을 '미등록'으로 일괄 변경합니다.


3. [DELETE] buy 테이블에서 구매 수량(qnt)이 10개 이상인 모든 구매 내역을 삭제하는 SQL 문을 작성하시오.

정답 및 해설 보기 **정답 SQL:** DELETE FROM buy WHERE qnt >= 10;

해설:
DELETE 구문과 WHERE 절을 사용하여 qnt 컬럼의 값이 10 이상인 모든 행을 buy 테이블에서 삭제합니다.


4. [ORDER BY] buy 테이블에서 price가 비싼 순서대로 모든 구매 내역을 정렬하여 product, price 컬럼을 조회하는 SQL 문을 작성하시오.

정답 및 해설 보기 **정답 SQL:** SELECT product, price FROM buy ORDER BY price DESC;

해설:
ORDER BY 절을 사용하여 결과를 정렬합니다. DESC는 내림차순(Descendant)을 의미하며, 큰 값부터 작은 값 순서로 정렬합니다. (오름차순은 ASC)


5. [GROUP BY] buy 테이블에서 상품(product)별로 총 판매된 수량(qnt의 합계)을 계산하여, 상품명과 총 판매 수량을 조회하는 SQL 문을 작성하시오.

정답 및 해설 보기 **정답 SQL:** SELECT product, SUM(qnt) AS total_qnt FROM buy GROUP BY product;

해설:
GROUP BY product를 사용하여 데이터를 상품별로 그룹화하고, SUM(qnt) 집계 함수를 이용해 각 그룹의 수량 합계를 계산합니다. AS는 결과 컬럼의 이름을 지정합니다.


6. [INNER JOIN] member 테이블과 buy 테이블을 내부 조인하여, id가 'apple'인 회원의 name과 그 회원이 구매한 모든 product 목록을 조회하는 SQL 문을 작성하시오.

정답 및 해설 보기 **정답 SQL:** SELECT m.name, b.product FROM member m INNER JOIN buy b ON m.id = b.id WHERE m.id = 'apple';

해설:
두 테이블을 id 컬럼으로 INNER JOIN한 후, WHERE 절을 이용해 member 테이블의 id가 'apple'인 데이터만 필터링하여 원하는 정보를 조회합니다.


7. [형변환] buy 테이블의 price 컬럼(숫자)을 '가격: 1200000원'과 같은 형식의 문자열로 만들어 product와 함께 조회하시오. (MySQL의 CONCAT 함수 활용)

정답 및 해설 보기 **정답 SQL:** SELECT product, CONCAT('가격: ', price, '원') AS price_info FROM buy;

해설:
CONCAT 함수는 여러 문자열이나 컬럼 값을 하나로 합쳐줍니다. 숫자 타입인 price 컬럼은 문자열과 합쳐지는 과정에서 자동으로 문자열로 형변환됩니다. 이 문제는 암시적 형변환과 문자열 함수를 동시에 테스트합니다.


8. [서브쿼리] buy 테이블에서 한번이라도 '노트북'을 구매한 기록이 있는 모든 회원의 namemember 테이블에서 조회하는 SQL 문을 작성하시오. (단, IN과 서브쿼리를 사용할 것)

정답 및 해설 보기 **정답 SQL:** SELECT name FROM member WHERE id IN (SELECT id FROM buy WHERE product = '노트북');

해설:
서브쿼리 (SELECT id FROM buy WHERE product = '노트북')가 먼저 실행되어 '노트북'을 구매한 모든 회원의 id 목록을 만듭니다. 메인 쿼리는 이 id 목록에 포함된(IN) 회원의 namemember 테이블에서 찾아냅니다.


9. [VIEW 생성] member 테이블에서 address가 '경기'인 회원들의 id, name, tel 정보만 담고 있는 v_gyeonggi_members라는 이름의 뷰(VIEW)를 생성하는 SQL 문을 작성하시오.

정답 및 해설 보기 **정답 SQL:** CREATE VIEW v_gyeonggi_members AS SELECT id, name, tel FROM member WHERE address = '경기';

해설:
CREATE VIEW 구문을 사용하여 특정 SELECT 문을 가상의 테이블(뷰)로 저장합니다. 이렇게 하면 복잡한 쿼리를 단순하게 재사용할 수 있습니다.


10. [VIEW 사용] 위 9번에서 생성한 v_gyeonggi_members 뷰를 사용하여, tel 번호가 '미등록'인 회원의 name을 조회하는 SQL 문을 작성하시오.

정답 및 해설 보기 **정답 SQL:** SELECT name FROM v_gyeonggi_members WHERE tel = '미등록';

해설:
뷰는 생성된 후 일반 테이블처럼 SELECT 문의 FROM 절에서 사용할 수 있습니다. 이미 '경기' 지역 회원으로 필터링된 뷰를 대상으로 추가 조건을 적용하여 데이터를 간단하게 조회합니다.


 

'SQL' 카테고리의 다른 글

[문제] 스토어드 프로시저  (0) 2025.06.30
세번째 시험준비  (0) 2025.06.30
SQL 시험 범위 정리 노트  (0) 2025.06.20
*두 번째 시험 예상 문제  (0) 2025.06.20
공부용 시험문제  (0) 2025.06.18