Wecode - Project 3 (부트캠프)/Project 3 과정

SQL 복습 - DATA 검색, 조회, 정렬, 필터링, 페이지네이션 ; SELECT, INNER/LEFT JOIN, GROUP BY

JBS 12 2023. 10. 12. 23:08

*select: 데이터 조회 

(전체 목록 페이지

  : [전체 데이터 조회] select * from posts

   [특정 열 조회] select title, content, post_id from posts where post_id= 1

   [검색] select title, name, content from posts where content like 'who%'

   [필터링] select title, content, post_id from posts where post_id= 1

   [pagination]  SELECT * FROM 테이블이름 LIMIT 10 OFFSET 20;

   [정렬] SELECT * FROM products ORDER BY price ASC; (오름차순)

            SELECT * FROM products ORDER BY price DESC; (내림차순) 

          SELECT * FROM products  ORDER BY price, recent ; (여러 열로 정렬)

   [카테고리] 

 

CRUD, 목록 페이지(pagination, category) - 모두 SQL문 활용이였구나

겨우겨우 하나씩 아무것도 모르고 하다가, sql을 다들 왜 복습해야 한다는지 쭉 처음 기초부터 심화까지 일주일 동안 훑으니까 알겠다. 그리고, 직접 terminal에 작성하며 해보니, 몰랐단 것들도 알

pm-developer-justdoit.tistory.com

*join : 테이블 결합 

*where, like:  데이터 쿼리 

 

Select 

- 데이터베이스에서 데이터 조회/검색 

- 테이블에서 원하는 데이터 추출, 반환 

 

SELECT 반환하려는 column1, column2 ... FROM 조회하려는 table_name    // 모든 행 반환 

SELECT 반환하려는 column1, column2 ... FROM 조회하려는 table_name WHERE 원하는 행 검색/필터링 조건 ;  

 

 


TEST DATA 만들기 

// users  테이블에, name email password age 칼럼에 각각의 값을 추가 
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);

 

1) 새로운 열 추가

add column 을 매번 쳐줘야 하고, varchar 뒤에 (길이 제한) 써줘야 함, INT 뒤에는 길이 제한 없음 

 

2) 데이터 추가 

 

데이터 추가 한번에 여러 개

(), (), 로 

 

1) 새로운 열 추가 

2) 데이터 추가 

 

VARCHAR 일 때 VALUES에서 " " 쓰고 / INT 일 때 안 씀 

 

 

모든 데이터 조회 : SELECT * FROM 'table이름'

검색 조건 지정 

1) 필요한 열 COLUMN 만 표시/조회/검색 -> 원하는 column 만 표시 

SELECT '표시하고 싶은 column name' FROM 'table 이름' 

 

SELECT posts.title FROM posts;

SELECT title FROM posts;

여러 column은 , 로 연결 

 

2) 필요한 행(row) 만 검색  -> WHERE 절로 조건 걸어주기 

일단 보고싶은 열 column  선택하고, 테이블 이름 

SELECT 'column1, column2, column4' FROM 'table이름' WHERE '선택하고 싶은 column = 해당하는 row' 

 

SELECT id, title, content, user_id FROM posts WHERE user_id = 1 ;

 

 

 

row의 조건 걸면서, 원하는 column만 검색할 수 있음. 

 

 

3) 필요한 행(row) 만 검색  -> WHERE 절로 여러 조건 걸어주기 ; AND/OR/NOT

AND

 

OR

 

NOT

SELECT * FROM posts WHERE NOT (user_id= 1 AND id=1);

 

'user_id=1 이면서 id=1'이 아닌 것만 가져온 것! 

WHERE LIKE

1)LIKE '검색할 텍스트 % : 문자열 맨 앞의 단어와 일치하는 경우 검색:

LIKE ‘HTML%’ HTML 텍스트 뒤로 임의의 문자열이 존재한다는 것을 의미

;

2))LIKE '%검색할 텍스트 %' : 문자열의 중간에 검색하고자 하는 단어가 포함

LIKE %HTML%

%는 임의의 문자열 뿐만아니라 빈 문자열(’’)에도 매치

HTML은 텍스트 중간이 아니라 처음에 포함되어 있는데 검색되는 이유

 

3) LIKE '%검색할 텍스트' : 검색할 텍스트가 마지막에 오는 경우 

 

추가 특수문자 

 

SQL LIKE Operator

W3Schools offers free online tutorials, references and exercises in all the major languages of the web. Covering popular subjects like HTML, CSS, JavaScript, Python, SQL, Java, and many, many more.

www.w3schools.com

 


테이블 결합 :JOIN 

- 우리 팀은 3차 프로젝트에서 테이블 수를 줄였는데, 다른 테이블과 연결되게 했는데,

그거를 join으로 연결 

 

sql Join만 따로

실험 1 SELECT users.id, users.name, users.post_id, posts.title, posts.content FROM users LEFT JOIN posts ON users.post_id = posts.id; 실험 2 SELECT users.id, users.name, users.post_id, posts.title, posts.content FROM users righT JOIN posts ON users.pos

pm-developer-justdoit.tistory.com

 

- 하나의 테이블에 많은 데이터에 저장하던 거를, 여러 개의 테이블로 나누어 저장 

- 다양하고 복잡한 데이터를 보여주기 위해, 복수의 테이블 결합해서, 데이터 검색 

 

곱집합으로 보는 개념

위를 코드로 나타내면, 교차 결합 (Cross Join)


join을 왜 하는지?

user 테이블과 posts 테이블이 모두 필요해서 2개의 테이블의 data를 모두 가져오고 싶을 때, join 을 하는 것 

 

[공부법] 
일단 inner join만 알면 됨. 

 


Inner Join 내부 결합

 

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

WHERE절을 사용해서 내부결합을 계산

 

WHERE절을 사용해서 내부결합

posts 테이블에 user id가 있는 이유
join을 위한 것!
-> user 테이블에 post id가 없는 이유는, 1대다 관계에서 '다'에 해당되지 않아서. 
1대 다 에서 '다'에 해당되는 부분만 fk를 가지기에. 


users 와 posts 테이블은 1대 다 관계
-> 하나의 user는 여러 post를 쓸 수 있지만, 
하나의 posts는 하나의 유저만 가지니까

users 테이블에 'post id'는 없지만, 'review id'는 가질 수 있음!   
-> users가 '다' , review가 1 이기 때문에 가능! 
users 와 posts 테이블에서는  'users와 posts 가 일대다'라서 post id를 못 가지지만,
users 와 review 테이블에서는 'users와 review 가 다대일'이라서 review id는 가질 수 있음!

users 와 review 테이블도 1대다 관계
-> 하나의 review 는 하나의 유저만 가지지만,
하나의 유저는 여러 리뷰를 가지기에, 1대다니까 가능! 

 

 

INNER JOIN 키워드를 사용해서 내부결합

INNER JOIN으로, users 테이블과 posts 테이블을, user_id 기준으로 결합

post.user_id= users.id

* 왼쪽엔 Post 테이블의 
   id, title, user_id, content 

* 오른쪽엔 user 테이블의 
   id, name 

* 기준은 user_id
(post 테이블의 user_id , user 테이블의 id // post 테이블의 user_id는 fk 외래키 --> 연결하기 위한
mysql> SELECT 
	posts.id,
	posts.title, 
	posts.user_id, 
	posts.content 
	users.id, 
	users.name
FROM posts 
INNER JOIN users ON posts.user_id = users.id;
+----+--------------+---------+----------------------------+----+-----------------+
| id | title        | user_id | content                    | id | name            |
+----+--------------+---------+----------------------------+----+-----------------+
|  1 | 위코드 1일차    |       1 | HTML과 CSS 익숙해지기..       |  1 | Rebekah Johnson |
|  2 | 위코드 2일차    |       1 | Javascript 기본 문법 학습..   |  1 | Rebekah Johnson |
|  3 | 위코드 3일차    |       1 | 웹서비스의 역사와 발전 세션을 듣고.|  1 | Rebekah Johnson |
|  5 | 자료구조 1번    |       2 | BigO Notation이란 무엇인가?   |  2 | Fabian Predovic |
|  6 | 자료구조 2번    |       2 | 시간 복잡도와 공간 복잡도에 대해서.|  2 | Fabian Predovic |
|  7 | 프론트 개발 입문 |       3 | 프론트 입문 HTML이란 무엇인가?   |  3 | Elenor Gottlieb |
+----+--------------+---------+----------------------------+----+-----------------+

Outer Join 외부 결합: Left Join, Right Join, Full Join 

일단 select ~ FROM users LEFT/RIGHT JOIN ~ ON ~

에서 select이후에는, 어떤 칼럼들이 올지 순서대로 읽으면 되고 (가볍게 패스)

FROM users 로 어느 테이블이 기준인지! 

LEFT/RIGHT: 왼쪽에서 시작인지, 오른쪽에서 시작인지! 생각

그리고 ON 이후엔 조건을 보면 됨 

 

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

 

기준이되는 테이블 (left table)의 모든 row와 join이 걸리는 테이블(right table) 중에서 left table과 매칭되는 row만 검색

join이 걸리는 테이블에서 매칭되는 결과가 없는 경우 빈 값(NULL)로 표시

 

과제 풀이

 

sql Join만 따로

실험 1 SELECT users.id, users.name, users.post_id, posts.title, posts.content FROM users LEFT JOIN posts ON users.post_id = posts.id; 실험 2 SELECT users.id, users.name, users.post_id, posts.title, posts.content FROM users righT JOIN posts ON users.pos

pm-developer-justdoit.tistory.com

 

left join vs. right join 이란? 

(사진 기준) 

 left join:
left/왼쪽에 있는 user table을 기준으로 user에 있는 모든 값을 다 찍어내겠다
 right의 Posts 테이블에 left에 해당되는 user table의 값 name4에 해당되는 user_id= 4가 post table에 없더라도, 
left join 으로 left 기준이니까, 찍어내겠다. 

 right join: right/오른쪽에 있는 posts table을 기준으로 posts 에 있는 모든 값을 다 찍어내겠다
 right의 Posts 테이블에 left에 해당되는 user table의 값에 없더라도, 
right join 으로 right 기준이니까, 
찍어내겠다. 

* 만약, left에 posts테이블에 있으면 left join이 posts 테이블 기준임.

유동적으로 옮겨질 수 있음. 

 

* inner join 은 교집합

* outer join은 합집합

  합집합 중에서도

  - left join은 left를 기준으로 left에 있는 것만 합 (left가 열이 3개면, right는 열이 4개면 -> join 결과는 3줄 ) 

 -  right join은 right을 기준으로  (left가 열이 3개면, right는 열이 4개면 -> join 결과는 4줄 ) 

  --> select는 가져와야 해서 join할 때 가져오는 거 

 

목록페이지에서 '정렬'

1. order by -> rating/ high price/ 등등으로 정렬하겠다 

 

2. left join으로 product에 color, option등등 테이블을 옆에 갖다 붙여준다. 

left right 중에 뭘 할지 정하는 기준은, ? 기준점으로 붙이니까, 그냥 내가 정하기 나름 

(right join을 쓸 일이 없음, 왼쪽 기준으로 옆으로 붙이니 left join 자랑)

  

3. 그 후에 다 붙인거를 한번에 

마지막에, 옆에 붙여준거를 group by - 타입이 같은 데이터 끼리  갖다 붙였으니 하나로 묶어준다 -> 정렬이 다양한 

 

나머진 null 로 들어감. 

 

 

* left join 은 옆으로 가져온다, 칼럼이 추가되는. 

* union은 아래로 가져온다

행으로 합친다. 

칼럼은 똑같고 밑으로 내려가는 

 


에러가 났던 이유

1. [ id에 INT, auto increment는 디폴트 ]

 id가 NULL인 이유, 내가 text 로 했고, auto_increment로 안 해서 

auto_increment를 쓸 때, primary key 를 써야 함 

 

그러고 나니, id가 숫자로 생김. 

 

2. INSERT 아닌 UPDATE 

update로 한줄씩 올려야 함. 

UPDATE users SET employee_id=1001 WHERE id=1;

UPDATE users SET employee_id=1001 WHERE id=1;

insert가 아니라, update를 해야 하는 이유

insert란, 추가 한다라는 뜻. 어디에? 새로운 행에!