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 강좌 / CSV 가져오기·내보내기: 경로·권한·문자 인코딩

MariaDB 강좌 / CSV 가져오기·내보내기: 경로·권한·문자 인코딩

CSV를 문자형 stage에 적재해 형식·중복·경고를 확인한 뒤 실제 타입으로 옮깁니다. LOCAL의 클라이언트 경로, 서버 OUTFILE의 권한·경로, 쉼표·한글·줄바꿈과 왕복 검증을 설명합니다.

MariaDB 강좌 / 문자열 다루기: 연결·추출·치환·길이

MariaDB 강좌 / 문자열 다루기: 연결·추출·치환·길이

문자열 연결·추출·치환과 길이 계산을 상품 데이터로 실습합니다. NULL과 빈 문자열의 연결 차이, UTF-8 문자 수·바이트 수, 원본을 보존하며 가공 결과를 확인하는 기준을 설명합니다.

MariaDB 강좌 / COUNT·SUM·AVG·MIN·MAX로 집계하기

MariaDB 강좌 / COUNT·SUM·AVG·MIN·MAX로 집계하기

COUNT·SUM·AVG·MIN·MAX의 집계 대상과 단위를 상품 재고로 비교합니다. NULL·0·빈 결과의 차이, 행별 계산 후 합계, 최솟값과 해당 행을 혼동하지 않는 기준을 설명합니다.

MariaDB 강좌 / CASE로 조건별 값과 집계 만들기

MariaDB 강좌 / CASE로 조건별 값과 집계 만들기

CASE 조건의 순서와 ELSE를 상품 재고 상태로 실습합니다. SUM·COUNT 안의 조건부 집계, 0과 NULL의 차이, WHERE로 그룹을 없애는 경우와 0을 표시하는 경우를 설명합니다.

MariaDB 강좌 / 복제 구조와 지연·오류·장애 대응 이해하기

MariaDB 강좌 / 복제 구조와 지연·오류·장애 대응 이해하기

빈 두 서버를 준비하는 로컬 Compose 구성과 복제 상태·지연·오류 진단을 설명합니다. 적용 중지·재개를 관찰하고 백업과 장애 승격의 경계를 구분합니다.

MariaDB 강좌 / 트랜잭션 시작하기: InnoDB·COMMIT·ROLLBACK

MariaDB 강좌 / 트랜잭션 시작하기: InnoDB·COMMIT·ROLLBACK

InnoDB에서 같은 변경을 ROLLBACK과 COMMIT으로 끝내어 미확정·확정의 차이를 비교합니다. 연결 유지, 영향 행 수 검사, 오류 처리와 구조 변경·외부 작업의 취소 한계를 설명합니다.

MariaDB 강좌 / ORDER BY·LIMIT로 정렬하고 조회 범위 제한하기

MariaDB 강좌 / ORDER BY·LIMIT로 정렬하고 조회 범위 제한하기

ORDER BY의 여러 열·방향과 LIMIT·OFFSET을 같은 가격의 상품으로 실습합니다. 동점 해소, 페이지 경계 변화, 마지막 정렬값을 이용한 조회와 NULL 배치를 설명합니다.

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

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

SELECT의 열 선택과 AS 별칭, 행별 계산식, DISTINCT의 열 조합 기준을 실습합니다. 원본 데이터와 출력 결과를 구분하고 WHERE에서 별칭을 사용할 때의 주의점을 설명합니다.

MariaDB 강좌 / 중복 데이터를 줄이는 정규화와 주문 데이터베이스 설계

MariaDB 강좌 / 중복 데이터를 줄이는 정규화와 주문 데이터베이스 설계

주문 상세에 반복한 고객 정보의 변경 오류를 관찰하고 키별 사실을 네 테이블로 나눕니다. 부분·이행 종속, 거래 당시 단가와 스냅샷 보존, 무결성 제약과 성능의 별도 검토를 설명합니다.

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

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

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