Udemy - The Ultimate MySQL Bootcamp: Go from SQL Beginner to Expert를 보고 정리하는 글
먼저 작가들의 last_name들을 검색해보자.
mysql> SELECT author_lname FROM books;
+----------------+
| author_lname |
+----------------+
| Lahiri |
| Gaiman |
| Gaiman |
| Lahiri |
| Eggers |
| Eggers |
| Chabon |
| Smith |
| Eggers |
| Gaiman |
| Carver |
| Carver |
| DeLillo |
| Steinbeck |
| Foster Wallace |
| Foster Wallace |
| Harris |
| Harris |
| Saunders |
+----------------+
19 rows in set (0.00 sec)
결과가 나왔다. 그런데 봐보면 이름이 중복되는 것들이 보인다. 한 작가가 책을 여러개 썼기 때문이다.
mysql> SELECT * FROM books;
+---------+-----------------------------------------------------+--------------+----------------+---------------+----------------+-------+
| book_id | title | author_fname | author_lname | released_year | stock_quantity | pages |
+---------+-----------------------------------------------------+--------------+----------------+---------------+----------------+-------+
| 1 | The Namesake | Jhumpa | Lahiri | 2003 | 32 | 291 |
| 2 | Norse Mythology | Neil | Gaiman | 2016 | 43 | 304 |
| 3 | American Gods | Neil | Gaiman | 2001 | 12 | 465 |
| 4 | Interpreter of Maladies | Jhumpa | Lahiri | 1996 | 97 | 198 |
| 5 | A Hologram for the King: A Novel | Dave | Eggers | 2012 | 154 | 352 |
| 6 | The Circle | Dave | Eggers | 2013 | 26 | 504 |
| 7 | The Amazing Adventures of Kavalier & Clay | Michael | Chabon | 2000 | 68 | 634 |
| 8 | Just Kids | Patti | Smith | 2010 | 55 | 304 |
| 9 | A Heartbreaking Work of Staggering Genius | Dave | Eggers | 2001 | 104 | 437 |
| 10 | Coraline | Neil | Gaiman | 2003 | 100 | 208 |
| 11 | What We Talk About When We Talk About Love: Stories | Raymond | Carver | 1981 | 23 | 176 |
| 12 | Where I'm Calling From: Selected Stories | Raymond | Carver | 1989 | 12 | 526 |
| 13 | White Noise | Don | DeLillo | 1985 | 49 | 320 |
| 14 | Cannery Row | John | Steinbeck | 1945 | 95 | 181 |
| 15 | Oblivion: Stories | David | Foster Wallace | 2004 | 172 | 329 |
| 16 | Consider the Lobster | David | Foster Wallace | 2005 | 92 | 343 |
| 17 | 10% Happier | Dan | Harris | 2014 | 29 | 256 |
| 18 | fake_book | Freida | Harris | 2001 | 287 | 428 |
| 19 | Lincoln In The Bardo | George | Saunders | 2017 | 1000 | 367 |
+---------+-----------------------------------------------------+--------------+----------------+---------------+----------------+-------+
19 rows in set (0.00 sec)
이렇게.
하지만 중복을 피하고 작가 목록을 보고 싶을 때가 있다. 이럴 때 쓰는 것이 DISTINCT이다.
mysql> SELECT DISTINCT author_lname FROM books;
+----------------+
| author_lname |
+----------------+
| Lahiri |
| Gaiman |
| Eggers |
| Chabon |
| Smith |
| Carver |
| DeLillo |
| Steinbeck |
| Foster Wallace |
| Harris |
| Saunders |
+----------------+
11 rows in set (0.01 sec)
중복된 부분이 제거된 결과가 나왔다.
이제 중복이 제거된 풀네임을 알고 싶을 때는 어떻게 할까.
먼저 f_name과 l_name을 구해보자.
mysql> SELECT author_fname, author_lname FROM books;
+--------------+----------------+
| author_fname | author_lname |
+--------------+----------------+
| Jhumpa | Lahiri |
| Neil | Gaiman |
| Neil | Gaiman |
| Jhumpa | Lahiri |
| Dave | Eggers |
| Dave | Eggers |
| Michael | Chabon |
| Patti | Smith |
| Dave | Eggers |
| Neil | Gaiman |
| Raymond | Carver |
| Raymond | Carver |
| Don | DeLillo |
| John | Steinbeck |
| David | Foster Wallace |
| David | Foster Wallace |
| Dan | Harris |
| Freida | Harris |
| George | Saunders |
+--------------+----------------+
19 rows in set (0.00 sec)
그런데 여기서 주의해야 될게 밑에서 2번째, 3번째를 보면 Dan Harris와 Freida Harris이다. 두사람은 l_name이 같고 f_name이 다른, 다른 사람이다. 하지만 SELECT DISTINCT author_lname FROM books
를 통해 출력해보면 Harris가 하나로 나오게 된다.
먼저 CONCAT메서드를 통해 그냥 풀네임들을 구해보자.
mysql> SELECT CONCAT (author_fname,' ', author_lname) AS 'Full Name' FROM books;
+----------------------+
| Full Name |
+----------------------+
| Jhumpa Lahiri |
| Neil Gaiman |
| Neil Gaiman |
| Jhumpa Lahiri |
| Dave Eggers |
| Dave Eggers |
| Michael Chabon |
| Patti Smith |
| Dave Eggers |
| Neil Gaiman |
| Raymond Carver |
| Raymond Carver |
| Don DeLillo |
| John Steinbeck |
| David Foster Wallace |
| David Foster Wallace |
| Dan Harris |
| Freida Harris |
| George Saunders |
+----------------------+
19 rows in set (0.00 sec)
Dan Harris
와 Freida Harris
는 구별되서 나오지만 중복된 이름들이 많이 나오게된다. 이제 CONCAT된 이름에 DISTINCT를 적용해보자.
mysql> SELECT DISTINCT CONCAT (author_fname, ' ', author_lname) AS 'Full Name' FROM books;
+----------------------+
| Full Name |
+----------------------+
| Jhumpa Lahiri |
| Neil Gaiman |
| Dave Eggers |
| Michael Chabon |
| Patti Smith |
| Raymond Carver |
| Don DeLillo |
| John Steinbeck |
| David Foster Wallace |
| Dan Harris |
| Freida Harris |
| George Saunders |
+----------------------+
12 rows in set (0.00 sec)
굿ㅋ👍 Dan Harris
와 Freida Harris
가 구별되서 나왔고, 중복도 제거되었다.
그런데 사실 더 간단하게
mysql> SELECT DISTINCT author_fname, author_lname FROM books;
+--------------+----------------+
| author_fname | author_lname |
+--------------+----------------+
| Jhumpa | Lahiri |
| Neil | Gaiman |
| Dave | Eggers |
| Michael | Chabon |
| Patti | Smith |
| Raymond | Carver |
| Don | DeLillo |
| John | Steinbeck |
| David | Foster Wallace |
| Dan | Harris |
| Freida | Harris |
| George | Saunders |
+--------------+----------------+
12 rows in set (0.01 sec)
이렇게 해줘도 된다.
SELECT DISTINCT author_fname, author_lname FROM books;
이런식으로 해주면 mysql이 알아서 전부 다 같으면 중복되지 않게, 또 하나라도 다르면 다 출력해준다. 위의 CONCAT과 다른점은 CONCAT의 경우 Full Name으로 합친 다음에 중복을 제거하기 때문에 한 칼럼으로 Full Name들을 출력할 수 있다는 것이고 아래의 SELECT DISTINCT author_fname, author_lname FROM books;
는 서로 다른 두 칼럼으로 출력해준다는 것.