*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 ; (여러 열로 정렬)
[카테고리]
*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 '%검색할 텍스트' : 검색할 텍스트가 마지막에 오는 경우
추가 특수문자
테이블 결합 :JOIN
- 우리 팀은 3차 프로젝트에서 테이블 수를 줄였는데, 다른 테이블과 연결되게 했는데,
그거를 join으로 연결
- 하나의 테이블에 많은 데이터에 저장하던 거를, 여러 개의 테이블로 나누어 저장
- 다양하고 복잡한 데이터를 보여주기 위해, 복수의 테이블 결합해서, 데이터 검색
곱집합으로 보는 개념
위를 코드로 나타내면, 교차 결합 (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)로 표시
과제 풀이
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란, 추가 한다라는 뜻. 어디에? 새로운 행에!
'Wecode - Project 3 (부트캠프) > Project 3 과정' 카테고리의 다른 글
Project 3- Software Test 세션 ** (0) | 2023.10.15 |
---|---|
Project3: sprint 1 - 금요일 standing 미팅, 기능정의서 api (0) | 2023.10.13 |
Project 3: 위치 기반 / AWS ** (0) | 2023.10.12 |
Project 3 - 장바구니 구조화 ** (0) | 2023.10.12 |
Project 3 - sprint 1주-3일차 : 기능정의요구서 1차 (0) | 2023.10.11 |