개발 학습 실습실

이 사이트의 실습은 자바스크립트를 켜야 움직입니다. 아래는 같은 내용을 글로 적은 것입니다.

기초개념 › DB

테이블, 행, 열

테이블은 어떻게 생겼고, 행과 열은 무엇인가

관계형 데이터베이스는 데이터를 테이블(표)에 담습니다. CREATE TABLE은 표를 만들면서 열(세로 칸)을 정하는 문장이고, 열마다 이름과 타입이 있어서 "id 칸에는 정수, name 칸에는 글자"처럼 무엇을 담을지가 정해집니다. INSERT는 행(가로 한 줄, 한 사람의 정보)을 하나 넣는 문장이고, 행은 열의 개수와 타입에 맞아야 합니다. SELECT는 행들에서 고른 열의 값을 읽어 오는 문장입니다. 이 실습은 CREATE TABLE을 지우거나 둘째 행의 모양과 읽는 열을 바꿔 가며 같은 SQL을 실행해, DB가 어느 문장을 받아들이고 어느 문장을 거부하는지를 봅니다.

실행으로 대조 · H2 2.4.240에서 열여섯 가지 조합을 실행해 대조, 규칙은 MySQL 문서와 대조

이 실습에 나오는 개념

테이블
관계형 데이터베이스에서 데이터를 담는 표이다. 테이블에는 member처럼 이름이 있고, 어떤 열(칸의 종류)을 둘지는 CREATE TABLE로 정한다. 데이터는 그 열에 맞춘 행(한 줄)으로 쌓이며, 행은 INSERT로 넣고 SELECT로 읽는다. 테이블을 만들기 전에는 그 이름으로 INSERT도 SELECT도 할 수 없다. 한 데이터베이스에는 테이블을 여러 개 둘 수 있다.
행과 열
관계형 데이터베이스의 테이블은 표처럼 열과 행으로 이루어진다. 열(컬럼)은 테이블을 만들 때 이름과 타입을 정해 두는 칸의 종류이고, 예를 들어 member 테이블의 id, name이 열이다. 행(레코드)은 그 열들에 값을 채운 한 줄이며, 회원 한 사람의 정보가 행 하나가 된다. INSERT는 행을 하나 추가하고, UPDATE는 WHERE 조건에 맞는 행을 모두 고치며, SELECT는 행을 읽어 온다. 열에 값이 없는 것은 NULL로 나타낸다.
열의 데이터 타입
열의 데이터 타입은 그 열에 담을 수 있는 값의 종류이다. CREATE TABLE에서 열마다 이름과 함께 적는다. 예를 들어 id INT는 정수 칸이고, name VARCHAR(20)은 길이가 달라지는 글자를 20자까지 담는 칸이다. MySQL 8.4 문서는 타입을 숫자, 날짜와 시간, 문자열, 공간, JSON의 다섯 종류로 나눈다. 타입에 맞지 않는 값을 넣으려 하면 DB가 그 INSERT를 거부하는 것이 보통이지만, 얼마나 엄격한지는 DB와 설정에 따라 다르다.
CREATE TABLE, INSERT, SELECT
이 셋은 SQL 문이다. SQL은 관계형 데이터베이스에 일을 시키는 언어이고, 시키는 한 문장 한 문장을 SQL 문이라고 한다. CREATE TABLE은 테이블을 만들면서 열의 이름과 타입을 정하는 문이다(예: CREATE TABLE member (id INT, name VARCHAR(20))). INSERT는 행을 하나 넣는 문이고, 열 이름을 따로 적지 않으면 VALUES 뒤의 값이 CREATE TABLE에서 열을 적은 순서대로 열에 들어간다. SELECT는 행을 읽어 오는 문으로, SELECT name FROM member처럼 열 이름을 적으면 그 열의 값만, *를 적으면 모든 열의 값을 읽는다. 문장은 보통 세미콜론(;)으로 끝낸다.

이렇게 바꿔 보세요

처음 설정으로 실행하면

  1. CREATE TABLE: DB가 member라는 빈 표를 만들고, 열의 이름과 타입을 기억합니다. 열은 id(INT, 정수를 담는 칸)와 name(VARCHAR(20), 글자를 담는 칸) 두 개이고, 행은 아직 하나도 없습니다.
  2. INSERT INTO member VALUES (1, '김철수'): 값 두 개가 열 두 개에 차례로 들어갑니다. 첫째 값 1은 id 열에, 둘째 값 '김철수'는 name 열에 들어가고, 이렇게 채워진 한 줄이 행 하나입니다. 지금 테이블의 행은 1개입니다.
  3. INSERT INTO member VALUES (2, '이영희'): 두 번째 행을 넣으려 합니다. DB는 행을 넣기 전에 값의 개수가 열의 개수와 같은지, 각 값이 그 열의 타입(id 칸에는 정수, name 칸에는 글자)에 맞는지 확인합니다. 이 확인을 하는 코드를 우리는 쓰지 않았습니다. DB가 INSERT가 올 때마다 스스로 합니다. 값은 두 개이고 2는 정수, '이영희'는 글자이므로 열 두 개와 타입이 모두 맞습니다.
  4. DB의 확인 결과: 통과입니다. 이영희 행이 들어갔고, 테이블의 행은 2개가 되었습니다.
  5. SELECT name FROM member: DB가 테이블의 모든 행에서 name 열의 값만 읽어 돌려줍니다. id 열은 읽지 않습니다. 읽은 행은 2개이고 결과는 김철수, 이영희입니다.

실행 결과

코드

-- 테이블: member라는 표를 만들고, 열 두 개(id, name)를 정한다
CREATE TABLE member (
    id   INT,
    name VARCHAR(20)
);

-- 행: 한 사람의 정보 한 줄을 넣는다
INSERT INTO member VALUES (1, '김철수');
INSERT INTO member VALUES (2, '이영희');

SELECT name FROM member;

이 모형의 전제

H2 2.4.240(메모리 DB, JDBC)에서 실행해 대조했습니다. 열여섯 가지 조합을 모두, 화면의 SQL 전체(주석 줄 포함)를 글자 그대로 문장 하나씩 따로 실행했고, 한 문장이 실패해도 다음 문장은 계속 실행했습니다. 대조한 것은 둘째 INSERT가 들어갔는지 거부됐는지와 오류의 종류(H2의 SQLSTATE 22018 값을 타입으로 바꿀 수 없음, 21S02 값의 개수가 열의 개수와 다름, 42S04 테이블 없음, 42S22 열 없음), INSERT 두 번 뒤의 행 수, 마지막 SELECT가 읽은 값입니다. CREATE TABLE 직후의 행 수가 0이고 DB가 열의 이름과 타입(id 정수, name 글자 20자)을 기억한다는 것은 메타데이터를 읽어 확인했습니다. 열이 둘인데 값이 하나뿐인 INSERT를 H2는 거부했고, 이것은 문서가 아니라 H2에서 관찰한 동작입니다. MySQL 8.4 문서의 튜토리얼 Creating a Table(CREATE TABLE로 열의 이름과 타입을 정함, VARCHAR는 길이가 달라지는 글자), Loading Data into a Table(INSERT의 값은 CREATE TABLE에서 열을 적은 순서대로 들어감, NULL을 직접 넣을 수 있음), Selecting All Data와 Selecting Particular Columns(SELECT *는 모든 행과 열, 열 이름을 적으면 그 열만), Chapter 13 Data Types의 서두(타입은 숫자, 날짜와 시간, 문자열, 공간, JSON의 다섯 종류)를 직접 열어 확인했습니다. 다만 타입이나 개수가 맞지 않는 INSERT를 거부한다는 규칙은 이 문서들이 정한 것이 아니라 H2의 실행으로 확인한 것입니다. MySQL에서의 실행 대조는 하지 않았습니다. 오류 메시지의 글자와, 맞지 않는 값을 얼마나 엄격하게 거부하는지는 DB와 설정에 따라 다를 수 있습니다. 화면에는 오류의 종류만 적었고 오류 번호와 메시지 원문은 대조 프로그램의 출력에만 있습니다. 이 실습은 INT와 VARCHAR 두 타입만 다루며, 기본 키 같은 제약 조건, 여러 테이블, WHERE 조건은 다루지 않습니다.

앞 실습: JPQL · 다음 실습: 기본 키

이 실습에 나오는 개념

이 실습에서 보는 것

설정

코드


      
    

그림

실행 비교

이렇게 바꿔 보세요