Lesson 07 — Intermediate

SQL FOR DATA
SCIENCE

Data scientists ko SQL aana zaroori hai — data extract karna, clean karna, analyze karna sab SQL se hota hai. Production mein SQL daily use hota hai. Jaise carpenter ke paas hammer hona zaroori hai, waise hi data scientist ke paas SQL hona zaroori hai. Bina SQL ke data tak pahunchna impossible hai.

? 22 min✓ Intermediate✓ Prerequisite: Dimensionality Reduction

WHY: SQL kyun seekhna chahiye?

Data scientist sirf Python nahi chalata — production databases SQL pe chalte hain. Data nikalna ho, clean karna ho, aggregate karna ho, ya analysis karna ho — sab SQL se hota hai. Interview mein SQL questions aate hain, daily kaam mein SQL lagta hai. SQL nahi aata toh data scientist ka kaam adhura hai.

EXTRACT

Data nikalo databases se — WHERE clause se filter karo, SELECT se columns chuno. Raw data ka first step yahi hai. Bina extract ke analysis ka koi matlab nahi.

AGGREGATE

Data ko summarize karo — COUNT, SUM, AVG, MIN, MAX. GROUP BY se group-wise analysis hota hai. HAVING se filtered aggregation hota hai.

JOIN

Do ya zyada tables ko combine karo — INNER, LEFT, RIGHT, FULL. Real world mein data alag alag tables mein hota hai. JOIN se sabko ek saath lao.

WINDOW

Advanced analysis — RANK, ROW_NUMBER, LAG, LEAD. Bina group kiye row-level analysis hota hai. Time series aur ranking mein bahut kaam aata hai.

WHY: Data Science mein SQL ka role

SQL sirf data extraction nahi hai — yeh data scientist ki daily bread hai. Production databases se data nikalte ho, clean karte ho, features banate ho, reports banaate ho. SQL nahi aata toh tum dependent ho doosron pe — aur dependent data scientist achha nahi hota.

concept
Data Science mein SQL ka use:

1. DATA EXTRACTION ✓ Raw data nikalo database se
2. DATA CLEANING ✓ Missing values handle, duplicates hatao
3. AGGREGATION ✓ Summary statistics nikalo (group by)
4. FEATURE ENGINEERING ✓ New columns banao (CASE, calculations)
5. A/B TESTING ✓ Groups compare karo SQL se
6. REPORTING ✓ Dashboards ke liye queries likho

Production mein 70% data scientist ka kaam SQL hai —
Python sirf 30%!
Mental model: SQL jaise supermarket hai — data hai shelves pe. SELECT se dekho kya chahiye, WHERE se filter karo, ORDER BY se sort karo, GROUP BY se sections mein jao. Simple hai lekin practice chahiye.

EXTRACT: Data nikalo

Sabse basic SQL — data nikalna. SELECT, WHERE, ORDER BY, LIMIT. Yeh 4 concepts daily use honge. Data scientist ko sirf raw data chahiye — WHERE se sahi data nikalo, ORDER BY se sajao, LIMIT se roko.

sql
-- Basic data extraction
SELECT name, course, marks
FROM students
WHERE marks > 70
ORDER BY marks DESC
LIMIT 10;

-- Multiple conditions
SELECT name, course, marks
FROM students
WHERE course = 'Python' AND marks >= 80
ORDER BY name;

-- LIKE pattern matching
SELECT name, email
FROM students
WHERE email LIKE '%@gmail.com';

-- IN operator
SELECT name, course
FROM students
WHERE course IN ('Python', 'SQL', 'ML');

AGGREGATE: Summarize karo

Aggregation se data ka summary milta hai — kitne students hain, average marks kya hai, max marks kaun le raha hai. GROUP BY se group-wise analysis hota hai — course wise, city wise, month wise. HAVING se filtered aggregation hota hai.

sql
-- Basic aggregation
SELECT 
 COUNT(*) as total_students,
 AVG(marks) as avg_marks,
 MAX(marks) as top_marks,
 MIN(marks) as lowest_marks
FROM students;

-- Group by single column
SELECT course, 
 COUNT(*) as students,
 AVG(marks) as avg_marks,
 MAX(marks) as top_marks
FROM students
GROUP BY course
ORDER BY avg_marks DESC;

-- Group by multiple columns
SELECT course, city,
 COUNT(*) as students,
 AVG(marks) as avg_marks
FROM students
GROUP BY course, city
ORDER BY course, avg_marks DESC;

-- HAVING — filtered aggregation
SELECT course, 
 COUNT(*) as students,
 AVG(marks) as avg_marks
FROM students
GROUP BY course
HAVING AVG(marks) > 80
ORDER BY avg_marks DESC;
WHERE vs HAVING: WHERE row-level filter hai — raw data pe lagta hai. HAVING group-level filter hai — GROUP BY ke baad lagta hai. WHERE marks > 80 matlab students jinke marks 80 se zyada hain. HAVING AVG(marks) > 80 matlab courses jinka average 80 se zyada hai.

JOIN: Tables combine karo

Real world mein data alag alag tables mein hota hai — students ek table mein, courses doosre mein, enrollments teesre mein. JOIN se sabko ek saath lao. INNER JOIN sirf matching rows deta hai, LEFT JOIN sab left ki rows deta hai.

sql
-- INNER JOIN — sirf matching rows
SELECT s.name, s.marks, c.course_name, c.duration
FROM students s
INNER JOIN courses c ON s.course_id = c.id;

-- LEFT JOIN — sab left ki rows
SELECT s.name, s.marks, c.course_name
FROM students s
LEFT JOIN courses c ON s.course_id = c.id;

-- RIGHT JOIN — sab right ki rows
SELECT s.name, s.marks, c.course_name
FROM students s
RIGHT JOIN courses c ON s.course_id = c.id;

-- Multiple JOINs
SELECT s.name, c.course_name, e.enroll_date, p.amount
FROM students s
INNER JOIN enrollments e ON s.id = e.student_id
INNER JOIN courses c ON e.course_id = c.id
INNER JOIN payments p ON e.id = p.enrollment_id
WHERE e.enroll_date >= '2024-01-01';

-- Self JOIN
SELECT a.name as student1, b.name as student2, a.course
FROM students a
INNER JOIN students b ON a.course = b.course AND a.id != b.id;

WINDOW: Advanced analysis

Window functions SQL ka superpower hai — bina GROUP BY kiye row-level analysis hota hai. RANK se ranking nikalo, LAG/LEAD se previous/next values dekho, running totals banao. Data scientists ke liye yeh bahut powerful tool hai.

sql
-- RANK — course wise ranking
SELECT name, course, marks,
 RANK() OVER (PARTITION BY course ORDER BY marks DESC) as rank,
 DENSE_RANK() OVER (PARTITION BY course ORDER BY marks DESC) as dense_rank,
 ROW_NUMBER() OVER (PARTITION BY course ORDER BY marks DESC) as row_num
FROM students;

-- Running totals aur moving averages
SELECT name, course, marks,
 SUM(marks) OVER (PARTITION BY course ORDER BY marks) as running_total,
 AVG(marks) OVER (PARTITION BY course ORDER BY marks 
 ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) as moving_avg_3
FROM students;

-- Course average ke saath comparison
SELECT name, course, marks,
 RANK() OVER (PARTITION BY course ORDER BY marks DESC) as rank,
 AVG(marks) OVER (PARTITION BY course) as course_avg,
 marks - AVG(marks) OVER (PARTITION BY course) as diff_from_avg
FROM students;

-- LAG — previous row ka value
SELECT name, course, marks,
 LAG(marks, 1) OVER (PARTITION BY course ORDER BY marks) as prev_marks,
 marks - LAG(marks, 1) OVER (PARTITION BY course ORDER BY marks) as diff
FROM students;

-- LEAD — next row ka value
SELECT name, course, marks,
 LEAD(marks, 1) OVER (PARTITION BY course ORDER BY marks) as next_marks
FROM students;
Window vs GROUP BY: GROUP BY rows collapse karta hai — har group ek row. Window function rows preserve karta hai — har row pe calculation hota hai. GROUP BY: 100 students ? 5 courses. Window: 100 students ? 100 rows with course-wise calculations.

DATE: Date analysis

Date functions data science mein bahut important hain — monthly trends, yearly comparisons, date filtering. DATE_FORMAT se dates format karo, DATE_DIFF se difference nikalo, DATE_TRUNC se month/year level pe group karo.

sql
-- Monthly revenue analysis
SELECT DATE_FORMAT(order_date, '%Y-%m') as month,
 COUNT(*) as orders,
 SUM(amount) as revenue,
 AVG(amount) as avg_order_value
FROM orders
GROUP BY month
ORDER BY month;

-- Year-over-year comparison
SELECT YEAR(order_date) as year,
 MONTH(order_date) as month,
 SUM(amount) as revenue,
 LAG(SUM(amount), 12) OVER (ORDER BY YEAR(order_date), MONTH(order_date)) as prev_year_revenue,
 ROUND(
 (SUM(amount) - LAG(SUM(amount), 12) OVER (ORDER BY YEAR(order_date), MONTH(order_date))) 
 / LAG(SUM(amount), 12) OVER (ORDER BY YEAR(order_date), MONTH(order_date)) * 100, 2
 ) as yoy_growth_pct
FROM orders
GROUP BY year, month
ORDER BY year, month;

-- Date range filtering
SELECT name, course, enroll_date
FROM students
WHERE enroll_date BETWEEN '2024-01-01' AND '2024-12-31';

-- Recent data
SELECT name, course, marks
FROM students
WHERE enroll_date >= DATE_SUB(CURRENT_DATE, INTERVAL 30 DAY);

SUBQUERY: Nested queries

Subqueries SQL ka advanced feature hai — ek query doosre query ke andar. EXISTS se check karo data hai ya nahi, IN se multiple values pe filter karo, correlated subquery se row-level comparison hota hai.

sql
-- Subquery in WHERE
SELECT name, course, marks
FROM students
WHERE marks > (SELECT AVG(marks) FROM students);

-- Subquery in FROM
SELECT course, avg_marks
FROM (
 SELECT course, AVG(marks) as avg_marks
 FROM students
 GROUP BY course
) as course_stats
WHERE avg_marks > 80;

-- EXISTS — check if data exists
SELECT s.name, s.course
FROM students s
WHERE EXISTS (
 SELECT 1 FROM enrollments e 
 WHERE e.student_id = s.id AND e.status = 'active'
);

-- Correlated subquery
SELECT name, course, marks,
 marks - (SELECT AVG(marks) FROM students s2 WHERE s2.course = s1.course) as diff_from_avg
FROM students s1;

Try it: SQL practice karo

Neeche ka editor SQL jaisa hai. Students data diya hai — SQL queries likho. "Run SQL" dabao aur output dekho. GROUP BY, HAVING, window functions try karo.

SQL playgroundSQL queries try karo
Code ko apni info se update karke run karein

Quick check

SQL query likho jo course-wise average marks nikale — GROUP BY use karo aur average marks har course ka dikhao.

Yaad karo — SELECT mein course aur AVG(marks) lo, FROM students, GROUP BY course lagao.

Common SQL mistakes

SQL clear?

Ab Feature Engineering par chalo — SQL aur Python se naye features banao. Feature engineering model ki performance ka sabse bada factor hai.