Home

Write a query that returns the first name, last name, and hire date of every female manager. For this problem, an employee is defined as a manager if the employee existing in the dept_manager table. Write this query using common table expressions (CTEs). (Hint: Use dept_manager and employees tables.)

WITH female_employees AS (
	SELECT 
		emp_no,
		first_name,
		last_name,
		hire_date
	FROM employees 
	WHERE gender = 'F'
)

, managers AS (
	SELECT emp_no
	FROM dept_manager 
)

SELECT female_employees.*
FROM female_employees
INNER JOIN managers 
	ON female_employees.emp_no = managers.emp_no 
;




Repeat the question above and get the same output, but write the query using no subqueries, just JOINs.

SELECT 
	employees.first_name,
	employees.last_name,
	employees.hire_date
FROM employees 
INNER JOIN dept_manager
	ON employees.emp_no = dept_manager.emp_no 
WHERE employees.gender = 'F'
;




Write a query that returns the first name, last name, and salary of every level of engineer (e.g. Engineer, Senior Engineer, etc) who was hired after 1970. If an employee has multiple salary records, return the highest salary. Write this query using common table expressions (CTEs). (Hint: Use titles, salaries, employees tables.)

WITH engineers AS (
	SELECT emp_no 
	FROM titles 
	WHERE UPPER(title) LIKE '%ENGINEER%'
	GROUP BY 1
)

, salaries AS (
	SELECT 
		emp_no,
		MAX(salary) AS salary 
	FROM salaries 
	GROUP BY 1
)

, hired_after_1970 AS (
	SELECT
		emp_no,
		first_name,
		last_name
	FROM employees 
	WHERE EXTRACT(year FROM hire_date) > 1970
	GROUP BY 1, 2, 3
)

SELECT 
	hired_after_1970.first_name,
	hired_after_1970.last_name,
	salaries.salary 
FROM hired_after_1970
INNER JOIN salaries
	ON hired_after_1970.emp_no = salaries.emp_no 
INNER JOIN engineers
	ON hired_after_1970.emp_no = engineers.emp_no 
;




Repeat the question above and get the same output, but write the query using no subqueries, just JOINs.

SELECT 
	employees.first_name,
	employees.last_name,
	MAX(salaries.salary) AS salary 
FROM employees 
INNER JOIN salaries 
	ON employees.emp_no = salaries.emp_no 
INNER JOIN titles 
	ON employees.emp_no = titles.emp_no 
WHERE EXTRACT(year FROM employees.hire_date) > 1970
  AND UPPER(titles.title) LIKE '%ENGINEER%'
GROUP BY 1, 2
;




Write a query that returns the first name, last name, and hire date of every employee who has worked in the Marketing department who makes more than $30k in salary. Write this query using common table expressions (CTEs). (Hint: Use dept_emp and salaries tables.)

WITH mktg AS (
	SELECT emp_no 
	FROM dept_emp 
	WHERE dept_no = 'd001'
)

, salaries_gt_30k AS (
	SELECT emp_no 
	FROM salaries 
	WHERE salary > 30000
	GROUP BY 1
)

SELECT 
	employees.first_name,
	employees.last_name,
	employees.hire_date
FROM employees 
INNER JOIN mktg 
	ON employees.emp_no = mktg.emp_no 
INNER JOIN salaries_gt_30k
	ON employees.emp_no = salaries_gt_30k.emp_no 
GROUP BY 1, 2, 3
;




Repeat the question above and get the same output, but write the query using no subqueries, just JOINs.

SELECT
	employees.first_name,
	employees.last_name,
	employees.hire_date
FROM employees 
INNER JOIN salaries 
	ON employees.emp_no = salaries.emp_no 
INNER JOIN dept_emp 
	ON employees.emp_no = dept_emp.emp_no 
WHERE salaries.salary > 30000
  AND dept_no = 'd001'
GROUP BY 1, 2, 3  
;