프로그래밍/Weekly I Learned

2023.10.12+ mysql select part.2 응용 및 연습

타코코딩 2023. 10. 12. 16:55
특정데이터를 검색 : where 조건절 + 비교연산자
-- 형식 : select 컬럼명 from 테이블명 where [조건절+비교연산자]

--  연봉이 5000 이상인 사원들만 조회
SELECT * FROM employee WHERE salary >= 5000 ORDER BY salary DESC 

-- 2015년 1월 1일 이후 입사자들을 입사일이 빠른 순서로 조회
-- 조회기준 연봉이 null인 직원의 값은 0으로 정의

SELECT emp_id ,emp_name ,ifnull(salary,0) AS salary  FROM employee WHERE hire_date >= '2015-01-01' ORDER BY salary

-- 입사일이 2016년 1월 1일 이후 이거나 연봉이 6000 이상인 사원들을 조회
-- 최근입사일 기준으로 정렬

SELECT * FROM employee WHERE salary >= 6000 OR  hire_date >= '2016-01-01' ORDER BY hire_date DESC 

-- 정보시스템 부서 중 급여가 7000 이상인 사원들만 조회

SELECT * FROM employee WHERE dept_id ='SYS' AND salary >= 7000

-- 영업부 직원들 중 2016-01-01 입사자들의 사원아이디, 사원명, 성별, 입사일, 이메일, 연봉, 보너스(연봉20프로) 조회
-- 연봉이 null인 사원은 기본값을 50 으로 정의
-- 보너스가 1000 이상인 직원만 조회
SELECT emp_id ,emp_name ,gender ,hire_date ,email ,ifnull(salary,50) AS salary  ,salary*0.2 AS bonus  
FROM employee WHERE employee.dept_id ='MKT' AND salary*0.2 >= 1000


-- 범위 조회 between ~ and
-- 형식 where 컬럼명 between 범위시작 and 범위종료
-- 연봉이 6000이상 7000미만인 사원들만 조회
SELECT *  FROM employee WHERE salary >= 6000 AND salary < 7000

SELECT *  FROM employee WHERE salary  BETWEEN 6000 AND 6999

-- 입사년도가 2015(2015-01-01~2015-12-31)년 사원들만 조회
DESC employee;

SELECT * FROM employee WHERE hire_date > '2015-01-01' AND hire_date < '2015-12-31'

SELECT * FROM  employee WHERE hire_date BETWEEN '2015-01-01' AND '2015-12-31'
 
-- 정보시스템 부서와 영업부서의 사원들만 조회
-- or 논리 연산자 : in(값1,값2)
-- where 컬럼명 in (값1,값2)
SELECT * FROM employee  WHERE dept_id ='SYS' OR dept_id ='MKT'

SELECT * FROM employee WHERE dept_id IN ('SYS','MKT') ORDER BY dept_id 

/*
 * 문자열 검색 : 와일드 문자 ( %, _ ) - Like 연산자와 함께 사용
 * 형식 : where 컬럼명 like '검색문자+와일드문자'
 * */

-- 사원들 중 김씨성을 가진 모든 사원 조회
SELECT * FROM employee WHERE employee.emp_name LIKE '김%'  
-- 폰번호가 010으로 시작하는 영업부의 모든 사원 조회

SELECT * FROM employee WHERE employee.phone LIKE '010%'

-- 이메일 주소 두번째자리 'a' 가 들어가는 사원 조회

SELECT * FROM employee  WHERE email LIKE '_a%'

-- 이메일 아이디가 4자리인 사원 조회

SELECT * FROM employee WHERE email LIKE '____@%'

-- 사원명에 삼이 들어가는 사원
SELECT * FROM employee WHERE emp_name  LIKE '%삼%'

/* 
 * 내장 함수 사용 : 숫자함수, 문자함수, 집계함수, 날짜함수 ...
 * 형식 : 컬럼리스트, 조건절
 * */
-- 함수 테스트 테이블 : dual
-- 123, -123 절대값 출력 : abs()
SELECT abs(123), abs(-123) FROM DUAL

-- 소수점 버리기 : floor(), truncate
SELECT  floor(123.456), floor(3843.384349534)

SELECT truncate(498.49849,1), truncate(3843.38434846456146548,0) 

SELECT floor(rand()*10)+1 AS num1 , truncate(rand(),2) AS num2  

-- 나머지연산 : mod()

SELECT mod(20,3), mod(20,2)

SELECT MOD(floor(rand()*1000),2) AS num1


/*
 * 문자함수
 * 문자열 결합 : concat()
 * */
SELECT concat('my','zzz','sql')

-- 홍길동(S00001) <<- 이런 형식으로 사원명 출력

SELECT concat(emp_name,'(',emp_id,')') AS emp_name FROM employee WHERE emp_name = '홍길동'


-- 문자열 추출 : substring(문자열,위치,문자열길이)
select substring('대한민국',1,2)

select substring('대한민국 홍길동',6,3)


-- 사원아이디, 사원명, 입사년,월,일, 폰번호, 이메일 조회
SELECT * FROM employee 

SELECT emp_id ,emp_name ,
substring(hire_date,1,4) AS year ,
substring(hire_date,6,2) AS mm ,
substring(hire_date,9,2) AS dd 
,phone ,email  FROM employee 

-- 2015년도 입사자들 모두 조회

SELECT * FROM employee WHERE substring(hire_date,1,4)  = '2015'

-- 1월에 입사한 사원들 조회

SELECT * FROM employee  WHERE substring(hire_date,6,2) = '01'  

-- 2018년도에 입사한 정보시스템 부서 사원 조회
SELECT  * FROM  employee WHERE substring(hire_date,1,4) = '2018' AND dept_id ='SYS'  

-- 오른쪽, 왼쪽 기준 문자열 추출 : left(문자열,숫자) right(문자열,숫자)
SELECT LEFT('대한민국 홍길동',4) , RIGHT('대한민국 홍길동 만세',2);
SELECT * FROM employee WHERE left(hire_date,4)  = '2015';

-- 대,소문자 변경 : upper('문자열'), lower('문자열')
-- 사용케이스 : 검색 기능 구현할때 test,TEST ,tEST 등 유저는 마음대로 영문 대소문자를 입력하여 검색 할 수 있는데
-- DB에 있는 데이터 타입에 변경하여 맞춰 줄 수 있음
SELECT upper('abc'), lower('ABC');  

-- 검색하는 데이터가 소문자로 전달된경우 sys (my sql 에서는 자동으로 대소문자 맞춰줌, 오라클이나 다른 툴 사용할때 사용해보면 좋을 것 같다)
SELECT  * FROM  employee e WHERE dept_id  = upper('sys')


-- 공백 삭제 : trim('공백포함 문자열')

SELECT trim('            대한민국       ');
SELECT trim( LEADING '!' from   '!!!!!대한민국       '); 
SELECT trim( TRAILING  '!' from   '대한민국!!!!') 


-- 문자열 포맷

SELECT format(12345678,0) 


-- 사원아이디, 사원명 , 입상년도, 연봉을 3자리로 구분하여 출력
SELECT concat(format(salary,0),'만원') ,emp_id ,emp_name,concat( LEFT(hire_date,4),'년도') AS 입사년도  FROM employee 

-- 날짜 함수 : curdate(), sysdate(), now()
SELECT curdate() -- 년 월 일 

SELECT sysdate() -- 2023-10-12 15:05:20

SELECT now()  -- 2023-10-12 15:05:20
  
SELECT  sysdate(),sleep(2),sysdate() -- 2초 차이나는 결과 출력/ 실행되는 기준이 함수기준임.

SELECT now() , sleep(2) , now()  -- 같은 결과 출력 / 실행되는 기준이 쿼리기준임, 쿼리에 now  갯수와 상관없이 같은 시간이 출력

-- 형변환 함수 : cast(변환하고자하는데이터 as 변환데이터 타입), convert(변환하고자하는데이터 as 변환데이터 타입)
SELECT cast(20231012 AS char) -- 숫자 --> 문자

SELECT cast(20231012 AS date) -- 숫자 --> 날짜

SELECT CAST('20231010' AS date) -- 문자 > 날짜

-- 123456789 숫자를 문자로 변환 후 3자리 숫자로 구분

SELECT format(cast(123456789 AS char),0) 

SELECT format(123456789,0) 

-- 현재 날짜를 가져와서 (년,월,일) 문자로 변경, 다시 날짜타입(datetime)

SELECT cast(cast(curdate() AS char) AS datetime); 

-- employee 테이블의 입사일ㅇ이 저장도리때 무슨 함수를 사용했을까요 ?

DESC employee 

SELECT emp_name,hire_date ,cast(hire_date AS datetime) FROM employee;

-- 입력폼에서 '20150101' 문자열 타입으로 전송되어진 경우, 해당일의 입사자를 모두 조회
SELECT  * FROM employee WHERE hire_date = cast('20150101' AS date)