दिन 32: SQLite के साथ SQL Basics
✅ आज आप सीखेंगे
- हर data job SQL क्यों माँगती है
- CSV files से database बनाना
- SELECT, aliases और calculated columns
- WHERE, IN, BETWEEN, LIKE, IS NULL से filter
- Sort, limit, DISTINCT और CASE WHEN
🏢 असली दुनिया में
असली company में data आपके laptop की CSV files में नहीं – करोड़ों rows वाले databases में होता है। pandas इस्तेमाल करने से पहले SQL से सही हिस्सा निकालना पड़ता है। India में data-analyst job descriptions की यह #1 skill है।
एक तस्वीर में SQL
हम SQLite लेंगे – एक file में पूरा SQL database जो Python के साथ आता है। यहाँ लिखा SQL MySQL और PostgreSQL में लगभग बिना बदलाव चलता है।
import sqlite3
import pandas as pd
con = sqlite3.connect("bazaar.db")
pd.read_csv("sales_data.csv").to_sql("sales", con, if_exists="replace", index=False)
pd.read_csv("employees.csv").to_sql("employees", con, if_exists="replace", index=False)
pd.read_csv("departments.csv").to_sql("departments", con, if_exists="replace", index=False)
def q(sql):
return pd.read_sql(sql, con)
print(q("SELECT name, type FROM sqlite_master WHERE type = 'table'"))SELECT
import sqlite3
import pandas as pd
con = sqlite3.connect("bazaar.db")
q = lambda sql: pd.read_sql(sql, con)
print(q("SELECT order_id, city, product, unit_price FROM sales LIMIT 5"))import sqlite3
import pandas as pd
con = sqlite3.connect("bazaar.db")
q = lambda sql: pd.read_sql(sql, con)
print(q("""
SELECT order_id,
product,
quantity * unit_price AS gross,
ROUND(quantity * unit_price * (1 - discount), 2) AS revenue
FROM sales
LIMIT 5
"""))Keywords CAPITALS में, हर clause नई line में, और calculated columns को AS से नाम दें। SQL case और line breaks नहीं देखता, पर आपके साथी शुक्रिया कहेंगे।
WHERE – rows filter करना
import sqlite3
import pandas as pd
con = sqlite3.connect("bazaar.db")
q = lambda sql: pd.read_sql(sql, con)
print(q("""
SELECT order_id, city, product, unit_price, payment_mode
FROM sales
WHERE city = 'Mumbai' AND unit_price > 20000
"""))| Operator | उदाहरण | pandas में |
|---|---|---|
| = , <>, <, >= | city = 'Delhi' | df.city == "Delhi" |
| AND / OR / NOT | a > 1 AND b = 'x' | (a > 1) & (b == "x") |
| IN | city IN ('Pune', 'Delhi') | df.city.isin([...]) |
| BETWEEN | customer_age BETWEEN 25 AND 35 | between(25, 35) |
| LIKE | product LIKE '%Phone%' | str.contains("Phone") |
| IS NULL | rating IS NULL | df.rating.isna() |
import sqlite3
import pandas as pd
con = sqlite3.connect("bazaar.db")
q = lambda sql: pd.read_sql(sql, con)
print(q("""
SELECT COUNT(*) AS orders
FROM sales
WHERE city IN ('Delhi', 'Mumbai', 'Bengaluru')
AND customer_age BETWEEN 25 AND 35
AND product LIKE '%Phone%'
"""))
print(q("SELECT COUNT(*) AS missing_ratings FROM sales WHERE rating IS NULL"))WHERE rating = NULL कुछ नहीं लौटाता, भले ratings missing हों। हमेशा IS NULL / IS NOT NULL लिखें।
ORDER BY, LIMIT, DISTINCT
import sqlite3
import pandas as pd
con = sqlite3.connect("bazaar.db")
q = lambda sql: pd.read_sql(sql, con)
print(q("""
SELECT order_id, city, product,
ROUND(quantity * unit_price * (1 - discount)) AS revenue
FROM sales
ORDER BY revenue DESC
LIMIT 5
"""))
print(q("SELECT DISTINCT region, city FROM sales ORDER BY region, city"))CASE WHEN – SQL के अंदर if/else
import sqlite3
import pandas as pd
con = sqlite3.connect("bazaar.db")
q = lambda sql: pd.read_sql(sql, con)
print(q("""
SELECT order_id, unit_price,
CASE WHEN unit_price >= 20000 THEN 'Premium'
WHEN unit_price >= 2000 THEN 'Mid'
ELSE 'Budget' END AS price_band,
CASE WHEN payment_mode = 'Cash on Delivery' THEN 0 ELSE 1 END AS prepaid
FROM sales
ORDER BY unit_price DESC
LIMIT 6
"""))Dates के साथ काम
import sqlite3
import pandas as pd
con = sqlite3.connect("bazaar.db")
q = lambda sql: pd.read_sql(sql, con)
print(q("""
SELECT DISTINCT order_date,
strftime('%m', order_date) AS month,
CASE strftime('%w', order_date) WHEN '0' THEN 'Weekend' WHEN '6' THEN 'Weekend' ELSE 'Weekday' END AS day_type
FROM sales
WHERE order_date BETWEEN '2024-10-01' AND '2024-10-31'
ORDER BY order_date
LIMIT 7
"""))SQL query कैसे चलती है
- 1FROM (कौन सी table)
- 2WHERE (rows filter)
- 3GROUP BY (Day 33)
- 4HAVING (Day 33)
- 5SELECT (columns)
- 6ORDER BY
- 7LIMIT
क्योंकि WHERE, SELECT से पहले चलता है, ज़्यादातर databases में WHERE में SELECT alias नहीं लिख सकते (WHERE revenue > 5000 fail)। Expression दोहराएँ या sub-query/CTE (Day 34) लें। ORDER BY, SELECT के बाद चलता है, इसलिए वहाँ aliases चलते हैं।
🏅 आज के Job Skills
Practice tasks
🏋️ Practice – ख़ुद करें
Solution देखें
import sqlite3
import pandas as pd
con = sqlite3.connect("bazaar.db")
q = lambda sql: pd.read_sql(sql, con)
print(q("""SELECT order_id, city, product, unit_price FROM sales
WHERE category = 'Electronics' AND region = 'South' ORDER BY unit_price LIMIT 5"""))Solution देखें
import sqlite3
import pandas as pd
con = sqlite3.connect("bazaar.db")
q = lambda sql: pd.read_sql(sql, con)
print(q("SELECT COUNT(*) AS n FROM employees WHERE salary BETWEEN 60000 AND 100000"))Solution देखें
import sqlite3
import pandas as pd
con = sqlite3.connect("bazaar.db")
q = lambda sql: pd.read_sql(sql, con)
print(q("""SELECT name, salary, CASE WHEN salary >= 100000 THEN 'Senior' WHEN salary >= 60000 THEN 'Mid' ELSE 'Junior' END AS band
FROM employees ORDER BY salary DESC LIMIT 8"""))Quick quiz
🧠 Quick Quiz – ख़ुद को जाँचें
Interview corner
💼 Interview Corner
WHERE और HAVING में क्या फ़र्क है?
WHERE grouping से पहले अलग-अलग rows filter करता है; HAVING, GROUP BY के बाद aggregates से groups filter करता है (जैसे HAVING SUM(revenue) > 100000)। Day 33 में।
WHERE में column alias क्यों नहीं लिख सकते?
Logical execution order के कारण – SELECT के alias बनाने से पहले WHERE चलता है। Expression दोहराएँ या query को sub-query/CTE में लपेटें।
सारांश
- SELECT columns FROM table WHERE condition ORDER BY col LIMIT n।
- IN, BETWEEN, LIKE, IS NULL ज़्यादातर filters cover करते हैं।
- CASE WHEN categories बनाता है; AS columns को नाम देता है।
- pd.read_sql results को pandas में लाता है।
Day 33: GROUP BY, HAVING और JOINs – tables को pro की तरह जोड़ें और summarise करें।
