-- 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~