BE_[Database] MySQL and SQL_data 검색/조회_10.31

송철진·2022년 10월 30일
0

요약

  • DQL, Data Query Language : 데이터를 쿼리하는데 사용되는 SQL문
  • 기본적인 SELECT 문에 WHERE, LIKE를 사용하여 제한적인 조건이 적용된 데이터를 선택
  • JOIN 문을 사용하면 서로 다른 테이블 공유하는 컬럼을 기준으로 연결된 데이터를 쿼리할 수 있다.
  • 내부 결합(Inner Join) : 기준이 되는 테이블 (left table)과 join이 걸리는 테이블(right table) 양쪽 모두에 결합조건이 matcing되는 row만 검색하는 방법.
  • 외부 결합(Outer Join) : 결합(Join)하는 여러테이블에서 한 쪽에는 데이터가 있고, 한 쪽에는 데이터가 없는 경우, 데이터가 있는 쪽 테이블을 기준으로 모두 출력하는 결합 방법.

1. DQL (Data Query Language)

1-1. SELECT 문법 표기

SELECT
    [ALL | DISTINCT | DISTINCTROW ]
    [HIGH_PRIORITY]
    [STRAIGHT_JOIN]
    [SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT]
    [SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS]
    select_expr [, select_expr] ...
    [into_option]
    [FROM table_references
      [PARTITION partition_list]]
    [WHERE where_condition]
    [GROUP BY {col_name | expr | position}, ... [WITH ROLLUP]]
    [HAVING where_condition]
    [WINDOW window_name AS (window_spec)
        [, window_name AS (window_spec)] ...]
    [ORDER BY {col_name | expr | position}
      [ASC | DESC], ... [WITH ROLLUP]]
    [LIMIT {[offset,] row_count | row_count OFFSET offset}]
    [into_option]
    [FOR {UPDATE | SHARE}
        [OF tbl_name [, tbl_name] ...]
        [NOWAIT | SKIP LOCKED]
      | LOCK IN SHARE MODE]
    [into_option]

into_option: {
    INTO OUTFILE 'file_name'
        [CHARACTER SET charset_name]
        export_options
  | INTO DUMPFILE 'file_name'
  | INTO var_name [, var_name] ...
}

👉 요약:

SELECT
    [ALL | DISTINCT | DISTINCTROW ]
    select_expr [, select_expr] ...
    [FROM table_references]
    [WHERE where_condition]
    [GROUP BY {col_name | expr | position}, ... [WITH ROLLUP]]
    [HAVING where_condition]
    [ORDER BY {col_name | expr | position}
      [ASC | DESC], ... [WITH ROLLUP]]
    [LIMIT {[offset,] row_count | row_count OFFSET offset}]

2. 예제 데이터 구축

2-1. users 테이블

INSERT INTO users (name, email, password, age) VALUES ("Rebekah	Johnson", "Glover12345@email.com", "password", 30);
INSERT INTO users (name, email, password, age) VALUES ("Fabian Predovic", "O'Connell12345@email.com", "password", 31);
INSERT INTO users (name, email, password, age) VALUES ("Elenor	Gottlieb", "Skiles12345@email.com", "password", 22);
INSERT INTO users (name, email, password, age) VALUES ("Madge	Ledner", "Quitzon12345@email.com", "password", 23);

2-2. posts 테이블

INSERT INTO posts (title, content, user_id) VALUES ("위코드 1일차", "HTML과 CSS 익숙해지기..", 1);
INSERT INTO posts (title, content, user_id) VALUES ("위코드 2일차", "Javascript 기본 문법 학습..", 1);
INSERT INTO posts (title, content, user_id) VALUES ("위코드 3일차", "웹서비스의 역사와 발전 세션을 듣고..", 1);
INSERT INTO posts (title, content, user_id) VALUES ("자료구조 1번", "BigO Notation이란 무엇인가?", 2);
INSERT INTO posts (title, content, user_id) VALUES ("자료구조 2번", "시간 복잡도와 공간 복잡도에 대해서..", 2);
INSERT INTO posts (title, content, user_id) VALUES ("프론트 개발 입문", "프론트 입문 HTML이란 무엇인가?", 3);

3. 데이터 조회/검색

3-1. 모든 데이터 조회

“Westagram 홈 화면"에 모든 사람들이 올린 게시물 목록을 보여준다면?
SELECT * FROM posts;

3-2. 검색 조건 지정하기

현재 posts 테이블에 있는 게시글의 타이틀 들만 뽑아내고 싶다면?
SELECT posts.title FROM posts; 또는
SELECT title FROM posts;

내용과 타이틀을 함께 보고 싶다면? 👉 콤마(,) 사용
SELECT posts.title, posts.content FROM posts;

3-3. WHERE 절 (WHERE 키워드 + 기본 조건 표현식)

WHERE : 필요한 행(row)만 검색하기 위해서 사용

“Rebekah Johnson”(user_id=1)이 작성한 게시물만 출력하고 싶다면?
SELECT id, title, content, user_id FROM posts WHERE user_id = 1;

3-4. WHERE 절 (WHERE 키워드 + 복수의 조건 표현식)

“Rebekah Johnson” (user_id=1)이 작성한 게시물 중에서 생성일(created_at)이 “2022-10-31 01:04:30” 이전인 게시글만 검색한다면?
SELECT * FROM posts WHERE user_id = 1 AND created_at < '2022-10-31 01:04:30';

비교대상:

조건을 만족하는 행을 집합으로 표현한다면?

  • AND 연산: 교집합
  • OR 연산: 합집합

NOT 연산: 조건의 false값을 반환

SELECT * FROM posts WHERE NOT(user_id = 1 AND created_at < '2022-10-31 01:04:30');

3-5. WHERE 절 + LIKE 패턴 매칭

사용자가 게시물의 내용(content)에 “HTML”이라는 문자열만으로 게시글을 검색하고 싶다면?
문자열 맨 앞의 단어"HTML"과 일치하는 경우: LIKE ‘HTML%’
SELECT id, title, content, user_id FROM posts WHERE content LIKE 'HTML%';

문자열의 중간에 검색하고자 하는 단어"HTML"이 포함: LIKE %HTML%
SELECT id, title, content, user_id FROM posts WHERE content LIKE '%HTML%';

그외 :

4. 테이블 결합

4-1. 곱집합

두 개의 집합을 곱하는 연산 방법

4-2. 교차집합

테이블(집합)과 테이블(집합)의 곱집합을 계산하는 방법
👉 비용이 매우 많이 드는 연산이기 때문에 실무에서는 사용되지 않음
👉 내부 결합(Inner Join)과 외부 결합의 근간이 됨

4-3. 내부 결합 (Inner Join)

기준이 되는 테이블 (left table)과 join이 걸리는 테이블(right table) 양쪽 모두에 결합조건이 matching되는 row만 검색하는 방법

교차 결합으로 계산된 곱집합에 결합조건(users.id = posts.user_id)을 더해서 검색하는 것

내부 결합은 교차 결합의 부분집합

4-4. 외부 결합 (Outer Join)

결합(Join)하는 여러테이블에서 한 쪽에는 데이터가 있고, 한 쪽에는 데이터가 없는 경우, 데이터가 있는 쪽 테이블을 기준으로 모두 출력하는 결합 방법

4-4-1. LEFT (OUTER) JOIN

기준이되는 테이블 (left table)의 모든 row와 join이 걸리는 테이블(right table) 중에서 left table과 매칭되는 row만 검색
기준이 되는 테이블(left table) 쪽에만 존재하는 row는 전부 그대로 가져오면서, join이 걸리는 테이블에서 매칭되는 결과가 없는 경우 빈 값(NULL)로 표시

4-4-2. RIGHT (OUTER) JOIN

join이 걸리는 테이블(right table)의 모든 row와 기준이 되는 테이블 (left table)에서 right table과 matching되는 row만 검색하고, 매칭되는 데이터가 없는 경우 NULL을 표시

4-4-3. FULL (OUTER) JOIN

LEFT OUTER JOIN과 RIGHT OUTER JOIN을 합친 결합 방법.
기준이 되는 테이블(left table)과 join이 걸리는 테이블(right table) 양쪽 모두의 row를 검색
LEFT OUTER JOIN과 RIGHT OUTER JOIN을 UNION 하는 방식으로 FULL OUTER JOIN을 구현

profile
검색하고 기록하며 학습하는 백엔드 개발자

0개의 댓글