There's a lot of silly types of queries here. I tried to include some basic examples and then some outlandish ones to give you an idea of how much we can find before getting too complicated.

Table of contents

Baby name data

Sorting and filtering

SELECT * 
FROM babynames
ORDER BY babies DESC
LIMIT 10;
name sex babies
Michael M 65274
Christopher M 52323
Jessica F 46466
Ashley F 45549
Matthew M 44794
Joshua M 43214
Brittany F 36535
Amanda F 34406
Daniel M 33809
David M 33741
SELECT * 
FROM babynames
WHERE sex = 'M'
ORDER BY babies DESC
LIMIT 5;
name sex babies
Michael M 65274
Christopher M 52323
Matthew M 44794
Joshua M 43214
Daniel M 33809
SELECT * 
FROM babynames
WHERE name LIKE 'Mich%'
ORDER BY babies DESC
LIMIT 5;
name sex babies
Michael M 65274
Michelle F 13417
Micheal M 1771
Michele F 1164
Michaela F 878
SELECT * 
FROM babynames
WHERE name LIKE 'Ja____'
ORDER BY babies DESC
LIMIT 5;

Alternatively, this would also work:

SELECT * 
FROM babynames
WHERE name LIKE 'Ja%' 
  AND LENGTH(name) = 6
ORDER BY babies DESC
LIMIT 5;
name sex babies
Jaclyn F 2155
Javier M 1977
Jasmin F 1218
Jazmin F 910
Jarrod M 792
SELECT * 
FROM babynames
WHERE 
  sex = 'F'
  AND LENGTH(name) <= 4
ORDER BY babies DESC
LIMIT 5;
name sex babies
Sara F 8972
Mary F 8664
Amy F 8456
Erin F 7985
Anna F 7288
SELECT * 
FROM babynames
WHERE 
  name LIKE 'Z%'
ORDER BY babies DESC
LIMIT 3;
name sex babies
Zachary M 20424
Zachery M 1228
Zachariah M 757
SELECT *
FROM babynames
WHERE name LIKE '%rr%'
ORDER BY babies DESC
LIMIT 3;
name sex babies
Garrett M 3755
Derrick M 3363
Larry M 2193
SELECT *
FROM babynames
WHERE 
  sex = 'F'
  AND SUBSTR(name, -1) IN ('a', 'e', 'i', 'o', 'u')
ORDER BY babies DESC
LIMIT 5;
name sex babies
Jessica F 46466
Amanda F 34406
Samantha F 25864
Stephanie F 24856
Nicole F 17950
SELECT *
FROM babynames
WHERE 
  sex = 'F'
  AND SUBSTR(name, -1) NOT IN ('a', 'e', 'i', 'o', 'u')
ORDER BY babies DESC
LIMIT 5;
name sex babies
Ashley F 45549
Brittany F 36535
Sarah F 25808
Jennifer F 22221
Elizabeth F 20742
SELECT *
FROM babynames
WHERE 
  sex = 'M'
  AND SUBSTR(name, 1, 1) IN ('A', 'E', 'I', 'O', 'U')
  AND SUBSTR(name, -1) IN ('a', 'e', 'i', 'o', 'u')
ORDER BY babies DESC
LIMIT 5;
name sex babies
Antonio M 4864
Alejandro M 2636
Andre M 2296
Eduardo M 2159
Alberto M 1353

The 5 longest names, sorted by popularity

SELECT name, LENGTH(name) AS namelength,
  sex, babies
FROM babynames
ORDER BY 
  namelength DESC,
  babies DESC
LIMIT 5;
name namelength sex babies
Franciscojavier 15 M 5
Michaelanthony 14 M 19
Mariadelcarmen 14 F 16
Mariaguadalupe 14 F 16
Sarahelizabeth 14 F 10

5 longest names with at least 1,000 babies

SELECT name,
  LENGTH(name) AS namelength,
  sex,
  babies
FROM babynames
WHERE babies >= 1000
ORDER BY namelength DESC;
name namelength sex babies
Christopher 11 M 52323
Jacqueline 10 F 5238
Alexandria 10 F 3594
Kristopher 10 M 1858
Stephanie 9 F 24856

Aggregates

Number of rows in the babynames table

SELECT COUNT(*)
FROM babynames;
COUNT(*)
24713

Number of total babies in the babynames table

SELECT SUM(babies)
FROM babynames;
SUM(babies)
3950252

Number of unique names

SELECT COUNT(DISTINCT name)
FROM babynames;
COUNT(DISTINCT name)
22674

Number of names with more than 10,000 babies

SELECT COUNT(*)
FROM babynames
WHERE babies > 10000;
COUNT(*)
78

Total number of girl names and babies

SELECT
  COUNT(*) AS total_names,
  SUM(babies) AS total_babies
FROM babynames
WHERE sex = 'F';
total_names total_babies
15231 1897709

Total number of names and babies, boys versus girls

SELECT sex,
  COUNT(*) AS total_names,
  SUM(babies) AS total_babies
FROM babynames
GROUP BY sex;
sex total_names total_babies
F 15231 1897709
M 9482 2052543

Average length of all names, unweighted

SELECT AVG(LENGTH(name))
FROM babynames;
AVG(LENGTH(name))
6.33828349451706

Weighted average length of all names

SELECT 
  1.0 * SUM(LENGTH(name) * babies) / SUM(babies)
FROM babynames;
1.0 * SUM(LENGTH(name) * babies) / SUM(babies)
6.19453898131056

Average length (unweighted) of names, boys versus girls, rounded to 2 decimal places

SELECT sex,
  ROUND(AVG(LENGTH(name)), 2)
FROM babynames
GROUP BY sex;
sex ROUND(AVG(LENGTH(name)), 2)
F 6.47
M 6.13
SELECT 
  SUBSTR(name, 1, 1) AS first_letter,
  SUM(babies) AS total_babies
FROM babynames
WHERE 
  sex = 'F'
GROUP BY first_letter
ORDER BY total_babies DESC
LIMIT 5;
first_letter total_babies
A 275925
K 201700
J 177754
S 177028
C 171470
SELECT 
  SUBSTR(name, 1, 1) AS first_letter,
  SUBSTR(name, -1) AS last_letter,
  SUM(babies) AS total_babies
FROM babynames
WHERE 
  sex = 'F'
GROUP BY first_letter, last_letter
ORDER BY total_babies DESC
LIMIT 5;
first_letter last_letter total_babies
J n 137274
M l 83196
B n 71835
C r 58305
S n 56663

Top 10 starting letter of names, sorted by longest (unweighted) average length of name

SELECT 
  SUBSTR(name, 1, 1) AS first_letter,
  AVG(LENGTH(name)) AS avg_namelength
FROM babynames
GROUP BY first_letter
ORDER BY avg_namelength DESC
LIMIT 10;
first_letter avg_namelength
Q 7.32258064516129
C 6.7832719621252
S 6.72365038560411
M 6.62336956521739
F 6.50609756097561
B 6.49479166666667
V 6.47902097902098
G 6.44465648854962
J 6.39849269901083
D 6.37574123989218

And bottom 5 starting letters, based on average name length

Just because I'm curious…

SELECT 
  SUBSTR(name, 1, 1) AS first_letter,
  AVG(LENGTH(name)) AS avg_namelength
FROM babynames
GROUP BY first_letter
ORDER BY avg_namelength ASC
LIMIT 5;
first_letter avg_namelength
I 5.37113402061856
U 5.54166666666667
X 5.59459459459459
O 5.6865671641791
Z 5.75925925925926

Number of babies and names for names that end in a vowel, boys versus girls

SELECT 
  sex,
  COUNT(*) AS total_names,
  SUM(babies) AS total_babies
FROM babynames
WHERE 
  SUBSTR(name, -1) IN ('a', 'e', 'i', 'o', 'u')
GROUP BY sex;
sex total_names total_babies
F 10860 1106357
M 2595 277115

For each vowel, total number of names (and babies named) that begin with a vowel, broken down by boys versus girls

SELECT 
  LOWER(SUBSTR(name, 1, 1)) AS first_letter,
  sex,
  COUNT(*) AS total_names,
  SUM(babies) AS total_babies
FROM babynames
WHERE 
  first_letter IN ('a', 'e', 'i', 'o', 'u')
GROUP BY first_letter, sex;
first_letter sex total_names total_babies
a F 1458 275925
a M 754 180177
e F 422 89356
e M 339 71102
i F 175 9492
i M 116 16722
o F 74 6133
o M 127 8928
u F 17 484
u M 31 1174

Florida university salaries

Sorting and filtering

Top 5 salaries overall

Remember we have to use a WHERE clause to filter out blank values:

SELECT * 
FROM florida_positions
WHERE AnnualSalary != ''
ORDER BY AnnualSalary DESC
LIMIT 5;

You might be thinking, why can't we use the money_amount we column created in a previous lesson?

SELECT * 
FROM florida_positions
ORDER BY money_amount DESC
LIMIT 5;

Because that money_amount could contain either AnnualSalary or OPSTermAmount. We just want salaried workers for this query.

University BudgetEntity PositionNumber LastName FirstName MI EmployeeType FTE ClassCode ClassTitle AnnualSalary OPSTermAmount money_amount
UF Contracts & Grants 00000000 FRIEDMAN WILLIAM A SALARIED 0.97 9001 PROFESSOR 961281   961281
UF Contracts & Grants 00000805 GUZICK DAVID S SALARIED 1.0 9001 PROFESSOR 905000   905000
UF Contracts & Grants 00000000 KESHAVARZI SASSAN . SALARIED 0.97 9003 ASSISTANT PROFESSOR 730685   730685
UF Contracts & Grants 00000000 CHALAM KAKARLA V SALARIED 0.96 9001 PROFESSOR 680685   680685
UF Contracts & Grants 00005361 FUCHS WESLEY K SALARIED 0.77 9001 PROFESSOR 661340   661340

Top 5 salaries that don't involve Contracts & Grants

According to this 2011 Orlando Sentinel article, "Here's what Florida professors earn", much of these high professor salaries come from grants, which seems like something we can filter out in the BudgetEntity column:

SELECT * 
FROM florida_positions
WHERE 
  AnnualSalary != ''
  AND BudgetEntity != "Contracts & Grants"
ORDER BY AnnualSalary DESC
LIMIT 5;
University BudgetEntity PositionNumber LastName FirstName MI EmployeeType FTE ClassCode ClassTitle AnnualSalary OPSTermAmount money_amount
UF Educational & General 00016824 BASS THEODORE A SALARIED 1.0 9001 PROFESSOR 633368   633368
UF Educational & General 00021041 MCCOOK BARRY M SALARIED 1.0 9002 ASSOCIATE PROFESSOR 575035   575035
FIU Intercollegiate Athletics 62515000 TURNER RONALD D SALARIED 1.0 9469 HEAD ATHLETIC COACH 546000   546000
UCF Educational & General 39123 GERMAN DEBORAH D SALARIED 1.0 9001 PROFESSOR 541402   541402
FIU Educational & General 34205000 ROCK JOHN A SALARIED 1.0 9001 PROFESSOR 539537   539537

Top 5 salaries for non-professors

Note that I'm not using * to select all columns, just to limit the visual clutter:

SELECT University, BudgetEntity,
  FirstName, LastName, ClassTitle, 
  AnnualSalary
FROM florida_positions
WHERE 
  AnnualSalary != ''
  AND ClassTitle NOT LIKE '%PROFESSOR%'
ORDER BY AnnualSalary DESC
LIMIT 5;
University BudgetEntity FirstName LastName ClassTitle AnnualSalary
FIU Intercollegiate Athletics RONALD TURNER HEAD ATHLETIC COACH 546000
USF Educational & General JOEL MOMBERG V P ADVANCEMENT/ALUMNI AFF. 532250
FIU Educational & General MODESTO MAIDIQUE EMINENT SCHOLAR 514211
FAU   CHARLES PARTRIDGE HEAD ATHLETIC COACH 500000
USF Intercollegiate Athletics ROBERT HARLAN ATHLETICS DIRECTOR 500000

Top 5 salaries for coaches

We can assume that these employees will have 'COACH' in their title somewhere:

SELECT University, BudgetEntity,
  FirstName, LastName, ClassTitle, 
  AnnualSalary
FROM florida_positions
WHERE 
  AnnualSalary != ''
  AND ClassTitle LIKE '%COACH%'
ORDER BY AnnualSalary DESC
LIMIT 5;
University BudgetEntity FirstName LastName ClassTitle AnnualSalary
FIU Intercollegiate Athletics RONALD TURNER HEAD ATHLETIC COACH 546000
FAU   CHARLES PARTRIDGE HEAD ATHLETIC COACH 500000
USF Intercollegiate Athletics WILLIE TAGGART HEAD FOOTBALL COACH 400000
FSU Intercollegiate Athletics MICHAEL MARTIN HEAD ATHL COACH II 391109
USF Intercollegiate Athletics ORLANDO ANTIGUA HEAD BASKETBALL COACH 375000

Top 5 salaries for anyone dealing with football

Same as above, but replace '%COACH%' with '%FOOTBALL%':

SELECT University, BudgetEntity,
  FirstName, LastName, ClassTitle, 
  AnnualSalary
FROM florida_positions
WHERE 
  AnnualSalary != ''
  AND ClassTitle LIKE '%FOOTBALL%'
ORDER BY AnnualSalary DESC
LIMIT 5;
University BudgetEntity FirstName LastName ClassTitle AnnualSalary
USF Intercollegiate Athletics WILLIE TAGGART HEAD FOOTBALL COACH 400000
USF Intercollegiate Athletics THOMAS ALLEN ASST. HEAD FOOTBALL COACH 350000

I'm pretty sure there are more than 2 football coaches in Florida's public university system…Looks like job titles aren't consistent across schools.

Find the provosts at each school and rank them by salary

SELECT University, ClassTitle, 
  FirstName, LastName, AnnualSalary
FROM florida_positions
WHERE ClassTitle LIKE '%PROVOST%'
ORDER BY AnnualSalary DESC;

Hmmm…that didn't work out. Some schools are missing.

University ClassTitle FirstName LastName AnnualSalary
UF VICE PRESIDENT & ASO PROVOST ZINA EVANS 197874
FGCU PROVOST & VP ACADEMIC AFFAIRS RONALD TOLL 186221
NCF PROVOST/ASSOC. PROFESSOR STEPHEN MILES 166000
FAU ASSISTANT PROVOST JEFFERY HOYT 145000
FPU ASSISTANT PROVOST - ADMISSONS SCOTT RHODES 140000
FGCU PROVOST & VP ACADEMIC AFFAIRS RONALD TOLL 129408
FAU ASSISTANT PROVOST TRACY BOULUKOS 125000
FAU ASSISTANT PROVOST JAMES CAPP 61500
UF VICE PRESIDENT & ASO PROVOST ZINA EVANS 34919

For example, Ralph Wilcox is the Provost for University of South Florida, but he doesn't show up in the list above. Let's look for him individually:

SELECT *
FROM florida_positions
WHERE University = 'USF'
  AND FirstName = 'RALPH'
  AND LastName = 'WILCOX';

Looks like he's just listed as a PROFESSOR, just one of his hats:

University BudgetEntity PositionNumber LastName FirstName MI EmployeeType FTE ClassCode ClassTitle AnnualSalary OPSTermAmount money_amount
USF Educational & General 00008847 WILCOX RALPH C SALARIED 1.0 9001 PROFESSOR 375000   375000

List all job titles that contain Professor in them

Is the data such that PROFESSOR is abbreviated as PROF? Only one way to find out:

SELECT DISTINCT ClassTitle
FROM florida_positions
WHERE ClassTitle LIKE '%PROF%';
ClassTitle
PROFESSOR
ASSOCIATE PROFESSOR
ASSISTANT PROFESSOR
UNIVERSITY SCHOOL ASSISTANT PROFESSOR
DISTINGUISHED PROFESSOR
ACADEMIC PARAPROFESSIONAL
ADMINISTRATIVE PARAPROFESSIONA
COMPUTING PARAPROFESSIONAL
OPERATIONAL PARAPROFESSIONAL
UNIVERSITY SCHOOL ASSOCIATE PROFESSOR
TECHNICAL PARAPROFESSIONAL
UNIVERSITY SCHOOL PROFESSOR
GRADUATE RESEARCH PROFESSOR
MEDICAL PARAPROFESSIONAL
VISITING ASSISTANT PROFESSOR
ASSIST PROF & DIR OF ECONOMICS ANALYSIS
VISITING ASSOCIATE PROFESSOR
ASSOCIATE VP FOR ACAD AFFAIRS & PROF
PROFESSIONAL ENGINEER
PROVOST/ASSOC. PROFESSOR
DEAN/ASSOCIATE PROFESSOR
DIRECTOR PROFESSIONAL DEVELOP
ASSOC PROFESSOR

Looks like doing a wildcard with 'PROF' brings up job titles with PROFESSIONAL in them, which is not what we want.

SELECT DISTINCT ClassTitle
FROM florida_positions
WHERE ClassTitle LIKE '%PROFESSOR%';
ClassTitle
PROFESSOR
ASSOCIATE PROFESSOR
ASSISTANT PROFESSOR
UNIVERSITY SCHOOL ASSISTANT PROFESSOR
DISTINGUISHED PROFESSOR
UNIVERSITY SCHOOL ASSOCIATE PROFESSOR
UNIVERSITY SCHOOL PROFESSOR
GRADUATE RESEARCH PROFESSOR
VISITING ASSISTANT PROFESSOR
VISITING ASSOCIATE PROFESSOR
PROVOST/ASSOC. PROFESSOR
DEAN/ASSOCIATE PROFESSOR
ASSOC PROFESSOR

Aggregates

Sum the total salaries and payments for Florida's public universities

SELECT SUM(money_amount) AS total_money
FROM florida_positions;
total_money
3322676999

List the top 5 universities by total salaries and payments

SELECT 
  University, 
  SUM(money_amount) AS total_money
FROM florida_positions
GROUP BY University
ORDER BY total_money DESC
LIMIT 5;
University total_money
UF 1167497173
USF 489160622
FSU 413407880
FIU 347706473
UCF 333182767

Count the total salaried employees for Florida's public universities

SELECT COUNT(*)
FROM florida_positions
WHERE AnnualSalary != '';
COUNT(*)
59865

Count and sum payments by employee type for Florida's public universities

SELECT EmployeeType, 
  COUNT(*),
  SUM(money_amount)
FROM florida_positions
GROUP BY EmployeeType;
EmployeeType COUNT(*) SUM(money_amount)
OPS 23919 156121051
SALARIED 59865 3166555948

Number of professors who are not salaried

SELECT COUNT(*)
FROM florida_positions
WHERE ClassTitle LIKE '%PROFESSOR%'
  AND EmployeeType != 'SALARIED';
COUNT(*)
1154

Rank colleges by salaries and payments of their athletic departments

SELECT 
  University,
  SUM(money_amount) as total_money
FROM florida_positions
WHERE BudgetEntity = 'Intercollegiate Athletics'
GROUP BY University
ORDER BY total_money DESC;
University total_money
FSU 15483680
USF 10173014
FIU 6245761
FGCU 3001760
UNF 2780809
FAMU 2504714
UWF 1494741
FAU 42008
FPU 42000

Rank BudgetEntities by total spent on salaries and payments

SELECT 
  BudgetEntity,
  SUM(money_amount) as total_money
FROM florida_positions
GROUP BY BudgetEntity
ORDER BY total_money DESC;
BudgetEntity total_money
Educational & General 1938000138
Contracts & Grants 829715351
Auxiliaries 278804776
  179878850
Intercollegiate Athletics 41768487
Student Activities 29284761
Data Center Operations/Computer Services-Aux 7902690
Student Financial Aid 5700871
Teaching Hospitals and Allied Clinics - FSU 5473926
Technology Fee 4148052
Teaching Hospitals and Allied Clinics - UCF 1470648
Board Approved Fees 528449

This seems frivolous but remember that our ultimate goal is to join the babynames table based on first name. So might as well remind ourselves that this dataset does indeed include first names:

SELECT 
  FirstName,
  COUNT(*) AS professors_count
FROM florida_positions
WHERE ClassTitle LIKE '%PROFESSOR%'
GROUP BY FirstName
ORDER BY professors_count DESC
LIMIT 10;
FirstName professors_count
MICHAEL 412
DAVID 394
JOHN 376
ROBERT 330
WILLIAM 294
JAMES 273
THOMAS 226
RICHARD 189
MARK 179
CHARLES 159

Hmmm…not a lot of traditionally female names in this list of most common professor names.

SELECT 
  FirstName,
  COUNT(*) AS people_count
FROM florida_positions
WHERE 
  ClassTitle LIKE '%PROVOST%' 
  OR ClassTitle LIKE '%DEAN%'
  OR ClassTitle LIKE '%PRESIDENT%'
  OR ClassTitle LIKE '%VP%'
  OR ClassTitle LIKE '%HEAD%' 
GROUP BY FirstName
ORDER BY people_count DESC
LIMIT 10;
FirstName people_count
JOHN 15
ROBERT 11
DAVID 10
JAMES 10
MARK 10
MICHAEL 10
THOMAS 10
MARY 9
WILLIAM 8
SUSAN 7

There's a few Marys and Susans in this breakdown.

SELECT 
  FirstName,
  COUNT(*) AS people_count
FROM florida_positions
WHERE 
  money_amount >= 200000
GROUP BY FirstName
ORDER BY people_count DESC
LIMIT 10;
FirstName people_count
JOHN 32
ROBERT 32
MICHAEL 30
DAVID 24
THOMAS 22
MARK 20
WILLIAM 18
JAMES 17
JOSEPH 14
DANIEL 12

However, this list of common names seems to be male-dominated. This isn't a great statistical measure of course – it could be the majority of $200K+ earners are women with uncommon names. We just don't know yet.

So let's move on to table joins.