mariaDB/3. SQL 사용법

IN (?, ?, ?) 문법

bbomkim 2025. 5. 20. 18:51

 

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();
  }
}