일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- coursera
- 개발
- 과제
- 백준
- COALESCE
- 알고리즘
- 최소공배수
- timestamp
- BFS
- ML
- 자료구조
- nullif
- Machine Learning
- 너비우선탐색
- BST
- postgresql
- 데이터베이스
- self join
- CREATE TABLE
- C++
- 최대공약수
- sql
- Advanced SQL
- Andrew Ng
- 깊이우선탐색
- 시퀄
- 유데미
- udemy
- pgadmin
- AVLTree
- Today
- Total
승1's B(log n)
SQL 구문 기초 정리 본문
그동안 사놓고 듣고 있지 않았던 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 |