특정데이터를 검색 : 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)