Python and SQL for Manufacturing: Hands-On Training¶
SQL Practice Notebook: EMP & DEPT Queries¶
Author: Prakash Ukhalkar
Role: Assistant Professor (MCA) | Researcher in Data Science and Machine Learning
Notebook Scope: Practice SQL queries covering SELECT, WHERE, ORDER BY, operators, aggregate functions, GROUP BY, HAVING, JOINs, and subqueries using the classic EMP and DEPT tables.
Assumed Tables:
| Table | Columns |
|---|---|
| EMP | Empno, Ename, Job, Mgr, Hiredate, Sal, Comm, Deptno |
| DEPT | Deptno, Dname, Loc |
Prerequisite: Complete
day1_emp_dept.ipynbfirst socompany.dbexists.
Setup — Connect to the database¶
import sqlite3
conn = sqlite3.connect('company.db')
cursor = conn.cursor()
print('Connected to company.db')
Connected to company.db
1) Select Entire Table¶
Question: Display all employee records.
# SQL Query:
# ---------
# SELECT * FROM EMP;
# Q: Display all employee records.
query = '''
SELECT * FROM emp
'''
cursor.execute(query).fetchall()
[(7369, 'SMITH', 'CLERK', 7902, '1980-12-17', 900.0, None, 20), (7499, 'ALLEN', 'SALESMAN', 7698, '1981-02-20', 1600.0, 300.0, 30), (7521, 'WARD', 'SALESMAN', 7698, '1981-02-22', 1250.0, 500.0, 30), (7566, 'JONES', 'MANAGER', 7839, '1981-04-02', 2975.0, None, 20), (7654, 'MARTIN', 'SALESMAN', 7698, '1981-09-28', 1250.0, 1400.0, 30), (7698, 'BLAKE', 'MANAGER', 7839, '1981-05-01', 2850.0, None, 30), (7782, 'CLARK', 'MANAGER', 7839, '1981-06-09', 2450.0, None, 10), (7788, 'SCOTT', 'ANALYST', 7566, '1982-12-09', 3000.0, None, 20), (7839, 'KING', 'PRESIDENT', None, '1981-11-17', 5000.0, None, 10), (7844, 'TURNER', 'SALESMAN', 7698, '1981-09-08', 1500.0, 0.0, 30), (7876, 'ADAMS', 'CLERK', 7788, '1983-01-12', 1100.0, None, 20), (7900, 'JAMES', 'CLERK', 7698, '1981-12-03', 950.0, None, 30), (7902, 'FORD', 'ANALYST', 7566, '1981-12-03', 3000.0, None, 20), (7934, 'MILLER', 'CLERK', 7782, '1982-01-23', 1300.0, None, 10)]
Question: Display all department records.
# SQL Query:
# ---------
# SELECT * FROM DEPT;
# Q: Display all department records.
query = '''
SELECT * FROM dept
'''
cursor.execute(query).fetchall()
[(10, 'ACCOUNTING', 'NEW YORK'), (20, 'RESEARCH', 'DALLAS'), (30, 'SALES', 'CHICAGO'), (40, 'OPERATIONS', 'BOSTON')]
2) Select Specific Columns¶
Question: Display employee names and salaries.
# SQL Query:
# ---------
# SELECT Ename, Sal
# FROM EMP;
# Q: Display employee names and salaries.
query = '''
SELECT ename, sal, deptno
FROM emp
WHERE deptno in (10, 20)
'''
cursor.execute(query).fetchall()
[('SMITH', 900.0, 20),
('JONES', 2975.0, 20),
('CLARK', 2450.0, 10),
('SCOTT', 3000.0, 20),
('KING', 5000.0, 10),
('ADAMS', 1100.0, 20),
('FORD', 3000.0, 20),
('MILLER', 1300.0, 10)]
Question: Display department names and locations.
# SQL Query:
# ---------
# SELECT Dname, Loc
# FROM DEPT;
# Q: Display department names and locations.
query = '''
SELECT dname, loc
FROM dept
'''
cursor.execute(query).fetchall()
[('ACCOUNTING', 'NEW YORK'),
('RESEARCH', 'DALLAS'),
('SALES', 'CHICAGO'),
('OPERATIONS', 'BOSTON')]
3) Select Specific Rows (WHERE)¶
Question: Show employees working in department 10.
# SQL Query:
# ---------
# SELECT *
# FROM EMP
# WHERE Deptno = 10;
# Q: Show employees working in department 10.
query = '''
SELECT *
FROM emp
WHERE deptno = 10
'''
cursor.execute(query).fetchall()
[(7782, 'CLARK', 'MANAGER', 7839, '1981-06-09', 2450.0, None, 10), (7839, 'KING', 'PRESIDENT', None, '1981-11-17', 5000.0, None, 10), (7934, 'MILLER', 'CLERK', 7782, '1982-01-23', 1300.0, None, 10)]
Question: Show employees whose salary is greater than 3000.
# SQL Query:
# ---------
# SELECT *
# FROM EMP
# WHERE Sal > 3000;
# Q: Show employees whose salary is greater than 3000.
query = '''
SELECT *
FROM emp
WHERE sal > 3000
'''
cursor.execute(query).fetchall()
[(7839, 'KING', 'PRESIDENT', None, '1981-11-17', 5000.0, None, 10)]
4) ORDER BY¶
Question: Display employees sorted by salary (ascending).
# SQL Query:
# ---------
# SELECT Ename, Sal
# FROM EMP
# ORDER BY Sal ASC;
# Q: Display employees sorted by salary (ascending).
query = '''
SELECT ename, sal
FROM emp
ORDER BY sal DESC
'''
cursor.execute(query).fetchall()
[('KING', 5000.0),
('SCOTT', 3000.0),
('FORD', 3000.0),
('JONES', 2975.0),
('BLAKE', 2850.0),
('CLARK', 2450.0),
('ALLEN', 1600.0),
('TURNER', 1500.0),
('MILLER', 1300.0),
('WARD', 1250.0),
('MARTIN', 1250.0),
('ADAMS', 1100.0),
('JAMES', 950.0),
('SMITH', 900.0)]
Question: Display employees sorted by name (descending).
# SQL Query:
# ---------
# SELECT Ename
# FROM EMP
# ORDER BY Ename DESC;
# Q: Display employees sorted by name (descending).
query = '''
SELECT ename
FROM emp
ORDER BY ename DESC
'''
cursor.execute(query).fetchall()
Conditional Operators : >, >=, <, <=, == (=), != (<>)
Logical Operators: AND, OR, NOT
5) Using Operators¶
AND¶
Question: Employees in department 20 earning more than 2000.
# SQL Query:
# ---------
# SELECT *
# FROM EMP
# WHERE Deptno = 20 AND Sal > 2000;
AND Logical Operator¶
TRUE AND TRUE = TRUE TRUE AND FALSE = FALSE FALSE AND TRUE = FALSE FALSE AND FALSE = FALSE
OR Logical Operator¶
TRUE OR TRUE = TRUE TRUE OR FALSE = TRUE FALSE OR TRUE = TRUE FALSE OR FALSE = FALSE
# Q: Employees in department 20 earning more than 2000.
query = '''
SELECT *
FROM emp
WHERE deptno = 20 AND sal > 2000
'''
cursor.execute(query).fetchall()
[(7566, 'JONES', 'MANAGER', 7839, '1981-04-02', 2975.0, None, 20), (7788, 'SCOTT', 'ANALYST', 7566, '1982-12-09', 3000.0, None, 20), (7902, 'FORD', 'ANALYST', 7566, '1981-12-03', 3000.0, None, 20)]
OR¶
Question: Employees in department 10 or 30.
# SQL Query:
# ---------
# SELECT *
# FROM EMP
# WHERE Deptno = 10 OR Deptno = 30;
# Q: Employees in department 10 or 30.
query = '''
SELECT *
FROM emp
WHERE deptno = 10 OR deptno = 30
'''
cursor.execute(query).fetchall()
[(7499, 'ALLEN', 'SALESMAN', 7698, '1981-02-20', 1600.0, 300.0, 30), (7521, 'WARD', 'SALESMAN', 7698, '1981-02-22', 1250.0, 500.0, 30), (7654, 'MARTIN', 'SALESMAN', 7698, '1981-09-28', 1250.0, 1400.0, 30), (7698, 'BLAKE', 'MANAGER', 7839, '1981-05-01', 2850.0, None, 30), (7782, 'CLARK', 'MANAGER', 7839, '1981-06-09', 2450.0, None, 10), (7839, 'KING', 'PRESIDENT', None, '1981-11-17', 5000.0, None, 10), (7844, 'TURNER', 'SALESMAN', 7698, '1981-09-08', 1500.0, 0.0, 30), (7900, 'JAMES', 'CLERK', 7698, '1981-12-03', 950.0, None, 30), (7934, 'MILLER', 'CLERK', 7782, '1982-01-23', 1300.0, None, 10)]
, >=
BETWEEN¶
Question: Employees earning between 2000 and 4000.
# SQL Query:
# ---------
# SELECT *
# FROM EMP
# WHERE Sal BETWEEN 2000 AND 4000;
# Q: Employees earning between 2000 and 4000.
query = '''
SELECT *
FROM emp
WHERE sal BETWEEN 2000 AND 4000
'''
cursor.execute(query).fetchall()
NOT¶
Question: Employees not working in department 10.
# SQL Query:
# ---------
# SELECT *
# FROM EMP
# WHERE NOT Deptno = 10;
# Q: Employees not working in department 10.
query = '''
SELECT *
FROM emp
WHERE deptno = 10 OR deptno = 30
'''
cursor.execute(query).fetchall()
[(7499, 'ALLEN', 'SALESMAN', 7698, '1981-02-20', 1600.0, 300.0, 30), (7521, 'WARD', 'SALESMAN', 7698, '1981-02-22', 1250.0, 500.0, 30), (7654, 'MARTIN', 'SALESMAN', 7698, '1981-09-28', 1250.0, 1400.0, 30), (7698, 'BLAKE', 'MANAGER', 7839, '1981-05-01', 2850.0, None, 30), (7782, 'CLARK', 'MANAGER', 7839, '1981-06-09', 2450.0, None, 10), (7839, 'KING', 'PRESIDENT', None, '1981-11-17', 5000.0, None, 10), (7844, 'TURNER', 'SALESMAN', 7698, '1981-09-08', 1500.0, 0.0, 30), (7900, 'JAMES', 'CLERK', 7698, '1981-12-03', 950.0, None, 30), (7934, 'MILLER', 'CLERK', 7782, '1982-01-23', 1300.0, None, 10)]
6) IN Operator¶
Question: Employees working in departments 10, 20, or 30.
# SQL Query:
# ---------
# SELECT *
# FROM EMP
# WHERE Deptno IN (10,20,30);
# Q: Employees working in departments 10, 20, or 30.
query = '''
SELECT *
FROM emp
WHERE deptno IN (10,20)
'''
cursor.execute(query).fetchall()
[(7369, 'SMITH', 'CLERK', 7902, '1980-12-17', 900.0, None, 20), (7566, 'JONES', 'MANAGER', 7839, '1981-04-02', 2975.0, None, 20), (7782, 'CLARK', 'MANAGER', 7839, '1981-06-09', 2450.0, None, 10), (7788, 'SCOTT', 'ANALYST', 7566, '1982-12-09', 3000.0, None, 20), (7839, 'KING', 'PRESIDENT', None, '1981-11-17', 5000.0, None, 10), (7876, 'ADAMS', 'CLERK', 7788, '1983-01-12', 1100.0, None, 20), (7902, 'FORD', 'ANALYST', 7566, '1981-12-03', 3000.0, None, 20), (7934, 'MILLER', 'CLERK', 7782, '1982-01-23', 1300.0, None, 10)]
7) NULL Values¶
Question: Employees with no commission.
# SQL Query:
# ---------
# SELECT *
# FROM EMP
# WHERE Comm IS NULL;
# Q: Employees with no commission.
query = '''
SELECT *
FROM emp
WHERE comm IS NOT NULL
'''
cursor.execute(query).fetchall()
[(7499, 'ALLEN', 'SALESMAN', 7698, '1981-02-20', 1600.0, 300.0, 30), (7521, 'WARD', 'SALESMAN', 7698, '1981-02-22', 1250.0, 500.0, 30), (7654, 'MARTIN', 'SALESMAN', 7698, '1981-09-28', 1250.0, 1400.0, 30), (7844, 'TURNER', 'SALESMAN', 7698, '1981-09-08', 1500.0, 0.0, 30)]
Question: Employees having commission.
# SQL Query:
# ---------
# SELECT *
# FROM EMP
# WHERE Comm IS NOT NULL;
# Q: Employees having commission.
query = '''
SELECT *
FROM emp
WHERE comm IS NOT NULL
'''
cursor.execute(query).fetchall()
8) LIKE Operator¶
Question: Employees whose names start with 'S'.
% = for searching 0 or more characters, _ = for searching single character
# SQL Query:
# ---------
# SELECT *
# FROM EMP
# WHERE Ename LIKE 'S%';
# Q: Employees whose names start with 'S'.
query = '''
SELECT *
FROM emp
WHERE ename LIKE 'S%'
'''
cursor.execute(query).fetchall()
Question: Employees whose names end with 'N'.
# SQL Query:
# ---------
# SELECT *
# FROM EMP
# WHERE Ename LIKE '%N';
# Q: Employees whose names end with 'N'.
query = '''
SELECT *
FROM emp
WHERE ename LIKE '%N'
'''
cursor.execute(query).fetchall()
[(7499, 'ALLEN', 'SALESMAN', 7698, '1981-02-20', 1600.0, 300.0, 30), (7654, 'MARTIN', 'SALESMAN', 7698, '1981-09-28', 1250.0, 1400.0, 30)]
9) Aggregate Functions¶
Question: Find total salary of all employees.
# SQL Query:
# ---------
# SELECT SUM(Sal) AS Total_Salary
# FROM EMP;
# Q: Find total salary of all employees.
query = '''
SELECT SUM(sal) AS Total_salary
FROM emp
'''
cursor.execute(query).fetchall()
[(29125.0,)]
Question: Find average salary.
# SQL Query:
# ---------
# SELECT AVG(Sal) AS Avg_Salary
# FROM EMP;
# Q: Find average salary.
query = '''
SELECT AVG(sal) AS Avg_salary
FROM emp
'''
cursor.execute(query).fetchall()
[(2080.3571428571427,)]
Question: Find maximum salary.
# SQL Query:
# ---------
# SELECT MAX(Sal) AS Highest_Salary
# FROM EMP;
# Q: Find maximum salary.
query = '''
SELECT MAX(sal) AS Highest_salary
FROM emp
'''
cursor.execute(query).fetchall()
[(5000.0,)]
Question: Count total employees.
# SQL Query:
# ---------
# SELECT COUNT(*) AS Total_Employees
# FROM EMP;
# Q: Count total employees.
query = '''
SELECT COUNT(*) AS total_employees
FROM emp
'''
cursor.execute(query).fetchall()
[(14,)]
10) GROUP BY¶
Question: Find total salary department-wise.
# SQL Query:
# ---------
# SELECT Deptno, SUM(Sal)
# FROM EMP
# GROUP BY Deptno;
# Q: Find total salary department-wise.
query = '''
SELECT deptno, SUM(sal)
FROM emp
GROUP BY deptno
'''
cursor.execute(query).fetchall()
[(10, 8750.0), (20, 10975.0), (30, 9400.0)]
Question: Count employees in each job role.
# SQL Query:
# ---------
# SELECT Job, COUNT(*)
# FROM EMP
# GROUP BY Job;
# Q: Count employees in each job role.
query = '''
SELECT job, COUNT(*)
FROM emp
GROUP BY job
'''
cursor.execute(query).fetchall()
[('ANALYST', 2),
('CLERK', 4),
('MANAGER', 3),
('PRESIDENT', 1),
('SALESMAN', 4)]
11) HAVING Clause¶
Question: Departments having total salary greater than 5000.
# SQL Query:
# ---------
# SELECT Deptno, SUM(Sal)
# FROM EMP
# GROUP BY Deptno
# HAVING SUM(Sal) > 5000;
# Q: Departments having total salary greater than 5000.
query = '''
SELECT deptno, SUM(sal)
FROM emp
GROUP BY deptno
HAVING SUM(sal) > 5000
'''
cursor.execute(query).fetchall()
12) INNER JOIN¶
Question: Display employee names with department names.
# SQL Query:
# ---------
# SELECT E.Ename, D.Dname
# FROM EMP E
# INNER JOIN DEPT D
# ON E.Deptno = D.Deptno;
# Q: Display employee names with department names.
query = '''
SELECT E.ename, D.dname
FROM emp E
INNER JOIN dept D
ON E.deptno = D.deptno
'''
cursor.execute(query).fetchall()
13) LEFT JOIN¶
Question: Show all employees with department details.
# SQL Query:
# ---------
# SELECT E.Ename, D.Dname
# FROM EMP E
# LEFT JOIN DEPT D
# ON E.Deptno = D.Deptno;
# Q: Show all employees with department details.
query = '''
SELECT E.ename, D.dname
FROM emp E
LEFT JOIN dept D
ON E.deptno = D.deptno
'''
cursor.execute(query).fetchall()
14) RIGHT JOIN¶
Question: Show all departments with employee details.
Note: SQLite does not support RIGHT JOIN directly. We simulate it by swapping the table order in a LEFT JOIN.
# SQL Query:
# ---------
# SELECT E.Ename, D.Dname
# FROM EMP E
# RIGHT JOIN DEPT D
# ON E.Deptno = D.Deptno;
# Q: Show all departments with employee details.
# Note: SQLite does not support RIGHT JOIN directly. We simulate it by swapping the table order in a LEFT JOIN.
query = '''
SELECT E.ename, D.dname
FROM dept D
LEFT JOIN emp E
ON D.deptno = E.deptno
'''
cursor.execute(query).fetchall()
15) FULL OUTER JOIN¶
Question: Show all employees and all departments.
Note: SQLite does not support FULL OUTER JOIN directly. We simulate it using UNION of LEFT JOIN and a reversed LEFT JOIN.
# SQL Query:
# ---------
# SELECT E.Ename, D.Dname
# FROM EMP E
# FULL OUTER JOIN DEPT D
# ON E.Deptno = D.Deptno;
# Q: Show all employees and all departments.
# Note: SQLite does not support FULL OUTER JOIN directly. We simulate it using UNION of LEFT JOIN and a reversed LEFT JOIN.
query = '''
SELECT E.ename, D.dname
FROM emp E
LEFT JOIN dept D ON E.deptno = D.deptno
UNION
SELECT E.ename, D.dname
FROM dept D
LEFT JOIN emp E ON D.deptno = E.deptno
'''
cursor.execute(query).fetchall()
16) Subqueries¶
Question: Find employees earning more than average salary.
# SQL Query:
# ---------
# SELECT Ename, Sal
# FROM EMP
# WHERE Sal > (
# SELECT AVG(Sal)
# FROM EMP
# );
# Q: Find employees earning more than average salary.
query = '''
SELECT ename, sal
FROM emp
WHERE sal > (
SELECT AVG(sal)
FROM emp
)
'''
cursor.execute(query).fetchall()
[('JONES', 2975.0),
('BLAKE', 2850.0),
('CLARK', 2450.0),
('SCOTT', 3000.0),
('KING', 5000.0),
('FORD', 3000.0)]
Question: Find employees working in SALES department.
# SQL Query:
# ---------
# SELECT Ename
# FROM EMP
# WHERE Deptno = (
# SELECT Deptno
# FROM DEPT
# WHERE Dname = 'SALES'
# );
# Q: Find employees working in SALES department.
query = '''
SELECT ename
FROM emp
WHERE deptno = (
SELECT deptno
FROM dept
WHERE dname = 'SALES'
)
'''
cursor.execute(query).fetchall()
Close the connection¶
conn.close()
print('Done!')
Summary¶
| Topic | SQL Concept Used |
|---|---|
| Select entire table | SELECT * FROM table |
| Select specific columns | SELECT col1, col2 FROM table |
| Filter rows | WHERE condition |
| Sort results | ORDER BY col ASC / DESC |
| Operators | AND, OR, BETWEEN, NOT, IN |
| NULL checks | IS NULL, IS NOT NULL |
| Pattern matching | LIKE 'pattern' |
| Aggregates | SUM, AVG, MAX, COUNT |
| Group and filter | GROUP BY ... HAVING ... |
| Joins | INNER, LEFT, RIGHT, FULL OUTER JOIN |
| Subqueries | WHERE col > (SELECT ...) |
About This Material¶
| Author | Prakash Ukhalkar |
| Role | Assistant Professor (MCA) · Researcher in Data Science and Machine Learning |
| GitHub | @prakash-ukhalkar |
| Repository | mfg-python-sql-training |
| License | MIT |
Provided for educational use in manufacturing analytics training programmes.
For questions, corrections, or contributions, open an issue or pull request on GitHub.