SELECT 로 조회하기
필요한 열만 가져와 이름을 붙이고, DISTINCT 로 중복을 걷어냅니다. 이어 붙일 때 NULL 이 무엇을 삼키는지도 봅니다.
무엇을 낼지 적는 자리
SELECT 는 결과에 어떤 열을 낼지 정하는
자리입니다. 어느 테이블에서 가져올지는 FROM 이 정하므로,
둘은 늘 함께 다닙니다.
여기서 정하는 것은 열입니다. 어느 행을 남길지는 아직 정하지 않습니다 —
그것은 1.6 의 WHERE 가 하는 일이라, 이 단원의 예제는
테이블에 든 행이 모두 나옵니다.
모든 열 가져오기
별표를 적으면 그 테이블의 열이 모두 나옵니다. 게시판 테이블은 세 행뿐이라 한눈에 들어옵니다.
SELECT * FROM Board.BOARDS;
| num | code | name | use_category | use_reply | reg_date |
|---|---|---|---|---|---|
| 1 | notice | 공지사항 | 0 | 0 | 2025-03-07 09:00:00 |
| 2 | free | 자유게시판 | 1 | 1 | 2025-03-07 09:00:00 |
| 3 | qna | 질문답변 | 1 | 1 | 2025-03-07 09:00:00 |
별표는 무엇이 들어 있는지 볼 때만 사용하십시오. 실제로 만드는 문장에 남겨 두면 세 가지가 걸립니다.
- 필요 없는 열까지 읽습니다. 본문처럼 큰 열이 있으면 목록 화면에서 사용하지도 않을 값을 매번 실어 나릅니다.
- 나중에 열이 늘면 결과가 바뀝니다. 순서에 기대어 값을 꺼내는 코드가 있으면 그날 조용히 어긋납니다.
- 인덱스를 살리지 못합니다. 필요한 열만 골랐다면 인덱스만 읽고 끝날 조회가 테이블까지 다녀오게 됩니다(5.2).
필요한 열만 · 이름 바꾸기
열 이름을 쉼표로 늘어놓으면 그것만 나옵니다. 적은 차례대로 나옵니다.
SELECT code, name FROM Board.BOARDS;
| code | name |
|---|---|
| notice | 공지사항 |
| free | 자유게시판 |
| qna | 질문답변 |
결과에 나올 이름은 AS 로 바꿉니다. 화면에 그대로 내보낼 때나
열 이름이 뜻을 알기 어려울 때 사용합니다.
SELECT code AS 코드, name AS 게시판, use_reply AS [답글 허용] FROM Board.BOARDS;
| 코드 | 게시판 | 답글 허용 |
|---|---|---|
| notice | 공지사항 | 0 |
| free | 자유게시판 | 1 |
| qna | 질문답변 | 1 |
이름에 공백이 들어가면 대괄호로 감쌉니다.
[답글 허용] 처럼 적지 않으면 두 개의 이름으로 읽혀 오류가
납니다. 큰따옴표로 감싸도 되지만 대괄호가 SQL Server 에서 더 널리 쓰입니다.
계산한 값과 고정된 값
SELECT 에는 테이블의 열만이 아니라 계산한 값과
고정된 값도 적을 수 있습니다.
SELECT TOP 3 title, hit_count, hit_count * 2 AS 두배, N'자유' AS 구분 FROM Board.POSTS ORDER BY num;
| title | hit_count | 두배 | 구분 |
|---|---|---|---|
| 조인 질문드립니다 | 7 | 14 | 자유 |
| 트랜잭션 질문드립니다 | 14 | 28 | 자유 |
| 페이징 질문드립니다 | 21 | 42 | 자유 |
TOP 3 은 앞의 세 행만 보려고 붙였습니다. 정렬과 함께
1.7 에서 다룹니다.
계산한 열에 이름을 붙이지 않으면 이름 없이 나옵니다.
SELECT TOP 3 hit_count, hit_count * 2 FROM Board.POSTS ORDER BY num;
| hit_count | (열 이름 없음) |
|---|---|
| 7 | 14 |
| 14 | 28 |
| 21 | 42 |
응용 프로그램은 대개 열 이름으로 값을 꺼냅니다. 이름이 없으면 꺼낼
방법이 없으므로, 계산한 열에는 반드시 AS 로 이름을
붙이십시오.
중복을 걷어내기 — DISTINCT
같은 값이 여러 행에 있을 때 어떤 값들이 있는지만 보고 싶다면
DISTINCT 를 붙입니다.
SELECT DISTINCT depth FROM Board.POSTS;
| depth |
|---|
| 0 |
| 1 |
| 2 |
507개 행에서 세 값만 남았습니다. 답글 깊이가 0·1·2 세 가지뿐이라는 뜻입니다.
DISTINCT 는 적은 열 전체를 묶어서 봅니다.
열을 둘 적으면 두 값의 조합이 겹치지 않는 것만 남습니다. 값마다 몇 개인지 세려면
GROUP BY(2.2)가 필요합니다.
문자열 이어붙이기 — NULL 을 조심하십시오
문자열은 + 로 잇습니다. 그런데 이어 붙일 값 가운데 하나라도
NULL 이면 결과 전체가 NULL 이 됩니다.
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;
| nickname | with_plus | with_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> |
| 최지우 | NULL | NULL | 최지우<> |
마지막 행을 보십시오. 최지우는 전자 메일이 없어
email 이 NULL 인데,
닉네임까지 함께 사라졌습니다. 화면에 이름이 안 나오는 버그는 흔히
이 자리에서 생깁니다.
| 방법 | NULL 을 만나면 |
|---|---|
| + | 결과 전체가 NULL 이 됩니다 |
| CONCAT | 빈 문자열로 보고 나머지를 이어 붙입니다 |
값이 없을 수 있는 열을 이어 붙일 때는 CONCAT 을
사용하십시오. + 를 그대로 쓰려면
ISNULL 로 빈 문자열을 채워 넣어야 합니다(1.9).
직접 해보기
Board.CATEGORIES 에서 말머리 이름과 차례만 가져오되, 화면에 말머리 와 순서 로 나오게 해보세요.
회원의 닉네임과 아이디를 홍길동(hong) 모양으로 이어 붙여 보세요. 전자 메일이 없는 회원도 빠지지 않아야 합니다.
SELECT는 어느 열을 낼지,FROM은 어느 테이블에서 가져올지 정합니다.- 별표는 살펴볼 때만 사용합니다. 실제 문장에는 필요한 열만 적습니다.
- 이름은
AS로 바꾸고, 공백이 들어가면[대괄호]로 감쌉니다. - 계산한 열에는 반드시 이름을 붙입니다. 없으면 응용 프로그램이 꺼내지 못합니다.
DISTINCT는 적은 열 전체를 묶어 중복을 걷어냅니다.- 문자열을
+로 이을 때 NULL 이 하나라도 있으면 전체가 NULL 입니다.CONCAT은 그러지 않습니다.