해당 포스트는 Udemy 'The Complete SQL Bootcamp: Go from Zero to Hero' 를 보고 작성한 내용입니다.
Select 는 가장 일반적으로 사용되는 구문이다.
이는 데이터베이스 내에 존재하는 테이블에서 정보를 검색할 때 사용된다.
아래 사용 예시를 보자.
사용 예시
ex) SELECT column_name FROM table_name
데이터베이스는 있다고 가정하고, 해당 데이터내부에 몇 개의 테이블이 있다고 하자. 각 테이블은 칼럼과 데이터 행으로 구성될 것이다. 우리가 어떤 칼럼을 고를때 SELECT column_name FROM table_name 을 통해 어떠한 테이블 table_name 에서 해당 column_name 을 검색할 수 있다. 여러개의 칼럼도 다음처럼 적을 수 있다.
SELECT c1, c2 FROM table1
만약 모든 칼럼을 선택한다면 *를 사용한다.
SELECT * FROM table1
다만, 일반적으로 * 을 사용하는 것은 트래픽을 증가시킬 수 있기 때문에 필요할 떄가 아니라면 권장되지 않는다.
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
dvd 렌탈의 schemas 의 table 을 보면 어떠한 tablel 이 있는지 확인할 수 있다. 그 밑에 칼럼까지 누르면 확인 가능
SELECT first_name, last_name, email FROM customers;
경우에 따라 테이블에 중복 값이 있는 열이 포함되어 있으며 우리는 고유한 값만 나열해야하는 상황에 처할 수 있다. 이때 열에서 DISTINCT 키워드를 사용해 고유값을 반환할 수 있다.
SELECT DISTINCT 를 사용하여 고유한 값이나 고유한 값을 얻을 수 있는 열 바로 앞에 두고 그런 다음 이 열이 있는 테이블을 지칭한다.
다른 열이 distinct 열로 지정 되는 것 막기 위해선 괄호 사용해도 된다. (괄호 없이도 작동한다.)
SELECT DISTINCT column FROM table;
예를 들어 아래와 같은 테이블이 있을 때, SELECT DISTINCT name FROM color_table 을 하면 name 칼럼 안에 David 인스턴스가 두 개가 있기 떄문에 이 테이블에서 DISTICT name 을 SELECT 하면 이 열에서 리턴하는 것은 중복을 배제한 3개일 것이다.
이렇게 되면 데이터의 손실이 발생할 수 있다. 따라서 이런 경우는 David 가 두개이기 때문에 이럴 때는 SELECT DISTINCT choice FROM color_table 을 진행하여 고유한 색상 옵션으로 하면 중복값을 효과적으로 제거할 수 있다.
DISTINCT 은 열 안의 고유값 알고 싶을 떄 도움이 된다. 예를 들어 film 테이블에서 개봉연도를 DISTINCT 로 SELECT 하면 하나의 데이터만 나온다. 모든 영화들이 2006년에 개봉되었다는 뜻이다. 만약 ()괄호를 쓰면 DISTICT 에 해당하는 하나를 더 명확히 지정해 줄 수 있다.
DISTINCT 를 사용하면 고유한 값이 얼마나 되는 지 확인할 수 있다.
다음은 COUNT 문을 알아보자.COOUNT 는 쿼리의 조건에 맞는 행의 개수를 리턴한다.
아까 예시에서
SELECT COUNT(name) FROM table;
을 실행하면 4개가 리턴될 것이다.
COUNT 는 단순히 해당하는 행의 개수를 리턴하기 때문에 SELECT COUNT(name) FROM table; 이나 SELECT COUNT(Choice) FROM table; 나 똑같이 4를 리턴한다.
따라서 개수를 세는 조건을 붙여야 유리하게 사용할 수 있다. 예를 들어 해당 테이블에서 고유한 이름이 몇 개인지 알아보려면
SELECT COUNT(DISTINCT name) FROM table; 을 사용하면 3을 리턴하여 고유한 name 의 개수를 확인할 수 있다.
만약 payment 테이블에서 staff_id 의 개수를 센다면 14,596개가 나온다.
여기서 DISTINCT staff_id 의 개수를 세면 2개가 나온다. 2명이서 14,596개의 payment 를 담당했나보다.
다음은 SELECT WHERE 을 알아보자. WHERE 은 조건을 추가할 수 있다.
우선 기본 문법은 다음과 같다.
SELECT column1, column2
FROM table
WHERE conditions;
WEHRE 절은 FROM 다음에 등장한다.
또 아까봤던 예시로 확인하자.
David 인 사람만 검색하고 싶을 떄는 아래 문법을 사용한다.
SELECT name, choice FROM table WHERE name='David';
그럼 아래와 같은 결과가 나올 것이다.
customer 테이블에서 고객 정보 필터링 연습을 해보자.
만약 누가 가게에 와서 first name 만 말한다고 가정해보자. 그럼 우리는 first name 으로 검색을 해야할 것이다. 아래 문법처럼 검색하면 된다.
SELECT * FROM customer
WHERE first_name='Julia';
만약 film 테이블에서 렌탈 비용과 교체 비용에 조건을 두고 검색을 하면 다음처럼 잘 출력된다. 조건은 얼마든지 추가할 수 있다.
ORDER BY 는 행을 정렬할 때 사용된다.
SELECT column_1, column_2
FROM table
ORDER BY column_1 ASC/DESC
Order by 는 쿼리 가장 마지막에 있으며, ASC 가 오름차순 / DESC 가 내림차순이라는 의미이다.
예를 들어, 아래 사진과 같은 테이블이 있을 때, 아래 테이블은 Company 에서 알파벳 순서로 먼저나오고 그 다음으로 Name 을 알파벳 순서로 나오고 그 다음으로 Sales 의 오름차순으로 정렬되어 있다.
실습을 해보면, 아래 customer 테이블에서 first_name 의 알파벳 순서로 정렬하려면 다음처럼
SELECT * FROM customer
ORDER BY first_name;
을 입력한다. 디폴트는 오름차순(알파벳순)이다.
만약 내림차순(역알파벳순)으로 보고싶다면 뒤에 DESC 라는 옵션을 추가한다.
LIMIT 키워드는 반환되는 쿼리의 행 수를 제한할 수 있다.
SELECT * FROM payment
ORDER BY payment_date DESC
LIMIT 5;
예를 들어 아래 처럼 마지막에 LIMIT 5 를 추가하면 전체 행수 중에서 상위 5개만 리턴하게 된다.
BETWEEN 연산자은 값 범위와 값을 대조할 때 사용된다.
value BETWEEN low AND high 처럼 쓰여서 low 와 high 사이인 value 를 가진 애들만 리턴하게 ㅗ딘다.
만약 해당 범위 아닌 애들만 출력하고 싶다면 NOT BETWEEN 을 사용한다.
아래 예시를 보면 payment 테이블에서 총합이 8에서 9 사이인 애들만 리턴된 것을 확인할 수 있다.
SELECT * FROM payment
WHERE amount BETWEEN 8 AND 9;
만약 COUNT 랑 같이 쓰면 해당 범위에 해당하는 row 의 개수를 알 수 있다. 위 예시에서 총합이 8에서 9 사이인 row 는 총 439개이다.
이건 date 에도 적용 가능하다.
IN 을 사용하면 조건을 지정할 수 있다.
예를 들어 아래와 같은 Statement에서 amount 가 0.99, 1.98, 1.99 인 애들만 반환하게 된다.
SELECT amount FROM payment
WHERE amount IN (0.99, 1.98,1.99);
문자열 패턴매칭과 관한 것이다.
예를 들어 이메일 중에 @gmail.com 으로 끝나는 애들을 출력하고 싶거나 'A'로 시작하는 애들만 출력하고 싶을 때,
customer 테이블에서 J 로 시작하는 애들만 추출하려면 다음처럼 LIKE '원하는 글자%' 로 적으면 된다.
SELECT * FROM customer
WHERE first_name LIKE 'J%';
만약 문자열 중간에 어떠한 글자가 들어간 애들만 추출하려면 앞 뒤에 %를 붙여서 쓰면 된다.
SELECT * FROM customer
WHERE first_name LIKE '%her%';
% 대신에 _ 를 쓰면 글자 수를 지정할 수 있다.
예를 들어
SELECT * FROM customer
WHERE first_name LIKE '_her%';
다음처럼 적는다면 her 앞에는 글자가 1개가 있는 애들만 추출할 수 있다.