IN (?, ?, ?) 문법 정리
1. 개념
IN은 지정한 여러 값 중 하나라도 일치하면 true가 되는 조건문입니다.
SQL에서 특정 컬럼이 여러 값 중 하나에 해당하는 row만 조회할 때 사용합니다.
2. 기본 문법
SELECT * FROM 테이블명 WHERE 컬럼명 IN (값1, 값2, 값3);
3. Prepared Statement에서 사용법 (?, ?, ?)
Node.js의 mysql2 또는 mariadb 드라이버에서는 SQL Injection 방지와 유연한 쿼리 구성을 위해 아래처럼 사용합니다.
const ids = [1, 2, 3];
const placeholders = ids.map(() => '?').join(','); // "?,?,?"
const sql = `SELECT * FROM cart WHERE id IN (${placeholders})`;
const [rows] = await conn.query(sql, ids);
이 쿼리는 아래와 같음:
SELECT * FROM cart WHERE id IN (1, 2, 3);
4. 장점
| 항목 | 설명 |
| 단일 쿼리 처리 | 여러 조건을 하나의 쿼리로 처리하므로 성능 좋고 깔끔함 |
| 반복문 없음 | 각 ID마다 쿼리 돌리는 비효율 피할 수 있음 |
| SQL Injection 방지 | ?를 사용한 바인딩 방식은 입력값을 안전하게 처리함 |
| 가독성 우수 | 복잡한 OR 조건보다 IN이 더 직관적임 |
5. 실전 예제: 장바구니에서 선택 항목 조회
SELECT * FROM cart WHERE id IN (2, 4, 5);
→ id가 2, 4, 5 중 하나인 row만 가져옴
6. 유의사항
- IN 안의 값이 너무 많으면 성능 저하 (수백~수천 개는 피하는 게 좋음)
- 값이 아예 없을 경우 SQL 문법 오류가 날 수 있으므로, 빈 배열 체크 필수
if (idArr.length === 0) {
return res.status(400).json({ message: "id가 필요합니다." });
}
실제 사용 예시
(cartController.js)
// 장바구니에서 "체크한" 상품 목록 조회
async function getCheckedItems(req, res) {
try {
const {user_id, cart_ids} = req.body;
if(cart_ids.length === 0) {
return res.status(StatusCodes.BAD_REQUEST).json({
message : "cart_ids 개수 0개"
});
}
let placeholder = cart_ids.map( value => "?" ); // ["?", "?", "?"] 배열 형태로
placeholder = placeholder.join(); // "?, ?, ?" 문자열 형태로
const conn = await dbConnection;
const [rows_checkedItems] = await conn.query(
`SELECT
cart.*, books.title, books.description, books.price
FROM cart
LEFT JOIN books ON cart.book_id = books.id
WHERE user_id = ? AND cart.id IN (${placeholder})`,
[user_id , ...cart_ids]
);
return res.status(StatusCodes.OK).json(rows_checkedItems)
}
catch(err) {
return res.status(StatusCodes.BAD_REQUEST).end();
}
}'mariaDB > 3. SQL 사용법' 카테고리의 다른 글
| 방금 테이블에 INSERT한 row의 ID를 가져오기 (0) | 2025.05.21 |
|---|---|
| 도서구매사이트 - 주문 API 작성 시 코드 리팩토링 (0) | 2025.05.21 |
| EXISTS 문법 (0) | 2025.05.19 |
| 좋아요 총 개수 보내주기 (개별 도서 조회) (1) | 2025.05.19 |
| 두 컬럼의 값을 한 쌍으로 제약조건 만들기 (0) | 2025.05.19 |