[SQL] 2. SELECT, ORDER BY, DISTINCT

공형규·2023년 10월 12일

SQL

목록 보기
2/2

SELECT

소개

  • SELECT 문은 하나 이상의 테이블에서 데이터를 고른다.

    SELECT
    		select_list
    FROM
    		table_name;
    • 먼저, SELECT 절에서 콤마 , 로 구분하여 테이블 컬럼 리스트를 작성한다.
    • 그 다음, FROM 절에서 테이블 이름을 특정한다.
  • SELECT 문을 평가할 때, DB 시스템은

    • FROM 절을 먼저 평가한다.
    • 그 다음 SELECT 절을 평가한다.
    • 이는 테이블에서 컬럼들의 데이터를 고르는(select) 것과 같다.
  • 세미콜론 ; 은 쿼리의 일부가 아니다.

    • DB 서버는 두 개의 SQL 절을 구분하는 데 세미콜론을 사용한다.
  • 네가 만약 테이블의 모든 컬럼 데이타를 쿼리하고 싶다면

    • 모든 컬럼 이름을 작성하는 대신에,
    • 애스터리스크 * 연산자를 사용하면 된다.
    SELECT * FROM table_name;
  • SQL은 케이스를 구분하지 않는다.

    • 따라서, SELECTselect 키워드는 같은 뜻이다.

예시

  1. 모든 컬럼 데이터 선택하기

    • 아래 예시는 SQL SELECT 문을 사용하여 employees 테이블의 모든 컬럼과 row의 데이터를 가져오는 것이다.
    SELECT * FROM employees;
    • SELECT * 는 select star로 읽힌다.
      • select star는 ad-hoc 쿼리들에만 유용하다.
    • 애플리케잉션 개발을 위해, 아래와 같은 이유로 select star 사용을 지양해야 한다.
      • select * 는 테이블 모든 컬럼의 데이터를 반환한다. 종종, 애플리케이션은 하나나 약간의 컬럼만 필요하지 모든 컬럼 데이터를 필요로 하지는 않는다.
      • 만약 네가 select * 를 사용한다면, DB는 데이터를 디스크에서 읽고 애플리케이션에 보내는 데까지 더 많은 시간을 필요로 한다. 이는 테이블이 많은 데이터의 많은 컬럼을 포함할 때 좋지 못한 성능의 결과로 이어질 수 있다.
  2. 특정 컬럼들에서 데이터 선택하기

    • 특정 컬럼들에서 데이터를 선택하기 위해, SELECT 문의 SELECT 절 뒤에 컬럼 리스트를 특정할 필요가 있다.
    • 예를 들어, 아래 예시는 employees 테이블의 employee id, first name, last name, hire date 모든 row를 선택한다.
    SELECT
    		employee_id,
    		first_name,
    		last_name,
    		hire_date
    FROM
    		employees;
  3. 간단한 계산 수행하기

    • 아래 예시는 SELECT 문을 사용하여 first name, last name, salary, new salary를 가져오는 것이다.
    SELECT
    		first_name,
    		last_name,
    		salary,
    		salary * 1.05
    FROM
    		employees;
    • salary * 1.05 식은 모든 고용자들의 급여에 5%를 추가한다.
    • 기본적으로, SQL은 식을 컬럼 헤딩에 사용한다.
    • 식이나 컬럼을 alias에 할당하기 위해, AS 키워드를 사용하여 아래와 같이 작성할 수 있다.
    expression AS column_alias
    • 예를 들어, 아래 SELECT 문에서 new_salary 컬럼 alias로 사용되고 salary * 1.05 가 할당된다.
    SELECT
    		first_name,
    		last_name,
    		salary,
    		salary * 1.05 AS new_salary
    FROM
    		employees;

정리

  • 테이블에서 데이터를 선택하기 위해 SQL SELECT 문을 사용하자
  • 테이블에서 데이터를 선택하기 위해, FROM 절에 테이블 이름을 특정하고 SELECT 절에 컬럼 리스트를 작성하자
  • SELECT * 는 테이블의 모든 컬럼을 SELECT 하는 약어이다.

ORDER BY

소개

  • ORDER BYSELECT 문의 선택 절이다.

    • ORDER BY 절을 사용하여 SELECT 절에서 반환하는 행을 오름차순 혹은 내림차순으로 정렬할 수 있다.
    SELECT
    		select_list
    FROM
    		table_name
    ORDER BY
    		sort_expression [ASC | DESC]
    • 이 문법을 풀어 설명하면,
      • 첫째, ORDER BY 절을 FROM 절 뒤에 배치한다. DB는 SELECT 문을 ORDER BY * 절을 FROM > SELECT > ORDER BY 의 순서대로 평가할 것이다.
      • 둘째, ORDER BY 절 뒤에 정렬 식을 특정한다. 정렬식은 정렬 기준으로 특정된다.
      • 셋째, ASC 옵션은 오름차순으로, DESC 옵션은 내림 차순으로 정렬한다.
    • ORDER BYASC 옵션을 default 로 사용함에 주목하자.
    • ORDER BY 절은 또한 여러개의 식으로 정렬될 수 있다. 이 경우 콤마 , 로 두 식을 구분해야 한다.
    SELECT
    		select_list
    FROM
    		table_name
    ORDER BY
    		sort_expression_1 [ASC | DESC]
    		sort_expression_2 [ASC | DESC]
    • 이 문법에서, ORDER BY 절은 sort_expression_1 로 먼저 정렬된다. 그 다음 sort_expression_2 로 정렬된다.
    • 만약 ORDER BY 절을 특정하지 않는다면, SELECT 문은 결과 셋을 정렬하지 않는다. 이는 결과의 row들이 특정 순서를 가지지 않는다는 뜻이다.

예시

  1. 하나의 컬럼 정렬하기

    • 아래 예시는 SELECT 문을 사용하여 employee id, first name, last name, hire date, salary 등을 employees 테이블에서 가져오는 것이다.
    SELECT
    		employee_id,
    		first_name,
    		last_name,
    		hire_date,
    		salary
    FROM
    		employees;
    +-------------+-------------+-------------+------------+----------+
    | employee_id | first_name  | last_name   | hire_date  | salary   |
    +-------------+-------------+-------------+------------+----------+
    |         100 | Steven      | King        | 1987-06-17 | 24000.00 |
    |         101 | Neena       | Kochhar     | 1989-09-21 | 17000.00 |
    |         102 | Lex         | De Haan     | 1993-01-13 | 17000.00 |
    |         103 | Alexander   | Hunold      | 1990-01-03 |  9000.00 |
    |         104 | Bruce       | Ernst       | 1991-05-21 |  6000.00 |
    |         105 | David       | Austin      | 1997-06-25 |  4800.00 |
    |         106 | Valli       | Pataballa   | 1998-02-05 |  4800.00 |
    |         107 | Diana       | Lorentz     | 1999-02-07 |  4200.00 |
    |         108 | Nancy       | Greenberg   | 1994-08-17 | 12000.00 |
    |         109 | Daniel      | Faviet      | 1994-08-16 |  9000.00 |
    |         110 | John        | Chen        | 1997-09-28 |  8200.00 |
    ...
    • 결과를 보면 알 수 있듯이, 어떠한 정렬도 가지고 있지 않다.
    • 아래 예시는 ORDER BY 절을 사용하여 고용인들의 이름으로 정렬한다. (오름차순)
    SELECT
    		employee_id,
    		first_name,
    		last_name,
    		hire_date,
    		salary
    FROM
    		employees
    ORDER BY
    		first_name;
    +-------------+-------------+-------------+------------+----------+
    | employee_id | first_name  | last_name   | hire_date  | salary   |
    +-------------+-------------+-------------+------------+----------+
    |         121 | Adam        | Fripp       | 1997-04-10 |  8200.00 |
    |         115 | Alexander   | Khoo        | 1995-05-18 |  3100.00 |
    |         103 | Alexander   | Hunold      | 1990-01-03 |  9000.00 |
    |         193 | Britney     | Everett     | 1997-03-03 |  3900.00 |
    |         104 | Bruce       | Ernst       | 1991-05-21 |  6000.00 |
    |         179 | Charles     | Johnson     | 2000-01-04 |  6200.00 |
    |         109 | Daniel      | Faviet      | 1994-08-16 |  9000.00 |
    |         105 | David       | Austin      | 1997-06-25 |  4800.00 |
    |         114 | Den         | Raphaely    | 1994-12-07 | 11000.00 |
    |         107 | Diana       | Lorentz     | 1999-02-07 |  4200.00 |
    ...
    • ORDER BYfirst_name 컬럼의 값을 정렬한다.
  2. 여러 컬럼 값 정렬하기

    • 아래 예시는 ORDER BY 절을 사용해 이름을 오름차순으로 정렬하고 성을 내림차순으로 정렬한 것이다.
    SELECT
    		employee_id,
    		first_name,
    		last_name,
    		hire_date,
    		salary
    FROM
    		employees
    ORDER BY
    		first_nanem
    		last_nane DESC;
    +-------------+-------------+-------------+------------+----------+
    | employee_id | first_name  | last_name   | hire_date  | salary   |
    +-------------+-------------+-------------+------------+----------+
    |         121 | Adam        | Fripp       | 1997-04-10 |  8200.00 |
    |         115 | Alexander   | Khoo        | 1995-05-18 |  3100.00 |
    |         103 | Alexander   | Hunold      | 1990-01-03 |  9000.00 |
    |         193 | Britney     | Everett     | 1997-03-03 |  3900.00 |
    |         104 | Bruce       | Ernst       | 1991-05-21 |  6000.00 |
    |         179 | Charles     | Johnson     | 2000-01-04 |  6200.00 |
    |         109 | Daniel      | Faviet      | 1994-08-16 |  9000.00 |
    |         105 | David       | Austin      | 1997-06-25 |  4800.00 |
    |         114 | Den         | Raphaely    | 1994-12-07 | 11000.00 |
    |         107 | Diana       | Lorentz     | 1999-02-07 |  4200.00 |
    |         118 | Guy         | Himuro      | 1998-11-15 |  2600.00 |
    ...
    • 이 예시에서, ORDER BY 절은 이름을 오름차순으로 정렬 한 뒤, 성을 기준으로 내림차순 정렬한다.
    • Alexander KhooAlexander Hunold 의 순서가 바뀐 것에 주목하자
  3. 수 컬럼의 값 정렬하기

    • 아래 예시는 ORDER BY 절을 사용하여 임금을 내림차순으로 정렬한 것이다.
    SELECT
    		employee_id,
    		first_name,
    		last_name,
    		hire_Date,
    		salary
    FROM
    		employees
    ORDER BY
    		salary DESC;
    +-------------+-------------+-------------+------------+----------+
    | employee_id | first_name  | last_name   | hire_date  | salary   |
    +-------------+-------------+-------------+------------+----------+
    |         100 | Steven      | King        | 1987-06-17 | 24000.00 |
    |         101 | Neena       | Kochhar     | 1989-09-21 | 17000.00 |
    |         102 | Lex         | De Haan     | 1993-01-13 | 17000.00 |
    |         145 | John        | Russell     | 1996-10-01 | 14000.00 |
    |         146 | Karen       | Partners    | 1997-01-05 | 13500.00 |
    |         201 | Michael     | Hartstein   | 1996-02-17 | 13000.00 |
    |         205 | Shelley     | Higgins     | 1994-06-07 | 12000.00 |
    |         108 | Nancy       | Greenberg   | 1994-08-17 | 12000.00 |
    |         114 | Den         | Raphaely    | 1994-12-07 | 11000.00 |
    ...
  4. 날짜 정렬하기

    • 문자와 숫자 데이터 외에, ORDER BY 절을 사용하여 날짜 정렬도 가능하다.
    • 예를 들어, 아래 절은 ORDER BY 절을 사용하여 hire_date 기준으로 정렬한 것이다.
    SELECT
    		employee_id,
    		first_name,
    		last_name,
    		hire_date,
    		salary
    FROM
    		employees
    ORDER BY
    		hire_date;
    +-------------+-------------+-------------+------------+----------+
    | employee_id | first_name  | last_name   | hire_date  | salary   |
    +-------------+-------------+-------------+------------+----------+
    |         100 | Steven      | King        | 1987-06-17 | 24000.00 |
    |         200 | Jennifer    | Whalen      | 1987-09-17 |  4400.00 |
    |         101 | Neena       | Kochhar     | 1989-09-21 | 17000.00 |
    |         103 | Alexander   | Hunold      | 1990-01-03 |  9000.00 |
    |         104 | Bruce       | Ernst       | 1991-05-21 |  6000.00 |
    |         102 | Lex         | De Haan     | 1993-01-13 | 17000.00 |
    |         203 | Susan       | Mavris      | 1994-06-07 |  6500.00 |
    |         204 | Hermann     | Baer        | 1994-06-07 | 10000.00 |
    ...
    • 최신순으로 정렬하고 싶다면, 날짜를 내림차순으로 정렬하면 된다.
    SELECT
    		employee_id,
    		first_name,
    		last_name,
    		hire_date,
    		salary
    FROM
    		employees
    ORDER BY
    		hire_date DESC;

정리

  • SELECT 절에서 반환된 row들을 정렬하기 위해서 ORDER BY 절을 사용하자
  • 오름차순은 ASC , 내림차순은 DESC 옵션을 사용해 정렬하자

DISTINCT

소개

  • 결과 셋에서 중복되는 row를 제거하기 위해서 DISTINCT 연산자를 사용하자

    SELECT DISTINCT
    		column1, column2, ...
    FROM
    		table1;
    • DISTINCT 연산자 뒤에 컬럼을 사용하면, DISTINCT 연산자는 컬럼의 값들을 중복 평가에 사용한다.
    • 두 개 이상의 컬럼을 사용한다면, DISTINCT 는 그 컬럼들의 값들의 조합을 중복 평가에 사용한다.

    DISTINCT 는 결과 셋에서 중복을 제거할 뿐이지, 테이블에서 중복을 삭제하지는 않는다.

  • 만일 두개의 컬럼을 고르면서 하나의 컬럼에 대해서만 중복 제거를 하고 싶다면, GROUP BY 문을 사용하자

예시

  1. 한개의 컬럼에 대한 연산

    • 아래 문은 employees 테이블에서 임금 컬럼의 데이터를 가져온 뒤 내림차순으로 정렬한 것이다.
    SELECT
    		salary
    FROM
    		employees
    ORDER BY salary DESC;
    +----------+
    | salary   |
    +----------+
    | 24000.00 |
    | 17000.00 |
    | 17000.00 |
    | 14000.00 |
    | 13500.00 |
    | 13000.00 |
    | 12000.00 |
    | 12000.00 |
    | 11000.00 |
    | 10000.00 |
    |  9000.00 |
    |  9000.00 |
    ...
    • 결과는 중복을 가지고 있다. (17000, 12000, 9000)
    • 아래 문은 DISTINCT 연산자를 사용해 유니크 값을 찾아낸다.
    SELECT
    		DISTINCT salary
    FROM
    		employees
    ORDER BY salary DESC;
    +----------+
    | salary   |
    +----------+
    | 24000.00 |
    | 17000.00 |
    | 14000.00 |
    | 13500.00 |
    | 13000.00 |
    | 12000.00 |
    | 11000.00 |
    | 10000.00 |
    |  9000.00 |
  2. 여러 컬럼에서의 연산

    • 아래 문은 job id와 salary를 employees 테이블에서 가져온다.
    SELECT
    		job_id,
    		salary
    FROM
    		employees
    ORDER BY
    		job_id,
    		salary DESC;
    +--------+----------+
    | job_id | salary   |
    +--------+----------+
    |      1 |  8300.00 |
    |      2 | 12000.00 |
    |      3 |  4400.00 |
    |      4 | 24000.00 |
    |      5 | 17000.00 |
    |      5 | 17000.00 |
    |      6 |  9000.00 |
    |      6 |  8200.00 |
    ...
    • 결과를 보면, 몇몇 중복이 있음을 확인할 수 있다. 이는 두명의 고용인이 같은 job id와 salary를 가지고 있음을 의미한다.
    • 아래 문은 DISTINCT 연산자를 사용해 job id와 salary 중복을 제거한다.
    SELECT DISTINCT
    		job_id,
    		salary
    FROM
    		employees
    ORDER BY
    		job_id,
    		salary DESC;
    +--------+----------+
    | job_id | salary   |
    +--------+----------+
    |      1 |  8300.00 |
    |      2 | 12000.00 |
    |      3 |  4400.00 |
    |      4 | 24000.00 |
    |      5 | 17000.00 |
    |      6 |  9000.00 |
    |      6 |  8200.00 |
    ...
    • job id에 여전히 중복이 존재한다. 이는 DISTINCT 연산자를 job_idsalary 둘에 적용했기 때문이다. 이렇게 되면 job_id 의 중복이 아니라, job_id salary 두 개 모두 중복되는 것만 제거한다.
  3. NULL에 관하여

    • DB에서, NULL은 unknown이나 missing data를 의미한다.
    • 수, 문자열, 날짜 등의 값과 달리, NULL은 그 어떤것과도 같지 않다. 심지어는 자기 자신과도 같지 않다. 아래 표현식은 unknown이나 NULL 을 반환할 것이다.
    NULL=NULL
    • 보통, DISTINCT 연산자는 모든 NULL 을 동일하게 취급한다. 그러므로, DISTINCT 연산자는 결과 셋에서 딱 하나의 NULL 만 남길 것이다.

    이 행위는 DB 제품에 따라 달라질 수 있다.

    • 예를 들어, 아래 문은 구별되는(중복이 없는) 핸드폰 번호를 반환한다.
    SELECT DISTINCT phone_number
    FROM emplyees
    ORDER BY phone_number;
    +--------------+
    | phone_number |
    +--------------+
    | NULL         |
    | 515.123.4444 |
    | 515.123.4567 |
    | 515.123.4568 |
    | 515.123.4569 |
    | 515.123.5555 |
    ...
    • 하나의 NULL 만 반환되는 점에 주목하자

정리

  • 중복 제거를 위해서는 DISTINCT 연산자를 사용하자

참고 링크: https://www.sqltutorial.org/

profile
즐겁게 개발하는 개발자

0개의 댓글