본문 바로가기

MySQL

220921

-- database 전체 조회
show databases;

-- database 선택
use [database명];

-- table 전체 조회
show tables;


-- 실행순서: WHERE&JOIN > GROUP BY > DISTINCT > HAVING > ORDER BY > LIMIT
-- GROUP BY 절 부재일 경우 실행순서: WHERE > ORDER BY > JOIN > LIMIT
SELECT s.emp_no, COUNT(DISTINCT e.first_name) AS cnt
FROM salaries s
	INNER JOIN employees e ON e.emp_no = s.emp_no
WHERE s.emp_no IN (100001, 100002)
GROUP BY s.emp_no
HAVING AVG(s.salary) > 1000
ORDER BY AVG(s.salary)
LIMIT 10;

-- 위의 쿼리에서 LIMIT을 먼저 적용하고 ORDER BY를 실행할 경우 아래처럼 인라인 뷰 사용
SELECT emp_no, cnt
FROM (
	SELECT s.emp_no, COUNT(DISTINCT e.first_name) AS cnt, MAX(s.salary) AS max_salary
	FROM salaries s
		INNER JOIN employees e ON e.emp_no = s.emp_no
	WHERE s.emp_no IN (100001, 100002)
	GROUP BY s.emp_no
	HAVING MAX(s.salary) > 1000
	LIMIT 10
	) temp_view
ORDER BY max_salary;

 

날짜 비교 (DATE / DATETIME / TIMESTAMP)

-- 이상적
select count(*)
from employees
where hire_date>=str_to_date('1999-12-30', '%Y-%m-%d');

-- 결과 값은 위와 동일. index 사용 불가.
select count(*)
from employees
where date_format(hire_date, '%Y-%m-%d') > '1999-12-30';



-- DATE와 DATETIME 비교
-- DATETIME에서 시간 부분 제외하고 비교할 경우
select count(*)
from employees
where hire_date > DATE(NOW());

select 
str_to_date('2011-06-30', '%Y-%m-%d') < str_to_date('2011-06-30 00:00:01', '%Y-%m-%d %H:%i:%s');



-- DATETIME과 TIMESTAMP 비교
select count(*)
from employees
where hire_date > '1999-12-30 11:10:12';

-- 컬럼 타입이 DATETIME 일 경우, FROM_UNIXTIME() 함수를 이용 (TIMESTAMP > DATETIME)
-- 컬럼 타입이 TIMESTAMP 일 경우, UNIX_TIMESTAMP() 함수를 이용 (DATETIME > TIMESTAMP)
select count(*)
from employees
where hire_date > from_unixtime(unix_timestamp('1999-12-30 11:10:12'));

 

P.72~

'MySQL' 카테고리의 다른 글

update 전  (0) 2022.09.21
220817  (0) 2022.08.18