9월7일(월)

Win Cha·2026년 9월 7일

DBMS 복습하면서...

SELECT
u.id,
u.userName,
COUNT() AS total_orders
FROM t_order AS o
INNER JOIN t_user AS u ON o.userNo = u.id
GROUP BY u.id, u.userName
ORDER BY COUNT(
) DESC
LIMIT 1;

<수정 전>
select u.userId, U.userNmae, coutn()
from t_order as o
inner join t_user as U
on o.userN0 = u.id
inner join t_product as p
on o.productNo = p.id
group by u.id
order by count(
) desc limit 1

SELECT
u.id, -- u.userId 대신 조인 조건에 쓴 u.id로 통일
u.userName, -- U.userNmae 오타 수정 및 별칭 소문자(u) 통일
COUNT() AS total_orders -- coutn() 오타 수정 및 별칭 부여
FROM t_order AS o
INNER JOIN t_user AS u ON o.userNo = u.id -- o.userN0 오타 수정 (숫자 0 -> 알파벳 o)
INNER JOIN t_product AS p ON o.productNo = p.id
GROUP BY u.id, u.userName -- SELECT에 있는 컬럼을 모두 명시하여 에러 방지
ORDER BY COUNT(*) DESC
LIMIT 1;

개선 후
SELECT
u.id,
u.userName,
COUNT() AS total_orders
FROM t_order AS o
INNER JOIN t_user AS u ON o.userNo = u.id
GROUP BY u.id, u.userName
ORDER BY COUNT(
) DESC
LIMIT 1;

💡 최적화 팁:
위 쿼리는 문법적으로 완벽합니다! 다만, 최종 조회 결과(SELECT)에 상품 테이블(t_product)의 정보가 쓰이지 않으므로, 성능을 위해 아래처럼 상품 테이블 조인을 빼주시면 가장 완벽한 쿼리가 됩니다.

<수정 후>

SELECT u.id, u.userName, COUNT() AS total_orders
FROM t_order AS o
INNER JOIN t_user AS u ON o.userNo = u.id
INNER JOIN t_product AS p ON o.productNo = p.id
GROUP BY u.id
ORDER BY COUNT(
) DESC
LIMIT 1;

SELECT 절의 완벽한 구현: 맨 위에 SELECT u.id, u.userName, COUNT() AS total_orders를 선언해 주셨습니다. 덕분에 "몇 번 주문했는지"라는 숫자 정보뿐만 아니라, "그 1등 주인공의 ID와 이름"이 무엇인지 식별 가능한 진짜 정보(Information)를 화면에 띄울 수 있게 되었습니다.
별칭(Alias)의 영리한 활용: 단순히 COUNT(
)로 출력하는 대신 AS total_orders라는 이름을 붙여주어, 최종 리포트를 보는 기획자나 마케터가 표를 직관적으로 이해할 수 있게 배려하셨습니다.
오타와 대소문자 매칭 완벽 해결: 알파벳 o와 숫자 0의 혼용 오류를 말끔히 해결하셨고, ORDER BY의 띄어쓰기와 LIMIT 예약어의 철자도 완벽하게 교정되었습니다.

상기 SQL 쿼리는 "가장 많은 주문(구매)을 한 회원 1명"을 찾는 구문입니다.

쿼리 동작 원리 분석
FROM t_order AS o

t_order(주문) 테이블을 기준으로 데이터를 가져옵니다.

AS o는 테이블 이름이 기니까 앞으로 쿼리 안에서 o라는 별칭(Alias)으로 짧게 부르겠다는 뜻입니다.

INNER JOIN t_user AS u ON o.userNo = u.id

주문 테이블(o)과 사용자 테이블(u)을 조인합니다. 주문한 사람의 번호(userNo)와 사용자의 고유 번호(id)가 같은 데이터를 짝지어 줍니다.
(작성하신 0.userN0는 o.userNo의 오타로 보입니다.)

INNER JOIN t_product AS p ON o.productNo = p.id

주문 테이블(o)과 상품 테이블(p)을 조인합니다. 어떤 상품을 샀는지 알아보기 위해 주문한 상품 번호와 상품의 고유 번호를 짝지어 줍니다.

GROUP BY u.id

결합된 전체 주문 내역을 사용자(u.id)별로 그룹화합니다. 이렇게 하면 홍길동이 5번, 손흥민이 10번 주문했다는 식으로 사람별로 데이터를 묶어 통계를 낼 수 있습니다.

ORDER BY count(*) DESC

그룹화된 데이터의 갯수(count(*), 즉 주문 건수)를 기준으로 내림차순(DESC) 정렬합니다.

즉, 주문 건수가 가장 많은 사람이 제일 위로 올라오게 됩니다.

LIMIT 1

정렬된 전체 결과 중 가장 맨 위에 있는 1개의 행만 가져옵니다. 결과적으로 주문을 가장 많이 한 1등 회원만 출력됩니다.

요약
DB == 데이터베이스

MySQL == MariaDB

MySQL은 DBMS 입니다.

DBMS == DataBase Management System

DBMS는 여러개의 DB를 관리하는 시스템입니다.

MySQL은 DBMS 중에 하나 입니다.

다른 DBMS로는 오라클, MSSQL 등이 있습니다.

MySQL은 전세계에서 가장 많이 사용되는 DBMS 입니다.

DB == 폴더

폴더 => 묶어주는 것

DB는 무엇으로 구성되는가? : 테이블들로 구성되어 있음

테이블 == 표 == 엑셀파일

표 == 칼럼(열, 1줄) + 로우(행, 여러줄)

칼럼 == 번호, 이름, 나이, 연락처

로우 == 1, 홍길동, 24, 010-1234-1234

표에서 칼럼은 한줄만 존재한다.

표에서 로우는 0 ~ N줄 존재할 수 있다.

SQL은 명령어 이다.

SQL은 DB에게 명령을 내릴 때 사용된다.

SQL 명령어 : 전체 데이터베이스 리스팅 => SHOW DATABASES;

SQL 명령어 : 특정 데이터베이스 선택, 다른말로 하면 특정 폴더(DB)로 접속 명령어

  • USE DB이름;

    EX : USE mysql;

SQL 명령어 : 현재 접속해 있는 DB안의 모든 테이블들을 리스팅

  • SHOW TABLES;

0개의 댓글