-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathSQL_joins.sql
More file actions
148 lines (131 loc) · 3.46 KB
/
SQL_joins.sql
File metadata and controls
148 lines (131 loc) · 3.46 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
-- Create sample tables
CREATE TABLE employees (
employee_id INT PRIMARY KEY,
name VARCHAR(100),
department_id INT,
salary DECIMAL(10, 2),
hire_date DATE
);
CREATE TABLE departments (
department_id INT PRIMARY KEY,
department_name VARCHAR(100),
location VARCHAR(100)
);
-- Insert sample data
INSERT INTO employees VALUES
(1, 'Alice', 1, 50000, '2020-01-15'),
(2, 'Bob', 2, 45000, '2019-03-20'),
(3, 'Charlie', 1, 60000, '2018-06-10'),
(4, 'David', 3, 48000, '2021-01-01'),
(5, 'Eve', NULL, 55000, '2019-11-15');
INSERT INTO departments VALUES
(1, 'Engineering', 'NYC'),
(2, 'Sales', 'LA'),
(3, 'HR', 'NYC'),
(4, 'Finance', 'Chicago');
-- 1. INNER JOIN - Returns only matching records from both tables
SELECT
e.name,
e.salary,
d.department_name,
d.location
FROM employees e
INNER JOIN departments d ON e.department_id = d.department_id;
/* Output:
Alice 50000 Engineering NYC
Bob 45000 Sales LA
Charlie 60000 Engineering NYC
David 48000 HR NYC
*/
-- 2. LEFT JOIN - Returns all records from left table, matching from right
SELECT
e.name,
e.salary,
d.department_name,
d.location
FROM employees e
LEFT JOIN departments d ON e.department_id = d.department_id;
/* Output:
Alice 50000 Engineering NYC
Bob 45000 Sales LA
Charlie 60000 Engineering NYC
David 48000 HR NYC
Eve 55000 NULL NULL
*/
-- 3. RIGHT JOIN - Returns all records from right table, matching from left
SELECT
e.name,
e.salary,
d.department_name,
d.location
FROM employees e
RIGHT JOIN departments d ON e.department_id = d.department_id;
/* Output:
Alice 50000 Engineering NYC
Bob 45000 Sales LA
Charlie 60000 Engineering NYC
David 48000 HR NYC
NULL NULL Finance Chicago
*/
-- 4. FULL OUTER JOIN - Returns all records from both tables
SELECT
e.name,
e.salary,
d.department_name,
d.location
FROM employees e
FULL OUTER JOIN departments d ON e.department_id = d.department_id;
/* Output:
Alice 50000 Engineering NYC
Bob 45000 Sales LA
Charlie 60000 Engineering NYC
David 48000 HR NYC
Eve 55000 NULL NULL
NULL NULL Finance Chicago
*/
-- 5. CROSS JOIN - Cartesian product (all combinations)
SELECT
e.name,
d.department_name
FROM employees e
CROSS JOIN departments d
LIMIT 10;
/* Output: Each employee paired with each department (5 × 4 = 20 rows)
Alice Engineering
Alice Sales
Alice HR
...
*/
-- 6. SELF JOIN - Join table with itself
CREATE TABLE employee_manager AS
SELECT
e1.name as employee_name,
e2.name as manager_name,
e1.salary as employee_salary,
e2.salary as manager_salary
FROM employees e1
LEFT JOIN employees e2 ON e1.employee_id = e2.employee_id + 1;
-- 7. Multiple JOINs
SELECT
e.name,
e.salary,
d.department_name,
d.location,
COUNT(*) as team_size
FROM employees e
INNER JOIN departments d ON e.department_id = d.department_id
GROUP BY e.employee_id, d.department_id;
-- 8. JOIN with WHERE clause (filter after join)
SELECT
e.name,
d.department_name,
e.salary
FROM employees e
INNER JOIN departments d ON e.department_id = d.department_id
WHERE e.salary > 50000
ORDER BY e.salary DESC;
/* Output:
Charlie Engineering 60000
Eve NULL 55000
Alice Engineering 50000
*/