SQL 기본 문법 정리

데이터베이스와 소통하는 핵심 열쇠, SQL에 대해 알아보고 싶으신가요? SQL은 복잡해 보이지만, 기본 문법을 이해하면 데이터 관리와 분석이 훨씬 쉬워져요.

이 글에서는 SQL의 기본 문법을 체계적으로 정리하여, 데이터베이스를 다루는 데 필요한 핵심 지식을 쉽고 빠르게 습득할 수 있도록 도와드릴게요.

데이터를 효과적으로 다루는 능력은 개발자뿐만 아니라 다양한 분야에서 필수적인 역량이 되고 있어요. SQL 기본 문법을 탄탄히 다져 실무에 바로 적용할 수 있도록 함께 알아보아요.

SQL은 관계형 데이터베이스 관리 시스템(RDBMS)에서 데이터를 관리하고 조작하기 위해 설계된 표준 언어예요. 표준화되어 있어 다양한 데이터베이스 시스템에서 유사하게 사용되므로, 한번 익혀두면 여러 곳에서 활용할 수 있다는 장점이 있죠.

이 글을 통해 SQL의 기본 개념부터 실제 활용까지 단계별로 익히면서 데이터 기반의 의사결정 능력을 한층 끌어올릴 수 있기를 바랍니다.

SQL 기본 문법 정리
SQL 기본 문법 정리

1. SQL, 데이터베이스의 언어를 이해해요

1.1 SQL이란 무엇인가요?

SQL은 Structured Query Language의 약자로, 데이터베이스와 대화하기 위한 프로그래밍 언어예요. 사용자가 원하는 데이터를 데이터베이스에서 가져오거나, 데이터를 추가, 수정, 삭제하는 등의 작업을 할 때 SQL 명령어를 사용하죠.

데이터베이스는 구조화된 데이터를 저장하는 시스템이며, SQL은 이러한 데이터베이스 시스템에 명령을 내리는 표준적인 방법을 제공해요. 예를 들어, 특정 조건에 맞는 고객 정보를 찾아달라고 요청할 때 SQL을 사용해요.

SQL은 특정 데이터베이스 시스템에 종속되지 않고 표준화되어 있기 때문에, MySQL, PostgreSQL, Oracle, SQL Server 등 다양한 RDBMS에서 거의 동일한 문법으로 사용할 수 있어요. 이러한 범용성 덕분에 SQL은 데이터 관련 직무에서 필수적인 기술로 자리 잡고 있죠.

1.2 데이터베이스의 기본 구성 요소

SQL을 이해하기 위해서는 데이터베이스의 기본적인 구성 요소를 아는 것이 좋아요. 데이터베이스는 크게 테이블(Table), 컬럼(Column), 로우(Row)로 구성돼요.

테이블은 엑셀 시트와 비슷하게 행과 열로 이루어진 데이터의 모음이에요. 예를 들어 '고객' 테이블에는 고객 정보를 저장하는 모든 데이터가 담겨 있죠.

컬럼은 테이블의 각 열에 해당하며, 데이터의 속성이나 종류를 나타내요. '고객' 테이블이라면 '이름', '이메일', '전화번호' 등이 컬럼이 될 수 있어요. 각 컬럼은 특정 데이터 타입(텍스트, 숫자, 날짜 등)을 가져요.

로우는 테이블의 각 행으로, 하나의 개체에 대한 개별적인 데이터 레코드를 의미해요. '고객' 테이블에서 한 명의 고객에 대한 모든 정보(이름, 이메일, 전화번호 등)가 하나의 로우를 구성하게 돼요.

2. 데이터를 조회하는 SELECT 문의 마법

2.1 SELECT 문의 기본 구조

SQL에서 가장 기본적이고 자주 사용되는 명령은 데이터를 조회하는 `SELECT` 문이에요. `SELECT` 문을 사용하면 테이블에서 원하는 데이터를 조건에 맞게 추출할 수 있어요.

`SELECT` 문의 기본적인 형식은 다음과 같아요: `SELECT 컬럼_이름 FROM 테이블_이름 WHERE 조건식 ORDER BY 컬럼_이름 LIMIT 숫자`. 여기서 `WHERE`, `ORDER BY`, `LIMIT` 등은 필요에 따라 생략 가능해요.

가장 간단한 형태는 특정 테이블의 모든 데이터를 조회하는 `SELECT * FROM 테이블_이름;` 이에요. 여기서 `*`는 모든 컬럼을 의미해요. 만약 특정 컬럼만 보고 싶다면, `SELECT 컬럼1, 컬럼2 FROM 테이블_이름;`과 같이 컬럼 이름을 나열하면 돼요.

2.2 WHERE 절로 원하는 데이터만 필터링해요

`WHERE` 절은 `SELECT` 문에서 특정 조건을 만족하는 로우(데이터)만을 선택할 때 사용해요. 이를 통해 불필요한 데이터를 제외하고 필요한 정보에 집중할 수 있어요.

예를 들어, '서울'에 거주하는 고객만 찾고 싶다면 `SELECT * FROM 고객 WHERE 지역 = '서울';`과 같이 사용할 수 있어요. 비교 연산자(`=`, `!=`, `>`, `<`, `>=`, `<=`)와 논리 연산자(`AND`, `OR`, `NOT`)를 함께 사용하여 복잡한 조건을 만들 수도 있어요.

`LIKE` 연산자를 사용하면 특정 문자열 패턴을 포함하는 데이터를 찾을 수 있어요. 예를 들어 '김'으로 시작하는 이름을 가진 고객을 찾으려면 `SELECT * FROM 고객 WHERE 이름 LIKE '김%';`이라고 작성해요. 여기서 `%`는 임의의 문자열을 의미해요.

2.3 ORDER BY로 결과 정렬하기

`ORDER BY` 절은 조회된 결과를 특정 컬럼을 기준으로 오름차순(`ASC`) 또는 내림차순(`DESC`)으로 정렬할 때 사용해요. 기본값은 오름차순이에요.

예를 들어, 고객 테이블을 나이순으로 오름차순 정렬하고 싶다면 `SELECT * FROM 고객 ORDER BY 나이 ASC;` 또는 `SELECT * FROM 고객 ORDER BY 나이;`와 같이 작성해요. 만약 나이가 많은 순서대로 보고 싶다면 `SELECT * FROM 고객 ORDER BY 나이 DESC;`라고 하면 돼요.

여러 컬럼을 기준으로 정렬할 수도 있어요. `SELECT * FROM 주문 ORDER BY 주문일 DESC, 금액 ASC;`와 같이 작성하면, 주문일이 최신인 것부터 먼저 보여주고, 주문일이 같다면 금액이 적은 것부터 보여주는 식이에요.

2.4 LIMIT으로 조회 결과 수 제한하기

`LIMIT` 절은 조회되는 결과 로우의 수를 제한할 때 사용해요. 많은 양의 데이터에서 상위 몇 개의 결과만 확인하고 싶을 때 유용하게 쓰이죠.

예를 들어, 가장 최근 주문 10건만 보고 싶다면 `SELECT * FROM 주문 ORDER BY 주문일 DESC LIMIT 10;`과 같이 사용할 수 있어요. `LIMIT` 절은 보통 `ORDER BY` 절과 함께 사용하여 의미 있는 결과를 얻는 경우가 많아요.

MySQL이나 PostgreSQL 같은 일부 데이터베이스에서는 `OFFSET`과 함께 사용하여 특정 개수만큼 건너뛰고 다음 데이터를 가져오는 것도 가능해요. `LIMIT 10 OFFSET 20;`은 21번째부터 10개의 데이터를 가져오는 것을 의미해요.

3. 데이터 조작(DML)으로 정보를 바꿔봐요

3.1 INSERT로 새로운 데이터 추가하기

`INSERT` 문은 테이블에 새로운 데이터를 추가할 때 사용해요. 데이터를 추가하려는 테이블의 컬럼 순서에 맞춰 값을 제공해야 해요.

기본적인 `INSERT` 문은 다음과 같아요: `INSERT INTO 테이블_이름 (컬럼1, 컬럼2, ...) VALUES (값1, 값2, ...);`. 모든 컬럼에 값을 넣는다면 컬럼 이름 목록은 생략할 수 있어요.

예를 들어, '사용자' 테이블에 새로운 사용자를 추가하고 싶다면 `INSERT INTO 사용자 (아이디, 이름, 이메일) VALUES ('new_user', '새로운 사용자', 'new@example.com');`과 같이 작성할 수 있어요. `id`와 같이 자동 증가하는 컬럼이라면 값을 명시하지 않아도 돼요.

3.2 UPDATE로 기존 데이터 수정하기

`UPDATE` 문은 테이블에 이미 존재하는 데이터를 수정할 때 사용해요. 특정 조건을 만족하는 로우의 특정 컬럼 값을 변경할 수 있죠.

`UPDATE` 문의 형식은 `UPDATE 테이블_이름 SET 컬럼1 = 새값1, 컬럼2 = 새값2 WHERE 조건식;`이에요. `WHERE` 절을 생략하면 테이블의 모든 로우가 수정되므로 주의해야 해요.

예를 들어, 'new_user'라는 아이디를 가진 사용자의 이메일 주소를 변경하려면 `UPDATE 사용자 SET 이메일 = 'updated@example.com' WHERE 아이디 = 'new_user';`라고 작성할 수 있어요.

3.3 DELETE로 데이터 삭제하기

`DELETE` 문은 테이블에서 데이터를 삭제할 때 사용해요. 특정 조건을 만족하는 로우를 삭제할 수 있어요.

`DELETE` 문의 형식은 `DELETE FROM 테이블_이름 WHERE 조건식;`이에요. `WHERE` 절을 생략하면 테이블의 모든 데이터가 삭제되므로 매우 신중해야 해요.

예를 들어, 'old_user'라는 아이디를 가진 사용자를 삭제하려면 `DELETE FROM 사용자 WHERE 아이디 = 'old_user';`라고 작성해요.

4. 테이블 구조를 만드는 DDL

4.1 CREATE TABLE로 새 테이블 생성하기

`CREATE TABLE` 문은 데이터베이스에 새로운 테이블을 생성할 때 사용해요. 테이블의 이름과 각 컬럼의 이름, 데이터 타입, 제약 조건 등을 정의할 수 있어요.

기본적인 `CREATE TABLE` 문의 구조는 `CREATE TABLE 테이블_이름 (컬럼1 데이터_타입 제약조건, 컬럼2 데이터_타입 제약조건, ...);`이에요. 각 컬럼은 어떤 종류의 데이터를 저장할지(예: INT, VARCHAR, DATE) 그리고 해당 컬럼에 대한 규칙(예: NULL 허용 여부, 기본값)을 지정해요.

예를 들어, '제품' 테이블을 생성하는 코드는 다음과 같을 수 있어요: `CREATE TABLE 제품 (제품_ID INT PRIMARY KEY AUTO_INCREMENT, 제품명 VARCHAR(255) NOT NULL, 가격 DECIMAL(10, 2), 등록일 DATE);`. 여기서 `PRIMARY KEY`는 각 로우를 고유하게 식별하는 기본 키를, `NOT NULL`은 해당 컬럼에 반드시 값이 있어야 함을 의미해요.

4. 테이블 구조를 만드는 DDL
4. 테이블 구조를 만드는 DDL

4.2 ALTER TABLE로 테이블 구조 변경하기

`ALTER TABLE` 문은 이미 존재하는 테이블의 구조를 변경할 때 사용해요. 새로운 컬럼을 추가하거나, 기존 컬럼의 데이터 타입을 변경하거나, 컬럼을 삭제하는 등의 작업이 가능해요.

컬럼을 추가하는 예시는 `ALTER TABLE 테이블_이름 ADD COLUMN 새로운_컬럼_이름 데이터_타입;`이에요. 예를 들어 '제품' 테이블에 '재고량' 컬럼을 추가하려면 `ALTER TABLE 제품 ADD COLUMN 재고량 INT DEFAULT 0;`과 같이 작성할 수 있어요.

기존 컬럼을 수정하거나 삭제하는 것도 가능하며, 데이터베이스 시스템마다 문법에 약간의 차이가 있을 수 있으니 해당 시스템의 문서를 참고하는 것이 좋아요.

4.3 DROP TABLE로 테이블 삭제하기

`DROP TABLE` 문은 더 이상 필요 없는 테이블을 완전히 삭제할 때 사용해요. 테이블과 함께 모든 데이터가 영구적으로 삭제되므로 사용에 주의가 필요해요.

`DROP TABLE` 문의 형식은 `DROP TABLE 테이블_이름;`이에요. 예를 들어 '임시_데이터' 테이블을 삭제하려면 `DROP TABLE 임시_데이터;`라고 입력하면 돼요.

테이블을 삭제하기 전에 중요한 데이터가 없는지 반드시 확인하고, 백업 등의 안전 조치를 취하는 것이 좋아요.

5. SQL 함수의 활용

5.1 집계 함수: 데이터 요약하기

SQL은 데이터를 요약하고 통계를 계산하는 데 유용한 다양한 집계 함수를 제공해요. `COUNT`, `SUM`, `AVG`, `MIN`, `MAX` 등이 대표적이에요.

`COUNT` 함수는 특정 조건에 맞는 로우의 개수를 세거나, 특정 컬럼의 NULL이 아닌 값의 개수를 세는 데 사용해요. `SUM`은 숫자 컬럼의 합계를, `AVG`는 평균을 계산해요. `MIN`과 `MAX`는 각각 최소값과 최대값을 반환하죠.

예를 들어, '주문' 테이블에서 총 주문 건수를 알고 싶다면 `SELECT COUNT(*) FROM 주문;`이라고 할 수 있어요. 전체 주문 금액의 합계는 `SELECT SUM(금액) FROM 주문;`으로 구할 수 있어요.

5.2 문자열 함수: 텍스트 다루기

문자열 함수는 텍스트 데이터를 조작하고 가공하는 데 사용돼요. `CONCAT`, `SUBSTRING`, `LENGTH`, `UPPER`, `LOWER` 등이 자주 쓰여요.

`CONCAT` 함수는 여러 문자열을 하나로 합칠 때 사용하고, `SUBSTRING`은 문자열의 일부분을 추출해요. `LENGTH`는 문자열의 길이를 반환하며, `UPPER`와 `LOWER`는 각각 대문자, 소문자로 변환해줘요.

예를 들어, 고객의 이름과 성을 합쳐 전체 이름을 만들고 싶다면 `SELECT CONCAT(성, 이름) AS 전체이름 FROM 고객;`과 같이 사용할 수 있어요. 여기서 `AS`는 컬럼에 별칭을 부여하는 역할을 해요.

5.3 날짜 및 시간 함수: 시간 정보 관리

날짜와 시간 데이터를 다루는 함수들도 유용해요. `NOW()`, `CURDATE()`, `DATE_FORMAT`, `DATEDIFF` 등이 대표적이죠.

`NOW()`는 현재 날짜와 시간을, `CURDATE()`는 현재 날짜만을 반환해요. `DATE_FORMAT`은 날짜를 원하는 형식의 문자열로 변환해주는 강력한 함수이고, `DATEDIFF`는 두 날짜 사이의 차이를 일수로 계산해줘요.

예를 들어, 오늘 날짜를 'YYYY-MM-DD' 형식으로 보고 싶다면 `SELECT DATE_FORMAT(CURDATE(), '%Y-%m-%d');`와 같이 사용할 수 있어요.

6. SQL 학습 로드맵

6.1 기본 문법 마스터하기

모든 SQL 학습의 시작은 `SELECT`, `INSERT`, `UPDATE`, `DELETE`와 같은 기본적인 DML(Data Manipulation Language)과 `CREATE TABLE`, `ALTER TABLE`, `DROP TABLE` 같은 DDL(Data Definition Language) 문법을 익히는 거예요. 이 부분은 데이터베이스를 다루는 데 있어 가장 기초가 되므로 확실하게 이해하는 것이 중요해요.

`WHERE`, `GROUP BY`, `HAVING`, `ORDER BY` 등의 절을 활용하여 데이터를 원하는 대로 필터링하고 정렬하는 방법을 익히는 것이 다음 단계예요. 다양한 조건을 조합하여 복잡한 쿼리를 작성하는 연습을 꾸준히 하는 것이 좋아요.

6.2 JOIN을 활용한 데이터 결합

실제 업무에서는 여러 테이블에 나누어져 있는 데이터를 함께 조회해야 하는 경우가 많아요. 이때 `JOIN`을 사용하게 돼요. `INNER JOIN`, `LEFT JOIN`, `RIGHT JOIN`, `FULL OUTER JOIN` 등 다양한 조인 방식을 이해하고 상황에 맞게 사용하는 능력을 키워야 해요.

테이블 간의 관계를 명확히 이해하고, 어떤 데이터를 어떤 방식으로 결합해야 원하는 결과를 얻을 수 있는지 파악하는 연습이 필요해요.

6.3 고급 기능 및 최적화

기본적인 문법을 익혔다면, 서브쿼리, 윈도우 함수, CTE(Common Table Expression) 등 고급 SQL 기능을 학습할 차례예요. 이러한 기능들은 복잡한 쿼리를 더 효율적이고 가독성 있게 작성하도록 도와줘요.

또한, 데이터베이스 성능 최적화를 위한 `인덱스`의 개념을 이해하고 `EXPLAIN` 등을 활용하여 쿼리의 실행 계획을 분석하는 능력도 중요해요. 비효율적인 쿼리는 대규모 데이터에서 심각한 성능 저하를 유발할 수 있기 때문이에요.

7. 자주 묻는 질문

Q1. SQL 문법에서 대소문자를 구분하나요?
일반적으로 SQL 예약어(SELECT, FROM 등)는 대소문자를 구분하지 않아요. 하지만 테이블 이름이나 컬럼 이름의 경우, 사용하는 데이터베이스 시스템의 설정에 따라 구분할 수도 있고 안 할 수도 있어요. 일반적으로는 일관성을 위해 예약어는 대문자로, 식별자(테이블/컬럼 이름)는 소문자로 작성하는 경우가 많아요.
Q2. NULL 값이란 무엇인가요?
NULL은 '값이 없음' 또는 '알 수 없음'을 나타내는 특별한 값이에요. 0이나 빈 문자열과는 달라요. NULL 값을 다룰 때는 주의해야 하는데, 예를 들어 NULL과의 비교 연산은 보통 예상과 다르게 동작하며, 집계 함수 중에는 NULL 값을 제외하고 계산하는 함수가 많아요. `IS NULL` 또는 `IS NOT NULL` 조건을 사용하여 NULL 값을 가진 로우를 찾을 수 있어요.
Q3. SELECT * 와 SELECT 컬럼_이름 의 차이는 무엇인가요?
`SELECT *`는 해당 테이블의 모든 컬럼에 있는 데이터를 조회하라는 명령이에요. 반면에 `SELECT 컬럼_이름1, 컬럼_이름2`는 지정된 컬럼에 해당하는 데이터만 조회해요. 모든 컬럼이 필요한 경우가 아니라면, 필요한 컬럼만 명시하는 것이 성능 면에서 더 효율적이에요. 특히 데이터 양이 많을 경우 불필요한 데이터 전송을 줄일 수 있어요.
Q4. WHERE 절과 HAVING 절의 차이는 무엇인가요?
`WHERE` 절은 `SELECT` 문에서 로우를 필터링하는 데 사용돼요. 즉, 데이터를 가져오기 전에 조건을 적용하는 것이죠. 반면에 `HAVING` 절은 `GROUP BY`로 그룹화된 결과에 조건을 적용할 때 사용해요. 집계 함수(`SUM`, `COUNT` 등)의 결과에 조건을 걸고 싶을 때 `HAVING`을 사용한다고 생각하면 돼요.
Q5. SQL을 배우기 좋은 온라인 리소스는 무엇인가요?
온라인에는 SQL을 배울 수 있는 다양한 유료 및 무료 리소스가 있어요. Codecademy, Khan Academy, SQLZoo와 같은 웹사이트에서 인터랙티브한 실습을 제공하며, W3Schools는 SQL 문법을 쉽게 찾아볼 수 있는 좋은 참고 자료예요. 유튜브에는 SQL 강의 영상도 많이 있으니, 자신에게 맞는 학습 스타일을 선택하여 꾸준히 연습하는 것이 중요해요.
Q6. SQL 쿼리가 느릴 때 어떻게 해야 하나요?
쿼리가 느린 이유는 다양할 수 있어요. 가장 먼저 `EXPLAIN` 명령어를 사용하여 쿼리의 실행 계획을 확인하고, 인덱스가 제대로 사용되고 있는지 점검해야 해요. 필요한 컬럼에 인덱스를 생성하거나, `SELECT *` 대신 필요한 컬럼만 지정하고, 불필요한 `JOIN`을 줄이는 등의 방법으로 쿼리를 최적화할 수 있어요. 또한, 데이터베이스 서버 자체의 성능 문제일 수도 있으니 시스템 리소스도 함께 확인하는 것이 좋아요.

⚠️ 면책조항

이 글은 SQL 기본 문법에 대한 일반적인 정보를 제공하기 위해 작성되었어요. 실제 데이터베이스 시스템이나 특정 상황에서의 적용은 다를 수 있으므로, 반드시 공식 문서나 전문가의 도움을 받아 정확성을 확인하세요.

📌 요약

• SQL은 데이터베이스와 소통하는 표준 언어로, 기본 문법 이해가 중요해요.
• SELECT 문은 데이터를 조회하는 핵심이며, WHERE, ORDER BY, LIMIT으로 제어해요.
• INSERT, UPDATE, DELETE 문으로 데이터를 추가, 수정, 삭제할 수 있어요.
• CREATE TABLE, ALTER TABLE, DROP TABLE 문으로 테이블 구조를 관리해요.
• 집계, 문자열, 날짜 함수 등을 활용하여 데이터를 다양하게 처리할 수 있어요.
• JOIN, 서브쿼리, 인덱스 등 고급 개념 학습으로 실무 능력을 향상시킬 수 있어요.

댓글