본문 바로가기

KOSA FullStack 교육/DB

KOSA fullstack 교육 (IN, LIKE 연산자, 단일 행 함수, 숫자함수, 날짜함수)

DB 배우는 순서

  • JDBC: Java와 DB를 연결하는 가장 기초적인 방법. SQL을 직접 작성
  • MyBatis: SQL은 내가 직접 짜되, 자동 매핑과 반복 코드 제거
  • JPA: SQL을 거의 작성하지 않고도 DB와 객체를 매핑 (ORM)

DBMS 장점

DBMS→ 중복 가능성이 낮을 뿐, 중복이 있을 수 있다.

SQL 종류

 

에러의 종류

  • Syntax error: 문법이 잘못되었을 때. 컴파일 시 발생→ 실행 불가
  • Semantic error: 문법적으로는 맞지만, 의도한 의미와 다르게 동작하는 코드
  • Logical error: 알고리즘이나 로직이 잘못됨 → 의도한 동작을 안 함

IN & LIKE 연산자

 

IN 연산자 예제

-- 사원번호가 7369 이거나 7521 이거나 7782번인 사원을 검색 
-- STEP 1
SELECT * FROM emp WHERE empno = 7369;
SELECT * FROM emp WHERE empno = 7521;
SELECT * FROM emp WHERE empno = 7782;

-- STEP 2
SELECT * FROM emp
WHERE empno=7369 OR empno=7521 OR empno=7782;

-- STEP 3
SELECT * FROM emp
WHERE empno IN(7369,7521,7782);

-- 사원번호가 7369번도, 7521번도, 7782번도 아닌 사원을 검색 
-- STEP 1
SELECT * FROM emp
WHERE empno!=7369 AND empno!=7521 AND empno!=7782;

-- STEP 2
SELECT * FROM emp
WHERE empno NOT IN(7369,7521,7782);

-- 업무, 급여순으로 정렬, 내림차순 정렬
SELECT empno, ename, job, sal
FROM emp 
WHERE sal > 2000 AND job NOT IN('SALSEMAN','PRESIDENT')
ORDER BY 3,4 DESC;

/*
IN: 여러개 중에서 어느 하나와 일치하는 지의 여부
A OR B OR C

NOT IN
!A AND !B AND !C
*/

-- emp 테이블에서 부하직원을 두고 있는 사원을 검색
SELECT empno, ename, job
FROM emp
WHERE empno IN (SELECT mgr FROM emp);

-- emp 테이블에서 부하직원을 가지지 않는 사원을 검색 
-- 다음은 emp테이블에서 mgr이 SELECT 되지 않은 애들 중 empno를 뽑는 것이라서 아무것도 뜨지 않는다. 
SELECT empno, ename, job
FROM emp
WHERE empno NOT IN (SELECT mgr FROM emp WHERE mgr IS NOT NULL);

-- STEP 2
SELECT empno, ename, job
FROM emp
WHERE empno NOT IN (SELECT ifnull(mgr,0) FROM emp);

단일 행 함수

문자 함수1

이 중에서 다음 세 가지는 반드시 외우기

  • CONCAT(s1, s2)
  • SUBSTR(s,m,n)
  • LENGTH(s)
SELECT empno, ename, job, CONCAT(empno, ename)ename, CONCAT(ename,empno) e_empno, CONCAT(ename, job) e_job
FROM emp
WHERE deptno = 10;

SELECT concat('Good', 'Morning') FROM dual; -- Oracle
SELECT concat('Good', 'Morning'); -- MySQL dual 필요없다 

-- upgrade: 공백 넣고, 알리아스 넣기
SELECT concat('Good', ' ', 'Morning') GoodMorning;

-- concat()을 사용해서 Smith is a CLERK 
SELECT ename, job, concat(ename, ' is a ', job)
FROM emp
WHERE ename = 'smith';

/*
substr: 문자열을 추출하는 기능 
*/
SELECT ename, substr(ename, 1,2)
FROM emp
WHERE job = 'PRESIDENT';

SELECT substr('HELLOWORLD', 6, 3);
SELECT substr('HELLOWORLD', -4, 3);

-- emp 테이블에서 사원들의 업무중에서 SALESMAN인 업무를 하는 사원중에서, 
-- 사원 이름이 R로 끝나는 사원의 정보를 출력 (2가지 방법)
SELECT ename, job
FROM emp
WHERE job = 'SALESMAN' AND
substr(ename, -1, 1) = 'R';

SElECT ename, job
FROM emp
WHERE job = 'SALESMAN' AND
ename LIKE '%R';

-- emp 테이블에서 SALESMAN 업무가 SALES로만 출력되도록
SELECT substr(job, 1, 5) s_job, ename
FROM emp
WHERE job = 'SALESMAN';

-- emp 테이블에서 ename이 'ALLEN'인 사람의 입사 년도, 월, 날짜를 추출하는 쿼리문 작성
SELECT hiredate, substr(hiredate, 1, 4) year, substr(hiredate, 6, 2) month, substr(hiredate, -2, 2) day
FROM emp 
WHERE ename = 'ALLEN';

 

문자 함수2

 

-- PAD
SELECT lpad('abc', 6, '*'); -- 왼쪽에서부터 6번째까지 * 채우기 -> ***abc 나옴
SELECT rpad('abc', 6, '*'); 
SELECT rpad('abc', 6); -- mysql에서는 지원 안됨
SELECT empno, deptno, LPAD(deptno, 6, ' ') 부서번호 from emp; -- 공백으로 채울 땐 이렇게

-- TRIM 
SELECT trim('    James Gosling is Good    ')
message;

-- 가운데 공백을 포함해서 모든 공백이 사라진다
SELECT trim(replace('    James Gos    ling is Good', ' ', '')) message; 

  • workshop2 문제&답
-- ###############  지난 시간 리뷰 실습    ###############
use kosa;
-- 1) 급여가 $1500 ~ $2000 이 아닌 사원의 ename 과 SAL를 검색
--  각각 별칭을 NAME, SALARY로 합니다.
SELECT ename NAME, sal SALARY
FROM emp
WHERE sal NOT BETWEEN 1500 AND 2000;

-- 2)  30번 부서의 연봉을 계산하여 이름, 부서번호, 급여, 연봉을 출력하라. 단, 연말에 급여의 150%를 보너스로 지급한다.
SELECT ename, deptno, sal, sal*12+ifnull(comm,0)+sal*1.5 연봉
FROM emp
WHERE deptno = 30;


-- 3) 직원들의 입사일을 기준으로 81년도에 입사한 사원중에서 가장 최근에 입사한 사원 2명을 추리고 해당 사원의 정보를 출력한다. 이때 정보출력은 3가지로 하고 각각 컬럼에 대한 별칭을 부여한다.
SELECT ename 이름, sal 급여, hiredate 입사일
FROM emp
WHERE hiredate LIKE '1981%'
ORDER BY hiredate DESC
limit 2;

-- ##############  문자열 함수 실습   #################
-- 1) 직원의 이름에 대소문자 상관없이 s가 들어간 직원의 모든 정보를 출력하라.
SELECT * 
FROM emp
WHERE ename LIKE '%s';

-- 2) 직원 정보 중 사원번호, 이름, 급여를 출력한다.  단, 이름은 앞에서 3글자씩만 출력하라.
SELECT empno 사원번호, substr(ename, 1, 3) 이름, sal 급여
FROM emp;


-- 3) 이름의 글자수가 6자 이상인 사람의 이름을 앞에서 3자만 구하여 소문자로 이름만을 출력하라.
SELECT lower(substr(ename, 1, 3))
FROM emp
WHERE length(ename) >= 6;

-- 4) 직원의 이름과 급여를 출력하라, 단, 금액의 정확도를 위해 급여를 6자리로 출력하고, 앞 여백을 모두 * 로 채워 출력하라.
SELECT ename 이름, lpad(sal, 6,'*') 급여
FROM emp;

-- 5) 직원정보를 입력하던중 아래와 같이 입력 되었다.
insert into emp values(8001,'   PARK   ', 'IT' ,  7900 , '21/11/10', 20000,1000,10);
select * from emp;

-- 이름이 'PARK'인 직원의 정보를 출력하여 보자.
 SELECT *
 FROM emp
 WHERE ename = 'PARK';

-- 이름 좌우에 공백이 있더라도 공백을 제거하고 이름이 'PARK'인 직원의 정보를 출력하여 보자.
 SELECT *
 FROM emp
 WHERE trim(ename) = 'PARK';

 

숫자함수

ROUND : 반올림(자릿수 지정)

TRUNCate : 버림(자릿수 지정)

CEILing : 올림(자릿수 지정X)

FLOOR : 버림(자릿수 지정X)

SIGN : 양수면 1, 음수면 -1, 0이면 0 반환


MySQL에서만 제공됨

greatest(숫자1,숫자2,숫자3....) 주어진 숫자중에서 가장 큰 수를 반환,,,

least(숫자1,숫자2,숫자3....) 주어진 숫자중에서 가장 작은 수 반환...

날짜함수

 

-- 연-월-일(오늘날짜)
SELECT curdate();
SELECT current_date();
SELECT date("2025-05-19"); 

-- 연-월-일:시분초
SELECT sysdate();
SELECT now();

select substr(curdate(),1,4) YEAR;
select year(curdate()) 연도,month(curdate()) 월,day(curdate()) 일;
select month(curdate()) 월;
select day(curdate()) 일;
-- 오늘 요일 출력
select dayname(curdate()) 요일;
/*
월요일(0),화요일(1),....일요일(6)
*/
select weekday(curdate()) 요일;

select hour(sysdate()) 시;
select minute(sysdate()) 분;
select second(sysdate()) 초;

-- 내일 (curdate()+1)
select curdate()+1 내일; -- 날짜 +숫자 = 날짜
select curdate()-1 어제; -- 날짜 - 숫자 = 날짜

-- 소유나님이 지금까지 살아온 생애 (2002-09-14)
select curdate()-date('2002-09-14'); -- 날짜 - 날짜 = 숫자 
select datediff(curdate(),date('2002-09-14')) 유나의일생;
select datediff(curdate(),date('2001-05-05')) 태란이일생;

-- step 1.
select curdate()-'2002-09-14' 일생; -- 1 이 방법은 틀렷어!!!!

-- step 2.
select curdate()-str_to_date('2025-05-18','%Y-%m-%d');

-- step 3.
select datediff(curdate(),'2025-05-18');

-- emp table에서 MANAGER업무에 관해서 입사일로부터 오늘 현재까지 근무한 일 수를 출력
-- 알리야스는 근무일수로 
select ename, hiredate, datediff(curdate(),hiredate) 근무일수
from emp
where job = 'MANAGER';

-- emp table에서 MANAGER업무에 관해서 입사일로부터 오늘 현재까지 근무한 주 수를 출력
-- 알리야스는 근무일수로 
select ename,hiredate,ceiling(datediff(curdate(),hiredate)/7) weekends
from emp
where job = 'MANAGER';

select date_add(curdate(),INTERVAL 300 DAY) 100일후;
select date_sub(curdate(),INTERVAL 300 DAY) 100일전;

select date_add(now(),INTERVAL 10 HOUR) 10시간후;
select date_add(now(),INTERVAL 10 MINUTE) 10분후;