SQL 기초 – PRIMARY KEY, FOREIGN KEY, 제약조건, JOIN, 서브쿼리

개발일지

PRIMARY KEY, FOREIGN KEY, 제약조건, JOIN, 서브쿼리 등 SQL의 핵심 개념들을 체득하기 위해 다양한 상황에서 반복적인 작업을 통해 실력을 향상시키고 있습니다. 데이터베이스의 정확성과 일관성을 유지하는데 중점을 두는 PRIMARY KEY와 FOREIGN KEY의 활용, 데이터 무결성을 지키기 위한 제약조건의 적용, 다양한 테이블 간의 데이터 결합을 위한 JOIN, 그리고 복잡한 조건을 다루기 위한 서브쿼리 작성에 대한 경험을 쌓고 있습니다.

계속해서 SQL을 다양하게 활용해보며 데이터베이스 관리 및 쿼리 작성 능력을 향상시키고자 노력 중이며, 지속적인 학습을 통해 보다 능숙한 개발자로 성장하고자 합니다.🚀

PRIMARY KEY (기본키)

SQL에서 PRIMARY KEY는 데이터베이스 테이블에서 각 행을 고유하게 식별하는 데 사용되는 열 또는 열의 조합입니다. PRIMARY KEY는 테이블의 기본 키로서, 해당 키의 값은 중복될 수 없으며 NULL일 수 없습니다. 이는 데이터베이스에서 행을 신속하게 찾고 관계를 설정하는 데 중요합니다.

PRIMARY KEY의 주요 특징

  1. 고유성 (Uniqueness): PRIMARY KEY의 값은 테이블 내에서 고유해야 합니다. 즉, 동일한 키 값이 두 번 이상 나타날 수 없습니다.
  2. NULL 값 금지 (Non-Null): PRIMARY KEY 열은 NULL 값을 허용하지 않습니다. 각 행은 해당 키 값이 있어야 합니다.
  3. 참조 무결성 (Referential Integrity): 다른 테이블의 FOREIGN KEY로 사용될 때 PRIMARY KEY는 참조 무결성을 제공합니다. 이는 관계형 데이터베이스에서 테이블 간의 관계를 유지하고 데이터 일관성을 유지하는 데 도움이 됩니다.

PRIMARY KEY 형식

SQL
CREATE TABLE 테이블명 (
    column1 데이터_유형 PRIMARY KEY,
    column2 데이터_유형,
    ...
);
SQL

또는 여러 열을 결합하여 PRIMARY KEY를 만들 수 있습니다.

SQL
CREATE TABLE 테이블명 (
    column1 데이터_유형,
    column2 데이터_유형,
    ...
    PRIMARY KEY (column1, column2)
);
SQL

예시

예를 들어, 다음은 사용자 정보를 저장하는 테이블을 만들고 그 중 사용자 ID를 PRIMARY KEY로 지정하는 예시입니다.

SQL
CREATE TABLE 사용자 (
    사용자_ID INT PRIMARY KEY,
    이름 VARCHAR(50),
    이메일 VARCHAR(100)
);
SQL

✔️이렇게 하면 각 사용자의 ID가 고유하게 식별되고, 다른 테이블에서 이 테이블을 참조할 때 사용자 ID를 FOREIGN KEY로 사용할 수 있습니다.

FOREIGN KEY (외래키)

SQL에서 FOREIGN KEY(외래 키)는 한 테이블의 열 또는 열의 조합으로 다른 테이블의 PRIMARY KEY 또는 UNIQUE KEY와 관련된 제약 조건입니다. FOREIGN KEY를 사용하면 두 테이블 간에 관계를 설정하고 데이터 무결성을 유지할 수 있습니다.

FOREIGN KEY의 주요 특징

  1. 데이터 무결성 (Data Integrity): FOREIGN KEY는 데이터베이스에서 참조 무결성을 제공합니다. 이는 부모 테이블(참조되는 테이블)의 PRIMARY KEY 또는 UNIQUE KEY 값과 일치하는 값만이 자식 테이블(참조하는 테이블)의 FOREIGN KEY에 삽입되거나 업데이트 되도록 합니다.
  2. 테이블 간의 관계 (Relationships Between Tables): FOREIGN KEY를 사용하여 두 테이블 간의 관계를 설정할 수 있습니다. 예를 들어, 주문 테이블에서 고객 ID를 참조하는 FOREIGN KEY를 가진 경우, 해당 FOREIGN KEY를 통해 주문이 특정 고객에 속한다는 관계를 정의할 수 있습니다.
  3. 참조 연산 (Referential Actions): FOREIGN KEY 제약 조건은 참조된 테이블의 행에 대한 변경에 대한 옵션을 제공합니다. 예를 들어, 참조된 행이 삭제될 때 참조하는 테이블의 행도 삭제하거나, 참조된 행이 변경될 때 참조하는 테이블의 FOREIGN KEY 값을 업데이트하는 등의 작업을 수행할 수 있습니다.

FOREIGN KEY 형식

SQL
CREATE TABLE 참조하는_테이블 (
    ...
    외래키_열 데이터_유형,
    FOREIGN KEY (외래키_열) REFERENCES 참조된_테이블(참조된_열)
    ...
);
SQL

예시

예를 들어, 주문 테이블에서 고객을 참조하는 FOREIGN KEY를 생성하는 SQL 문은 다음과 같습니다.

SQL
CREATE TABLE 주문 (
    주문_ID INT PRIMARY KEY,
    고객_ID INT,
    주문_날짜 DATE,
    FOREIGN KEY (고객_ID) REFERENCES 고객(고객_ID)
);
SQL

✔️이렇게 하면 주문 테이블의 고객_ID 열이 고객 테이블의 고객_ID와 관련되어 데이터 무결성을 유지할 수 있습니다.

제약조건

SQL에서 제약 조건(Constraint)은 테이블에 데이터의 무결성을 유지하기 위한 규칙 또는 규정입니다. 제약 조건은 테이블에 삽입, 업데이트, 삭제 작업이 수행될 때 데이터의 일관성과 유효성을 보장합니다. 여러 종류의 제약 조건이 있으며, 주요 유형은 다음과 같습니다.

  1. PRIMARY KEY 제약 조건:
    • 테이블에서 하나 이상의 열을 결합하여 고유하게 식별하는 데 사용됩니다.
    • 해당 열의 값은 NULL이 아니어야 하며, 중복될 수 없습니다.
    • 테이블당 하나의 PRIMARY KEY만 가질 수 있습니다.
  2. FOREIGN KEY 제약 조건:
    • 한 테이블의 열(또는 열의 조합)이 다른 테이블의 PRIMARY KEY 또는 UNIQUE KEY를 참조하는 데 사용됩니다.
    • 참조된 테이블에서 변경이나 삭제가 발생할 때, 이를 참조하는 테이블에서도 일관성을 유지하기 위한 규칙을 정의합니다.
  3. UNIQUE 제약 조건:
    • 열(또는 열의 조합)의 값이 중복되지 않아야 합니다.
    • 하나의 테이블에 여러 개의 UNIQUE 제약 조건을 가질 수 있습니다.
  4. NOT NULL 제약 조건:
    • 열에 NULL 값을 허용하지 않습니다. 각 행은 해당 열에 대해 NULL이 아닌 값을 가져야 합니다.
  5. CHECK 제약 조건:
    • 특정 열에 대해 지정된 조건을 만족해야 합니다. 예를 들어, 나이가 음수가 아니어야 하는 등의 규칙을 설정할 수 있습니다.

예시

제약 조건은 테이블을 생성할 때 또는 이미 존재하는 테이블을 변경할 때 정의됩니다. 다음은 각각의 제약 조건을 테이블 생성 시에 어떻게 정의하는지에 대한 예시입니다.

SQL
CREATE TABLE 예제 (
    ID INT PRIMARY KEY,
    이름 VARCHAR(50) NOT NULL,
    이메일 VARCHAR(100) UNIQUE,
    부서_ID INT,
    FOREIGN KEY (부서_ID) REFERENCES 부서(부서_ID),
    CHECK (나이 >= 0)
);
SQL

✔️이 예시에서는 PRIMARY KEY, NOT NULL, UNIQUE, FOREIGN KEY, CHECK 제약 조건이 사용되었습니다. 이러한 제약 조건들은 데이터베이스 시스템이 테이블에 삽입되는 데이터에 대해 자동으로 검증하고 유지할 수 있도록 도와줍니다.

JOIN

SQL에서 JOIN은 두 개 이상의 테이블을 결합하여 데이터를 가져오는 데 사용되는 연산자입니다. JOIN은 특정 조건에 따라 두 테이블 간의 행을 연결하여 새로운 결과 집합을 생성합니다. 주로 INNER JOIN, LEFT JOIN, RIGHT JOIN, FULL JOIN과 같은 다양한 JOIN 유형이 있습니다.

INNER JOIN (내부 조인)

  • INNER JOIN은 두 테이블에서 조건에 맞는 행만 선택합니다.예를 들어, 두 테이블 A와 B가 있을 때, A와 B의 조인 조건을 만족하는 행만 결과에 포함됩니다.
SQL
SELECT *
FROM 테이블A
INNER JOIN 테이블B ON 테이블A.공통열 = 테이블B.공통열;
SQL

LEFT JOIN (왼쪽 조인)

  • 왼쪽 테이블의 모든 행과 오른쪽 테이블에서 일치하는 행을 선택합니다.오른쪽 테이블에 일치하는 값이 없으면 NULL 값으로 채워집니다.
SQL
SELECT *
FROM 테이블A
LEFT JOIN 테이블B ON 테이블A.공통열 = 테이블B.공통열;
SQL

RIGHT JOIN (오른쪽 조인)

  • 오른쪽 테이블의 모든 행과 왼쪽 테이블에서 일치하는 행을 선택합니다.왼쪽 테이블에 일치하는 값이 없으면 NULL 값으로 채워집니다.
SQL
SELECT *
FROM 테이블A
RIGHT JOIN 테이블B ON 테이블A.공통열 = 테이블B.공통열;
SQL

FULL JOIN (전체 조인)

  • 양쪽 테이블에서 일치하는 행을 모두 선택합니다.어느 한 쪽에만 있는 경우 NULL 값으로 채워집니다.
SQL
SELECT *
FROM 테이블A
FULL JOIN 테이블B ON 테이블A.공통열 = 테이블B.공통열;
SQL

✔️이렇게 다양한 JOIN 유형을 활용하여 데이터베이스에서 필요한 정보를 효과적으로 추출할 수 있습니다. JOIN은 데이터를 효과적으로 관리하고 복잡한 쿼리를 작성하는 데 도움이 되는 중요한 SQL 기능 중 하나입니다.

서브쿼리

서브쿼리(subquery)란 SQL 쿼리 내에서 다른 쿼리를 포함하는 것을 의미합니다. 서브쿼리는 주로 메인 쿼리의 일부 또는 조건으로 사용되며, 데이터베이스로부터 원하는 정보를 추출하거나 조건을 검사하기 위해 활용됩니다.

단일행 서브쿼리

단일행 서브쿼리는 서브쿼리가 하나의 행만 반환하는 유형의 서브쿼리를 의미합니다. 이 서브쿼리는 주로 단일 값을 계산하거나 단일 행을 비교하는데 사용됩니다. 주로 SELECT 절이나 WHERE 절에서 활용되며, 비교 연산자와 함께 자주 사용됩니다.

특징

  • 단일행 서브쿼리는 하나의 행만 반환하므로, 결과로 나오는 값은 스칼라 값(단일 값)입니다.
  • 주로 등호(=), 부등호(<>, !=), 비교 연산자들과 함께 사용하여 부모 쿼리의 조건을 만족하는 값을 찾습니다.

SELECT 절에서의 사용

SQL
SELECT 열1, (SELECT 열2 FROM 다른테이블 WHERE 조건) AS 계산열
FROM 테이블;
SQL

WHERE 절에서의 사용

SQL
SELECT *
FROM 테이블1
WHERE 열1 = (SELECT 열1 FROM 테이블2 WHERE 조건);
SQL

IN 연산자와 함께 사용

  • IN 연산자와 함께 사용하여 부모 쿼리의 조건에 여러 값이나 서브쿼리의 결과 중 하나가 일치하는지 확인합니다.
SQL
SELECT *
FROM 테이블1
WHERE 열1 IN (SELECT 열1 FROM 테이블2 WHERE 조건);
SQL

EXISTS 연산자와 함께 사용

  • EXISTS 연산자와 함께 사용하여 서브쿼리의 결과가 존재하는지 여부를 확인하는데에도 사용됩니다.
SQL
SELECT *
FROM 테이블1
WHERE EXISTS (SELECT * FROM 테이블2 WHERE 조건);
SQL

✔️단일행 서브쿼리는 데이터베이스에서 특정 행의 값을 추출하거나, 특정 조건을 만족하는 행을 찾는 데에 유용하게 활용됩니다.

다중행 서브쿼리

다중행 서브쿼리(Multi-Row Subquery)는 서브쿼리가 여러 행을 반환하는 유형의 서브쿼리입니다. 이는 서브쿼리의 결과 집합이 하나 이상의 행을 포함할 수 있음을 의미합니다. 주로 비교 연산자나 IN, ANY, ALL과 같은 비교 조건과 함께 사용되며, 주로 SELECT 문의 WHERE, HAVING 절에서 활용됩니다.

IN 연산자

  • IN 연산자는 서브쿼리에서 반환된 값 중 하나와 일치하는 경우를 확인할 때 사용됩니다.
SQL
SELECT *
FROM 테이블1
WHERE 열1 IN (SELECT 열1 FROM 테이블2 WHERE 조건);
SQL

ANY (또는 SOME) 연산자

  • ANY 또는 SOME 연산자는 서브쿼리에서 반환된 값 중 하나 이상과 조건을 만족하는 경우를 확인할 때 사용됩니다. ANY와 SOME은 동의어로 사용할 수 있습니다.
SQL
SELECT *
FROM 테이블1
WHERE 열1 < ANY (SELECT 열1 FROM 테이블2 WHERE 조건);
SQL

ALL 연산자

  • ALL 연산자는 서브쿼리에서 반환된 모든 값이 조건을 만족하는 경우를 확인할 때 사용됩니다.
SQL
SELECT *
FROM 테이블1
WHERE 열1 > ALL (SELECT 열1 FROM 테이블2 WHERE 조건);
SQL

EXISTS 연산자

  • EXISTS 연산자는 서브쿼리에서 반환된 결과가 존재하는 경우를 확인할 때 사용됩니다. 결과가 존재하면 조건이 참이 됩니다.
SQL
SELECT *
FROM 테이블1
WHERE EXISTS (SELECT * FROM 테이블2 WHERE 조건);
SQL

✔️이러한 연산자들은 서브쿼리를 사용하여 복잡한 조건을 만족하는 데이터를 검색하는 데에 유용합니다. 각 연산자는 다양한 상황에서 활용될 수 있으며, 적절한 상황에 적용하여 데이터를 추출하거나 필터링할 수 있습니다.

마무리

이번 개발일지에서는 SQL의 중요한 개념들을 학습하고 익힌 내용에 대해 간략하게 기록해 보았습니다. PRIMARY KEY, FOREIGN KEY, 제약조건, JOIN, 서브쿼리 등 SQL의 핵심 개념을 반복적인 작업을 통해 익히고 있습니다.

데이터베이스 설계에서는 PRIMARY KEY의 고유성과 참조 무결성을 강조하여 관계를 설정하고, FOREIGN KEY를 활용하여 테이블 간의 연결을 구축하고 있습니다. 또한, 제약조건을 통해 데이터의 무결성을 보장하며, 다양한 JOIN 연산을 활용하여 테이블 간의 데이터를 효과적으로 결합하고 있습니다. 더불어, 서브쿼리를 사용하여 복잡한 조건을 다루고 필요한 정보를 추출하는 경험도 쌓고 있습니다.

앞으로도 계속해서 다양한 상황에 SQL을 활용하며 데이터베이스 관리 및 쿼리 작성 능력을 향상시키고자 노력할 것이며, 지속적인 학습을 통해 보다 능숙한 개발자로 성장하고자 합니다. 성장하는 과정을 기록하고, 미래의 프로젝트에서 높은 수준의 개발 역량을 발휘할 수 있도록 노력하겠습니다.🚀

Leave a Comment