승1's B(log n)

SQL 구문 기초 정리 본문

Database

SQL 구문 기초 정리

승1이 2022. 8. 31. 16:49

그동안 사놓고 듣고 있지 않았던 Udemy의 SQL 강의를 수강하기 시작했다. 앞으로 블로그에 SQL 관련 지식들을 차곡 차곡 쌓아보려고 한다.

우선 강의에서 사용하는 SQL은 PostgreSQL이다. 따라서 나도 PostgreSQL을 깔았고, 더 쉬운 작업을 위한 pgAdmin4도 설치했다. 

 

그럼 SQL 구문 기초에 대해서 정리해보겠다. 

 

1) SELECT 문 : 원하는 테이블에서 원하는 열을 불러오는 방법

SQL의 쿼리 툴에서 원하는 열을 불러오는 커맨드는 다음과 같다.

SELECT columns(열의 이름) FROM table(테이블의 이름);

이 커맨드의 의미는 특정 테이블에서 내가 원하는 열을 가져온다는 뜻이다.

열의 이름을 콤마를 통해서 이어주면 여러 열을 불러올 수도 있다.

ex) SELECT column1, column2 FROM table;

 

만약, film 테이블에서 영화 제목을 불러오고 싶다면 이런 식으로 커맨드를 작성하면 된다.

ex) SELECT title FROM film;

 

추가적으로 특정 열만 뽑아내지 않고 전체 테이블의 형태를 보고 싶을 때는 SELECT 뒤에 *(asterisk)기호를 넣으면 된다.

ex) SELECT * FROM table;

 

2) SELECT DISTINCT 문 : 중복되지 않는 값을 불러오는 방법

테이블에는 종종 중복된 값들이 존재하곤 한다. 그러나 중복된 값을 제외하고 고유한 값들을 필요로 할 때가 있을 것이다. 그때 바로 SELECT DISTINCT 구문을 사용한다.

SELECT DISTINCT columns FROM table;

 

예컨대, 가지고 있는 고객의 정보 중에서 중복되지 않는 고객의 이름 데이터를 추출한다고 해보자. 그렇다면 이런 식으로 커맨드를 작성할 수  있다.

 

3) COUNT 문 : 행의 개수를 반환받는 방법

SQL은 Excel이나 스프레드 시트와 유사하지만 더 큰 데이터들을 다루기 때문에 일일히 원하는 데이터의 개수를 세는 것은 매우 힘들다. 따라서 원하는 조건에 맞는 행의 개수를 반환받는 커맨드가 필요하다. 그것이 바로 COUNT 구문이다.

SELECT COUNT(*) FROM table;

 

COUNT문은 괄호와 함께 사용된다. 괄호 안에 행의 수를 세는데 기준이 될 열이 들어간다. 그러나, 테이블이라는 것이 모든 열에 대하여 모두가 같은 행의 수를 가지므로 괄호 안에 열 중 그 어느 것을 넣어도 값이 같다.

 

고로 SELECT COUNT(*) FROM table;와 SELECT COUNT(columns) FROM table;는 같은 값을 반환하는 것이다.

그러나 가독성을 위해서 어떤 열에 대한 행의 개수를 구하고자 했는지 적는 것이 바람직하다.

 

COUNT문을 사용하는 예제를 살펴보자. 예컨대, 2)에서 예제로 들었던 고객의 이름 중 중복되지 않는 이름의 개수를 구한다고 생각해보자.

그렇다면 이런 식으로 커맨드를 작성할 수 있다.

 

4) SELECT WHERE 문 : 조건에 맞는 값을 찾는 법

SQL에도 당연히 조건에 맞는 값을 찾는 커맨드가 존재한다. 바로 SELECT WHERE라는 구문이다. 어떻게 커맨드를 사용하는지 바로 보러 가자.

SELECT columns FROM table WHERE condition;

 

우선 SELECT를 통해서 화면에 보여줄 열들을 고르고, FROM을 통해 테이블을 명시한다. 그리고 그 뒤에 WHERE을 사용하여 어떤 조건을 걸 것인지를 명시한다. 조건에는 연산자들을 사용한다.

사용가능한 연산자는

= (동일한), > (~보다 큰), < (~보다 작은), >= (~보다 크거나 같은), <= (~보다 작거나 같은), !=, <>(~와 같지 않은)

가 있다. 프로그래밍 언어를 주로 사용해본 사람이라면 동일하다는 의미로 ==이 아니라 = 을 사용한다는 것을 주의할 필요가 있겠다. 그리고 같지 않다라는 의미로 사용되는 연산자가 != 과 <>가 존재한다는 것을 추가적으로 기억할 수 있겠다. 

 

예시를 통해서 더 이해해보자. 예컨대, 고객의 이름 중에서 Jack인 사람을 찾는다고 해보자. 그렇다면 해당 커맨드를 이렇게 작성할 수 있다.

Jack은 문자열이기 때문에 따옴표로 감싸줘야 한다. 참고로 커맨드가 길다면 여러 줄에 걸쳐서 적어도 아무 문제가 되지 않는다.

 

다른 예제로, 국가 번호가 5보다 큰 국가의 이름과 국가 번호를 호출한다고 해보자. 그렇다면 이런 식으로 작성할 수 있다.

 

만약 여러 조건을 충족하는 값을 찾고 싶을 땐 어떻게 할까. 바로 AND, OR, NOT 연산자를 통해서 구할 수 있다. AND를 사용하면 조건을 모두 만족하는 값을 반환하고, OR을 사용하면 조건들 중 하나만 만족해도 값을 반환하고, NOT을 사용하면 조건을 만족하는 값을 제외한 나머지 값들을 반환한다.

수도 코드로 표현하면 다음과 같다.

SELECT columns FROM table WHERE condition1 AND(OR) condition 2;

 

물론 당연히 두 개 이상의 조건을 AND, OR 연산자를 통해서 이을 수도 있다.

 

예를 들어서, 도시 번호가 15 이상이거나 국가 번호가 50 이하인 도시의 이름을 출력한다고 해보자.

위와 같은 커맨드로 원하는 값을 구할 수 있다.

 

5) ORDER BY 문 : 원하는 순서대로 정렬하는 방법

그동안 배웠던 커맨드를 사용해서 값을 추출했을 때는 기준이 없이 출력되는 것을 깨달을 수 있다. 그럼 기준이 있이 정렬을 하려면 어떻게 해야 하는지 배워보자.

SELECT columns FROM table ORDER BY column ASC(DESC);

 

원하는 값을 어떤 열의 값들의 오름차순으로 정렬하고 싶다면 ORDER BY 기준이 될 열의 이름 ASC(오름차순); 으로 사용하면 되고, 만약 내림차순으로 정렬하고 싶다면 ORDER BY 기준이 될 열의 이름 DESC(내림차순);으로 사용하면 된다. 

 

바로 예제로 들어가보자. 만약 도시의 번호를 오름차순으로 정렬하여 도시의 이름과 함께 출력하고 싶다고 생각해보자. 그렇다면 이를 해결할 수 있는 커맨드는 다음과 같다.

 

이렇게 숫자를 기준으로 정렬할 수 있을 뿐더러 알파벳 순서를 기준으로 정렬할 수도 있다. A부터 정렬하려면 ASC를, Z부터 정렬하려면 DESC를 사용하면 된다. 다만 유의해야 할 점은, 아스키코드 순서대로 정렬을 하므로 아스키코드 상 소문자들이 대문자보다 뒤에 있는 것을 유의하고, 따라서 소문자와 대문자를 함께 정렬할 경우 따로 정렬될 수 밖에 없음을 기억해야 한다.

ex)

결과: 

 

6) LIMIT 문 : 원하는 개수만큼 출력하는 방법

LIMIT문은 원하는 개수만큼만 출력하는 방법이다. 즉 LIMIT 2를 입력하면 행이 두 개만 출력된다. LIMIT문은 제일 마지막에 사용한다. 

수도 코드는 다음과 같다. 

SELECT columns FROM table LIMIT n;

 

예를 들어, city 테이블에 있는 city_id를 내림차순으로 정렬하고 상위에 있는 5개의 행들만 추출한다고 생각해보자. 그렇다면 이렇게 해결할 수 있을 것이다.

결과 : 

 

7) BETWEEN 문 : 사이에 있는 값 찾는 방법

WHERE문을 이용해서 특정한 두 값 사이에 있는 값들을 찾을 수도 있지만 BETWEEN문을 이용할 수도 있다. 이때 BETWEEN문은 두 값을 모두 포함한다. 즉, WHERE city_id >= 5 AND city_id <= 10과 WHERE city_id BETWEEN 5 AND 10이 같은 것이다. NOT을 BETWEEN 앞에 붙히게 되면 두 값은 포함되지 않는다. 즉 WHERE city_id < 5 OR city_id > 10과 WHERE city_id NOT BETWEEN 5 AND 10이 같아진다.

 

BETWEEN을 사용하는 수도코드는 다음과 같다.

SELECT columns FROM table WHERE column BETWEEN n1 AND n2;

 

예제로는 설명에서 들었던 예시를 그대로 사용해보겠다.

 

8) IN 문 : 괄호 안에 있는 값들과 같은지 확인하는 방법

일일히 WHERE문으로 특정한 값들과 같은지 확인하는 방법은 힘든 일이다. 그럴 때 IN문을 함께 이용하면 편하게 문제를 해결할 수 있다.

수도코드는 다음과 같다. 

SELECT columns FROM table WHERE column IN (n1, n2, n3);

 

만약 괄호 안의 값이 문자열이라면 각각의 문자열마다 따옴표(' ')를 씌워줘야 한다.

 

예시를 통해서 확인해보자. 만약 고객의 이름 중에서 Jack과 Julie와 같은 이름이 있는지 확인하고자 한다. 그럴 때는 문제를 이렇게 해결할 수 있다.

 

9) LIKE와 ILIKE 문 : 패턴이 일치하는 값을 찾는 방법

종종 특정 문자나 문자열이 들어간 값을 찾아야 할 때가 있다. 그럴 때 사용할 수 있는 것이 바로 LIKE와 ILIKE문이다. 

우선 두 문의 차이는 LIKE는 대소문자를 구별하고, ILIKE는 대소문자를 구별하지 않는다는 것이다. 상황에 따라서 적절하게 사용하면 된다. 

그럼 어떻게 일치하는 패턴을 찾을까? 바로 %와 _기호를 통해서 찾을 수 있다. _기호는 한 문자만 달라질 때 사용하고, %기호는 여러 문자가 달라져도 사용할 수 있다는 차이점이 있다.

 

예를 들어서, 트랜스포머라는 영화가 시즌 4까지 나왔다고 생각해보자. 그렇다면 영화의 이름은 Transformer 1, Transformer 2, Transformer 3, Transformer 4 이런 식의 형태를 띌 것이다. 여기서 달라지는 것은 바로 시즌의 숫자이다. 그 외의 Transformer라는 문자열은 모든 시즌의 제목과 동일하다. 고로 이럴 때는 WHERE title LIKE(혹은 ILIKE) ('Transformer _')라고 작성하면 트랜스포머 시즌1부터 시즌4까지 모두 커버할 수 있다.

 

%기호는 다음과 같은 상황에서 사용될 수 있다. 영화 제목에 'dive'라는 단어가 들어가는 영화를 찾는다고 해보자. 그럴 때는 WHERE title LIKE ('%dive%')와 같은 식으로 사용될 수 있다. 물론 dive로 시작하는 영화를 찾는다고 할 때는 ('dive%')를 사용해야 하고, dive로 끝나는 영화를 찾는다고 하면 ('%dive')를 사용한다.

 

예시로, 영화 이름에 Truman이 들어간 영화를 찾는다고 생각해보자.

커맨드는 이런 식으로 작성하면 되고,

그 결과는 다음과 같다.

 

지금까지 9개의 기초 SQL 커맨드를 배워보았다. 앞으로는 조금 더 심화된 SQL 커맨드에 대해서 공부하고 업로드 해보도록 하겠다.

SQL 참 재밌다 :)

 

참고자료: Udemy의 데이터 역량 강화를 위한 SQL 부트캠프 by Jose Portilla

사용한 데이터의 출처 : https://www.udemy.com/course/best-sql-2022/learn/lecture/29097128#overview

 

'Database' 카테고리의 다른 글

SQL 조건식과 프로시저  (0) 2022.10.30
SQL 테이블 만들기  (0) 2022.10.27
SQL 고급 명령어  (0) 2022.10.24
SQL GROUP BY문과 JOIN문 배우기  (2) 2022.10.23
Comments