EMS 교육 SQL 기초 (조회 등)

함성민(Ham SeongMin)·2021년 6월 24일
0

개발일지

목록 보기
2/3

일단 급한대로 이틀동안 했던 생 것을 들고왔다. 추후 다시 수정예정..

SQL MariaDB

1일차

select 출력 타이틀
from DB.테이블
where 조건문
and, or 등등 필요에 따라

Join

같은 컬럼을 통해 두 테이블을 묶어줌. Key값을 통해 묶었었음

SELECT last_name,first_name,dept_name,title,COUNT(*)
FROM employees.employees e, employees.dept_emp de, employees.departments d, employees.titles ti

WHERE e.emp_no=de.emp_no
AND de.emp_no=ti.emp_no
AND de.dept_no=d.dept_no
AND de.dept_no='d001'
AND ti.title='Senior Staff'

date_format(컬럼,%Y%m%d)=’yyyymmdd’
date_format(컬럼,%y%m%d)=’yymmdd’
date_format(컬럼,%Y-%m-%d)=’yyyy-mm-dd’

SELECT b.salary,b.from_date,b.to_date
,DATE_FORMAT(to_date,'%Y%m%d')
,DATE_FORMAT(to_date,'%y%m%d')
,DATE_FORMAT(to_date,'%m%d')

FROM employees a, employees.salaries b
WHERE a.emp_no=b.emp_no
AND last_name='Peac' AND first_name='Sumant'
AND date_format(to_date,'%Y') BETWEEN '1997' AND '1999'

조건에 맞춘 상황별 결정. < <= = != > >=

SELECT first_name, last_name, title, date_format(ti.to_date,'%Y'),COUNT(*)
FROM employees.employees e, employees.titles ti
WHERE e.emp_no=ti.emp_no
AND ti.title='Engineer'
AND date_format(ti.to_date,'%Y')>='2000'
AND date_format(ti.to_date,'%Y')!='9999'

데이터값이 이상할 때
and last_name IS not null

정렬
order by 컬럼명

묶음
group by

Join
Left Join
Right Join
Inner Join
Fullouter Join

나이구하기
SELECT NOW(),birth_date,
ROUND((TO_DAYS(NOW()) - TO_DAYS(DATE_FORMAT(birth_date, '%Y-%m-%d'))) / 365) AS rage
FROM employees

최대,최소,평균,합계
Min, Max,avg, sum


2일차

Like – 특정 단어 검색

like “%be” - be가 뒤쪽일 때
like “be%” - be가 앞쪽일 때
like “%be%” - be 포함 모두 탐색

SELECT * FROM employees
WHERE first_name LIKE "%Be%“

IF – 조건에 따라 표기

SELECT last_name, if(first_name LIKE "%Be%", "o","x") AS NAME
FROM employees

CASE문

조건에 따라 값을 변경

SELECT case when emp_no='10001' then '사람1'
when emp_no='10002' then '사람2'
ELSE '사람3'
END

when then을 추가해 늘릴 수 있음

from employees
WHERE emp_no='10002'

concat

문자와 문자를 결합

SELECT CONCAT(last_name,'&',first_name),last_name+first_name AS 이름 FROM employees

SELECT CONCAT(last_name,' ',first_name) FROM employees

숫자의 경우 일반 덧셈으로 해결

SELECT salary+salary AS 합계 FROM salaries

substr

문자를 일정 규칙에 맞게 자르기

SELECT first_name,SUBSTR(first_name,3),SUBSTR(first_name,3,2) FROM employees

앞에서 세 번째 글자까지 자르고 출력
세 번째 구간에서 두 번째 글자까지만 출력

SELECT first_name,left(first_name,3),right(first_name,3) FROM employees

SELECT
SUBSTRING_INDEX('gocoder.tistory.com','.',1),
SUBSTRING_INDEX('gocoder.tistory.com','.',2),
SUBSTRING_INDEX('gocoder.tistory.com','.',3),
SUBSTRING_INDEX('gocoder.tistory.com','.',-1),
SUBSTRING_INDEX('gocoder.tistory.com','.',-2),
SUBSTRING_INDEX('gocoder.tistory.com','.',-3),
FROM dual

‘.’을 기준으로 앞에 문장을 출력
-1, -2, -3은 뒷문장을 출력

count

원하는 소숫점까지만 보여주기

SELECT dept_name AS '부서명',COUNT(dept_name) AS '부서별 인원수'
, round(avg(salary),2) AS '평균연봉'
FROM dept_emp de, departments d, salaries s

order by desc limit

올림차순 정렬/ 몇 개까지 표기

SELECT dept_name AS '부서명',COUNT(d.dept_no) AS '부서별 인원수'
, round(avg(salary),2) AS '평균연봉'
FROM dept_emp de, departments d, salaries s
WHERE de.dept_no=d.dept_no
AND de.emp_no=s.emp_no
GROUP BY d.dept_no
ORDER BY AVG(s.salary) DESC LIMIT 3

having

조건에서 정렬

SELECT dept_name AS '부서명',COUNT(d.dept_no) AS '부서별 인원수', round(avg(salary),2) AS '평균연봉'
FROM dept_emp de, departments d, salaries s
WHERE de.dept_no=d.dept_no
AND de.emp_no=s.emp_no
GROUP BY d.dept_no
HAVING AVG(s.salary)>70000;

Rank

순위를 매기는 함수

SELECT dept_name AS '부서명'
,COUNT(d.dept_no) AS '부서별 인원수'
,round(avg(salary),2) AS '평균연봉'
,RANK() over(ORDER BY AVG(s.salary)DESC)AS rank
FROM dept_emp de, departments d, salaries s
WHERE de.dept_no=d.dept_no
AND de.emp_no=s.emp_no
GROUP BY d.dept_no
ORDER BY RANK

rank() over 기준(order by 비교기준)

profile
From 코린이 to 코할배

0개의 댓글