<span style='color: grey'>해당 포스트는 Udemy 'The Complete SQL Bootcamp: Go from Zero to Hero' 를 보고 작성한 내용입니다.</span>


## SQL Statement

### SELECT Statement

Select 는 가장 일반적으로 사용되는 구문이다. 
이는 데이터베이스 내에 존재하는 테이블에서 정보를 검색할 때 사용된다.
아래 사용 예시를 보자. 

**사용 예시**
ex) SELECT column_name FROM table_name

데이터베이스는 있다고 가정하고, 해당 데이터내부에 몇 개의 테이블이 있다고 하자. 각 테이블은 칼럼과 데이터 행으로 구성될 것이다. 우리가 어떤 칼럼을 고를때 SELECT column_name FROM table_name 을 통해 어떠한 테이블 table_name 에서 해당 column_name 을 검색할 수 있다. 여러개의 칼럼도 다음처럼 적을 수 있다.

```sql
SELECT c1, c2 FROM table1
```

만약 모든 칼럼을 선택한다면 *를 사용한다.
```sql
SELECT * FROM table1 
```

다만, 일반적으로 * 을 사용하는 것은 트래픽을 증가시킬 수 있기 때문에 필요할 떄가 아니라면 권장되지 않는다.


### SELECT 실습

1. PGadmin 을 연다.


2. dvd 렌탈을 우클릭하여 쿼리 툴을 연다.
이에 대한 설명은 아래 게시글에 설명되어 있다.
https://velog.io/@aengzu/SQL-Database-%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80-PostgreSQL-%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0
![](https://velog.velcdn.com/images/aengzu/post/90dc4d16-ee99-4f1e-8b71-95887dad1a78/image.png)

3. dvd 렌탈의 schemas 의 table 을 보면 어떠한 tablel 이 있는지 확인할 수 있다. 그 밑에 칼럼까지 누르면 확인 가능

![](https://velog.velcdn.com/images/aengzu/post/ecbd3a41-89d6-4f38-8a08-e21a1ce61464/image.png)

4. SELECT * FROM actor; 을 통해 배우 테이블의 모든 칼럼 검색하기

![](https://velog.velcdn.com/images/aengzu/post/7c2f46bf-97b9-4023-bd88-7506e4469c0b/image.png)

5. SELECT first_name, last_name FROM actor; 을 통해 배우 테이블의 특정 칼럼 검색하기(칼럼들 순서 바꾸면 바뀐채로 확인 가능)

![](https://velog.velcdn.com/images/aengzu/post/776f08c3-578e-4bbb-9258-7b3153bb8d24/image.png)

6. 만약 SELECT FROM 을 소문자로 써도 작동 가능하다. (다만 대문자가 알아보기 쉽기에 표준화되어있다) 
7. 세미콜론은 쿼리의 끝을 나타낸다. 없어도 작동 가능하지만 있어야 가독성이 좋다. 




### SELECT 과제

1. 상황 : 우리는 기존 고객에게 프로모션 이메일 보내려고 한다. 
SELECT 문을 활용하여 고객의 이름과 이메일 문을 가져오자.

```sql
SELECT first_name, last_name, email FROM customers;
```

![](https://velog.velcdn.com/images/aengzu/post/7b4c8c1f-10bf-4b65-bbf5-53cc53841ae3/image.png)


### SELECT DISTINCT

경우에 따라 테이블에 중복 값이 있는 열이 포함되어 있으며 우리는 고유한 값만 나열해야하는 상황에 처할 수 있다. 이때 열에서 DISTINCT 키워드를 사용해 고유값을 반환할 수 있다. 

SELECT DISTINCT 를 사용하여 고유한 값이나 고유한 값을 얻을 수 있는 열 바로 앞에 두고 그런 다음 이 열이 있는 테이블을 지칭한다. 

다른 열이 distinct 열로 지정 되는 것 막기 위해선 괄호 사용해도 된다. (괄호 없이도 작동한다.)

```sql
SELECT DISTINCT column FROM table;
```


예를 들어 아래와 같은 테이블이 있을 때, SELECT DISTINCT name FROM color_table 을 하면 name 칼럼 안에 David 인스턴스가 두 개가 있기 떄문에 이 테이블에서 DISTICT name 을 SELECT 하면 이 열에서 리턴하는 것은 중복을 배제한 3개일 것이다.
이렇게 되면 데이터의 손실이 발생할 수 있다. 따라서 이런 경우는 David 가 두개이기 때문에 이럴 때는 SELECT DISTINCT choice FROM color_table 을 진행하여 고유한 색상 옵션으로 하면 중복값을 효과적으로 제거할 수 있다.


![](https://velog.velcdn.com/images/aengzu/post/e2fff58b-5dcc-41ce-a2c5-39d11f7299ff/image.png)


DISTINCT 은 열 안의 고유값 알고 싶을 떄 도움이 된다. 예를 들어 film 테이블에서 개봉연도를 DISTINCT 로 SELECT 하면 하나의 데이터만 나온다. 모든 영화들이 2006년에 개봉되었다는 뜻이다. 만약 ()괄호를 쓰면 DISTICT 에 해당하는 하나를 더 명확히 지정해 줄 수 있다. 

![](https://velog.velcdn.com/images/aengzu/post/2fd8e498-6062-46cb-b575-03b9ffb851d8/image.png)

DISTINCT 를 사용하면 고유한 값이 얼마나 되는 지 확인할 수 있다. 



### COUNT Statement

다음은 COUNT 문을 알아보자.COOUNT 는 쿼리의 조건에 맞는 행의 개수를 리턴한다. 

아까 예시에서 
```sql
SELECT COUNT(name) FROM table;
``` 
을 실행하면 4개가 리턴될 것이다. 
![](https://velog.velcdn.com/images/aengzu/post/e2fff58b-5dcc-41ce-a2c5-39d11f7299ff/image.png)

COUNT 는 단순히 해당하는 행의 개수를 리턴하기 때문에 SELECT COUNT(name) FROM table; 이나 SELECT COUNT(Choice) FROM table; 나 똑같이 4를 리턴한다.

따라서 개수를 세는 조건을 붙여야 유리하게 사용할 수 있다. 예를 들어 해당 테이블에서 고유한 이름이 몇 개인지 알아보려면

SELECT COUNT(DISTINCT name) FROM table; 을 사용하면 3을 리턴하여 고유한 name 의 개수를 확인할 수 있다.



### COUNT Statement 실습

만약 payment 테이블에서 staff_id 의 개수를 센다면 14,596개가 나온다. 
![](https://velog.velcdn.com/images/aengzu/post/7339b860-1c6b-47c9-9b61-9cd6cfda33b4/image.png)

여기서 DISTINCT staff_id 의 개수를 세면 2개가 나온다. ~~2명이서 14,596개의 payment 를 담당했나보다.~~

![](https://velog.velcdn.com/images/aengzu/post/ab709533-bb3b-45e5-85b5-55e852caabd7/image.png)



### SELECT WHERE 구문

다음은 SELECT WHERE 을 알아보자. WHERE 은 조건을 추가할 수 있다.
우선 기본 문법은 다음과 같다.

```sql
SELECT column1, column2
FROM table
WHERE conditions;
```

WEHRE 절은 FROM 다음에 등장한다. 

- 비교 연산
=, >, <, >=, <=, <>, !=
    
- 논리 연산
AND, OR, NOT
    
또 아까봤던 예시로 확인하자.
![](https://velog.velcdn.com/images/aengzu/post/e2fff58b-5dcc-41ce-a2c5-39d11f7299ff/image.png)

David 인 사람만 검색하고 싶을 떄는 아래 문법을 사용한다.

```sql
SELECT name, choice FROM table WHERE name='David';
```
그럼 아래와 같은 결과가 나올 것이다.
![](https://velog.velcdn.com/images/aengzu/post/7f7c2796-a3eb-4fb0-8898-3b68cd3bb817/image.png)



### SELECT WHERE 실습

customer 테이블에서 고객 정보 필터링 연습을 해보자.
만약 누가 가게에 와서 first name 만 말한다고 가정해보자. 그럼 우리는 first name 으로 검색을 해야할 것이다. 아래 문법처럼 검색하면 된다.

```sql
SELECT * FROM customer
WHERE first_name='Julia';
```

만약 film 테이블에서 렌탈 비용과 교체 비용에 조건을 두고 검색을 하면 다음처럼 잘 출력된다. 조건은 얼마든지 추가할 수 있다. 

![](https://velog.velcdn.com/images/aengzu/post/8cc5f430-2196-49ce-920d-d7032b202cab/image.png)


### ORDER BY

ORDER BY 는 행을 정렬할 때 사용된다. 

```sql
SELECT column_1, column_2
FROM table
ORDER BY column_1 ASC/DESC
```

Order by 는 쿼리 가장 마지막에 있으며, ASC 가 오름차순 / DESC 가 내림차순이라는 의미이다.

예를 들어, 아래 사진과 같은 테이블이 있을 때, 아래 테이블은 Company 에서 알파벳 순서로 먼저나오고 그 다음으로 Name 을 알파벳 순서로 나오고 그 다음으로 Sales 의 오름차순으로 정렬되어 있다. 
![](https://velog.velcdn.com/images/aengzu/post/14f3b89e-aebe-42a7-9dce-743b3da3fc4a/image.png)


실습을 해보면, 아래 customer 테이블에서 first_name 의 알파벳 순서로 정렬하려면 다음처럼
SELECT * FROM customer
ORDER BY first_name; 
을 입력한다. 디폴트는 오름차순(알파벳순)이다.

![](https://velog.velcdn.com/images/aengzu/post/4956d47b-403c-4e6c-bcae-9f23027499dd/image.png)

만약 내림차순(역알파벳순)으로 보고싶다면 뒤에 DESC 라는 옵션을 추가한다.

![](https://velog.velcdn.com/images/aengzu/post/a93ef12e-5f00-4432-ae8f-f69ac66a2678/image.png)



### LIMIT 

LIMIT 키워드는 반환되는 쿼리의 행 수를 제한할 수 있다.

```sql
SELECT * FROM payment
ORDER BY payment_date DESC
LIMIT 5;
```

예를 들어 아래 처럼 마지막에 LIMIT 5 를 추가하면 전체 행수 중에서 상위 5개만 리턴하게 된다. 


![](https://velog.velcdn.com/images/aengzu/post/eb7a80e8-b723-43de-8d92-1e0bbfea36f9/image.png)


### BETWEEN

BETWEEN 연산자은 값 범위와 값을 대조할 때 사용된다.

value BETWEEN low AND high 처럼 쓰여서 low 와 high 사이인 value 를 가진 애들만 리턴하게 ㅗ딘다. 
만약 해당 범위 아닌 애들만 출력하고 싶다면 NOT BETWEEN 을 사용한다.

아래 예시를 보면 payment 테이블에서 총합이 8에서 9 사이인 애들만 리턴된 것을 확인할 수 있다.
SELECT * FROM payment
WHERE amount BETWEEN 8 AND 9;
![](https://velog.velcdn.com/images/aengzu/post/a6d026e9-e59c-4702-bd0b-1d3355347c76/image.png)

만약 COUNT 랑 같이 쓰면 해당 범위에 해당하는 row 의 개수를 알 수 있다. 위 예시에서 총합이 8에서 9 사이인  row 는 총 439개이다. 
![](https://velog.velcdn.com/images/aengzu/post/6700e0a1-9d02-446f-b0a2-1e1f9bab7a1c/image.png)

이건 date 에도 적용 가능하다.

![](https://velog.velcdn.com/images/aengzu/post/1423abda-f1f5-4f6a-ab4a-b27d1ccda98c/image.png)


### IN

IN 을 사용하면 조건을 지정할 수 있다. 
예를 들어 아래와 같은 Statement에서 amount 가 0.99, 1.98, 1.99 인 애들만 반환하게 된다.
```sql
SELECT amount FROM payment
WHERE amount IN (0.99, 1.98,1.99);
```
![](https://velog.velcdn.com/images/aengzu/post/219536ce-0a32-4b28-8194-815e3391bfcb/image.png)


### LIKE / ILIKE

문자열 패턴매칭과 관한 것이다.
예를 들어 이메일 중에 @gmail.com 으로 끝나는 애들을 출력하고 싶거나 'A'로 시작하는 애들만 출력하고 싶을 때, 
customer 테이블에서 J 로 시작하는 애들만 추출하려면 다음처럼 **LIKE '원하는 글자%'** 로 적으면 된다. 

```sql
SELECT * FROM customer
WHERE first_name LIKE 'J%';
```

![](https://velog.velcdn.com/images/aengzu/post/8adc4659-cce4-4fa2-9b48-111f13120de2/image.png)

만약 문자열 중간에 어떠한 글자가 들어간 애들만 추출하려면 앞 뒤에 %를 붙여서 쓰면 된다.
```sql
SELECT * FROM customer
WHERE first_name LIKE '%her%';
```


![](https://velog.velcdn.com/images/aengzu/post/5ae34ef5-4d35-4182-9092-87a0f77d1379/image.png)


% 대신에 _ 를 쓰면 글자 수를 지정할 수 있다. 
예를 들어 
```sql
SELECT * FROM customer
WHERE first_name LIKE '_her%';
```

다음처럼 적는다면 her 앞에는 글자가 1개가 있는 애들만 추출할 수 있다. 
![](https://velog.velcdn.com/images/aengzu/post/2dee85f6-043e-4548-b3cc-2af66d2dd8fc/image.png)

728x90

+ Recent posts