-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathSQLsummary.sql
More file actions
909 lines (645 loc) · 16.7 KB
/
SQLsummary.sql
File metadata and controls
909 lines (645 loc) · 16.7 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
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
---Table: Employee_Anjali
---Table Structure
CREATE TABLE Employee_Anjali
(
EmpID INT PRIMARY KEY,
EmpName VARCHAR(30),
Department VARCHAR(20),
Salary INT,
Age INT,
City VARCHAR(20)
);
INSERT INTO Employee_Anjali VALUES
(1, 'Anjali', 'IT', 30000, 22, 'Vadodara'),
(2, 'Rohan', 'HR', 18000, 24, 'Ahmedabad'),
(3, 'Aman', 'IT', 25000, 26, 'Surat'),
(4, 'Neha', 'Finance', 40000, 30, 'Vadodara'),
(5, 'Kiran', 'HR', 22000, 23, 'Surat'),
(6, 'Arjun', 'IT', 35000, 28, 'Ahmedabad');
---1.Name starts with a letter --->Employee_Anjali(EmpID, EmpName, Department, Salary, Age, City)
---Keyword in question: starts with / begins with
SELECT *
FROM Employee_Anjali
WHERE EmpName LIKE 'A%';
---2.Name ends with a letter
---Keyword: ends with
SELECT *
FROM Employee_Anjali
WHERE EmpName LIKE '%n';
---'%n' → anything before, ends with n
---3.Name contains a word or letter
---Keyword: contains / has / includes
SELECT *
FROM Employee_Anjali
WHERE EmpName LIKE '%an%';
--- %an% → an can be anywhere
---4.Name exact length (e.g., 5 letters)
---Keyword: exactly X characters
SELECT *
FROM Employee_Anjali
WHERE EmpName LIKE '_____';
---Each _ = one character
---(5 underscores = 5 letters)
---Name starts with A and ends with i
SELECT *
FROM Employee_Anjali
WHERE EmpName LIKE 'A%i';
--- Second letter is specific
--Keyword: second character is…
SELECT *
FROM Employee_Anjali
WHERE EmpName LIKE '_n%';
--- _ skips first character
---City name contains "da"
SELECT *
FROM Employee_Anjali
WHERE City LIKE '%da%';
---Department starts with F
SELECT *
FROM Employee_Anjali
WHERE Department LIKE 'F%';
---Names NOT starting with A
SELECT *
FROM Employee_Anjali
WHERE EmpName NOT LIKE 'A%';
---NOT LIKE = reverse condition
---Names ending with "sh"
SELECT *
FROM Employee_Anjali
WHERE EmpName LIKE '%sh';
---Names containing either A or N
SELECT *
FROM Employee_Anjali
WHERE EmpName LIKE '%a%'
OR EmpName LIKE '%n%';
---Email-style pattern (if column exists)
SELECT *
FROM Employee_Anjali
WHERE Email LIKE '%@gmail.com';
Employee_Anjali
(EmpID, EmpName, Department, Salary, Age, City)
---EQUAL TO (=)
---Keyword: is / equals / exactly
SELECT *
FROM Employee_Anjali
WHERE Department = 'IT';
---Used for exact match
---NOT EQUAL (!= or <>)
---Keyword: not / except
SELECT *
FROM Employee_Anjali
WHERE Department != 'HR';
OR
WHERE Department <> 'HR';
---GREATER THAN (>)
---Keyword: more than / above
SELECT *
FROM Employee_Anjali
WHERE Salary > 30000;
---LESS THAN (<)
---Keyword: less than / below
SELECT *
FROM Employee_Anjali
WHERE Age < 25;
---GREATER THAN OR EQUAL TO (>=)
---Keyword: at least / minimum
SELECT *
FROM Employee_Anjali
WHERE Salary >= 20000;
---LESS THAN OR EQUAL TO (<=)
---Keyword: at most / maximum
SELECT *
FROM Employee_Anjali
WHERE Age <= 30;
---BETWEEN (RANGE)
---Keyword: between X and Y (inclusive)
SELECT *
FROM Employee_Anjali
WHERE Salary BETWEEN 20000 AND 30000;
---Includes 20000 and 30000
---Wrong thinking: BETWEEN is NOT exclusive
---BETWEEN (WITHOUT BETWEEN)
SELECT *
FROM Employee_Anjali
WHERE Salary >= 20000 AND Salary <= 30000;
---Same result as BETWEEN
---IN (MULTIPLE VALUES)
---Keyword: in / among / belongs to
SELECT *
FROM Employee_Anjali
WHERE Department IN ('IT','HR','QA');
---Cleaner than OR
---NOT IN
---Keyword: not in / except
SELECT *
FROM Employee_Anjali
WHERE Department NOT IN ('IT','HR');
--AND OPERATOR
---Keyword: and / both conditions
SELECT *
FROM Employee_Anjali
WHERE Department = 'IT'
AND Salary > 30000;
---ALL conditions must be true
--- OR OPERATOR
---Keyword: or / either
SELECT *
FROM Employee_Anjali
WHERE Department = 'IT'
OR Department = 'HR';
---Any ONE true
---AND + OR (IMPORTANT)
SELECT *
FROM Employee_Anjali
WHERE Department = 'IT'
AND (Salary > 30000 OR Age > 30);
---Brackets are mandatory to control logic
---IS NULL
---Keyword: missing / blank
SELECT *
FROM Employee_Anjali
WHERE Salary IS NULL;
--❌ = NULL is WRONG
---IS NOT NULL
SELECT *
FROM Employee_Anjali
WHERE Salary IS NOT NULL;
---LIKE (TEXT PATTERNS)
WHERE EmpName LIKE 'A%'; -- starts with A
WHERE EmpName LIKE '%n'; -- ends with n
WHERE EmpName LIKE '%an%'; -- contains an
---NOT LIKE
SELECT *
FROM Employee_Anjali
WHERE EmpName NOT LIKE 'A%';
---COMBINED WHERE (REAL EXAM STYLE)
SELECT *
FROM Employee_Anjali
WHERE Department IN ('IT','QA')
AND Salary BETWEEN 20000 AND 40000
AND City != 'Delhi';
---WHERE is used for: Filtering rows
--Comparisons
---NULL / NOT NULL — ALL PATTERNS (COMPLETE GUIDE)
---Base Table
Employee_Anjali
(EmpID, EmpName, Department, Salary, Age, City, Email)
---1.What is NULL? (Concept)
---NULL = missing / unknown / not provided
---NULL ≠ 0
---NULL ≠ empty string (' ')
---2.Find rows where column is NULL
---Keyword: missing / not available / blank
SELECT *
FROM Employee_Anjali
WHERE Email IS NULL;
--✅ Correct
---❌ Email = NULL → WRONG
---3️. Find rows where column is NOT NULL
SELECT *
FROM Employee_Anjali
WHERE Email IS NOT NULL;
---4️. NULL with Numeric Column
SELECT *
FROM Employee_Anjali
WHERE Salary IS NULL;
--Salary not entered
---5️.NOT NULL with Numeric Column
SELECT *
FROM Employee_Anjali
WHERE Salary IS NOT NULL;
---6️. Combine NULL with AND
SELECT *
FROM Employee_Anjali
WHERE Department = 'IT'
AND Salary IS NULL;
---IT employees whose salary is missing
---7️. Combine NULL with OR
SELECT *
FROM Employee_Anjali
WHERE Salary IS NULL
OR Email IS NULL;
---Any missing data
---8. NULL with NOT
SELECT *
FROM Employee_Anjali
WHERE NOT Salary IS NULL;
-------------Works, but better style:
WHERE Salary IS NOT NULL;
---9.Count NULL values
SELECT COUNT(*)
FROM Employee_Anjali
WHERE Email IS NULL;
---COUNT(column) ignores NULL
COUNT(*) counts rows
---10.Difference: COUNT(*) vs COUNT(column)
SELECT COUNT(Salary) FROM Employee_Anjali;
---✔ Counts only non-NULL salaries
SELECT COUNT(*) FROM Employee_Anjali;
---✔ Counts all rows
---11.NULL inside IN (IMPORTANT TRAP)
---❌ WRONG
WHERE Salary IN (NULL);
---✔ CORRECT
WHERE Salary IS NULL;
---12. NULL inside NOT IN
SELECT *
FROM Employee_Anjali
WHERE Department NOT IN ('IT','HR')
AND Department IS NOT NULL;
---Always protect NOT IN with IS NOT NULL
---13. Replace NULL using ISNULL (SQL Server)
SELECT EmpName,
ISNULL(Salary, 0) AS Salary_Value
FROM Employee_Anjali;
---If Salary is NULL → show 0
---14. NULL in Calculations
SELECT EmpName,
ISNULL(Salary,0) + 5000 AS NewSalary
FROM Employee_Anjali;
--- Without ISNULL → result becomes NULL
---15. UPDATE NULL values
UPDATE Employee_Anjali
SET Salary = 20000
WHERE Salary IS NULL;
---16.DELETE NULL records
DELETE FROM Employee_Anjali
WHERE Email IS NULL;
---17. NULL in GROUP BY (IMPORTANT)
SELECT Department, COUNT(*)
FROM Employee_Anjali
GROUP BY Department;
---NULL appears as a separate group
---18.HAVING with NULL
SELECT Department, COUNT(*)
FROM Employee_Anjali
GROUP BY Department
HAVING COUNT(Salary) > 2;
---AGGREGATE FUNCTIONS — ALL PATTERNS (EXAM MASTER GUIDE)
---Base Table
Employee_Anjali
(EmpID, EmpName, Department, Salary, Age, City)
--- 1️⃣ COUNT() — TOTAL ROWS
a) Count all rows
SELECT COUNT(*)
FROM Employee_Anjali;
--- Counts every row (including NULLs)
b) Count non-NULL values in a column
SELECT COUNT(Salary)
FROM Employee_Anjali;
--- Ignores NULL salaries
c) Count with condition
SELECT COUNT(*)
FROM Employee_Anjali
WHERE Department = 'IT';
---2️. SUM() — TOTAL (NUMERIC ONLY)
Total salary of all employees
SELECT SUM(Salary)
FROM Employee_Anjali;
Sum with condition
SELECT SUM(Salary)
FROM Employee_Anjali
WHERE Department = 'HR';
---3️. AVG() — AVERAGE (NUMERIC ONLY)
Average salary
SELECT AVG(Salary)
FROM Employee_Anjali;
Average salary per department
SELECT Department, AVG(Salary)
FROM Employee_Anjali
GROUP BY Department;
--- GROUP BY mandatory when column is in SELECT
--- 4️. MAX() — HIGHEST VALUE
Highest salary
SELECT MAX(Salary)
FROM Employee_Anjali;
Highest salary per department
SELECT Department, MAX(Salary)
FROM Employee_Anjali
GROUP BY Department;
--- 5️. MIN() — LOWEST VALUE
Lowest salary
SELECT MIN(Salary)
FROM Employee_Anjali;
Minimum age per city
SELECT City, MIN(Age)
FROM Employee_Anjali
GROUP BY City;
--- 6️. MULTIPLE AGGREGATES TOGETHER
SELECT
MAX(Salary) AS Highest,
MIN(Salary) AS Lowest,
AVG(Salary) AS Average
FROM Employee_Anjali;
--- 7️. AGGREGATES WITH WHERE
SELECT AVG(Salary)
FROM Employee_Anjali
WHERE Department = 'IT';
--- WHERE filters rows before aggregation
-- 8️. AGGREGATES WITH GROUP BY (MOST IMPORTANT)
Employees count per department
SELECT Department, COUNT(*)
FROM Employee_Anjali
GROUP BY Department;
Total salary per department
SELECT Department, SUM(Salary)
FROM Employee_Anjali
GROUP BY Department;
--- 9️. HAVING — FILTER AFTER GROUP BY
Departments with avg salary > 25000
SELECT Department, AVG(Salary)
FROM Employee_Anjali
GROUP BY Department
HAVING AVG(Salary) > 25000;
--- WHERE ❌ | HAVING ✅ for aggregates
--- WHERE vs HAVING (EXAM FAVORITE)
-- WRONG
WHERE AVG(Salary) > 25000
-- ✔ CORRECT
HAVING AVG(Salary) > 25000
--- COUNT + GROUP BY + HAVING
SELECT Department, COUNT(*)
FROM Employee_Anjali
GROUP BY Department
HAVING COUNT(*) > 3;
--- Departments with more than 3 employees
--- DISTINCT with AGGREGATE
SELECT COUNT(DISTINCT Department)
FROM Employee_Anjali;
--- Unique departments count
--- AGGREGATE with CALCULATION
SELECT SUM(Salary * 12) AS Annual_Payout
FROM Employee_Anjali;
--- AGGREGATE with NULL SAFETY
SELECT AVG(ISNULL(Salary,0))
FROM Employee_Anjali;
--- Prevent NULL affecting result
--- TOP with AGGREGATE
SELECT TOP 1 Salary
FROM Employee_Anjali
ORDER BY Salary DESC;
--- TOP N per GROUP (INTERVIEW STYLE)
SELECT Department, MAX(Salary)
FROM Employee_Anjali
GROUP BY Department;
--- AGGREGATE with ORDER BY
SELECT Department, AVG(Salary) AS AvgSal
FROM Employee_Anjali
GROUP BY Department
ORDER BY AvgSal DESC;
--- AGGREGATE + BETWEEN
SELECT Department, COUNT(*)
FROM Employee_Anjali
WHERE Salary BETWEEN 20000 AND 40000
GROUP BY Department;
--- GOLDEN RULES (MUST MEMORIZE)
--✔ If column is in SELECT, it must be:
in GROUP BY
OR
inside aggregate function
-- ✔ WHERE → before GROUP BY
---✔ HAVING → after GROUP BY
--- 10-SECOND MEMORY FORMULA
SELECT column, AGG(column)
FROM table
WHERE condition
GROUP BY column
HAVING AGG(column) condition
ORDER BY column;
SET OPERATORS — ALL PATTERNS (COMPLETE GUIDE)
Used to combine results of two SELECT statements
--- Tables Used (Example)
Table: Employee_Anjali
(EmpID, EmpName, Department)
Table: Employee_Anju
(EmpID, EmpName, Department)
--- Important Rule (Must match):
Same number of columns
Same order
Compatible data types
--- UNION
--➤ Combines results & removes duplicates
SELECT EmpID, EmpName, Department
FROM Employee_Anjali
UNION
SELECT EmpID, EmpName, Department
FROM Employee_Anju;
--- Unique rows only
--- UNION ALL
--➤ Combines results & keeps duplicates
SELECT EmpID, EmpName, Department
FROM Employee_Anjali
UNION ALL
SELECT EmpID, EmpName, Department
FROM Employee_Anju;
--- Faster than UNION
--- INTERSECT
--➤ Common rows in both tables
SELECT EmpID, EmpName, Department
FROM Employee_Anjali
INTERSECT
SELECT EmpID, EmpName, Department
FROM Employee_Anju;
---- Returns matching rows only
---4.EXCEPT
---➤ Rows present in first table but not in second
SELECT EmpID, EmpName, Department
FROM Employee_Anjali
EXCEPT
SELECT EmpID, EmpName, Department
FROM Employee_Anju;
---Order matters!
---5.REVERSE EXCEPT
SELECT EmpID, EmpName, Department
FROM Employee_Anju
EXCEPT
SELECT EmpID, EmpName, Department
FROM Employee_Anjali;
--- Opposite difference
---6.SET OPERATORS WITH WHERE
SELECT EmpID, EmpName, Department
FROM Employee_Anjali
WHERE Department = 'IT'
UNION
SELECT EmpID, EmpName, Department
FROM Employee_Anju
WHERE Department = 'IT';
--- WHERE filters first, then UNION
---7.SET OPERATORS WITH DISTINCT COLUMNS
SELECT EmpName
FROM Employee_Anjali
UNION
SELECT EmpName
FROM Employee_Anju;
---DISTINCT automatically in UNION
---8.SET OPERATORS WITH ORDER BY
SELECT EmpID, EmpName
FROM Employee_Anjali
UNION
SELECT EmpID, EmpName
FROM Employee_Anju
ORDER BY EmpID;
---ORDER BY only at the end
---9.SET OPERATORS WITH TOP
SELECT TOP 3 EmpID, EmpName
FROM Employee_Anjali
UNION ALL
SELECT TOP 3 EmpID, EmpName
FROM Employee_Anju;
--- SET OPERATORS WITH ALIAS
SELECT EmpID AS ID, EmpName AS Name
FROM Employee_Anjali
UNION
SELECT EmpID, EmpName
FROM Employee_Anju;
--- Alias name comes from first SELECT
--- LIMITATIONS OF SET OPERATORS (EXAM FAVORITE)
-- 1. Same number of columns
-- 2. Same column order
-- 3. Same data type
-- 4. ORDER BY only at the end
---Full company-level mock SQL test with solutions
---Absolutely Anjalii
---Here’s a **FULL company-level SQL mock test WITH SOLUTIONS**, designed exactly like **internal company tests / interviews**.
--- Covers **WHERE, LIKE, NULL, AGGREGATES, GROUP BY, HAVING, SET OPERATORS**
---Questions are **natural + human-written**, not AI-looking
--- Difficulty: **Easy → Medium → Tricky (but fair)**
---
--- SQL MOCK TEST (Company Level)
--- Base Table (Assume this already exists)
Employee_Anjali
(
EmpID INT,
EmpName VARCHAR(30),
Department VARCHAR(20),
Salary INT,
Age INT,
City VARCHAR(20)
)
---
--- SECTION A — WHERE & COMPARISON (10 Marks)
--- Q1. Display all employees whose salary is greater than 25,000.
SELECT *
FROM Employee_Anjali
WHERE Salary > 25000;
--- Q2. List employees who are exactly 22 years old.
SELECT *
FROM Employee_Anjali
WHERE Age = 22;
--- Q3. Show employees who do not belong to the IT department.
SELECT *
FROM Employee_Anjali
WHERE Department <> 'IT';
--- Q4. Find employees whose salary is between 20,000 and 30,000.
SELECT *
FROM Employee_Anjali
WHERE Salary BETWEEN 20000 AND 30000;
--- Q5. Display employees who work in IT or HR.
SELECT *
FROM Employee_Anjali
WHERE Department IN ('IT','HR');
--- SECTION B — LIKE PATTERNS (10 Marks)
--- Q6. Find employees whose name starts with ‘A’.
SELECT *
FROM Employee_Anjali
WHERE EmpName LIKE 'A%';
--- Q7. Find employees whose name ends with ‘n’.
SELECT *
FROM Employee_Anjali
WHERE EmpName LIKE '%n';
--- Q8. Find employees whose name contains ‘an’.
SELECT *
FROM Employee_Anjali
WHERE EmpName LIKE '%an%';
--- Q9. Find employees whose city starts with ‘M’.
SELECT *
FROM Employee_Anjali
WHERE City LIKE 'M%';
--- Q10. Display employees whose name does NOT start with ‘S’.
SELECT *
FROM Employee_Anjali
WHERE EmpName NOT LIKE 'S%';
--- Q11. Find employees whose salary is not available.
SELECT *
FROM Employee_Anjali
WHERE Salary IS NULL;
--- Q12. Display employees whose city is available.
SELECT *
FROM Employee_Anjali
WHERE City IS NOT NULL;
--- Q13. Count how many employees have NULL salary.
SELECT COUNT(*)
FROM Employee_Anjali
WHERE Salary IS NULL;
--- SECTION D — AGGREGATE FUNCTIONS (20 Marks)
--- Q14. Find the highest salary.
SELECT MAX(Salary)
FROM Employee_Anjali;
--- Q15. Find the average salary of all employees.
SELECT AVG(Salary)
FROM Employee_Anjali;
--- Q16. Find total salary paid to all employees.
SELECT SUM(Salary)
FROM Employee_Anjali;
--- Q17. Count total number of employees.
SELECT COUNT(*)
FROM Employee_Anjali;
--- Q18. Find minimum salary.
SELECT MIN(Salary)
FROM Employee_Anjali;
--- Q19. Count employees in each department.
SELECT Department, COUNT(*)
FROM Employee_Anjali
GROUP BY Department;
--- Q20. Find average salary per department.
SELECT Department, AVG(Salary)
FROM Employee_Anjali
GROUP BY Department;
--- Q21. Display departments having average salary greater than 25,000.
SELECT Department, AVG(Salary)
FROM Employee_Anjali
GROUP BY Department
HAVING AVG(Salary) > 25000;
--- Q22. Find cities where total salary exceeds 50,000.
SELECT City, SUM(Salary)
FROM Employee_Anjali
GROUP BY City
HAVING SUM(Salary) > 50000;
--- Q23. Find departments having more than 3 employees.
SELECT Department, COUNT(*)
FROM Employee_Anjali
GROUP BY Department
HAVING COUNT(*) > 3;
--- Q24. Find departments where max salary is greater than 40,000.
SELECT Department, MAX(Salary)
FROM Employee_Anjali
GROUP BY Department
HAVING MAX(Salary) > 40000;
--- Q25. Find IT employees with salary above 30,000.
SELECT *
FROM Employee_Anjali
WHERE Department = 'IT'
AND Salary > 30000;
--- Q26. Find employees older than 25 and not from HR.
SELECT *
FROM Employee_Anjali
WHERE Age > 25
AND Department <> 'HR';
--- Q27. Display employees whose salary is NULL or less than 20,000.
SELECT *
FROM Employee_Anjali
WHERE Salary IS NULL
OR Salary < 20000;
--- Q28. Find employees whose city is Delhi and salary between 25,000 and 40,000.
SELECT *
FROM Employee_Anjali
WHERE City = 'Delhi'
AND Salary BETWEEN 25000 AND 40000;
--- Q29. Show employees ordered by salary (highest first).
SELECT *
FROM Employee_Anjali
ORDER BY Salary DESC;
--- Q30. Display top 3 highest paid employees.
SELECT TOP 3 *
FROM Employee_Anjali
ORDER BY Salary DESC;