빅데이터 국비 교육

[아이티윌 빅데이터 52기] Day 2 데이터 검색하기 SQL 함수

datahaseo 2025. 10. 1. 12:00

데이터 검색하기 SQL 함수 1

<학습 내용>

-데이터 검색하기

-집합 연산자

-문자열 함수

-숫자 함수

 

<학습 목표>

WHERE ,UNION, INTERSECT ,EXCEPT, 를 이해

문자열/숫자 함수의 종류 파악

 

 

 

WHERE 절의 사용

-특정 검색 조건을 만족하는 행만 조회

-비교 / 논리/ SQL 연산자

 

비교 연산자 : = . != , < ,> ,>= , <=

논리 연산자 : AND . OR . NOT

 

-AND 모든 조건이 참 / OR 하나라도 참  

-괄호를 적용하면 우선적으로 적용

 

SELECT * FROM STUDENTS 
WHERE (GRADE =1 OR GRADE = 2) AND STATUS = '재학;
ORDER BY GRADE ASC;

 

 

-AND 가 OR 보다 우선적으로 적용

SELECT * FROM STUDENTS 
WHERE GRADE =1 OR GRADE = 2 AND STATUS = '재학;
ORDER BY GRADE ASC;

*모든 1학년 혹은 2학년이면서 재학중인 사람을 조회

 

 

<연습 문제>

학점이2또는3이아닌과목의과목번호,과목명,학점을조회하는SQL문을작성하시오.
단,과목명가나다순으로정렬하시오.

 

<답안 참고>

#모범 답안
SELECT id, name, credit FROM subjects 
WHERE credit NOT IN (2, 3) 
ORDER BY name ASC; 


#내가 쓴 답안
select id,name,credit from subjects
where not (credit = 2 or credit=3)
order by name;


#주의
select id,name,credit from subjects
where credit != 2 or credit !=3
order by name;

 

 

위의 둘은 답이 같지만 

where credit != 2 or credit !=3

라고 하면 2이 가아닌 1,3, 3이 아닌 1,2 학점의 수업이 포함되기 떄문에 틀림

 

 

 

 

 

BETWEEN A AND B / NOT BETWEEN A AND B

WHERE 절에서 BETWEEN 절 쓸 수 있음

WHERE {컬럼} BETWEEN A AND B

 

이는 단순 비교 연산자로도 표현이 가능함

WHERE 컬럼명 >= A AND 컬럼명 <= B

 

 

 

*NOT BETWEEN 은 비교 연산자로 표현할 떄 OR 로 표현

그리고 비교 기준이 포함되지 않고 미만/초과로 처리

 

 

이걸 또 다르게 표현하면

NOT (BETWEEN A>=2 AND A<=6) 

 

 

 

IN /NOT IN 

 

 

 

조건이 교수나 부교수 중 한명만 걸려도 참이 되는 것

 

 

 

NOT IN 을 비교 연산차로 표현하면 AND 로 처리

 

 

 

 

LIKE / NOT LIKE 

와일드 카드를 사용해서 조회

특정 키워드가 포함/미포함인 경우를 조회

 

 

IS NULL / IS NOT NULL

'=' 부등호 사용 불가하고, 반드시 IS 키워드를 사용해야함

NULL 은 0, 공백을 의미하지 않고 아예 존재하지 않음을 의미함

 

 

DESC 구문으로 확인해서 NULL 유무 여부 확인 가능

 

 

 

 

 

집합 연산자

SELECT 절을 통한 조회 결과를 결과 집합이라고 할 떄,

여러개의 SELECT 구문이 있으면 집합 연산을 진행할 수 있음

 

조건 

-SELECT 문에서 조회하는 컬럼의 개수가 같고, 데이터 타입이 같아야함 

 

 

 

 

합집합

1. UNION : 중복된 행 제거

2.UNION ALL : 중복 제거 없이 바로 결합, 성능이 좀 더 빠름

 

DB 에서의 중복은 한 행에 있는 모든 값이 다 같을 떄를 의미함

 

 

교집합

 

 

차집합

오타 > PROFESSORS 에서 STUDENTS 를 뺴야함

 

 

SQL 함수의 종류

-단일 행 함수: 각 행에 대해 하나의 결과값 반환 (ROUND, LENGTH,UPPER)

-집계 함수:여러개 행의 값을 하나의 결과로 요약 (SUM,AVG,MAX)

 

문자열 함수

 

 

 

 

*오라클의 경우 CONCAT 할 수 있는게 2개로 한정되어 있고, 이어 붙일 떄 || 사용 가능

 

 

 

 

문자열을 일부분으로 자르고 싶을 때는 SUBSTRING (뮨자열, 시작 위치, 자르는 개수)

 

 

이름에서 성과 이름을 따로 분류할 때

RIGHT(NAME,CHAR_LENGTH(NAME)-1)

 

 

 

INSTR(A,B) A 에서 B 라는 문자가 시작하는 순서가 몇 번째인지

INSTR(EMAIL,'gmail.com') >0 이게 0보다 크면 포함된다는 조건처럼 쓸 수 있음

 

 

 

 

LPAD (LEFT PADDING)

만약 ID 가 ABC 인데 5자리로 맞춰주고 싶다면

LPAD(ID,5,'0')  >> ABC00

 

 

 

숫자를 예쁘게 만들어주는 FORMAT 함수

소수점자리 없애고 싶으면 0 으로 두면 됩니다이터 검색하기 SQL 함수 1

<학습 내용>

 

-데이터 검색하기

 

-집합 연산자

 

-문자열 함수

 

-숫자 함수

 

 

 

<학습 목표>

 

WHERE ,UNION, INTERSECT ,EXCEPT, 를 이해

 

문자열/숫자 함수의 종류 파악

 

 

 

 

 

 

 

WHERE 절의 사용

-특정 검색 조건을 만족하는 행만 조회

 

-비교 / 논리/ SQL 연산자

 

 

 

비교 연산자 : = . != , < ,> ,>= , <=

 

논리 연산자 : AND . OR . NOT

 

 

 

-AND 모든 조건이 참 / OR 하나라도 참  

 

-괄호를 적용하면 우선적으로 적용

 

 

 

SELECT * FROM STUDENTS 

WHERE (GRADE =1 OR GRADE = 2) AND STATUS = '재학;

ORDER BY GRADE ASC;

 

 

 

 

-AND 가 OR 보다 우선적으로 적용

 

SELECT * FROM STUDENTS 

WHERE GRADE =1 OR GRADE = 2 AND STATUS = '재학;

ORDER BY GRADE ASC;

*모든 1학년 혹은 2학년이면서 재학중인 사람을 조회

 

 

 

 

 

<연습 문제>

 

학점이2또는3이아닌과목의과목번호,과목명,학점을조회하는SQL문을작성하시오.

단,과목명가나다순으로정렬하시오.

 

 

 

<답안 참고>

 

#모범 답안

SELECT id, name, credit FROM subjects 

WHERE credit NOT IN (2, 3) 

ORDER BY name ASC; 

 

 

#내가 쓴 답안

select id,name,credit from subjects

where not (credit = 2 or credit=3)

order by name;

 

 

#주의

select id,name,credit from subjects

where credit != 2 or credit !=3

order by name;

 

 

 

 

위의 둘은 답이 같지만 

 

where credit != 2 or credit !=3

 

라고 하면 2이 가아닌 1,3, 3이 아닌 1,2 학점의 수업이 포함되기 떄문에 틀림

 

 

 

 

 

 

 

 

 

 

 

BETWEEN A AND B / NOT BETWEEN A AND B

WHERE 절에서 BETWEEN 절 쓸 수 있음

 

WHERE {컬럼} BETWEEN A AND B

 

 

 

이는 단순 비교 연산자로도 표현이 가능함

 

WHERE 컬럼명 >= A AND 컬럼명 <= B

 

 

 

 

 

 

 

*NOT BETWEEN 은 비교 연산자로 표현할 떄 OR 로 표현

 

그리고 비교 기준이 포함되지 않고 미만/초과로 처리

 

 

 

 

 

이걸 또 다르게 표현하면

 

NOT (BETWEEN A>=2 AND A<=6) 

 

 

 

 

 

 

 

IN /NOT IN 

 

 

 

 

 

 

조건이 교수나 부교수 중 한명만 걸려도 참이 되는 것

 

 

 

 

 

 

 

NOT IN 을 비교 연산차로 표현하면 AND 로 처리

 

 

 

 

 

 

 

 

 

LIKE / NOT LIKE 

와일드 카드를 사용해서 조회

 

특정 키워드가 포함/미포함인 경우를 조회

 

 

 

 

 

IS NULL / IS NOT NULL

'=' 부등호 사용 불가하고, 반드시 IS 키워드를 사용해야함

 

NULL 은 0, 공백을 의미하지 않고 아예 존재하지 않음을 의미함

 

 

 

 

 

DESC 구문으로 확인해서 NULL 유무 여부 확인 가능

 

 

 

 

 

 

 

 

 

 

 

집합 연산자

SELECT 절을 통한 조회 결과를 결과 집합이라고 할 떄,

 

여러개의 SELECT 구문이 있으면 집합 연산을 진행할 수 있음

 

 

 

조건 

 

-SELECT 문에서 조회하는 컬럼의 개수가 같고, 데이터 타입이 같아야함 

 

 

 

 

 

 

 

 

 

합집합

1. UNION : 중복된 행 제거

 

2.UNION ALL : 중복 제거 없이 바로 결합, 성능이 좀 더 빠름

 

 

 

DB 에서의 중복은 한 행에 있는 모든 값이 다 같을 떄를 의미함

 

 

 

 

 

교집합

 

 

 

 

차집합

오타 > PROFESSORS 에서 STUDENTS 를 뺴야함

 

 

 

 

 

SQL 함수의 종류

-단일 행 함수: 각 행에 대해 하나의 결과값 반환 (ROUND, LENGTH,UPPER)

 

-집계 함수:여러개 행의 값을 하나의 결과로 요약 (SUM,AVG,MAX)

 

 

 

문자열 함수

 

 

 

 

 

 

 

 

*오라클의 경우 CONCAT 할 수 있는게 2개로 한정되어 있고, 이어 붙일 떄 || 사용 가능

 

 

 

 

 

 

 

 

 

문자열을 일부분으로 자르고 싶을 때는 SUBSTRING (뮨자열, 시작 위치, 자르는 개수)

 

 

 

 

 

이름에서 성과 이름을 따로 분류할 때

 

RIGHT(NAME,CHAR_LENGTH(NAME)-1)

 

 

 

 

 

 

 

INSTR(A,B) A 에서 B 라는 문자가 시작하는 순서가 몇 번째인지

 

INSTR(EMAIL,'gmail.com') >0 이게 0보다 크면 포함된다는 조건처럼 쓸 수 있음

 

 

 

 

 

 

 

 

 

LPAD (LEFT PADDING)

 

만약 ID 가 ABC 인데 5자리로 맞춰주고 싶다면

 

LPAD(ID,5,'0') >> ABC00

 

 

 

 

 

 

 

숫자를 예쁘게 만들어주는 FORMAT 함수

 

소수점자리 없애고 싶으면 0 으로 두면 됩니다

 

 

 


예제 연습

1. 학과명(dname)을 모두 소문자로 변환하고, 학과명이 5글자를 초과하는 경우만 조회하시오.

SELECT LOWER(DNAME) FROM DEPARTMENTS
WHERE CHAR_LENGTH(DNAME) >5;

 

2. 과목명(name)의 앞 2글자와 학점을 결합해 "과목코드:AA-3"형식으로 출력하시오.

(예:'데이터베이스'3학점→'과목코드:데이-3')

SELECT CONCAT('과목코드:', LEFT(NAME,2),"-",CREDIT)
FROM SUBJECTS;

 

3.학생의 전화번호(phone)중,가운데 4자리를 추출하여 출력하시오.

SELECT MID(PHONE,INSTR(PHONE,'-')+1,4) FROM STUDENTS;

 

*MID 랑 SUBSTRING 거의 같은 개념으로 쓸 수 있음 

SELECT name, SUBSTRING(phone, INSTR(phone, '-') + 1, 4) AS mid_number 
FROM students;

 

 

4.전화번호는"xxx-1234-5678"혹은"xx-1234-5678"형식으로 저장되어 있습니다. 전화번호가 저장되어 있는 학과 중에서 학과명을 오른쪽으로 공백을 추가하여 15자 고정폭으로 출력하고,전화번호는 왼쪽으로 공백을 추가하여 15자 고정폭으로 출력하시오. 두값을 합쳐 하나의 문자열로 출력하시오.

 

SELECT CONCAT(RPAD(DNAME,15,' '),LPAD(PHONE,15,' '))
 FROM DEPARTMENTS
WHERE PHONE IS NOT NULL;

 

5.학생의 이름(name)과 이메일의 아이디 부분 (이메일에서'@'앞부분)을 추출하여 출력하시오

SELECT NAME, 
       LEFT(EMAIL,INSTR(EMAIL,'@')-1) 
FROM STUDENTS;

 

SELECT NAME, SUBSTRING(EMAIL,1,INSTR(EMAIL,'@')-1) FROM STUDENTS;

 

6. 이름이 5글자를 초과하는 학과의 이름과 이름 글자수를 길이의 내림차순으로 조회하시오

*char_length 를 통해서 특정 문자들의 글자수를 셀 수 있고, 이를 where 절이나 order by 에서도 조건으로 쓸 수 있음

*sql 실행 순서 상, 이 char_length 글자수는 where 절에서 별칭으로 못쓰다보니 그대로 적어줘야하고, order by 에서는 별칭으로 쓸 수 있음

 

SELECT DNAME, CHAR_LENGTH(DNAME) D_LENGTH FROM DEPARTMENTS WHERE CHAR_LENGTH(DNAME)>5 
ORDER BY D_LENGTH DESC;

 

 


 

숫자 함수

 

 

단위 통일

 

 

 

MOD 함수를 활용한 짝/홀수 구분

 

 

 


1.학생의 이름(name)과 키(height)를 소수점 첫째자리까지 반올림하여 rounded_height라는 별칭으로 출력하시오.

SELECT NAME,ROUND(HEIGHT,2) ROUNDED_HEIGHT FROM STUDENTS;

 

*소수점 첫쨰자리 까지 반올림 한다는 것은 ROUND(height, 1) 로 작성 필요

 

SELECT name, ROUND(height, 1) AS rounded_height FROM students;

 

2.`professors`테이블에서,모든 교수의 급여(`sal`)를 12로 나눈 월급을 계산한 결과를 조회하시오.

월급을 계산한 후,소수점 이하는 모두 버리고 정수 부분만 조회 되어야하며

결과 집합에는 교수의 이름(`name`),원래 급여(`sal`),그리고 소수점을 버린 월급(`monthly_salary`)이 포함 되어야한다.

 

SELECT NAME,

              SAL,

              ROUND(SAL/12,0) MONTHLY_SALARY

FROM PROFESSORS;

 

*소수점 이하를 모두 버릴 때 쓰는 함수 FLOOR

 

3.`departments`테이블을 사용하여,2024년을 기준으로 각 학과가 설립된지 몇년이 지났는지 계산하고,

그햇수를10으로 나눈값을소수점 첫째 자리에서 반올림하여' 경과 십년'으로 표시하라.

결과에는학과명(`dname`),설립연도(`established`),그리고반올림된'경과십년'(`decades_passed`)이포함되어야 한다.

 

SELECT DNAME,

              established  ,

              ROUND(ABS(established -2024)/10,1) AS '경과십년' 

FROM DEPARTMENTS;

 

*첫쨰 자리 에서 반올림 ROUND ( A,0)

 

 

4.`professors`테이블에서 보직수당(`comm`)을 받는 교수만을 대상으로,

각 교수가 받는 보직수당의 1/3값을  구하려고 합니다.

계산된 값은 소수점 이하를 무조건 올림하여 정수로 표현하세요.

결과에는 교수의 이름(`name`),원래 보직수당(`comm`), 그리고 올림 처리된 값(`adjusted_comm`)이 포함되어야 합니다.

 

 SELECT NAME,

                COMM,

                ROUND(COMM/3,0) ADJUSTED_COMM

FROM PROFESSORS WHERE COMM IS NOT NULL;

 

*소수점 이하를 무조건 올림하는 함수는 CEIL

 

SELECT name, comm, CEIL(comm / 3) AS adjusted_comm FROM professors WHERE comm IS NOT NULL;

 

5.학생의 이름,몸무게,기준 몸무게와의 차이,몸무게 구간을 기준 몸무게와의 차이가 적은 순서대로 상위5명을 조회하려고 한다.

기준 몸무게와의 차이는 기준 몸무게는 65kg과 비교하 여학생들의 몸무게 차이를 절댓값으로 계산한 값이다.이 값을`차이`로 출력하라.또한 몸무게 구간은 63kg인 경우60, 77kg인 경우 70으로 표시한 값을 의미한다.이를 `몸무게 구간`이라는이름으로 표시하라

 

SELECT NAME,

              WEIGHT,

              ABS(WEIGHT-65) AS '차이' ,

              CASE WHEN WEIGHT BETWEEN 60 AND 69 THEN '60'

                        WHEN WEIGHT BETWEEN  70 AND 79 THEN '70' ELSE '-' END '몸무게 구간'

FROM STUDENTS ORDER BY ABS(WEIGHT-65) LIMIT 5;

 

 

*답안 > 십의 자리의 몸무게를 소수점으로 만든 후 완전 소수자리를 내려버리고, 다시 10을 곱하는 형식

 

SELECT name, weight, ABS(weight - 65) AS 차이 ,

              CONCAT(FLOOR(weight / 10) * 10) AS 몸무게구간

FROM students ORDER BY 차이 ASC LIMIT 5

 

 

 

 

 

헷갈리는 함수 : ROUND / CEIL / FLOOR

 

ROUND > 내가 쓴 숫자까지 보여줌 (즉 그 이전 자리에서 부터 계산을 진행)

CEIL > 소수점 버려버림, 이때 소수 첫째자리에서 올림 반영함 (숫자가 있기만 하면 그냥 올려 버림) EX) 12.25 > 13

FLOOR > 소수점과 관계 없이 다 버려버림