AD JB Toolbox 01

MariaDB 강좌 / SELECT로 열 선택하기: 별칭·계산식·DISTINCT

SELECT는 테이블에서 필요한 열과 계산 결과를 읽는 SQL 문입니다. AS로 결과 열의 이름을 정하고 DISTINCT로 선택한 열 조합의 중복을 제거할 수 있지만, 조회만으로 원본 값이나 저장된 행이 바뀌지는 않습니다.

조회할 열과 결과의 모양 정하기

상품 목록 화면에서는 상품명과 가격, 재고 평가에서는 가격과 재고의 곱이 필요합니다. SELECT 뒤에는 필요한 결과 열, FROM 뒤에는 읽을 테이블을 적습니다. 실제 저장 구조와 출력 형식을 구분하면 원본을 손대지 않고 목적에 맞는 결과를 만들 수 있습니다. 출력 행의 순서는 ORDER BY·LIMIT로 정렬하고 조회 범위 제한하기로 명시하고, 여러 행을 하나의 값으로 요약하려면 행별 계산과 다른 COUNT·SUM·AVG·MIN·MAX로 집계하기를 사용합니다.

구문 의미 주의할 점
SELECT product_name, price 이름·가격 두 열 읽기 쓴 순서가 결과 열 순서
AS 상품명 결과 열에 이름 붙이기 원본 열 이름은 그대로
price * stock 행마다 계산 합계 집계와는 다름
DISTINCT category 분류의 중복 제거 원본 행 삭제가 아님

SELECT *는 빠르게 구조를 살펴볼 때 편하지만, 프로그램이나 내보내기에서는 열이 추가될 때 결과가 달라질 수 있습니다. 필요한 열을 직접 적고, 행 순서가 중요하면 ORDER BY도 명시합니다. 조회 결과가 입력 순서대로 나왔다는 관찰만으로 다음 실행의 순서까지 보장되지는 않습니다.

같은 상품 데이터로 독립적인 연습 테이블 만들기

명령줄 클라이언트에서 course_user로 학습용 서버에 접속하고 shopcourse 데이터베이스를 준비합니다. 접속과 UTF-8 SQL 파일 실행 방법은 명령줄 클라이언트와 SQL 파일 실행 안내를 참고하세요. 아래 코드는 운영 서버가 아닌 연습 환경에서 실행합니다.

이 글은 products_14_lab이라는 독립된 실습 테이블을 사용합니다. 이전 강좌의 products 등 기존 테이블에는 손대지 않습니다. SELECT VERSION(), DATABASE();와 SHOW TABLES LIKE 'products_14_lab';로 서버·선택한 데이터베이스·이름 중복을 먼저 확인합니다. 같은 이름이 이미 있으면 정의와 데이터를 확인하고, 이 글에서 만든 연습 데이터인지 판단한 뒤 마지막 절의 반복 방법을 따르세요.

USE shopcourse;
CREATE TABLE products_14_lab (
  product_id INT NOT NULL AUTO_INCREMENT,
  product_name VARCHAR(100) NOT NULL,
  category VARCHAR(30) NOT NULL,
  price DECIMAL(10,2) NOT NULL,
  stock INT NOT NULL DEFAULT 0,
  note VARCHAR(100) NULL DEFAULT NULL,
  PRIMARY KEY (product_id),
  CONSTRAINT ck_p14_price CHECK (price >= 0),
  CONSTRAINT ck_p14_stock CHECK (stock >= 0)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
INSERT INTO products_14_lab
  (product_id, product_name, category, price, stock, note)
VALUES (1, '노트', '문구', 3500.00, 20, NULL),
  (2, '볼펜', '문구', 1500.00, 0, ''),
  (3, '머그컵', '생활', 8000.00, 12, '선물 포장'),
  (4, '스탠드', '생활', 25000.00, 5, NULL),
  (5, '파일', '문구', 1500.00, 50, ''),
  (6, '케이블', '전자', 8000.00, 0, '호환 확인');

상품 여섯 개에는 같은 분류·가격, 0인 재고와 NULL 메모가 섞여 있습니다. 서로 다른 결과를 비교하기 위한 데이터이며 이 글의 조회문을 반복 실행해도 초기 행이 바뀌지 않습니다. SQL 파일 실행이 끝난 뒤에는 같은 연결에서 아래 문장을 하나씩 실행하며 열 이름과 값의 차이를 살펴보세요.

AS로 별칭을 붙이고 계산 열 만들기

SELECT product_id, product_name AS 상품명, price AS 판매가
FROM products_14_lab ORDER BY product_id;

상품명과 판매가는 출력 머리글에 표시됩니다. 원본 열은 여전히 product_name과 price이며, 이후 INSERT나 UPDATE에서 별칭을 실제 열 이름 대신 사용할 수는 없습니다. 공백이 포함된 별칭이 필요하면 백틱으로 감싼 식별자를 사용하고, 문자열 값과 혼동하지 않도록 구분합니다.

SELECT product_id, product_name, price, stock,
       price * stock AS inventory_value
FROM products_14_lab ORDER BY product_id;
번호 계산 inventory_value
1 3500 × 20 70000.00
2 1500 × 0 0.00
3 8000 × 12 96000.00
4 25000 × 5 125000.00
5 1500 × 50 75000.00
6 8000 × 0 0.00

이 계산은 각 상품의 현재 가격으로 재고 금액을 구한 것입니다. 모든 상품의 합계가 필요하면 별도의 SUM 집계를 써야 하며 이 열 하나가 전체 재고 총액을 뜻하지 않습니다. 실제 원가·세금·할인 정책이 있는 업무에서는 계산 기준부터 정의해야 합니다.

DISTINCT는 선택한 열 조합 전체에 적용하기

SELECT DISTINCT category FROM products_14_lab ORDER BY category;
SELECT DISTINCT category, price
FROM products_14_lab ORDER BY category, price;

첫 조회는 문구·생활·전자 세 분류를 반환합니다. 둘째 조회는 분류와 가격의 조합이므로 문구/1500.00이 한 번만 나오고 총 다섯 조합이 됩니다. product_id까지 함께 선택하면 번호가 모두 달라서 여섯 행이 유지됩니다.

DISTINCT는 첫 번째 열에만 붙는 수식어가 아닙니다. 선택한 열들의 값이 모두 같은 결과 행을 하나로 모읍니다. 따라서 같은 분류에서 특정 상품 하나를 대표로 고르는 기능으로 사용할 수 없습니다. 어떤 상품을 고를지 기준을 정해야 하는 문제는 정렬·집계·윈도 함수 등의 다른 설계가 필요합니다. SELECT 공식 문법의 선택 목록과 DISTINCT 설명을 참고하세요.

계산 별칭과 WHERE를 사용할 때 순서 구분하기

SELECT product_name, price * stock AS inventory_value
FROM products_14_lab
WHERE price * stock >= 100000
ORDER BY inventory_value DESC, product_id ASC;

inventory_value가 100000 이상인 상품은 스탠드 한 개이고 금액은 125000.00입니다. WHERE에서는 별칭이 아니라 원래 계산식 price * stock을 썼습니다. 같은 SELECT 단계에서 만든 별칭을 WHERE에 바로 적으면 실제 열을 찾지 못할 수 있습니다. ORDER BY에서는 결과 별칭을 사용할 수 있습니다.

이 설명은 SQL을 이해하기 위한 논리적인 처리 구분입니다. 서버가 실제로 데이터를 읽는 실행 순서까지 그대로 설명하는 것은 아닙니다. 계산식을 여러 번 쓰기 복잡해지면 파생 테이블 등을 검토하지만, 단순한 예제에서는 계산식이 명확하게 보이는 편이 이해하기 쉽습니다.

조회 오류와 예제 결과 점검하기

Unknown column 오류가 나면 DESCRIBE products_14_lab;로 실제 열 이름을 확인합니다. 쉼표 누락, 존재하지 않는 별칭, 다른 데이터베이스의 동명 테이블도 확인하세요. 계산 결과가 NULL이면 입력 열에 NULL이 있는지 살펴보고, 임의로 0으로 바꾸기 전에 업무 의미를 확인합니다.

SELECT 자체는 이 글의 원본 행을 수정하지 않습니다. 결과에서 행이 빠졌다고 저장 데이터가 사라졌다는 뜻은 아니므로 기본키를 포함한 전체 조회와 DISTINCT 조회를 나란히 비교합니다. 예상 행 수가 다르면 초기 여섯 행을 중복 입력했는지, 기존 연습 테이블에 다른 값이 들어 있는지 확인합니다.

다시 실습하려면 SELECT DATABASE();, SHOW CREATE TABLE products_14_lab;와 저장된 행을 확인합니다. 보관할 데이터가 없는 이 글의 연습 테이블이 확실할 때만 아래 문장으로 지운 뒤 준비 코드를 다시 실행합니다. DROP TABLE은 구조와 데이터를 함께 없애며 일반적인 ROLLBACK으로 취소되지 않습니다.

DROP TABLE shopcourse.products_14_lab;
같은 카테고리의 다른 글
MariaDB / 샘플 데이터베이스 employees 설치하는 방법

MariaDB / 샘플 데이터베이스 employees 설치하는 방법

데이터베이스를 다루는 공부를 할 때 데이터가 들어있는 데이터베이스가 있으면 좋습니다. 데이터베이스를 직접 만드는 방법도 있지만, 공개된 샘플 데이터베이스를 이용하면 편합니다. 예를 들어 SQL Server라면 AdventureWorks라는 샘플 데이터베이스를 마이크로소프트에서 제공합니다. MariaDB라면 employees를 사용하면 됩니다.

MariaDB 강좌 / 최종 실습: 주문 데이터베이스 구축부터 권한·백업·복원까지

MariaDB 강좌 / 최종 실습: 주문 데이터베이스 구축부터 권한·백업·복원까지

주문 DB 구축·제한 계정·재고와 주문의 트랜잭션을 한 흐름으로 실습합니다. 확정 상태를 덤프해 별도 DB로 복원하고 행·금액·재고·키·권한 실패 조건으로 완성 여부를 검증합니다.

MariaDB 강좌 / 날짜와 시간 저장하기: DATE·DATETIME·TIMESTAMP

MariaDB 강좌 / 날짜와 시간 저장하기: DATE·DATETIME·TIMESTAMP

DATE·DATETIME·TIMESTAMP의 저장 의미와 시간대 처리를 비교합니다. 동일 입력의 한국 시간·UTC 조회 결과, 버전별 TIMESTAMP 범위, 날짜 오류와 설정 복원을 실습합니다.

MariaDB / 연산자 / 논리 연산자

MariaDB / 연산자 / 논리 연산자

MariaDB의 논리 연산자에 대하여 알아보겠습니다. 예제로 사용하는 테이블은 아래의 데이터를 가진 T_2이라는 테이블입니다. 각 열의 데이터 형식은 다음과 같습니다. C_1 : 정수 C_2 : 문자 +----+------+------+ | ID | C_1 | C_2 | +----+------+------+ | 1 | 1 | A | | 2 | ...

MariaDB 강좌 / 조회 종합 실습: 월별 매출·고객별 구매·미판매 상품

MariaDB 강좌 / 조회 종합 실습: 월별 매출·고객별 구매·미판매 상품

월별 paid 매출, 미구매 포함 고객별 구매 금액, 미판매 상품 조회를 종합 실습합니다. 주문·상세 단위와 취소 정책을 정하고 세 결과의 전체 금액을 교차 검증합니다.

MariaDB 강좌 / 사용자 계정 만들고 필요한 권한만 부여하기

MariaDB 강좌 / 사용자 계정 만들고 필요한 권한만 부여하기

사용자·호스트 조합을 확인하고 상품 한 테이블의 SELECT만 허용하는 계정을 만듭니다. 새 연결의 허용·거절 시험, 권한 회수와 기존 계정을 덮어쓰지 않는 정리 절차를 설명합니다.

MariaDB 강좌 / 조회 조건·정렬·페이지 나누기를 개선하기

MariaDB 강좌 / 조회 조건·정렬·페이지 나누기를 개선하기

날짜 범위·정렬·키셋 페이지 조회를 같은 주문 데이터로 검증합니다. 함수 조건의 버전별 최적화, 동점 비교 방향, 포함 검색의 의미와 실제 계획·측정 기준을 설명합니다.

MariaDB 강좌 / 첫 실습: 상품 테이블을 만들고 데이터를 넣어 조회하기

MariaDB 강좌 / 첫 실습: 상품 테이블을 만들고 데이터를 넣어 조회하기

상품 세 건을 저장하는 전체 SQL로 테이블 생성·입력·조회 과정을 실습합니다. 구조와 행 수, 가격·재고 조건의 예상 결과를 확인하고 반복 입력 오류와 실습 테이블 초기화 범위를 구분합니다.

MariaDB 강좌 / NULL을 올바르게 비교하기: IS NULL·COALESCE

MariaDB 강좌 / NULL을 올바르게 비교하기: IS NULL·COALESCE

NULL·빈 문자열·0을 구분하고 IS NULL·IS NOT NULL과 COALESCE의 역할을 실습합니다. 일반 비교에서 빠지는 NULL 행, NULL-safe 비교와 NOT IN 목록의 함정을 설명합니다.

MariaDB 강좌 / 로컬·원격 접속과 연결 오류 해결하기

MariaDB 강좌 / 로컬·원격 접속과 연결 오류 해결하기

로컬 TCP 연결을 명시하고 서버 정보·현재 계정·실제 테이블 권한을 확인합니다. 연결 거절·인증·DB 오류를 나누어 진단하고 원격 수신 주소·계정·TLS의 적용 조건을 설명합니다.