1. 문제 출처

https://school.programmers.co.kr/learn/courses/30/lessons/151138

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

2. 문의 의도

3. 풀이

-- 코드를 입력하세요
SELECT HISTORY_ID, CAR_ID, DATE_FORMAT(START_DATE,'%Y-%m-%d') AS START_DATE, DATE_FORMAT(END_DATE,'%Y-%m-%d') AS END_DATE,
CASE WHEN END_DATE - START_DATE >= 90 THEN "장기 대여"
     ELSE "단기 대여" END AS RENT_TYPE
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE (MONTH(START_DATE) = 9) AND (YEAR(START_DATE) = 2022)
ORDER BY HISTORY_ID DESC

1. 문제 출처

https://school.programmers.co.kr/learn/courses/30/lessons/157340

2. 문의 의도

  • 날짜를 기준으로 대여 가능 여부를 확인하는 쿼리
  • case when 으로 비트 마스킹 후 min/max함수를 이용해 이용 가능한 차량 출력하기

3. 풀이

# car_id 기준으로 한번이라도 0이 등장하면 못빌리는 자동차
select car_id, case when possible = 1 then '대여 가능' else '대여중' end as AVAILABILITY
from(
    select car_id, 
        min(possible) as possible
    from 
        (
            select car_id, 
            DATE_FORMAT(start_date,'%Y-%m-%d'), DATE_FORMAT(end_date,'%Y-%m-%d'),
            case when start_date <= '2022-10-16' and end_date >= '2022-10-16' then 0
            else  1 end as possible        # 해당하는 기간에 16일이 껴있으면 0(불가), 1(가능)
            from car_rental_company_rental_history
            order by car_id asc
        ) t1
    group by car_id
    ) t2
order by car_id desc

 

1. 문제 출처

https://school.programmers.co.kr/learn/courses/30/lessons/164670

2. 문의 의도

  • 서브쿼리를 이용한 행 필터링

3. 풀이

  • 오답
SELECT B.WRITER_ID AS USER_ID, 
U.NICKNAME, CONCAT(U.STREET_ADDRESS1," ",U.STREET_ADDRESS2) AS 전체주소, 
CONCAT(SUBSTR(U.TLNO,1,3),"-",SUBSTR(U.TLNO,4,4),"-",SUBSTR(U.TLNO,8,4)) AS 전화번호
FROM USED_GOODS_BOARD AS B JOIN USED_GOODS_USER AS U ON B.WRITER_ID=U.USER_ID
GROUP BY B.WRITER_ID
HAVING COUNT(*) >= 3
ORDER BY B.WRITER_ID DESC
  • 정답
select distinct(u.USER_ID), u.NICKNAME, 
       concat(CITY,' ',STREET_ADDRESS1,' ',STREET_ADDRESS2) as 전체주소, 
       concat(left(TLNO,3),'-',substr(TLNO,4,4),'-',right(TLNO,4)) as 전화번호
from USED_GOODS_BOARD as b
join USED_GOODS_USER as u on b.WRITER_ID = u.USER_ID
where b.WRITER_ID in (select WRITER_ID 
                     from USED_GOODS_BOARD
                     group by WRITER_ID
                     having count(WRITER_ID) >= 3)
order by user_id desc

 

위 오답과 정답 둘 다 예시 테이블에서는 적어도 같은 테이블로 출력된다. 하지만 채점하면 에러가 난다.  그 이유는 프로그래머스에서 채점하는 테이블이 예시 테이블이 아닌 채점 테이블이 따로 있기 때문이다. 오답의 경우 두 테이블을 조인하여 having count(*)을 이용하여 필터링을 했는데 다음과 같은 상황에 엣지 케이스가 있다.

"동일한 유저가 판매글을 2개 올리고, 주소가 2개 인 경우" 이 경우 문제에 따르면 중고 거래 게시물을 3건 이상 등록한 것이 아닌 2건이지만 오답처럼 join과정에서 4개로 뻥튀기되고 count(*)로 집계하는 과정에서 의도치 않은 필터링이 된다. 따라서 정답처럼 사전에 서브쿼리로 writer_id를 선별해놓고 필터링 하는게 적절하다고 할 수 있겠다.

인 오류도 생각할 수 있으나.. 그냥 오답에 CITY 컬럼이 누락됐다. 너무 복잡하게 생각했네 🤣

1. 문제 출처

https://leetcode.com/problems/managers-with-at-least-5-direct-reports/description/?envType=study-plan-v2&envId=top-sql-50

2. 문제 의도

  • 계층형 데이터를 구하기 위한 self-join

3. 풀이

  • mangerid와 id를 키로 inner join 
  • groupy - having 조건을 이용하여 5개 이상의 부하직원이 있는 사람을 조회
select e2.name
from employee e1 inner join employee e2 on e1.managerid = e2.id
group by e1.managerid
having count(e1.id) >=5
order by e1.id asc

1. 문제 출처

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

2. 문의 의도

  • case when 문법을 이용한 데이터 변환

3. 풀이

  • price의 가격이 상한선이 정해져 있지 않아서, 8만원까지 하드 코딩 하거나, resursive 문법으로 해결
SELECT 
    CASE 
        WHEN (PRICE/10000) < 1 THEN 0
        WHEN (PRICE/10000) < 2 THEN 10000
        WHEN (PRICE/10000) < 3 THEN 20000
        WHEN (PRICE/10000) < 4 THEN 30000
        WHEN (PRICE/10000) < 5 THEN 40000
        WHEN (PRICE/10000) < 6 THEN 50000
        WHEN (PRICE/10000) < 7 THEN 60000
        WHEN (PRICE/10000) < 8 THEN 70000
        WHEN (PRICE/10000) < 9 THEN 80000
    END AS PRICE_GROUP,
    COUNT(PRODUCT_ID) AS PRODUCTS
FROM PRODUCT
GROUP BY PRICE_GROUP
ORDER BY PRICE_GROUP ASC

 

MySQL은 데이터베이스의 한 종류로, 가장 범용적인 데이터베이스입니다. 일반적으로 회사에 데이터베이스에 구축되어 있으면 따로 로컬컴퓨터에 설치하지 않고 SQL WorkBench, DBeaver등 어플리케이션 툴을 이용하여 접속하면 되기 때문에 설치할 일이 없습니다. 반면 개인 학습 혹은 서버를 띄운 상태에서 데이터베이스를 설치하고자 한다면 이 가이드를 통해 로컬에 MySQL 데이터베이스를 설치할 수 있습니다.

Last Updated

  • 2024-06-26: Custom 설치방법 추가
  • 2024-11-26: Initializing Database 오류 방법추가
  • 2025-05-19: Trouble shooting 추가

1. MySQL 설치

MySQL을 설치하는 것은 설치파일을 실행 후 "다음", "다음"의연속입니다. 중요한 점은 중간에 mysql 접속을 위한 비밀번호 설정과 mysql 포트(지하철로 따지면 출구번호)가 3306으로 사전 지정이 잘 되어있는지 확인하면 됩니다. 이를 통해 MySQL을 로컬 컴퓨터에 설치할 수 있고 추후 Database에 접속할 수 있는 Command Line 혹은 DBeaver와 같은 Application을 통해서 테이블을 생성하고 SQL쿼리를 실행할 수 있게 됩니다. 

https://dev.mysql.com/downloads/mysql/

 

MySQL :: Download MySQL Community Server

Select Version: 8.4.0 LTS 8.0.37 Select Operating System: Select Operating System… Microsoft Windows Ubuntu Linux Debian Linux SUSE Linux Enterprise Server Red Hat Enterprise Linux / Oracle Linux Fedora Linux - Generic Oracle Solaris macOS Source Code Se

dev.mysql.com

 

여기서 본인 운영체제에 따라 Windows 혹은 Macos 를 선택해줍니다.

 

2023년 12월기준 ver 8이 최신이네요. Download를 눌러서 설치파일을 받고 실행 하겠습니다. 두 파일의 차이는 설치 시 인터넷이 필요한가 아닌가의 유무여서 별다른 차이는 없습니다. 

  • mysql-installer-web-community-8.0.35.0.msi: 인터넷 연결을 통해 다운로드 받는 설치 
  • mysql-installer-community-8.0.35.0.msi: 인터넷 연결 없이 설치하는 full package

로그인 이나 회원가입을 하지 않고 No thanks, just start my download를 누르겠습니다.

 

실습이나 과제를 위해서는 Server only를 사용하는 걸 권장

  • ※ 이부분은 기존 23년 1월 배포버전만 해도 Develop only 항목이 있었는데 최근되어서 삭제 되었다.
  • Server only 방법) Server only로 진행하여도 크게 문제는 없다.오히려 Full 이 설치하는 것이 많아서 많이 무거워진다. 본인이 사용하려는 Application에 따라 선택하면 된다. 
    • 방법1: Server Only + DBeaver 와 같은 Application 따로 사용
    • 방법2: Full 설치하여 WorkBench Application이용  
  • Custom 방법) Product를 구체적으로 다음을 추가한다
    • [MySQl Servers] - [MySQL Server] - [MySQL Server 8.0] - [MySQL Server 8.0.21 - X64]
    • [Applications] – [MySQL Workbench] – [MySQL Workbench 8.0] – [MySQL Workbench 8.0.21 – X64]
    • [Documentation] – [Samples and Examples] – [Samples and Examples 8.0] – [Samples and Examples 8.0.21 – X86]

Custom 이용방법

 

MySQL를 설치를 위한 Microsoft Visual이 필요하여, Execute 버튼을 눌러줍니다. 

 

 

설정한 비밀번호 넣고 check

설치 완료 후 위 start ~~ 는 모두 해제 해주도록 합시다.

2. MySQL 실행하기

MySQL을 설치가 완료되었으니 잘 실행되는지 확인해 봅시다. 사전에 설정한 비밀번호를 입력 후 하기 코드를 이용해서 데이터베이스의 종류, 데이터베이스 선택, 테이블의 종류를 확인해 볼 수 있습니다.

# 설치된 데이터 베이스 조회
show databases;

# 데이터베이스 중 mysql 선택
use mysql;

# 선택한 mysql 데이터베이스의 테이블 조회하기
show tables;

3. Application을 통해 mysql 접속하기 - DBeaver

Command Line을 통해 쿼리를 날릴 수 있지만 인터페이스가 불편하기 때문에 DBeaver 라는 어플리케이션을 이용하여 연결해보겠습니다. DBeaver가 설치 되어있지 않다면 다음 글을 참조해주세요

https://velog.io/@yongseok0419/dbeaver-%EC%84%A4%EC%B9%98-%EB%B0%8F-%EC%84%A4%EC%A0%95

 

dbeaver 설치 및 설정

1. 구글 검색창에서 dbeaver 를 검색하여 Download | DBeaver Community를 클릭한다. 2. 아래 화면에서 필자는 Windows에 dbeaver를 설치할것이기때문에 Windows (installer)를 클릭한다. (환경에 맞게 설치해주면 된

velog.io

SQL WorkBench 등의 다른 Tool을 이용하여 연결할 수 도 있습니다. 

새 데이터베이스 연결 클릭

연결할 수 있는 다양한 Database를 지원합니다. 우리는 MySQL을 설치했기 때문에 해당하는 것을 클릭합니다.

MySQL 설치시 설정한 Password를 넣어줍니다. Username은 기본적으로 root로 설정되어있어서 변경하지 않아도 됩니다.

3306 포트의 localhost가 연결된 것을 확인 할 수 있습니다. 

4. 나의 데이터베이스 생성하기 

localhost의 좌측 꺽쇄를 누르니 sys 라는 Database밖에 조회되지 않았습니다. 기본적으로 필수적이지 않은 Database는 숨겨진 채로 DBeaver에서 조회할 수 없네요. 또한, sys 이름으로 유추하건데 시스템 정보에 관한 데이터베이스므로, 테이블을 생성하는 등 작업에 적합하지 않아 보여 새로운 데이터베이스를 생성해보겠습니다. 

우클릭 - Create New Database

Database 이름을 편의상 Ecommerce라고 설정하겠습니다.

테이블 조회를 하기 위해서 임의로 3개의 파일을 데이터베이스에 넣어 보도록 하겠습니다. 

Sales target.xlsx
0.01MB
List of Orders.csv
0.02MB
Order Details.csv
0.06MB

 

Ecommerce 데이터베이스 - Table 에서 우클릭 - 데이터 가져오기

CSV 가져오기 클릭

파일 드래그 & 열기

총 3개의 테이블이 정상적으로 로드된 것을 알 수 있습니다.

5. 데이터 조회하기

SQL편집기를 이용하여 데이터를 조회해 보겠습니다.

SQL 편집기 탭 - 새 SQL 편집기

select * from List_of_Orders;

 

이렇게 MySQL 설치와 DBeaver 연결까지 모든 과정이 끝났습니다. 필요에 따라 추가적인 테이블을 불러오거나  혹은 외부 Server의 접속 정보를 받아 연결해볼 수 도 있겠습니다. 

6. 에러 해결하기

6.1. 설치 시 Initializing Database 에서 오류

Initializing Database에서 오류가 난다면 윈도우 사용자명이 한글명이여서그렇습니다. 윈도우 이름을 영어로 바꾸는 방법도 있지만, 다음 포스팅을 참고하는게 빠릅니다.

https://codinghalbae.tistory.com/9

 

MySQL 설치 진행이 되지 않거나 에러 발생 시 해결방법 (Windows)

아래는 Windows 에서 MySQL 설치 시 자주 발생하는 에러에 대한 해결 방법입니다. MySQL 설치 관련 문서는 이전 글 을 참고하시면 됩니다. Initializing database (may take a long time) 단계 에러 아래 화면과 같

codinghalbae.tistory.com

 

6.2. Public Key Retrieval is not allowed(MySQL 8버전부터)

  •  MySQL 8부터 일어나는 문제
    • 데이터베이스 우클릭 - Edit Connection - Driver Properties 의 False -> True로 변경하기

 

6.3. 데이터가 커서 로딩이 안되는 경우

  • 기본적으로 DBeaver는 1024메가의 데이터를 램에 올려서 받을 수 있습니다.이를 힙사이즈라고합니다.
  • 이 설정은 DBeaver.ini의 파일을 수정하여 해결 할 수 있지만, 컴퓨터의 가용 램에 따라서 적절히 산정해야합니다.
    • 맥 경로: cd /Applications/DBeaver.app/Contents/Eclipse/dbeaver.ini
    • 윈도우 경로: C:\Users\사용자이름\AppData\Local\DBeaver/ dbeaver.ini
  • dbeaver.ini 파일에서 -Xmx1024m  부분의 숫자가 최대 용량 MB이므로 2048 혹은 ****(제한 없음)으로 변경해주면 됩니다.
  • https://rastalion.dev/dbeaver%EC%97%90%EC%84%9C-java-heap-space-%EB%B6%80%EC%A1%B1%EC%9D%B4%EB%9D%BC%EA%B3%A0-%EB%82%98%EC%98%AC%EB%95%8C/
 

DBeaver에서 java heap space 부족이라고 나올때 - RastaLion.dev

DB를 관리하는 툴중에 DBeaver라는 툴이 있습니다. 커뮤니티 버전은 프리웨어이기도 하고, 엔터프라이즈 버전은 낮은 가격에도 강력한 부가 기능들이 있어 주로 사용하는 DB툴입니다.DBeaver에서 대

rastalion.dev

 

1. 취지

저도 처음에 데이터분석 분야에 입문했을때 여러사람의 많은 도움을 받았습니다. 그 배움에 보답하고자 제가 만든 요약자료를 무료 배포합니다. 열심히 공부하셔서 SQLD 자격층 취득에 도움이 되시길 바랍니다 :) 

저작권 문제로 수정되어, 요약자료가 약간 개연성이 떨어질 수 있습니다만, 자격증 취득에는 충분히 도움이 되실거라 믿습니다.  추가로 하기  SQLD문제를 같이 실습하시면 더 효과가 좋습니다.

https://snowgot.tistory.com/entry/SQLD-%EC%97%B0%EC%8A%B5%EB%AC%B8%EC%A0%9C-Oracle-Live-SQL

 

[SQLD]1과목 데이터 모델링의 이해.pdf
2.75MB
[SQLD]2과목 SQL 기본 및 활용_1장.pdf
1.52MB
[SQLD]2과목 SQL 기본 및 활용-2,3장.pdf
1.99MB

2. 출처

SQLD 연습하기 위한 기본 문제와 답
 Oracle 환경을 이용하여 자유롭게 SQL쿼리를 이용하여 연습하세요.

 

Oracle Live SQL: https://livesql.oracle.com/apex/f?p=590:1000

다음 자료와 함께 보면 풀기 더 쉽습니다.

https://snowgot.tistory.com/entry/SQLD-%EC%9A%94%EC%95%BD%EC%9E%90%EB%A3%8C

 

1. SELECT /WHERE 문제

문제1) ORDER_TOTAL이 500 이상인 주문의 ORDER_ID와 ORDER_TOTAL 값을 구하세요.

SELECT ORDER_ID, ORDER_TOTAL
FROM OE.orders
WHERE ORDER_TOTAL >= 500;

문제2) ORDER_STATUS가 “Entered” 인 주문의 CUSTOMER_ID와 ORDER_DATE 값을 구하세요. (힌트 Schema를 참조)

SELECT CUSTOMER_ID, ORDER_DATE
FROM OE.orders
WHERE ORDER_STATUS = 1;

문제3) ORDER_STATUS가 “Cancled” 인 주문의 CUSTOMER_ID와 ORDER_DATE 값을 구하세요.

SELECT CUSTOMER_ID, ORDER_DATE
FROM OE.orders
WHERE ORDER_STATUS in (2,3);

문제4) ORDER_STATUS가 “Shipped” 인 주문의 CUSTOMER_ID와 ORDER_DATE 값을 구하세요.

SELECT CUSTOMER_ID, ORDER_DATE
FROM OE.orders
WHERE ORDER_STATUS not  in (0,1,2,3);

문제5)SALES_REP_ID가 153인 모든 주문의 ORDER_ID, ORDER_DATE, 및 ORDER_TOTAL 값을 구하세요.

SELECT ORDER_ID, ORDER_DATE, ORDER_TOTAL
FROM oe.orders
WHERE SALES_REP_ID = 5;

문제6) ORDER_MODE가 'online'인 주문 중, ORDER_TOTAL이 2000 이하인 주문의 ORDER_ID와 CUSTOMER_ID 값을 구하세요.

 

SELECT ORDER_ID, CUSTOMER_ID
FROM oe.orders
WHERE ORDER_MODE = 'online' AND ORDER_TOTAL <= 2000;

2. GROUP / HAVING 문제

문제1) OE.ORDERS 테이블에서 ORDER_STATUS 별로 주문 건수를 구하세요.

SELECT ORDER_STATUS, COUNT(*) as NUMBER_OF_ORDERS
FROM OE.ORDERS
GROUP BY ORDER_STATUS;

 

문제2) ORDER_TOTAL의 합계가 10,000 이상인 CUSTOMER_ID를 구하세요.

SELECT CUSTOMER_ID, SUM(ORDER_TOTAL) as TOTAL_AMOUNT
FROM OEorders
GROUP BY CUSTOMER_ID
HAVING SUM(ORDER_TOTAL) >= 10000;

 

문제3): 각 SALES_REP_ID별로 처리한 주문의 평균 ORDER_TOTAL 값을 구하세요.

SELECT SALES_REP_ID, AVG(ORDER_TOTAL) as AVERAGE_ORDER_TOTAL
FROM OE.orders
GROUP BY SALES_REP_ID;

 

문제4) 3번의 결과에서 평균 ORDER_TOTAL이 500 이상인 SALES_REP_ID를 구하세요.

SELECT SALES_REP_ID, AVG(ORDER_TOTAL) as AVERAGE_ORDER_TOTAL
FROM OE.orders
GROUP BY SALES_REP_ID
HAVING AVG(ORDER_TOTAL) >= 500;

 

문제5) ORDER_MODE별로 주문된 ORDER_TOTAL의 합계를 구하세요.

SELECT ORDER_MODE, SUM(ORDER_TOTAL) as TOTAL_AMOUNT
FROM OE.orders
GROUP BY ORDER_MODE;

 

문제6) CUSTOMER_ID별로 주문한 횟수가 5회 이상인 고객들의 ID를 구하세요.

SELECT CUSTOMER_ID, COUNT(*)
FROM OE.orders
GROUP BY CUSTOMER_ID
HAVING COUNT(*) >= 5;

 

문제7) 각 SALES_REP_ID별로 처리한 주문 중 ORDER_TOTAL이 100 이상인 주문의 건수를 구하세요.

SELECT SALES_REP_ID, COUNT(*) as NUMBER_OF_ORDERS
FROM OE.orders
WHERE ORDER_TOTAL >= 100
GROUP BY SALES_REP_ID;

 

 

3. built-in 함수 문제 1

문제 1) OE.ORDERS 테이블에서 주문 총액(ORDER_TOTAL)이 50000 이상인 주문들에 대해 주문 모드(ORDER_MODE)를 기반으로 'direct'인 경우 '직접 주문', 그렇지 않은 경우 '일반 주문'으로 출력하세요.

SELECT ORDER_ID, DECODE(ORDER_MODE, 'direct', '직접 주문', '일반 주문') AS ORDER_TYPE
FROM OE.ORDERS
WHERE ORDER_TOTAL >= 50000;

문제 2) OE.ORDERS 테이블에서 주문 상태(ORDER_STATUS)를 기반으로 상태 값이 0인 경우 '진행 중', 1인 경우 '완료', 2,3인 경우 '취소'로 출력하세요. 나머지는 ‘기타’로 출력하세요.

SELECT ORDER_ID, ORDER_STATUS, CASE ORDER_STATUS
                 WHEN 0 THEN '진행 중'
                 WHEN 1 THEN '완료'
                 WHEN 2 THEN '취소'
		         WHEN 3 THEN '취소'
                 ELSE '기타' END  AS STATUS_DESC
FROM OE.ORDERS;

문제 3) OE.ORDERS 테이블에서 주문 총액(ORDER_TOTAL)의 절대값을 출력하세요.

SELECT ORDER_ID, ABS(ORDER_TOTAL) AS ABS_TOTAL
FROM OE.ORDERS;

문제 4) OE.ORDERS 테이블에서 주문 총액(ORDER_TOTAL)이 양수인지 음수인지를 판별하여 결과를 출력하세요.

SELECT ORDER_ID, SIGN(ORDER_TOTAL) AS SIGN_STATUS
FROM OE.ORDERS;

문제 5) OE.ORDERS 테이블에서 주문 총액(ORDER_TOTAL)을 100으로 나눈 나머지를 출력하세요.

SELECT ORDER_ID, ORDER_TOTAL, MOD(ORDER_TOTAL, 100) AS MOD_RESULT
FROM OE.ORDERS;

문제 6) OE.ORDERS 테이블에서 주문 날짜(ORDER_DATE)의 년도만을 출력하세요.

SELECT ORDER_ID, ORDER_DATE, TO_CHAR(ORDER_DATE, 'YYYY') AS ORDER_YEAR
FROM OE.ORDERS;

문제7) OE.ORDERS 테이블에서 ORDERS_STATUS 별로 그룹지은 후 ORDER_TOTAL 의 값을 평균을 내세요. 해당 테이블을 with 절을 이용하여 temp1 에 저장한 후 전체 temp1 테이블을 출력하세요.

WITH TEMP1 AS
(SELECT ORDER_STATUS, ROUND(AVG(ORDER_TOTAL))
    FROM OE.ORDERS GROUP BY ORDER_STATUS)
SELECT * FROM TEMP1

문제8) 당신은 ORDE_STATUS 별로 전체 매출액을 알고 싶다. 다만, 현재 취소건 등 고객들의 클레임이 많은 것을 확인하였다. 얼마나 취소로 인한 손해가 많은지 알고 싶다. 해당 쿼리를 하단에 작성하라.

-- order_status 2,3 취소건 -> 취소건만 order_total
-- order_status 0 ~ 10 까지있는데, 카테고리화 / 퍼센트(분율) 로 보여주면 더 구체적으로 판단할수있다. 

-- 0. 쓸 컬럼을 order_total, order_status
-- 1. case문을 이용해서 order_status 카테고리화 할예정.
-- 2. order_status 별로 그룹을 지어 sum(order_total)

with temp1 as(
select order_total,
    case
    	when order_status = 0 then '주문미완료'
    	when order_status = 1 then '주문완료'
    	when order_status in (2,3) then '주문취소'
    	else '배송중'
    end as os_cat
from oe.orders)
select os_cat, sum(order_total), round(sum(order_total)/3668054.7*100)
from temp1
group by os_cat

 

4. DML/DDL 문제

 

문제 1) 새로운 테이블 NEW_EMPLOYEES를 만들어 주세요. 이 테이블에는 EMP_ID, EMP_NAME, EMP_SALARY 세 개의 컬럼이 있어야 합니다.

  • EMP_ID는 숫자 타입이며, 기본 키로 설정해주세요.
  • EMP_NAME은 최대 50자의 문자열 타입으로 설정해주세요.
  • EMP_SALARY는 숫자 타입으로 설정해주세요.
CREATE TABLE NEW_EMPLOYEES (
    EMP_ID NUMBER PRIMARY KEY,
    EMP_NAME VARCHAR2(50),
    EMP_SALARY NUMBER
);

 

문제 2) NEW_EMPLOYEES 테이블에 다음 정보를 입력해주세요.

  • EMP_ID: 101, EMP_NAME: 'John Doe', EMP_SALARY: 5000
INSERT INTO NEW_EMPLOYEES (EMP_ID, EMP_NAME, EMP_SALARY) VALUES (101, 'John Doe', 5000);

문제 3) NEW_EMPLOYEES 테이블에서 EMP_ID가 101인 직원의 EMP_SALARY를 5500으로 수정해주세요.

UPDATE NEW_EMPLOYEES SET EMP_SALARY = 5500 WHERE EMP_ID = 101;

문제 4) NEW_EMPLOYEES 테이블에서 EMP_ID가 101인 직원의 정보를 삭제해주세요.

DELETE FROM NEW_EMPLOYEES WHERE EMP_ID = 101

문제 5) NEW_EMPLOYEES 테이블에 EMP_EMAIL 컬럼을 추가해주세요. 이 컬럼은 최대 100자의 문자열 타입입니다.

ALTER TABLE NEW_EMPLOYEES ADD (EMP_EMAIL VARCHAR2(100));

문제6) NEW_EMPLOYEES 테이블의 모든 데이터를 삭제해주세요.

TRUNCATE TABLE NEW_EMPLOYEES;

문제 7) NEW_EMPLOYEES 테이블을 삭제해주세요.

DROP TABLE NEW_EMPLOYEES;

 

문제8) 최종 문제

주문 테이블을 생성하고, 데이터를 삽입한 뒤 데이터를 생성하고 주문별로 개수를 확인하려한다. 다음 1번~4번 절차대로 쿼리를 수행하여 결과를 다음과 같은 예시처럼 나타내어라. 내부 값은 다를 수 있음

문제8-1) 아래 제공된 테이블의 컬럼 이름과 제약 조건을 기반으로 주문 정보를 저장할 orders 테이블을 생성하세요.

  1. order_id: 주문 번호, 숫자, 기본 키
  2. customer_name: 고객 이름, 문자열(50자 제한)
  3. product_name: 제품 이름, 문자열(50자 제한)
  4. quantity: 주문 수량, 숫자
  5. order_date: 주문 날짜, 날짜형
CREATE TABLE orders (
    order_id NUMBER PRIMARY KEY,
    customer_name VARCHAR2(50),
    product_name VARCHAR2(50),
    quantity NUMBER,
    order_date DATE
);

문제8-2) 주어진 데이터를 orders 테이블에 삽입하세요.

1, '김영희', '노트북', 1, '2023-10-01'
2, '박철수', '키보드', 2, '2023-10-02'
3, '이민수', '마우스', 1, '2023-10-03'
4, '최수진', '모니터', 2, '2023-10-05'
5, '박지훈', '노트북', 1, '2023-10-06'
6, '김소연', '키보드', 3, '2023-10-07'
7, '이태희', '마우스', 5, '2023-10-08'
8, '박민아', '노트북', 2, '2023-10-09'
9, '최영준', '모니터', 1, '2023-10-10'
10, '정희선', '노트북', 1, '2023-10-11'

 

INSERT ALL
  INTO orders VALUES (1, '김영희', '노트북', 1, TO_DATE('2023-10-01', 'YYYY-MM-DD'))
  INTO orders VALUES (2, '박철수', '키보드', 2, TO_DATE('2023-10-02', 'YYYY-MM-DD'))
  INTO orders VALUES (3, '이영수', '마우스', 1, TO_DATE('2023-10-03', 'YYYY-MM-DD'))
  INTO orders VALUES (4, '최민영', '모니터', 2, TO_DATE('2023-10-04', 'YYYY-MM-DD'))
  INTO orders VALUES (5, '황영준', '노트북', 1, TO_DATE('2023-10-05', 'YYYY-MM-DD'))
  INTO orders VALUES (6, '김영미', '키보드', 1, TO_DATE('2023-10-06', 'YYYY-MM-DD'))
  INTO orders VALUES (7, '박진수', '마우스', 3, TO_DATE('2023-10-07', 'YYYY-MM-DD'))ㄷㄷ
  INTO orders VALUES (8, '이민철', '모니터', 1, TO_DATE('2023-10-08', 'YYYY-MM-DD'))
  INTO orders VALUES (9, '최영주', '노트북', 1, TO_DATE('2023-10-09', 'YYYY-MM-DD'))
  INTO orders VALUES (10, '황지수', '키보드', 2, TO_DATE('2023-10-10', 'YYYY-MM-DD'))
SELECT * FROM DUAL;

문제8-3) 모든 주문 정보를 조회하되, 수량이 3 이상인 경우 '대량 주문'이라는 문자열을, 그렇지 않은 경우 '일반 주문'이라는 문자열을 새로운 컬럼 order_type에 표시하여 출력하세요.

SELECT order_id, customer_name, product_name, quantity, order_date,
       CASE WHEN quantity >= 3 THEN '대량 주문'
            ELSE '일반 주문'
       END AS order_type
FROM orders;

문제8-4): 제품별로 총 주문 수량을 계산하고, 주문 수량이 많은 순으로 정렬하여 출력하세요.

with temp1 as (SELECT order_id, customer_name, product_name, quantity, order_date,
       CASE WHEN quantity >= 3 THEN '대량 주문'
            ELSE '일반 주문'
       END AS order_type
FROM orders)
SELECT order_type, SUM(quantity) as total_quantity
FROM temp1
GROUP BY order_type
ORDER BY total_quantity DESC;;

 

5. 조인문제 1차

문제 1) OE.ORDERS 테이블에서 주문 상태(ORDER_STATUS)가 '1'인 모든 주문을 조회하십시오.

SELECT * FROM OE.ORDERS WHERE ORDER_STATUS = 1;

 

문제 2) OE.ORDERS와 OE.CUSTOMERS 테이블을 INNER JOIN을 사용하여 결합하고, 이를 기반으로 주문 상태(ORDER_STATUS)가 '0'인 고객의 이름 (CUST_FIRST_NAME, CUST_LAST_NAME)과 주문 총액(ORDER_TOTAL)을 조회하십시오.

SELECT C.CUST_FIRST_NAME, C.CUST_LAST_NAME, O.ORDER_TOTAL
FROM OE.ORDERS O
JOIN OE.CUSTOMERS C ON O.CUSTOMER_ID = C.CUSTOMER_ID
WHERE O.ORDER_STATUS = 0;

 

문제 3) OE.CUSTOMERS 테이블을 기준으로 OE.ORDERS 테이블과 LEFT JOIN을 하여, 주문 정보가 없는 고객의 이름 (CUST_FIRST_NAME, CUST_LAST_NAME)을 조회하십시오.

SELECT C.CUST_FIRST_NAME, C.CUST_LAST_NAME
FROM OE.CUSTOMERS C
LEFT JOIN OE.ORDERS O ON C.CUSTOMER_ID = O.CUSTOMER_ID
WHERE O.CUSTOMER_ID IS NULL;

 

문제 4) OE.ORDERS와 OE.CUSTOMERS 테이블을 INNER JOIN을 사용하여 결합하고, 주문 총액(ORDER_TOTAL)이 10,000 이상이며, 고객의 성별(GENDER)이 'M'인 모든 주문을 조회하십시오.

SELECT C.CUST_FIRST_NAME, C.CUST_LAST_NAME, O.ORDER_TOTAL
FROM OE.ORDERS O
JOIN OE.CUSTOMERS C ON O.CUSTOMER_ID = C.CUSTOMER_ID
WHERE O.ORDER_TOTAL >= 10000 AND C.GENDER = 'M';

 

문제 5) FULL OUTER JOIN 이용한 조회 OE.ORDERS와 OE.CUSTOMERS 테이블을 FULL OUTER JOIN을 사용하여 결합하고, 주문 정보나 고객 정보 중 하나라도 없는 모든 레코드를 조회하십시오.

SELECT C.CUST_FIRST_NAME, C.CUST_LAST_NAME, O.ORDER_TOTAL
FROM OE.ORDERS O
FULL OUTER JOIN OE.CUSTOMERS C ON O.CUSTOMER_ID = C.CUSTOMER_ID
WHERE O.CUSTOMER_ID IS NULL OR C.CUSTOMER_ID IS NULL;

 

6. 조인문제 2차

문제 1) ORDER_DATE와 관련된 JOIN OE.ORDERS 테이블과 OE.ORDER_ITEMS 테이블을 JOIN하여 ORDER_DATE, PRODUCT_ID 및 QUANTITY 정보를 가져와보세요.

SELECT O.ORDER_DATE, I.PRODUCT_ID, I.QUANTITY
FROM OE.ORDERS O
JOIN OE.ORDER_ITEMS I ON O.ORDER_ID = I.ORDER_ID;

SELECT O.ORDER_DATE, I.PRODUCT_ID, I.QUANTITY
FROM OE.ORDERS O
natural JOIN OE.ORDER_ITEMS I ;

SELECT O.ORDER_DATE, I.PRODUCT_ID, I.QUANTITY
FROM OE.ORDERS O
JOIN OE.ORDER_ITEMS I using(order_id)

문제 2) 특정 조건에 따른 집계 ORDER_STATUS가 1인 주문에 대하여 총 주문 금액(UNIT_PRICE * QUANTITY)을 계산하세요.

SELECT O.ORDER_ID, SUM(I.UNIT_PRICE * I.QUANTITY) AS TOTAL_ORDER_AMOUNT
FROM OE.ORDERS O
JOIN OE.ORDER_ITEMS I ON O.ORDER_ID = I.ORDER_ID
WHERE O.ORDER_STATUS = 1

문제 3) ORDER_MODE가 'direct'이며 ORDER_STATUS가 0인 주문에 대해 총 주문된 제품 수(QUANTITY)를 계산하세요.

SELECT O.ORDER_ID, SUM(I.QUANTITY) AS TOTAL_QUANTITY
FROM OE.ORDERS O
JOIN OE.ORDER_ITEMS I ON O.ORDER_ID = I.ORDER_ID
WHERE O.ORDER_MODE = 'direct' AND O.ORDER_STATUS = 0

문제 4)  각 SALES_REP_ID별로 주문된 제품의 총 가격(UNIT_PRICE * QUANTITY의 합)을 조회하고, 주문 총 가격이 높은 순으로 정렬하세요.

SELECT O.SALES_REP_ID, SUM(I.UNIT_PRICE * I.QUANTITY) AS TOTAL_SALES
FROM OE.ORDERS O
JOIN OE.ORDER_ITEMS I ON O.ORDER_ID = I.ORDER_ID
GROUP BY O.SALES_REP_ID
ORDER BY TOTAL_SALES DESC;

문제 5) 2008년에 이루어진 주문과 관련된 모든 PRODUCT_ID와 해당 PRODUCT_ID의 총 판매 금액을 조회하세요.

SELECT O.ORDER_DATE, I.PRODUCT_ID, SUM(I.UNIT_PRICE * I.QUANTITY) AS TOTAL_AMOUNT
FROM OE.ORDERS O
JOIN OE.ORDER_ITEMS I ON O.ORDER_ID = I.ORDER_ID
WHERE TO_CHAR(O.ORDER_DATE,'YYYY-MM-DD') BETWEEN '2008-01-01' AND '2008-12-31'
GROUP BY O.ORDER_DATE,I.PRODUCT_ID;

 

7. 집합 문제

문제1) 주문 상태(ORDER_STATUS)가 1과 2인 주문을 합쳐서 출력해보세요. (UNION을 이용)

SELECT * FROM OE.ORDERS WHERE ORDER_STATUS = 1 
UNION 
SELECT * FROM OE.ORDERS WHERE ORDER_STATUS = 2;

 

문제2) 주문 상태(ORDER_STATUS)가 1인 주문과 ORDER_TOTAL이 50000을 초과하는 주문을 모두 출력하세요. 단, 중복된 주문이 있을 수 있습니다. (UNION ALL을 이용)

SELECT * FROM OE.ORDERS WHERE ORDER_STATUS = 1
UNION ALL 
SELECT * FROM OE.ORDERS WHERE ORDER_TOTAL > 50000;

문제3)  주문 상태(ORDER_STATUS)가 1인 주문과 ORDER_TOTAL이 50000을 초과하는 공통된 주문을 찾아 출력하세요. (INTERSECT를 이용)

SELECT * FROM OE.ORDERS WHERE ORDER_STATUS = 1 
INTERSECT 
SELECT * FROM OE.ORDERS WHERE ORDER_TOTAL > 50000;

문제4) 주문 상태(ORDER_STATUS)가 1인 주문 중에서 ORDER_TOTAL이 50000 초과하는 주문을 제외하고 출력하세요. (MINUS를 이용

SELECT * FROM OE.ORDERS WHERE ORDER_STATUS = 1 
MINUS 
SELECT * FROM OE.ORDERS WHERE ORDER_TOTAL > 50000;

 

8. SubQuery 문제

문제1) 총 주문 금액이 가장 높은 주문의 금액을 조회하시오.

SELECT * 
FROM OE.ORDERS WHERE ORDER_TOTAL = (SELECT MAX(ORDER_TOTAL) FROM OE.ORDERS);

문제2) 2007년에 주문한 모든 고객의 평균 주문 금액을 조회하시오.

SELECT CUSTOMER_ID, AVG(ORDER_TOTAL) AS AVG_TOTAL 
FROM (SELECT CUSTOMER_ID, ORDER_TOTAL FROM OE.ORDERS WHERE TO_CHAR(ORDER_DATE, 'YYYY') = '2007') GROUP BY CUSTOMER_ID;

문제3) SALES_REP_ID가 155인 판매 대표의 평균 주문 금액보다 높은 주문들만 조회하시오.

SELECT ORDER_ID, ORDER_TOTAL FROM OE.ORDERS 
WHERE ORDER_TOTAL > (SELECT AVG(ORDER_TOTAL) FROM OE.ORDERS WHERE SALES_REP_ID = 155);

문제4) IN 사용: 주문 금액이 10,000 이상 50,000 이하인 CUSTOMER_ID의 모든 주문을 조회하시오.

SELECT ORDER_ID, CUSTOMER_ID, ORDER_TOTAL FROM OE.ORDERS
WHERE CUSTOMER_ID IN (SELECT CUSTOMER_ID FROM OE.ORDERS WHERE ORDER_TOTAL BETWEEN 10000 AND 50000);

문제5) ALL 사용: 모든 판매 대표의 평균 주문 금액보다 높은 주문들만 조회하시오.

SELECT ORDER_ID, ORDER_TOTAL FROM OE.ORDERS 
WHERE ORDER_TOTAL > ALL (SELECT AVG(ORDER_TOTAL) FROM OE.ORDERS GROUP BY SALES_REP_ID);

문제6) ANY 사용:주문 상태가 1 또는 3인 주문보다 주문 금액이 높은 주문들을 조회하시오.

SELECT ORDER_ID, ORDER_TOTAL FROM OE.ORDERS 
WHERE ORDER_TOTAL > ANY (SELECT ORDER_TOTAL FROM OE.ORDERS WHERE ORDER_STATUS IN (1,3))

 

 

9. GROUPING 문제

문제1) OE.ORDERS 테이블을 이용하여 ORDER_MODE, ORDER_STATUS 그룹짓고 모든 subtotal과 총합을 생성하세요.

SELECT ORDER_MODE, ORDER_STATUS, SUM(ORDER_TOTAL)
FROM OE.ORDERS
GROUP BY CUBE (ORDER_MODE, ORDER_STATUS);

문제2) Grouping sets 으로 OE.ORDERS 테이블을 이용하여 ORDER_MODE, ORDER_STATUS 과 전체 total을 생성하세요.

SELECT ORDER_MODE, ORDER_STATUS, SUM(ORDER_TOTAL)
FROM OE.ORDERS
GROUP BY GROUPING SETS ((ORDER_MODE), (ORDER_STATUS), ());
-- 두 컬럼을 모두 넣으면 모든행 출력

문제3) ORDER_MODE로 그룹화한 후, 각 ORDER_MODE 내에서 SALES_REP_ID로 추가 그룹화하여 주문 총액을 반환합니다. 또한 ORDER_MODE에 대한 subtotal와 Grand total도 반환하세요

SELECT ORDER_MODE, SALES_REP_ID, SUM(ORDER_TOTAL)
FROM OE.ORDERS
GROUP BY ROLLUP (ORDER_MODE, SALES_REP_ID);

문제4) 문제 3처럼 ORDER_MODE와 ORDER_STATUS의 각 조합에 대한 주문 총액을 반환하며, GROUPING 함수를 사용하여 어떤 열이 집계된 결과인지를 0과 1로 나타내세요.

SELECT ORDER_MODE, ORDER_STATUS, SUM(ORDER_TOTAL),
       GROUPING(ORDER_MODE) AS GRP_MODE,
       GROUPING(ORDER_STATUS) AS GRP_STATUS
FROM OE.ORDERS
GROUP BY ROLLUP (ORDER_MODE, ORDER_STATUS);

 

10. Window function 문제

문제1) 모든 주문에 대한 주문 총액(ORDER_TOTAL)의 합계를 출력하세요.

SELECT ORDER_ID, ORDER_TOTAL, SUM(ORDER_TOTAL) OVER() AS TOTAL_SUM
FROM OE.ORDERS;

문제2) 주문 모드(ORDER_MODE)별 주문 총액(ORDER_TOTAL)의 합계를 출력하세요.

SELECT ORDER_ID, ORDER_MODE, ORDER_TOTAL, SUM(ORDER_TOTAL) OVER(PARTITION BY ORDER_MODE) AS MODE_TOTAL
FROM OE.ORDERS;

문제3) 주문 날짜(ORDER_DATE)에 따라 주문 총액(ORDER_TOTAL)의 주문 날짜까지의 누적 합계를 반환하세요.

SELECT ORDER_ID, ORDER_DATE, ORDER_TOTAL, SUM(ORDER_TOTAL) OVER(ORDER BY ORDER_DATE) AS CUMULATIVE_TOTAL
FROM OE.ORDERS;

문제4) 주문 모드(ORDER_MODE)별로 그룹화하고, 주문 날짜(ORDER_DATE)에 따라 주문 총액과 해당 주문 모드 및 날짜까지의 누적 합계를 반환하세요.

SELECT ORDER_ID, ORDER_MODE, ORDER_DATE, ORDER_TOTAL, SUM(ORDER_TOTAL) OVER(PARTITION BY ORDER_MODE ORDER BY ORDER_DATE) AS CUMULATIVE_MODE_TOTAL
FROM OE.ORDERS;

문제5) 문제: 주문 날짜(ORDER_DATE)에 따라 주문 총액 누적합계와 해당 주문 날짜를 포함한 최근 7일 동안의 누적 합계를 반환하세요.

Hint) BETWEEN INTERVAL ‘7’ DAY PRECEDING AND CURRENT ROW

SELECT ORDER_ID, ORDER_DATE, ORDER_TOTAL, SUM(ORDER_TOTAL) OVER(ORDER BY ORDER_DATE RANGE BETWEEN INTERVAL '7' DAY PRECEDING AND CURRENT ROW) AS WEEKLY_CUMULATIVE_TOTAL
FROM OE.ORDERS;

문제6) 각 판매 대표(SALES_REP_ID)에 대한 주문 총액(ORDER_TOTAL)과 해당 판매 대표의 평균 주문 총액을 반환하세요.

SELECT ORDER_ID, SALES_REP_ID, ORDER_TOTAL, 
AVG(ORDER_TOTAL) OVER(PARTITION BY SALES_REP_ID) AS AVG_SALES_BY_REP
FROM OE.ORDERS;

 

도움이 되셨다면 공감을 눌러주시면 큰 도움이 됩니다!!
자격증 취득과 SQL 향상에 도움이 되길 바랍니다 화이팅!
강의문의:https://snowgot.tistory.com/notice/96

 

데이터 베이스를 조작할때 자주 나오는 단어가 DDL, DML 이다.Data Definition Language (DDL), Data Manipulatation Language(DML), Data Control Language(DCL)이다. 다양한 SQL 언어를 사용하다 보면 헷갈리니까 mysql 기준으로 한번 정리해보자.

1. Data Definition Language(DDL)

DDL 란 데이터베이스를 정의하는 언어이며 데이터가 들어오는 조건(제약조건), 데이터의 타입등을 정의하는 언어이다. 쉽게말하면 데이터를 수집하기 위한 껍데기 혹은 틀을 생성하는 것이며, Database 설계시 가장 먼저 수행한다. 다만, 사용하는 Tool(DBeaver 등)에 대해서 지원하는 파일(csv) 혹은 API 형식(Google Bigquery)에 따라 자동으로 데이터 type를 잡아주는 것들도 있다.

  • CREATE: 테이블을 만들기 위한 기본 statement로, 데이터 타입, 제약조건을 설정한다.
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
    (create_definition,...)
    [table_options]
    [partition_options]

-- 사용예
create table 테이블명(
    컬럼명 데이터타입,
    컬럼명2 데이터타입 DEFAULT 값,
    컬럼명3 데이터타입 PRIMARY KEY,
    컬럼명3 데이터타입 AUTO_INCREMENT -- 자동인덱스 증가
FOREIGN KEY (컬럼명) REFERENCES 외부테이블(외부컬럼)
);
 
  • ALTER: 기존 테이블을 수정한다.
ALTER TABLE tbl_name
    [alter_option [, alter_option] ...]
    [partition_options]

-- 사용례

-- 제약조건 추가
ALTER TABLE 테이블명
ADD CONSTRAINT 제약조건이름 UNIQUE (컬럼명);

-- 제약조건 추가2
ALTER TABLE 테이블명
ALTER 컬럼명 SET DEFAULT 초기값;

-- 제약조건 삭제
ALTER TABLE 테이블명 DROP CONSTRAINT 제약조건이름;
 
  • DROP: 모든 데이터와 정의도 삭제한다.
DROP [TEMPORARY] TABLE [IF EXISTS]
    tbl_name [, tbl_name] ...
    [RESTRICT | CASCADE]

-- 사용례
DROP TABLE 테이블명;
 
  • TRUNCATE 테이블안의 데이터를 삭제한다. DELETE를 all row에 대해서 수행하는 것과 유사하다.
TRUNCATE [TABLE] tbl_name

-- 사용례
TRUNCATE TABLE 테이블명;
 

 

자주 헷갈리는 TRUNCATE, DROP, DELETE 비교. 사실상 TRUNCATE와 DELETE를 비교해보면 쉽다.

 
 
TRUNCATE
DROP
DELETE
범주
DDL
DDL
DML
where와 사용가능
X
X
O
성능
빠름
(transaction log 1번)
-
느림
(각 행마다 transaction log 기록)
ROLLBACK
불가
불가
가능
테이블 용량
초기화
-
용량 감소 없음

2. Data Manipulatation Language(DML)

DML 란 기존에 생성된 Database를 조작하는 것으로 기본적으로 조회하는 select이 가장 많이 쓰인다.

  • SELECT
  • INSERT
INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]
    [INTO] tbl_name
    [PARTITION (partition_name [, partition_name] ...)]
    [(col_name [, col_name] ...)]
    { {VALUES | VALUE} (value_list) [, (value_list)] ... }

-- 사용례

-- 전체 컬럼에 해당하는 모든 값을 넣을 때
INSERT INTO 테이블이름
   VALUES (데이터값1, 데이터값2, 데이터값3, ...)

-- 특정 컬럼의 값을 넣을 때
INSERT INTO 테이블이름(필드이름1, 필드이름2, 필드이름3, ...)
   VALUES (데이터값1, 데이터값2, 데이터값3, ...)
 
  • UPDATE
UPDATE [LOW_PRIORITY] [IGNORE] table_reference
    SET assignment_list
    [WHERE where_condition]
    [ORDER BY ...]
    [LIMIT row_count]

-- 사용례

UPDATE 테이블이름
SET 컬럼명1=데이터값1
WHERE 컬럼명2=데이터값
 
  • DELETE
DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM tbl_name [[AS] tbl_alias]
    [PARTITION (partition_name [, partition_name] ...)]
    [WHERE where_condition]
    [ORDER BY ...]
    [LIMIT row_count]

-- 사용례 
DELETE FROM 테이블명 WHERE 조건;
 

 

3. Data Control Language(DCL)

DCL이란 데이터베이스의 권한 관리를 위한 명령어이다. 데이터베이스는 무결성과 정합성이 매우 중요하기 때문에, 데이터 변환,삭제 등에 대한 관리를 엄격하게 한다. 이를 위해서 특정 user의 수행권한을 관리하는 것이라고 이해하면 된다. mysql에서는 Account Manger Statements라고 분류된다.

  • GRANT
GRANT 'role1', 'role2' TO 'user1'@'localhost', 'user2'@'localhost';
 
  • REVOKE
REVOKE 'role1', 'role2' FROM 'user1'@'localhost', 'user2'@'localhost';
 

 

 

 

4. 출처

https://dev.mysql.com/doc/refman/8.0/en/sql-statements.html

+ Recent posts