SQL에서는 산술 연산자(+, -, *, /)는 모두 숫자에만 사용할 수 있다. 문자열로 '100'을 넣어도 숫자로 변환되어서 계산이 된다. 때문에 숫자로 변환될 수 없는 정말 찐 문자인 'a'를 1과 더하는 산술연산은 오류를 발생시킨다.
#연산자: 문자 연산자
그렇다면 문자를 더하고 싶으면어떻게 해야 할까? 이때는 다른 곳에서는 보통 OR연산자로 활용되는 ||연산자를 사용한다.
출처: 뉴렉처(https://www.youtube.com/@newlec1)
문자 연산자를 활용하여 column 명칭을 이름(ID)의 형태로 출력해보자. (HINT: 모든 문자열 형태의 값을 ||로 연결해주면 된다.)
출처: 뉴렉처(https://www.youtube.com/@newlec1)
별칭까지 써주면 완벽!
출처: 뉴렉처(https://www.youtube.com/@newlec1)
#연산자: 비교 연산자
비교 연산자에서 주의할 점은
1. 같다를 대입연산자(=)로 쓴다는 점 2. 같지 않다는 3가지 방법(!=, ^=, <>)으로 동일하게 나타낼 수 있다는 점 3. NULL값을 비교하기 위해서는 별도의 연산이 필요하다는 점을 들 수 있겠다. (IS NULL, IS NOT NULL)
💡 (참고) 왜 같지 않다를 3가지의 다른 표현식으로 사용하나요?
1. !=: 많은 플랫폼에서 사용하다 보니 본의아니게 표준처럼 변해버린 연산 2. ^=: Oracle에서 같지 않다를 표현하는 연산 3. <>: ANSI에서 표준화를 위해 만든 연산
출처: 뉴렉처(https://www.youtube.com/@newlec1)
#연산자: 관계 연산자
연속되는 숫자라면 and와 between을 사용할 수 있다. between은 값을 포함해서 사이값을 출력한다. 만약 포함시키지 않고 출력하고 싶다면 (0초과 2미만) AND만 가능하다.
💡 BETWEEN이 있는데 AND를 쓸 일이 있을까?
BETWEEN은 >=와 <=처럼 등호가 포함된 연산이다. 따라서 초과, 미만을 이용해서 연산을 하고 싶을 때에는 AND연산을 사용해야 한다.
출처: 뉴렉처(https://www.youtube.com/@newlec1)
연속되는 숫자가 아니라면 OR이나 IN을 사용해서 출력할 수 있다. OR로 여러개의 값을 묶어야 할 경우 IN을 사용하면 보다 간편하게 출력할 수 있다.
출처: 뉴렉처(https://www.youtube.com/@newlec1)
만약 특정한 몇 몇 값을 제외한 나머지 여집합의 값을 구하고 싶다면 IN앞에 NOT을 써서 출력한다. IN은 여러 값을 다룰 수 있다는 점을 잘 기억해서 SELECT절을 사용할 때 WHERE 구문에서 잘 사용해보자!
출처: 뉴렉처(https://www.youtube.com/@newlec1)
#연산자: 패턴 비교 연산자
여태까지는 정확히 A를 찾았다면, 이번에는 A같은 것, A를 포함한 것을 찾아보자. 정확히 A를 찾는 것이 아니라 A같은 것을 찾는 것이기 때문에 =을 사용하는 것이 아니라 LIKE를 사용해서 조회한다.
💡 LIKE, %, _ 각각에 대해서 알아보자.
1. LIKE: 패턴연산을 하기 위해서 필요한 등호. =이 아니라 반드시 LIKE를 사용해야 한다. 2. %: 마치 *과 같은 느낌으로 포함하고 있다는 뜻을 나타낸다. (EX) 박%: 박으로 시작하는 모든 데이터 / %박%: 박이 포함된 모든 데이터 / %박: 박으로 끝나는 모든 데이터 3. _ : 언더스코어 하나당 하나의 자리수를 나타낸다. (EX) 휴대전화 마지막은 4자리가 와야한다. 010-1234-____
출처: 뉴렉처(https://www.youtube.com/@newlec1)
#정규식을 이용한 패턴 연산
위의 패턴 연산자는 정규식과 함께 사용되면 그 효과가 극대화된다. 정형화된 모습을 가진 데이터들 (EX. 핸드폰 번호, 우편번호, 이메일 등)을 간단한 식으로 표현하여 적용시킬 수 있기 때문이다.
핸드폰 번호를 가지고 연습을 해보자.
💡 핸드폰 번호를 정규식으로 표현해보자.
(예제 1) 010-2354-256[1247] : 2561, 2562, 2564, 2567로 끝나는 번호를 찾겠다. (예제 2) 010-2354-256[0-9]: 끝자리가 2560~2569로 끝나는 번호를 찾겠다. (예제 3)010-2354-[0-9][0-9][0-9][0-9]: 끝자리가 0~9이며 4글자인 번호를 찾겠다. (예제 4) 이때, [0-9]를 \d로 대체할 수 있다. 그럼 \d\d\d\d라고 해야하나? 이것도 \d{4}로 줄일 수 있다. (예제 5),를 사용하면 자릿수를 결정할 수도 있다. {2,4}이면 2자리 ~ 4자리를 다 포괄한다. (예제 6)패턴에서 대문자 \D는 [^0-9] 즉, 숫자를 제외한 문자나 특수문자를 의미한다.
추가로 잘 만든 정규식을 단지 이렇게만 쓰면 앞 뒤로 다른 문자가 왔을 때 문제가 생길 수 있다.
^: 앞에 어떤 문자도 오면 안됨 $: 끝에 어떤 문자도 오면 안됨 \d: 한 자리에 0~9사이의 숫자를 표현한다. (\D: 한 자리에 숫자만 제외한 문자를 표현한다.) {3}: 3번 반복한다. *: 해당 안되면 안나오고 (0회) 해당 되면 계속해서 나온다. (+: 무조건 1회는 나오고 해당되면 계속 해서 나온다.)
어떤 자리수가 와도 다 검증될 수 있도록 정규식을 작성해보면 이상하게 소괄호()로 설정한 부분이 한 번 더 나온다. 검사가 한 번 더 진행된다는 뜻이기 때문에 반복되는 부분(소괄호로 묶은 부분)에 ?:을 추가해준다.
💡 소괄호를 다시 검사하고 싶지 않으면?
변경 전: \d{1,3}(,\d{3})* 변경 후: \d{1,3}(?:,\d{3})* //반복되는 부분에 물음표와 콜론을 넣어주었다.
출처: 뉴렉처(https://www.youtube.com/@newlec1)
조금 더 나아가서 물음표를 이용한 다른 정규식도 살짝 익혀보자.
💡문자열 정규식: \w+(?= mdn) (한칸 띄우고 mdn이라는 글자가 뒤 따르는 단어를 찾아라)
※ 문자이기 때문에띄어쓰기 까지 고려해야 한다. 특수한 의미를 가진 기호는 (+, ? 등) 앞에 \를 붙여서 이스케이프한다.
\w: 글자 단위 (띄어쓰기 포함 안됨) \w+: 단어 단위, 무조건 1개는 와야함(띄어쓰기 포함 안됨) \w*: 단어 단위 ,올 수도 안 올 수도 있음(띄어쓰기 포함 안됨) \w+(?=y): 뒤에 y라는 글자가 따라오는 단어 St(v|ph)en: Steven 또는 Stephen (?<=y)\w+: 앞에 y라는 글자가 따라오는 단어