Repository navigation
Expand file tree
/
Copy pathhaving_vs_where scripts.sql
More file actions
153 lines (114 loc) · 3.92 KB
/
Copy pathhaving_vs_where scripts.sql
File metadata and controls
153 lines (114 loc) · 3.92 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
-- =========================================================
-- FILE: having_vs_where.sql
-- PROJECT: TechSphere Solutions Database System
-- AUTHOR: Benard Onyango Omoga
-- DATABASE: MySQL
-- DESCRIPTION:
-- Demonstrates the difference between
-- WHERE and HAVING clauses in MySQL.
-- =========================================================
-- =========================================================
-- USE DATABASE
-- =========================================================
USE techsphere_solutions;
-- =========================================================
-- SECTION 1: INTRODUCTION
-- =========================================================
-- WHERE and HAVING are both used to filter data,
-- but they work differently.
-- WHERE:
-- Filters rows BEFORE grouping occurs.
-- HAVING:
-- Filters grouped or aggregated results AFTER
-- the GROUP BY operation.
-- =========================================================
-- SECTION 2: GROUP BY WITH AGGREGATE FUNCTION
-- =========================================================
-- Calculate average salary by job role
SELECT
role_title,
AVG(base_salary) AS average_salary
FROM job_roles
GROUP BY role_title;
-- =========================================================
-- SECTION 3: USING WHERE INCORRECTLY
-- =========================================================
-- The query below will produce an error because
-- aggregate functions cannot be used directly
-- inside the WHERE clause.
SELECT
role_title,
AVG(base_salary) AS average_salary
FROM job_roles
WHERE AVG(base_salary) > 100000
GROUP BY role_title;
-- WHY IT FAILS:
-- WHERE executes BEFORE GROUP BY.
-- At that stage, AVG(base_salary) does not yet exist.
-- =========================================================
-- SECTION 4: USING HAVING CORRECTLY
-- =========================================================
-- Filter grouped results using HAVING
SELECT
role_title,
AVG(base_salary) AS average_salary
FROM job_roles
GROUP BY role_title
HAVING AVG(base_salary) > 100000;
-- WHAT IT DOES:
-- 1. Groups records by role_title
-- 2. Calculates average salary
-- 3. Filters only groups with average salary > 100000
-- =========================================================
-- SECTION 5: USING COLUMN ALIAS IN HAVING
-- =========================================================
-- Using alias for readability
SELECT
role_title,
AVG(base_salary) AS avg_salary
FROM job_roles
GROUP BY role_title
HAVING avg_salary > 100000;
-- WHAT IT DOES:
-- Same result as above, but uses the alias
-- "avg_salary" for cleaner syntax.
-- =========================================================
-- SECTION 6: WHERE + HAVING TOGETHER
-- =========================================================
-- Example:
-- First filter salaries greater than 60000,
-- then group results and filter averages.
SELECT
role_title,
AVG(base_salary) AS avg_salary
FROM job_roles
WHERE base_salary > 60000
GROUP BY role_title
HAVING avg_salary > 100000;
-- WHAT HAPPENS:
-- WHERE filters individual rows first
-- GROUP BY creates grouped results
-- HAVING filters aggregated groups
-- =========================================================
-- SECTION 7: PRACTICAL BUSINESS ANALYTICS EXAMPLE
-- =========================================================
-- Count employees per department and
-- return only departments with more than 1 employee
SELECT
department_id,
COUNT(*) AS total_employees
FROM employees
GROUP BY department_id
HAVING total_employees > 1;
-- BUSINESS USE:
-- Helps identify departments with larger workforce sizes.
-- =========================================================
-- KEY DIFFERENCE SUMMARY
-- =========================================================
-- WHERE:
-- Filters raw rows before grouping
-- HAVING:
-- Filters grouped/aggregated data after grouping
-- =========================================================
-- END OF FILE
-- =========================================================