SQL: 비트연산자, JOIN

SeongGyun Hong·2025년 2월 15일

SQL

목록 보기
40/51

https://school.programmers.co.kr/learn/courses/30/lessons/276035

1. 비트연산자란?

비트 연산자는 데이터를 비트(bit) 단위로 연산하는 연산자이다.

SQL에서도 비트 연산자를 지원하며, 주로 정수형 데이터에 대해 비트 단위로 AND, OR, XOR, NOT 등의 연산을 수행함.

비트 연산은 이진수로 표현된 데이터의 각 비트를 직접 조작하는 데 사용됨.


1.1 주요 비트 연산자

  1. AND (&):

    • 두 비트가 모두 1일 때만 1을 반환
    • 예: 5 & 30101 & 0011 = 0001 (결과: 1)
  2. OR (|):

    • 두 비트 중 하나라도 1이면 1을 반환
    • 예: 5 | 30101 | 0011 = 0111 (결과: 7)
  3. XOR (^):

    • 두 비트가 서로 다를 때 1을 반환
    • 예: 5 ^ 30101 ^ 0011 = 0110 (결과: 6)
  4. NOT (~):

    • 비트를 반전시킴 (01로, 10으로)
    • 예: ~5~0101 = 1010 (결과: -6, 부호 비트가 반전되기 때문)
  5. 시프트 연산자 (MySQL 등 일부 DBMS에서 지원):

    • << (왼쪽 시프트): 비트를 왼쪽으로 이동 (예: 5 << 11010, 결과: 10)
    • >> (오른쪽 시프트): 비트를 오른쪽으로 이동 (예: 5 >> 10010, 결과: 2)

1.2 비트 연산의 활용

  1. 플래그(Flag) 처리:

    • 여러 상태를 하나의 정수 값으로 표현할 때 사용
    • 예: 사용자 권한 관리 (읽기: 1, 쓰기: 2, 실행: 4 등)
  2. 데이터 압축:

    • 여러 값을 하나의 정수로 압축하여 저장할 수 있음
  3. 성능 최적화:

    • 비트 연산은 일반적으로 빠르기 때문에, 특정 상황에서 성능 최적화에 사용됨.

SQL에서의 비트 연산 예시

1. AND 연산 (&)

SELECT 5 & 3;  -- 결과: 1
  • 5는 이진수로 0101, 30011
  • AND 연산 결과: 0001 (십진수로 1)

2. OR 연산 (|)

SELECT 5 | 3;  -- 결과: 7
  • 5는 이진수로 0101, 30011
  • OR 연산 결과: 0111 (십진수로 7)

3. XOR 연산 (^)

SELECT 5 ^ 3;  -- 결과: 6
  • 5는 이진수로 0101, 30011
  • XOR 연산 결과: 0110 (십진수로 6)

4. NOT 연산 (~)

SELECT ~5;  -- 결과: -6
  • 5는 이진수로 0101입니다.
  • NOT 연산 결과: 1010 (십진수로 -6, 부호 비트가 반전되기 때문)

1.3 주의사항

  1. 데이터 타입:

    • 비트 연산은 주로 정수형 데이터(INT, BIGINT 등)에 적용됨.
    • 부동소수점이나 문자열에는 사용할 수 없음
  2. DBMS별 차이:

    • 모든 DBMS가 동일한 비트 연산자를 지원하지는 않음.
      • 예: Oracle은 BITAND 함수를 사용
    • 시프트 연산자(<<, >>)는 MySQL에서만 지원됨.
  3. 성능:

    • 비트 연산은 일반적으로 빠르지만, 복잡한 비트 연산은 가독성을 해칠 수 있으므로 적절히 사용하자..!

1.4 DBMS별 비교 표

기능MySQLOracleMS SQL Server
AND 연산&BITAND()&
OR 연산```
XOR 연산^^^
NOT 연산~~~
시프트 연산<<, >>미지원미지원

2. 문제 풀이

  • MySQL, MS SQL SERVER 기준 풀이
SELECT DISTINCT D.ID, D.EMAIL, D.FIRST_NAME, D.LAST_NAME
FROM (
    SELECT CODE FROM SKILLCODES WHERE CATEGORY = 'Front End'
) S
INNER JOIN DEVELOPERS D
ON (S.CODE & D.SKILL_CODE) = S.CODE
WHERE S.CATEGORY = 'Front End'
ORDER BY D.ID ASC;
  • ORACLE 기준 풀이 >> BITAND 만 달라짐
SELECT DISTINCT D.ID, D.EMAIL, D.FIRST_NAME, D.LAST_NAME
FROM (
    SELECT CODE FROM SKILLCODES WHERE CATEGORY = 'Front End'
) S
INNER JOIN DEVELOPERS D
ON BITAND(S.CODE, D.SKILL_CODE) = S.CODE
ORDER BY D.ID ASC;
profile
헤매는 만큼 자기 땅이다.

0개의 댓글