본문 바로가기
혼공학습단/SQL

[Sql] Chapter 03. SQL 기본 문법

by 노 코딩 노 라이프 2023. 7. 16.

3장 : SQL 기본 문법


3-1 기본 중에 기본 SELECT  ~ FROM ~ WHERE

1. 기본 조회하기 : SELECT ~ FROM

1. USE 문

SELECT문을 실행하려면 먼저 사용해야할 데이터베이스를 지정해야합니다. 현재 사용하는 데이터베이스를 지정 또는 변경하는 형식은 다음과 같습니다.

USE 데이터베이스_이름;

 

2. SELECT문의 기본형식

SELCT문은 처음에는 사용하기 간단하지만, 사실 상당히 복잡한 구조를 갖습니다. MYSQL 메뉴열에 나온 것은 너무 복잡해서 여기서는 간단한 형태로 먼저 살펴보겠습니다.

SELECT 열_이름
	FROM 테이블_이름
    WHERE 조건식
    GROUP BY 열_이름
    HAVING 조건식
    ORDER BY 열_이름
    LIMIT 숫자

여기서는 다음과 같이 기본적이고 핵심적인 형식을 먼저 살펴보겠습니다.

SELECT 열_이름
	FROM 테이블_이름
    WHERE 조건식

 

3. SELECT문과 FROM

SELECT 문과 FROM 절은 SQL에서 데이터베이스로부터 데이터를 조회하는 데 사용되는 중요한 구문입니다.

SELECT 문
SELECT 문은 데이터베이스에서 데이터를 조회하고 선택할 때 사용됩니다. 일반적인 형식은 다음과 같습니다.

SELECT 열1, 열2, ... FROM 테이블명;
  • 열1, 열2, ...: 조회할 열의 이름을 나열합니다. '*'를 사용하면 모든 열을 선택할 수 있습니다.
  • 테이블명: 데이터를 조회할 테이블의 이름입니다.


예를 들어, "members" 테이블에서 이름과 나이 열을 조회하는 경우

SELECT name, age FROM members;

위의 예제는 "members" 테이블의 "name"과 "age" 열을 선택하여 조회합니다.


FROM 절
FROM 절은 SELECT 문에서 데이터를 가져올 테이블을 지정하는 데 사용됩니다. 일반적인 형식은 다음과 같습니다

SELECT 열1, 열2, ... FROM 테이블명;
  • 열1, 열2, ...: 조회할 열의 이름을 나열합니다. '*'를 사용하면 모든 열을 선택할 수 있습니다.
  • 테이블명: 데이터를 조회할 테이블의 이름입니다.

 

예를 들어, "members" 테이블에서 이름과 나이 열을 조회하는 경우

SELECT name, age FROM members;

위의 예제는 "members" 테이블의 "name"과 "age" 열을 선택하여 조회합니다.


SELECT 문과 FROM 절은 데이터베이스에서 필요한 데이터를 선택하고 가져오는 데 사용되는 핵심적인 구문입니다. 이를 통해 특정 열이나 전체 열을 선택하여 원하는 데이터를 조회할 수 있습니다.

 

2. 특정한 조건만 조회하기 : SELECT~FROM~WHERE

SELECT~FROM은 대부분 WHERE와 함께 사용합니다. WHERE는 필요한 것들만 골라서 결과를 보는 효과를 갖습니다.

 

1. WHERE없이 조회하기

WHERE가 없이 SELECT~FROM만으로 테이블을 조회하면 테이블의 모든 행이 출력됩니다.

데이터의 건수가 적은 경우에는 별 문제가 없지만, 실체 쿠팡/마켓컬리/지마켓/옥션 등과 같이 회원이 수백만 명 이상이 되는 인터넷 쇼핑물에서 회원테이블(member)을 다음과 같이 검색하면 어떨까요?

SELECT * FROM 쿠팡_회원_테이블(member);

결과가 엄청 많이 나오겠죠? 출력된 수백만 건 이상의 결과에서 필요한 데이터를 눈으로 찾아내는 것은 상당히 어려울 뿐 아니라, 이렇게 많은 데이터를 출력하면 아무리 고성능의 컴퓨터라도 부담이 될 수밖에 없습니다. 그래서 학습 등을 할 때와 같이 작은 데이터를 조회할 때를 제외한 SELECT문은 WHERE 절과 함께 사용합니다.

 

2. 기본적인 WHERE 절

WHERE절은 조회하는 결과에 특정한 조건을 추가해서 원하는 데이터만 보고 싶을 때 사용합니다.

SELECT 열_이름 FROM 테이블_이름 WHERE 조건식;

또는 

SELECT 열_이름
	FROM 테이블_이름
    WHERE 조건식

+ 이 형식에서 세미콜론(;)이 나오기 전까지는 한 줄로 쓰든, 여러 줄로 쓰든 동일합니다. SQL이 길거나 복잡한 경우에는 여러 줄로 나눠 쓰는 것이 좀 더 읽기 편합니다. 

 

지금 찾는 이름(mem_name)이 '블랙핑크'라면 다음과 같은 조건식을 사용하면 됩니다. 열_이름 = 값은 열의 값에 해당하는 결과만 출력해줍니다.

SELECT * FROM member WHERE mem_name = '블랙핑크';

지금은 이름(mem_name)이 블랙핑크인 결과만 출력했습니다. 이름(mem_name)열은 문자형 (CHAR)이므로 작은 따옴표로 묶어줬습니다.

 

3. 관계 연산자, 논리 연산자의 사용

숫자로 표현된 데이터는 범위를 지정할 수 있습니다. 예를 들어 평균 키(height)가 162이하인 회원을 검색하려면 다음과 같이 관계연산자를 사용해서 조회할 수 있습니다.

SELECT mem_id, mem_name
	FROM member
    Where height <= 162;

2가지 이상의 조건을 만족하도록 할 수도 있습니다. 평균 키(height)가 165 이상이면서 인원(mem_number)도 6명 초과인 회원은 다음과 같인 논리 연산자 AND/OR를 이용해서 조회할 수 있습니다.

SELECT mem_id, mem_name
	FROM member
    Where height >= 165 AND mem_number > 6;

 

4. BETWEEN ~ AND

BETWEEN ~ AND는 SQL에서 사용되는 연산자로, 특정 범위 내에 있는 값을 비교하거나 선택하는 데 사용됩니다. BETWEEN 절은 일반적으로 WHERE 절과 함께 사용됩니다.

BETWEEN ~ AND의 일반적인 형식은 다음과 같습니다

column_name BETWEEN value1 AND value2
  • column_name: 비교할 열의 이름입니다.
  • value1 및 value2: 비교할 범위의 시작 값과 끝 값입니다.

BETWEEN ~ AND 연산자는 column_name의 값이 value1과 value2 사이에 포함될 때 조건이 참이 됩니다.

이 연산자는 동등 비교(범위에 포함)를 수행하므로, 시작 값과 끝 값도 포함됩니다.

예를 들어, "age" 열이 20부터 30 사이의 값을 가진 행을 선택하는 경우

SELECT * FROM members WHERE age BETWEEN 20 AND 30;

위의 예제는 "members" 테이블에서 "age" 열의 값이 20과 30 사이에 있는 모든 행을 선택합니다.


BETWEEN ~ AND 연산자를 사용하면 특정 범위 내에 있는 값들을 효과적으로 선택하거나 비교할 수 있습니다.

 

5. IN()

IN()은 SQL에서 사용되는 연산자로, 여러 개의 값을 비교하거나 선택하는 데 사용됩니다. IN() 연산자는 WHERE 절과 함께 주로 사용됩니다.

IN()의 일반적인 형식은 다음과 같습니다

column_name IN (value1, value2, ...)
  • column_name: 비교할 열의 이름입니다.
  • value1, value2, ...: 비교할 값들의 목록입니다.

IN() 연산자는 column_name의 값이 주어진 목록에 포함되어 있는지 확인합니다. 만약 값이 목록에 포함되어 있다면 조건은 참이 됩니다.

예를 들어, "grade" 열이 'A', 'B', 또는 'C'인 행을 선택하는 경우

SELECT * FROM students WHERE grade IN ('A', 'B', 'C');

위의 예제는 "students" 테이블에서 "grade" 열의 값이 'A', 'B', 또는 'C' 중 하나에 해당하는 모든 행을 선택합니다.

IN() 연산자를 사용하면 여러 값을 한 번에 비교하거나 선택할 수 있습니다. 이를 통해 특정 값들을 간단하게 필터링하거나 원하는 값을 선택할 수 있습니다.

 

6. LIKE()

LIKE()는 SQL에서 사용되는 연산자로, 문자열 패턴 매칭을 수행하여 특정 패턴을 가진 값을 비교하거나 선택하는 데 사용됩니다. LIKE() 연산자는 WHERE 절과 함께 주로 사용됩니다.

LIKE()의 일반적인 형식은 다음과 같습니다

column_name LIKE 'pattern'
  • column_name: 비교할 열의 이름입니다.
  • 'pattern': 비교할 패턴을 나타내는 문자열입니다. 패턴은 와일드카드 문자인 '%'나 '_'를 포함할 수 있습니다.


LIKE() 연산자는 column_name의 값이 'pattern'과 일치하는지 확인합니다. 'pattern'은 특정 문자열 패턴을 나타내며, 와일드카드 문자 '%'는 0개 이상의 임의의 문자와 대응되고, '_'는 정확히 한 개의 임의의 문자와 대응됩니다.

예를 들어, "name" 열이 'Smith'로 시작하는 행을 선택하는 경우

SELECT * FROM customers WHERE name LIKE 'Smith%';

위의 예제는 "customers" 테이블에서 "name" 열의 값이 'Smith'로 시작하는 모든 행을 선택합니다.


LIKE() 연산자를 사용하면 특정 패턴을 가진 문자열을 비교하거나 선택할 수 있습니다. 와일드카드를 사용하여 패턴을 유연하게 지정할 수 있으며, 다양한 문자열 매칭 조건을 처리할 수 있습니다.

 

3-2. 좀 더 깊게 알아보는 SELECT 문

SELECT 문에서는 결과의 정렬을 위한 ORDER BY, 결과의 개수를 제한하는 LIMIT, 중복 데이터를 제거하는 DISTINCT 등을 사용할 수 있습니다. 그리고 GROUP BY 절은 지정한 열의 데이터들을 같은 데이터끼리는 묶어서 결과를 추출합니다. 주로 그룹으로 묶는 경우에는 합계, 평균, 개수 등을 처리할 때 사용하므로 집계 함수와 함께 사용됩니다. GROUP BY 절에서도 HAVING 절을 통해 조건식을 추가할 수 있습니다. HAVAING 절은 WHERE절과 비슷해 보이지만, GROUP BY절과 함께 사용되는 것이 차이점입니다.ORDER BY 절은 SQL에서 사용되는 구문으로, 결과 집합을 정렬하는 데 사용됩니다. SELECT 문에 함께 사용되며, 정렬 기준을 지정하여 데이터를 정렬합니다.

1. ORDER BY절

ORDER BY의 일반적인 형식은 다음과 같습니다

SELECT 열1, 열2, ...
FROM 테이블명
ORDER BY 열1 [ASC|DESC], 열2 [ASC|DESC], ...
  • 열1, 열2, ...: 정렬할 열의 이름을 나열합니다. 여러 개의 열을 지정할 수 있으며, 순서대로 정렬됩니다.
  • [ASC|DESC]: 정렬 방향을 지정합니다. ASC오름차순(기본값), DESC내림차순을 나타냅니다.


예를 들어, "employees" 테이블에서 이름(name)을 오름차순으로 정렬하여 선택하는 경우

SELECT * FROM employees ORDER BY name ASC;

위의 예제는 "employees" 테이블에서 모든 열을 선택하며, 이름(name) 열을 오름차순으로 정렬합니다.
여러 열에 대한 정렬을 지정하려면 추가 열과 정렬 방향을 지정하면 됩니다. 

 

예를 들어, "employees" 테이블에서 이름(name)을 오름차순으로 정렬하고, 그 다음에 급여(salary)를 내림차순으로 정렬하여 선택하는 경우

SELECT * FROM employees ORDER BY name ASC, salary DESC;

위의 예제는 "employees" 테이블에서 모든 열을 선택하며, 이름(name)을 오름차순으로 먼저 정렬하고, 그 다음에 급여(salary)를 내림차순으로 정렬합니다.


ORDER BY 절을 사용하면 데이터를 원하는 방식으로 정렬하여 조회할 수 있습니다.

 

2. 출력의 개수를 제한 : LIMIT

LIMIT는 SQL에서 사용되는 절(clause)로, 쿼리 결과의 행 수를 제한하는 데 사용됩니다. 일반적으로 SELECT 문과 함께 사용되며, 반환되는 결과의 크기를 제한하고 특정 범위의 행만 가져올 수 있습니다.

LIMIT의 일반적인 형식은 다음과 같습니다

SELECT 열1, 열2, ...
    FROM 테이블명
    LIMIT 숫자;
  • 열1, 열2, ...: 선택할 열의 이름을 나열합니다. '*'을 사용하면 모든 열을 선택할 수 있습니다.
  • 숫자: 반환할 행의 최대 개수를 지정합니다.


예를 들어, "employees" 테이블에서 처음 10개의 행만 선택하는 경우

SELECT * FROM employees LIMIT 10;

위의 예제는 "employees" 테이블에서 모든 열을 선택하며, 최대 10개의 행만 반환합니다.



LIMIT는 결과 집합의 일부를 선택하고 필요한 행의 수를 제한하는 데 사용됩니다.
또한 OFFSET을 함께 사용하여 결과 집합의 시작 위치를 지정할 수도 있습니다.

 

예를 들어, "employees" 테이블에서 10개의 행을 건너뛰고 그 다음 5개의 행만 선택하는 경우

SELECT * FROM employees LIMIT 5 OFFSET 10;

위의 예제는 "employees" 테이블에서 모든 열을 선택하며, 시작 위치로부터 10개의 행을 건너뛰고 그 다음 5개의 행만 반환합니다.



LIMIT를 사용하여 쿼리 결과의 크기를 제한하고 필요한 범위의 행만 선택할 수 있습니다. 이를 통해 데이터를 효과적으로 관리하고 원하는 결과를 얻을 수 있습니다.

 

 

3. 중복된 결과를 제거 : DISTINCT

DISTINCT는 SQL에서 사용되는 키워드로, 쿼리 결과에서 중복된 값을 제거하는 데 사용됩니다. 주로 SELECT 문과 함께 사용되며, 고유한(unique) 값을 선택하고자 할 때 사용됩니다.

DISTINCT의 일반적인 형식은 다음과 같습니다

SELECT DISTINCT 열1, 열2, ...
    FROM 테이블명;
  • 열1, 열2, ... : 중복된 값을 제거하고자 하는 열의 이름을 나열합니다. 여러 개의 열을 지정할 수 있습니다
  • 테이블명: 데이터를 조회할 테이블의 이름입니다.


예를 들어, "customers" 테이블에서 "city" 열의 중복된 값을 제거하여 선택하는 경우

SELECT DISTINCT city FROM customers;

위의 예제는 "customers" 테이블에서 "city" 열의 중복된 값을 제거하여 고유한 도시(city)들만 선택합니다.


DISTINCT는 결과 집합에서 중복된 값을 제거하여 유일한(unique) 값을 선택하는 데 사용됩니다. 이를 통해 고유한 값을 식별하거나 중복된 값을 제외할 수 있습니다. DISTINCT는 단일 열 뿐만 아니라 여러 열에도 적용할 수 있습니다.

 

4. GROUP BY절

GROUP BY는 SQL에서 사용되는 구문으로, 결과 집합을 그룹으로 분류하고 각 그룹에 대한 집계 함수를 계산하는 데 사용됩니다. 주로 SELECT 문과 함께 사용되며, 데이터를 그룹별로 요약하거나 집계된 정보를 얻을 때 사용됩니다.

GROUP BY의 일반적인 형식은 다음과 같습니다

SELECT 열1, 집계함수(열2), ...
    FROM 테이블명
    GROUP BY 열1;
  • 열1 : 그룹화할 기준이 되는 열의 이름입니다.
  • 집계함수(열2) : 각 그룹에 대한 집계 함수를 계산할 열의 이름입니다. SUM, AVG, COUNT, MAX, MIN 등의 집계 함수를 사용할 수 있습니다.
  • 테이블명 : 데이터를 조회할 테이블의 이름입니다.

 

예를 들어, "orders" 테이블에서 각 고객별로 주문된 총량을 계산하는 경우

SELECT customer_id, SUM(quantity) AS total_quantity
    FROM orders
    GROUP BY customer_id;

위의 예제는 "orders" 테이블에서 각 고객(customer_id)별로 주문된 총량(quantity)을 계산합니다. 결과는 각 고객별로 그룹화되며, 그룹별로 총량이 계산됩니다.


GROUP BY는 데이터를 그룹화하여 각 그룹에 대한 집계된 결과를 얻을 수 있습니다. 그룹화된 데이터를 기반으로 요약 정보를 얻거나 집계 함수를 사용하여 계산할 수 있습니다. GROUP BY 절은 일반적으로 집계 함수와 함께 사용되며, 데이터의 특정 특성을 분석하거나 요약할 때 유용합니다.

 

5. 집계함수 

5-1. SUM(): 주어진 열의 합계를 계산합니다.
예를 들어, "orders" 테이블에서 총 판매량을 계산하는 경우

SELECT SUM(quantity) AS total_sales FROM orders;

위의 예제는 "orders" 테이블의 "quantity" 열에 있는 값들의 합계를 계산하고, 결과를 "total_sales"라는 별칭으로 반환합니다.


5-2. AVG(): 주어진 열의 평균 값을 계산합니다.
예를 들어, "products" 테이블에서 평균 가격을 계산하는 경우

SELECT AVG(price) AS average_price FROM products;

위의 예제는 "products" 테이블의 "price" 열에 있는 값들의 평균을 계산하고, 결과를 "average_price"라는 별칭으로 반환합니다.



5-3. COUNT(): 주어진 열의 개수를 계산합니다.
예를 들어, "customers" 테이블에서 등록된 고객의 수를 계산하는 경우

SELECT COUNT(*) AS total_customers FROM customers;

위의 예제는 "customers" 테이블의 행의 개수를 계산하고, 결과를 "total_customers"라는 별칭으로 반환합니다. 여기서 '*'는 모든 열을 의미합니다.



5-4. MAX(): 주어진 열에서 최대값을 반환합니다.
예를 들어, "inventory" 테이블에서 가장 많이 남은 재고 수량을 계산하는 경우

SELECT MAX(quantity) AS max_inventory FROM inventory;

위의 예제는 "inventory" 테이블의 "quantity" 열에서 가장 큰 값, 즉 최대 재고 수량을 계산하고, 결과를 "max_inventory"라는 별칭으로 반환합니다.



5-5. MIN(): 주어진 열에서 최소값을 반환합니다.
예를 들어, "products" 테이블에서 가장 낮은 가격을 계산하는 경우:

SELECT MIN(price) AS min_price FROM products;

위의 예제는 "products" 테이블의 "price" 열에서 가장 작은 값, 즉 최소 가격을 계산하고, 결과를 "min_price"라는 별칭으로 반환합니다.



이러한 집계 함수를 사용하여 데이터의 요약 정보를 계산하고 분석할 수 있습니다. 필요에 따라 복합적인 쿼리를 작성하여 여러 집계 함수를 함께 사용할 수도 있습니다.

 

3-3 데이터 변경을 위한 SQL문

1. 데이터 입력 : INSERT

데이터베이스 테이블에 새로운 레코드(행)을 추가하는 작업입니다. 일반적으로 INSERT INTO 문을 사용합니다. 다음은 기본적인 형식입니다

INSERT INTO 테이블명 (열1, 열2, ...) VALUES (값1, 값2, ...);

위의 코드에서 "테이블명"은 데이터를 추가할 테이블 이름이고, "열1, 열2, ..."은 추가할 열들의 이름이며, "값1, 값2, ..."는 각 열에 대응하는 실제 값을 의미합니다.

 

2. 데이터 수정 : UPDATE

이미 존재하는 데이터의 값을 변경하는 작업입니다. UPDATE 문을 사용하여 특정 조건에 맞는 레코드를 선택하고 열 값을 수정합니다. 다음은 기본적인 형식입니다:

UPDATE 테이블명 SET 열1 = 값1, 열2 = 값2, ... WHERE 조건;

위의 코드에서 "테이블명"은 데이터를 수정할 테이블 이름이며, "열1, 열2, ..."은 수정할 열들의 이름이고, "값1, 값2, ..."은 각 열에 대응하는 실제 값을 의미합니다. "WHERE" 절을 사용하여 수정할 레코드를 선택합니다.

 


3. 데이터 삭제 : DELETE 

데이터베이스 테이블에서 특정 조건에 맞는 레코드(행)를 삭제하는 작업입니다. DELETE FROM 문을 사용하여 행을 삭제합니다. 다음은 기본적인 형식입니다:

DELETE FROM 테이블명 WHERE 조건;

위의 코드에서 "테이블명"은 데이터를 삭제할 테이블 이름이며, "WHERE" 절을 사용하여 삭제할 레코드를 선택합니다.