MSSQL LAB
MSSQL 1.5 · 1부. 기초

SELECT 로 조회하기

필요한 열만 가져와 이름을 붙이고, DISTINCT 로 중복을 걷어냅니다. 이어 붙일 때 NULL 이 무엇을 삼키는지도 봅니다.

예상 학습 시간 16분 난이도 입문
개념 설명

무엇을 낼지 적는 자리

SELECT결과에 어떤 열을 낼지 정하는 자리입니다. 어느 테이블에서 가져올지는 FROM 이 정하므로, 둘은 늘 함께 다닙니다.

여기서 정하는 것은 열입니다. 어느 행을 남길지는 아직 정하지 않습니다 — 그것은 1.6 의 WHERE 가 하는 일이라, 이 단원의 예제는 테이블에 든 행이 모두 나옵니다.

최소 예제

모든 열 가져오기

별표를 적으면 그 테이블의 열이 모두 나옵니다. 게시판 테이블은 세 행뿐이라 한눈에 들어옵니다.

SQL
SELECT * FROM Board.BOARDS;
결과
numcodenameuse_categoryuse_replyreg_date
1notice공지사항002025-03-07 09:00:00
2free자유게시판112025-03-07 09:00:00
3qna질문답변112025-03-07 09:00:00
(3개 행이 영향을 받음)

별표는 무엇이 들어 있는지 볼 때만 사용하십시오. 실제로 만드는 문장에 남겨 두면 세 가지가 걸립니다.

  • 필요 없는 열까지 읽습니다. 본문처럼 큰 열이 있으면 목록 화면에서 사용하지도 않을 값을 매번 실어 나릅니다.
  • 나중에 열이 늘면 결과가 바뀝니다. 순서에 기대어 값을 꺼내는 코드가 있으면 그날 조용히 어긋납니다.
  • 인덱스를 살리지 못합니다. 필요한 열만 골랐다면 인덱스만 읽고 끝날 조회가 테이블까지 다녀오게 됩니다(5.2).
최소 예제

필요한 열만 · 이름 바꾸기

열 이름을 쉼표로 늘어놓으면 그것만 나옵니다. 적은 차례대로 나옵니다.

SQL
SELECT code, name FROM Board.BOARDS;
결과
codename
notice공지사항
free자유게시판
qna질문답변
(3개 행이 영향을 받음)

결과에 나올 이름은 AS 로 바꿉니다. 화면에 그대로 내보낼 때나 열 이름이 뜻을 알기 어려울 때 사용합니다.

SQL
SELECT code AS 코드,
       name AS 게시판,
       use_reply AS [답글 허용]
FROM Board.BOARDS;
결과
코드게시판답글 허용
notice공지사항0
free자유게시판1
qna질문답변1
(3개 행이 영향을 받음)

이름에 공백이 들어가면 대괄호로 감쌉니다. [답글 허용] 처럼 적지 않으면 두 개의 이름으로 읽혀 오류가 납니다. 큰따옴표로 감싸도 되지만 대괄호가 SQL Server 에서 더 널리 쓰입니다.

상세 사용법

계산한 값과 고정된 값

SELECT 에는 테이블의 열만이 아니라 계산한 값고정된 값도 적을 수 있습니다.

SQL
SELECT TOP 3 title,
       hit_count,
       hit_count * 2 AS 두배,
       N'자유'      AS 구분
FROM Board.POSTS
ORDER BY num;
결과
titlehit_count두배구분
조인 질문드립니다714자유
트랜잭션 질문드립니다1428자유
페이징 질문드립니다2142자유
(3개 행이 영향을 받음)

TOP 3 은 앞의 세 행만 보려고 붙였습니다. 정렬과 함께 1.7 에서 다룹니다.

계산한 열에 이름을 붙이지 않으면 이름 없이 나옵니다.

SQL
SELECT TOP 3 hit_count, hit_count * 2
FROM Board.POSTS
ORDER BY num;
결과
hit_count(열 이름 없음)
714
1428
2142
(3개 행이 영향을 받음)

응용 프로그램은 대개 열 이름으로 값을 꺼냅니다. 이름이 없으면 꺼낼 방법이 없으므로, 계산한 열에는 반드시 AS 로 이름을 붙이십시오.

상세 사용법

중복을 걷어내기 — DISTINCT

같은 값이 여러 행에 있을 때 어떤 값들이 있는지만 보고 싶다면 DISTINCT 를 붙입니다.

SQL
SELECT DISTINCT depth FROM Board.POSTS;
결과
depth
0
1
2
(3개 행이 영향을 받음)

507개 행에서 세 값만 남았습니다. 답글 깊이가 0·1·2 세 가지뿐이라는 뜻입니다.

DISTINCT 는 적은 열 전체를 묶어서 봅니다. 열을 둘 적으면 두 값의 조합이 겹치지 않는 것만 남습니다. 값마다 몇 개인지 세려면 GROUP BY(2.2)가 필요합니다.

상세 사용법

문자열 이어붙이기 — NULL 을 조심하십시오

문자열은 + 로 잇습니다. 그런데 이어 붙일 값 가운데 하나라도 NULL 이면 결과 전체가 NULL 이 됩니다.

SQL
SELECT TOP 5 nickname, email,
       nickname + N'<' + email + N'>'       AS with_plus,
       CONCAT(nickname, N'<', email, N'>')  AS with_concat
FROM Member.USERS
ORDER BY num;
결과
nicknameemailwith_pluswith_concat
홍길동hong@example.com홍길동<hong@example.com>홍길동<hong@example.com>
김철수kim@example.com김철수<kim@example.com>김철수<kim@example.com>
이영희lee@example.com이영희<lee@example.com>이영희<lee@example.com>
박민수park@example.com박민수<park@example.com>박민수<park@example.com>
최지우NULLNULL최지우<>
(5개 행이 영향을 받음)

마지막 행을 보십시오. 최지우는 전자 메일이 없어 emailNULL 인데, 닉네임까지 함께 사라졌습니다. 화면에 이름이 안 나오는 버그는 흔히 이 자리에서 생깁니다.

방법NULL 을 만나면
+결과 전체가 NULL 이 됩니다
CONCAT빈 문자열로 보고 나머지를 이어 붙입니다

값이 없을 수 있는 열을 이어 붙일 때는 CONCAT 을 사용하십시오. + 를 그대로 쓰려면 ISNULL 로 빈 문자열을 채워 넣어야 합니다(1.9).

실습 문제

직접 해보기

1. 말머리 목록 보기 난이도 하

Board.CATEGORIES 에서 말머리 이름과 차례만 가져오되, 화면에 말머리순서 로 나오게 해보세요.

열 이름을 바꾸는 것은 AS 입니다. 별표는 사용하지 마십시오.
SELECT name AS 말머리, sort_no AS 순서 FROM Board.CATEGORIES;
2. 이어 붙일 때 사라지지 않게 난이도 중

회원의 닉네임과 아이디를 홍길동(hong) 모양으로 이어 붙여 보세요. 전자 메일이 없는 회원도 빠지지 않아야 합니다.

아이디(user_id)는 NOT NULL 이라 + 로도 됩니다. 다만 값이 없을 수 있는 열이 섞이면 이야기가 달라진다는 것을 기억해 두십시오.
SELECT CONCAT(nickname, N'(', user_id, N')') AS 표시이름 FROM Member.USERS; -- 아이디는 NOT NULL 이므로 + 로 이어도 같은 결과가 나옵니다. -- nickname + N'(' + user_id + N')' -- 그래도 CONCAT 을 습관으로 두면, 나중에 값이 없을 수 있는 -- 열을 끼워 넣을 때 조용히 NULL 이 되는 일을 겪지 않습니다.
요약
  • SELECT어느 열을 낼지, FROM어느 테이블에서 가져올지 정합니다.
  • 별표는 살펴볼 때만 사용합니다. 실제 문장에는 필요한 열만 적습니다.
  • 이름은 AS 로 바꾸고, 공백이 들어가면 [대괄호] 로 감쌉니다.
  • 계산한 열에는 반드시 이름을 붙입니다. 없으면 응용 프로그램이 꺼내지 못합니다.
  • DISTINCT 는 적은 열 전체를 묶어 중복을 걷어냅니다.
  • 문자열을 + 로 이을 때 NULL 이 하나라도 있으면 전체가 NULL 입니다. CONCAT 은 그러지 않습니다.