SQL/SQL 튜닝

4장 악성 SQL 튜닝으로 초보자 탈출하기 - (2)

domsam 2025. 3. 25. 18:09
반응형

아래 접은글로 되어있는 내용을 보기 전에 각 예제의 내용을 확인하고 본인이 생각하는 쿼리문을 먼저 작성해 보세요.

 

4.2.1 기본 키를 변형하는 BAD SQL

 

사원번호(emp_no)가 1,100 이상이면서 사원번호가 5자리인 사원(employees)의 모든 정보를 출력하는 쿼리를 만들어 주세요. (찾은 행: 10)

더보기

튜닝 전 SQL문 - 10 rows in set (0.23 sec) 

SELECT *
  FROM employees
 WHERE SUBSTRING(emp_no, 1, 4) = 1100
   AND LENGTH(emp_no) = 5;

 

-- 4.2.1 
-- 10개 레코드 
 



SELECT emp_no, SUBSTRING(emp_no, 1, 4)
     , LENGTH(emp_no), LENGTH(emp_no) = 5
FROM employees;


-- 4.2.2
EXPLAIN 
SELECT IFNULL(gender, 'NO DATA') AS group_gender
     , COUNT(1) AS cnt
FROM employees
GROUP BY group_gender;

EXPLAIN
SELECT gender
     , COUNT(1) AS cnt
FROM employees
GROUP BY gender;

-- 4.2.3
-- 묵시적 형변환, (문자열 - 숫자형)
EXPLAIN 
SELECT COUNT(1)
FROM salaries
WHERE yn_use = 1;

EXPLAIN 
SELECT COUNT(1)
FROM salaries
WHERE yn_use = '1';

EXPLAIN 
SELECT COUNT(1)
FROM salaries
WHERE CAST(yn_use AS SIGNED) = 1;

SELECT yn_use
     , CAST(yn_use AS SIGNED)
     , CONVERT(yn_use, SIGNED)
FROM salaries;


-- 4.2.4 
EXPLAIN 
SELECT *
FROM employees 
WHERE CONCAT(gender, ' ', last_name) = 'M radwan';

SELECT gender, last_name, CONCAT(gender, ' ', last_name)
FROM employees;

EXPLAIN 
SELECT *
FROM employees 
WHERE gender = 'M'
AND last_name = 'radwan';

-- 4.2.5 
SELECT e.emp_no, e.first_name, e.last_name, de.dept_no
FROM employees e
INNER JOIN dept_emp de
ON e.emp_no = de.emp_no;

-- dept_emp에서 부서가 2개 이상인 emp_no를 찾아주세요. (31,579)
SELECT emp_no, COUNT(emp_no)
FROM dept_emp
GROUP BY emp_no
HAVING COUNT(emp_no) > 1;