MySQL 쿼리에 대해서

hoifoi·2023년 10월 29일


이제 데이터베이스도 만들고 테이블도 만들어 봤으니
데이터를 씹뜯맛즐 할 시간!
데이터의 입력과 조회, 수정, 삭제 등을 해볼까?

SELECT 문

가장 기본적인 쿼리 SELECT!
이를 통해 데이터를 검색하고 가져올 수 있다!

## MySql
-- users의 모든 데이터를 조회
SELECT * FROM users;

-- users의 일부 칼럼에 대해서만 조회(id, name, phone_number)
SELECT id, name, phone_number FROM users;

-- 조회되는 칼럼의 이름을 한글로 띄우고 싶다면!
SELECT id AS '아이디', name AS '이름', phone_number AS '폰번호' FROM users;

여기서 *은 모든 것이라는 뜻이라고 생각하면 좋다!
그리고 칼럼이나 테이블 이름을 제외한 MySQL의 문법은 모두 대문자로 작성하는 것이 좋다!
소문자로 써도 잘 작동하긴 하는데
다른 사람도 금방 쉽게 이해할 수 있어서 좋을 테고 나 한테도 좋고!
오류를 찾아내기도 쉽다..(난 항상 겪어봐야 아는 것 같다ㅜㅜ)

WHERE : 검색을 하는데 조건이 필요하다면?

WHERE 절을 사용하여 특정 조건을 만족하는 행만 선택할 수 있습니다.

## MySql
-- users에서 id가 17번인 유저 조회
SELECT * FROM users WHERE id = 1;

-- users에서 성별이 남자인 유저만 조회
SELECT * FROM users WHERE gender = 'male';

보통 위와 같이 쓰는데
그러면 정확한 값을 알아야 하는 단점이 있다!
그럴때 쓰는 것이 LIKE! 평소에도 쓰지만 검색기능을 붙여야 하거나
데이터의 특정 값만 필요한 경우에 쓴다!

## MySql
-- users에서 id가 100번대인 유저를 조회
SELECT * FROM users WHERE id LIKE '1__';

-- users에서 이름이 진씨인 유저만 조회
SELECT * FROM users WHERE name LIKE '진__';
SELECT * FROM users WHERE name LIKE '진%';

-- users에서 핸드폰 번호가 중간에 7892인 유저 조회
SELECT * FROM users WHERE phone_number LIKE '____7892_____';
SELECT * FROM users WHERE phone_number LIKE '%-7892-%';

여기서 언더바의 역할은 정확한 글자수 대신 표시하는 역할이다
그래서 100번대는 116, 167 등을 대신해 '1_ '로 쓰고
진씨 성을 가진 유저를 찾을 때는 '진
_'을 써도 되는데
'진기명기'와 같이 네글자 이름의 경우에는 이렇게 썼을때 검색되지 않으므로
'진%'이라고 쓰면 진으로 시작하는 모든 데이터를 찾아준다
그래서 글의 갯수나 순서까지 정확하게 찾으려면 언더바
몇개인지는 모르겠고 맨 앞이나, 맨 뒤, 혹은 중간에 포함된 특정 문자열로
검색을 하고 싶으면 %를 쓰면 된다!

ORDER BY : 데이터의 정렬이 필요할 때!

ORDER BY 절을 사용하여 결과를 특정 열을 기준으로 정렬할 수 있다!

## MySql
-- posts에서 등록일 기준 오름차순으로 조회(오래된 것 먼저)
SELECT * FROM posts ORDER BY created_at ASC;

-- posts에서 등록일 기준 내림차순으로 조회(제일 최근에 작성된 것 먼저)
SELECT * FROM posts ORDER BY created_at DESC;

GROUP BY : 데이터를 특정 조건으로 그루핑할 때!

GROUP BY 절을 사용하여 특정 열을 기준으로 데이터를 그룹화할 수 있다!

## MySql
-- families에서 가족별로 구성인원이 몇명인지 조회
SELECT id, COUNT(*) FROM families GROUP BY id

-- orders에서 제품 별 총 주문 량을 조회
SELECT product_name, SUM(quantity) FROM orders GROUP BY product_name;

묶었으면 하는 칼럼을 GROUP BY 뒤에 적어주면서 명시해주고,
그랬을 때 필요한 값(총량이나 평균값(AVG)도 가능!)을 작성하면 그에 맞게 조회된다!

나머지 : INSERT, UPDATE, DELETE

아아주 기본적인 부분이지만 조금 조심해야 할 부분도 같이 묶어서 설명해보겠다!

## MySql
-- users 테이블에 간단한 데이터 입력
INSERT INTO users(name, gender) VALUES('호로롱', 'male');

-- users 테이블의 데이터를 일부 수정 하는 경우
UPDATE users SET name = '호로리', gender = 'female' WHERE id = 1;

-- users 테이블의 name이 '호로리'인 유저의 데이터를 삭제하는 경우
DELETE FROM users WHERE name = '호로리';

INSERT 쿼리의 경우 명시한 칼럼 값에만 데이터가 입력되며
나머지 칼럼에는 NULL값이 들어간다!
이때 해당 칼럼에 NOT NULL 조건이 있다면 데이터 입력이 거부되고 오류가 발생!
그렇기 때문에 필수 정보는 조건을 걸어두면서 오류를 발생시키는 것이 좋다!
(API 단계에서 한번 막고, 데이터베이스에서 한번 더 막으면 좋겠지?!)

UPDATE와 DELETE 의 경우에는 어떤 값을 수정하거나 삭제해야 하는지
WHERE로 찾아줘야 하는데 그렇기 때문에 LIKE 절을 쓰는 경우는 되도록이면 없어야 한다.
(정확한 값이 정확한 곳에 들어가거나 삭제되어야 하기 때문)
그래서 다시 한번 조심할 수 있는 방법은 교차 검증을 하는 것!

## MySql
UPDATE users SET name = '호로리', gender = 'female' WHERE id = 1 AND name = '호로롱';
DELETE FROM users WHERE name = '호로리' AND id = 7;

이렇게 AND 조건을 쓰면서 교차검증할 해당 다른 칼럼을 또 넣어주는 것!
2개만 해도 잘 되거나 프라이머리 칼럼 값을 교차검증하는 방법만 써도 되니
굳이 3개를 쓰지는 말자!(OR절도 쓸 수 있으니 한번 테스트 해보기!)

++
발돋움 중인 예비 개발자 입니다.
태클 및 의견 공유 언제나 환영 :D

profile
컨텐츠 기획자 출신 백엔드 개발자 :D

0개의 댓글