DQL은 Data Query Language의 약자로 데이터를 쿼리하는데 사용되는 SQL문을 뜻한다.
쿼리(Query)의 사전적 의미는 묻다, 질문하다 인데
데이터베이스 서버에게 데이터를 달라고 요청하는것 이라고 이해하면 된다.
애플리케이션에서 사용되는 쿼리 중에서 가장 비율이 높고, 사용을 잘 못할 경우
성능이슈가 발생 할 수 있어 가장 중요한 SQL문이다.
앞의 포스팅에서 보았던 SELECT
를 사용하고 JOIN
WHERE
LIKE
로 조건을 줄 수있다.
mysql> select * from comments;
+----+----------------------------------------------------------+------------+---------+---------------------+
| id | comment | posting_id | user_id | created_at |
+----+----------------------------------------------------------+------------+---------+---------------------+
| 1 | 작은 성공이 모여 큰 성취가 되니까요! | 1 | 3 | 2022-08-15 10:41:22 |
| 2 | 같이 힘냅시다 | 4 | 1 | 2022-08-15 10:41:22 |
| 3 | 햇살이 너무 좋아서 코딩하고 싶지 않아요 | 2 | 2 | 2022-08-15 10:41:22 |
| 4 | 지금 비오는걸요 | 2 | 4 | 2022-08-15 10:41:22 |
| 5 | 모델링 최고! 생각하는거 너무 재밌죠 | 3 | 3 | 2022-08-15 10:41:22 |
| 6 | 언제나 길이 있기 마련입니다. | 4 | 1 | 2022-08-15 10:41:22 |
| 7 | 자다가 코딩하는 꿈꿀 것 같아요 | 1 | 4 | 2022-08-15 10:41:22 |
+----+----------------------------------------------------------+------------+---------+---------------------+
7 rows in set (0.00 sec)
이렇게 select 절과 from 절 두개로 만들어진 SELECT 문장을 사용해 쿼리할 수 있다.
현재 comments 테이블의 comment 만 뽑아 내고 싶을 때에는 다음과 같은 쿼리문을 사용합니다.
mysql> select comments.comment from comments;
+----------------------------------------------------------+
| comment |
+----------------------------------------------------------+
| 작은 성공이 모여 큰 성취가 되니까요! |
| 같이 힘냅시다 |
| 햇살이 너무 좋아서 코딩하고 싶지 않아요 |
| 지금 비오는걸요 |
| 모델링 최고! 생각하는거 너무 재밌죠 |
| 언제나 길이 있기 마련입니다. |
| 자다가 코딩하는 꿈꿀 것 같아요 |
+----------------------------------------------------------+
7 rows in set (0.00 sec)
만일 user_id도 보고싶다면 , 로 구분하여 나열해주면 된다.
mysql> select comments.user_id, comments.comment from comments;
+---------+----------------------------------------------------------+
| user_id | comment |
+---------+----------------------------------------------------------+
| 3 | 작은 성공이 모여 큰 성취가 되니까요! |
| 1 | 같이 힘냅시다 |
| 2 | 햇살이 너무 좋아서 코딩하고 싶지 않아요 |
| 4 | 지금 비오는걸요 |
| 3 | 모델링 최고! 생각하는거 너무 재밌죠 |
| 1 | 언제나 길이 있기 마련입니다. |
| 4 | 자다가 코딩하는 꿈꿀 것 같아요 |
+---------+----------------------------------------------------------+
7 rows in set (0.00 sec)
같은 내용이지만 아래는 alias(별칭)을 정해서 select
뒤에 테이블명을 확 줄여주었습니다.
별칭에 대한 내용은 다음에 더 공부하고 포스팅 해야겠다. 오늘의 포스팅에서는 이정도만..ㅎㅎ
mysql> select c.user_id, c.comment from comments c;
+---------+----------------------------------------------------------+
| user_id | comment |
+---------+----------------------------------------------------------+
| 3 | 작은 성공이 모여 큰 성취가 되니까요! |
| 1 | 같이 힘냅시다 |
| 2 | 햇살이 너무 좋아서 코딩하고 싶지 않아요 |
| 4 | 지금 비오는걸요 |
| 3 | 모델링 최고! 생각하는거 너무 재밌죠 |
| 1 | 언제나 길이 있기 마련입니다. |
| 4 | 자다가 코딩하는 꿈꿀 것 같아요 |
+---------+----------------------------------------------------------+
7 rows in set (0.00 sec)
데이터들 중에서 필요한 데이터만 뽑아쓰기 위해 where키워드 뒤에 조건 표현식을 써서
조건을 걸어줄 수 있다.
mysql> select c.user_id, c.comment from comments c WHERE user_id = 1;
+---------+------------------------------------------+
| user_id | comment |
+---------+------------------------------------------+
| 1 | 같이 힘냅시다 |
| 1 | 언제나 길이 있기 마련입니다. |
+---------+------------------------------------------+
2 rows in set (0.00 sec)
user_id=1
이라는 조건을 걸어주어 user_id가 1인 comment 만 출력되는 것을 볼 수 있다.
=
는 이항 연산자로 좌변 우변의 항목을 비교하고 같은 값이면 참 아니면 거짓을 반환한다.
비교 연산자는 = 외에 <,>,>=,>= 등 이있다.
복수 조건 표현식에는 AND, OR, NOT
을 사용할 수 있습니다.
SELECT * FROM posts;
+----+-------------------+-----------------------------+----------+---------------------+------------+
| id | title | content | user_id | created_at | updated_at |
+----+-------------------+-----------------------------+----------+---------------------+------------+
| 1 | 코딩공부 1일차 | HTML과 CSS 익숙해지기.. | 1 | 2022-04-10 11:41:36 | NULL |
| 2 | 코딩공부 2일차 | Javascript 기본 문법 학습.. | 1 | 2022-04-18 11:41:38 | NULL |
| 3 | 코딩공부 3일차 | 웹서비스의 역사와 발전 세션을 듣고..| 1 | 2022-05-02 11:41:39 | NULL |
| 4 | 자료구조 1번 | BigO Notation이란 무엇인가?.. | 2 | 2022-04-13 11:41:39 | NULL |
| 5 | 자료구조 2번 | 시간 복잡도와 공간 복잡도에 대해서..| 2 | 2022-04-19 11:41:39 | NULL |
| 6 | 프론트 개발 입문 | 프론트 입문 HTML이란 무엇인가? | 3 | 2022-05-23 11:43:25 | NULL |
+----+-------------------+-----------------------------+----------+---------------------+------------+
SELECT * FROM posts WHERE user_id = 1 AND created_at < '2022-04-15 00:00:00';
+----+-------------------+-----------------------------+----------+---------------------+------------+
| id | title | content | user_id | created_at | updated_at |
+----+-------------------+-----------------------------+----------+---------------------+------------+
| 1 | 코딩공부 1일차 | HTML과 CSS 익숙해지기.. | 1 | 2022-04-10 11:41:36 | NULL |
+----+-------------------+-----------------------------+----------+---------------------+------------+
(user_id=1)이 작성한 게시물 중 생성일이 '2022-04-15 00:00:00' 이전인 게시물만 나오게 되었다.
AND는 교집합 OR은 합집합으로 계산한다.
NOT을 붙이게 된다면 거짓을 반환하게 할 수 있다.
SELECT SELECT * FROM posts WHERE NOT(user_id = 1 AND created_at < '2022-04-15 00:00:00');
+----+-------------------+-----------------------------+----------+---------------------+------------+
| id | title | content | user_id | created_at | updated_at |
+----+-------------------+-----------------------------+----------+---------------------+------------+
| 2 | 코딩공부 2일차 | Javascript 기본 문법 학습.. | 1 | 2022-04-18 11:41:38 | NULL |
| 3 | 코딩공부 3일차 | 웹서비스의 역사와 발전 세션을 듣고..| 1 | 2022-05-02 11:41:39 | NULL |
| 4 | 자료구조 1번 | BigO Notation이란 무엇인가?.. | 2 | 2022-04-13 11:41:39 | NULL |
| 5 | 자료구조 2번 | 시간 복잡도와 공간 복잡도에 대해서..| 2 | 2022-04-19 11:41:39 | NULL |
| 6 | 프론트 개발 입문 | 프론트 입문 HTML이란 무엇인가? | 3 | 2022-05-23 11:43:25 | NULL |
+----+-------------------+-----------------------------+----------+---------------------+------------+
위와 같이 user_id=1인 유저가 쓴 게시글중 2022-04-15 00:00:00 보다 작은값이 아닌
모든 데이터들을 반환하는 것을 볼 수 있다.
데이터 중에 문자열을 기준으로 데이터를 가져올 수 있는 방법중에 LIKE
서술어를 사용하면 된다.
이 때 사용하는 기호중에 %를 사용하는데 메타문자라고 한다. %는 임의의 문자열이라고 보면된다.
LIKE %텍스트
일 경우 텍스트 앞에 임의의 문자열 %가 존재한다는 뜻이고
LIKE %텍스트%
일 경우 검색하고자 하는 텍스트가 중간에 위치한다는 뜻이다.
%는 임의의 문자열 뿐만 아니라 빈 문자열('')도 매치되기 때문에 텍스트가 처음에 포함되어도 반환한다.
mysql> select c.user_id, c.comment from comments c;
+---------+----------------------------------------------------------+
| user_id | comment |
+---------+----------------------------------------------------------+
| 3 | 작은 성공이 모여 큰 성취가 되니까요! |
| 1 | 같이 힘냅시다 |
| 2 | 햇살이 너무 좋아서 코딩하고 싶지 않아요 |
| 4 | 지금 비오는걸요 |
| 3 | 모델링 최고! 생각하는거 너무 재밌죠 |
| 1 | 언제나 길이 있기 마련입니다. |
| 4 | 자다가 코딩하는 꿈꿀 것 같아요 |
+---------+----------------------------------------------------------+
7 rows in set (0.00 sec)
mysql> select c.user_id, c.comment from comments c WHERE comment LIKE '%작은';
Empty set (0.00 sec)
보다시피 '작은' 이라는 텍스트가 뒤에오는 경우는 없으니 Empty set을 반환하는 걸 볼 수 있다.
mysql> select c.user_id, c.comment from comments c WHERE comment LIKE '작은%';
+---------+-----------------------------------------------------+
| user_id | comment |
+---------+-----------------------------------------------------+
| 3 | 작은 성공이 모여 큰 성취가 되니까요! |
+---------+-----------------------------------------------------+
1 row in set (0.00 sec)
mysql> select c.user_id, c.comment from comments c WHERE comment LIKE '%작은%';
+---------+-----------------------------------------------------+
| user_id | comment |
+---------+-----------------------------------------------------+
| 3 | 작은 성공이 모여 큰 성취가 되니까요! |
+---------+-----------------------------------------------------+
1 row in set (0.00 sec)
'작은' 이라는 텍스트가 맨 앞에오는 경우를 반환했더니 잘 반환되었고
'작은' 이라는 텍스트가 중간에 오는 경우를 반환했더니 처음오는 경우도 반환된것을 볼 수 있다.
다음 포스팅에서 JOIN에 대해 포스팅하겠다.