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
|
-- GENERAL
-- See the names for all the tables and views
.tables
-- See the schema for the table shopping
.schema shopping
-- See the schema for the view am_analysis
.schema am_analysis
-- OPTIONS
-- Set the number of meals to analyze to 3
update options set defanal_am = 3;
-- Set the meals per day to 1 (you always need to record all the meals the
-- program is set for; otherwise it throws off the calculations--so record
-- a glass of water or something for each missing meal--although there is no
-- harm in totally stopping your recording for a while while you collect
-- your thoughts.) When meals per day changes, meals from the old meals
-- per day are archived, and archived meals at the new meals per day are
-- restored.
update options set meals_per_day = 1;
-- Set the weight display to ounces avoirdupois when using the currentmeal view
update options set grams = 0;
-- Set the weight display to grams when using the currentmeal view
update options set grams = 1;
-- Set the current meal to March 16, 2017 meal #3
update options set currentmeal = 2017031603;
-- NUTRIENTS
-- See all the defined nutrients
select * from nutr_def;
-- Set the Daily Value (nutrient standard) for Non-Fiber Carb to 250 grams
update nutr_def set nutopt = 250.0 where NutrDesc = 'Non-Fiber Carb';
-- Set the Daily Value for Total Fat to the default
update nutr_def set nutopt = 0.0 where NutrDesc = 'Total Fat';
-- Set the Daily Value for Protein to equal whatever is in your meals
update nutr_def set nutopt = -1.0 where NutrDesc = 'Protein';
-- Find where the Magnesium is coming from in your meals
select * from nut_in_meals where NutrDesc = 'Magnesium';
-- Find where the Magnesium is coming from in your meals in percentages of DV
select * from nutdv_in_meals where NutrDesc = 'Magnesium';
-- Find the percentages of protein/carb/fat in your meals
select macropct from am_analysis_header;
-- Find the Omega-6/3 balance of your meals
select n6balance from am_analysis_header;
-- List the defined food groups
select * from fd_group;
-- List the "Sweets"
select NDB_No, Long_Desc from food_des where FdGrp_Cd = 1900;
-- Find the 15 vegetables with the most Magnesium in 100 grams
select Long_Desc from fd_group natural join food_des natural join nut_data
where FdGrp_Desc like '%veg%' and Nutr_No = 304 order by Nutr_Val desc limit 15;
-- Find the 15 vegetables with the most Magnesium that aren't dried
select Long_Desc from fd_group natural join food_des natural join nut_data
natural join nutr_def where FdGrp_Desc like '%veg%' and Long_Desc not like
'%dried%' and NutrDesc = 'Magnesium' order by Nutr_Val desc limit 15;
--
-- We interrupt our examples because Senorita SQL has dropped by. Senorita,
-- what would you like to show us?
-- Senorita SQL: Let's imagine we have something we want to know and we don't
-- have the faintest idea how to do it; so we do little pieces of it and later
-- fit the pieces together and see if it works.
-- Imagine this: you have been changing protein and calories over the last few
-- days and you remember some of how you felt on various days, but are unsure
-- just what you were doing. Say the last three weeks. Can we get the Calories
-- numbers for days in the last three weeks? We know all our meal information
-- is based in the table "mealfoods" so let's just list mealfoods out for the
-- meals we care about. I am going to use a limit clause initially so that I
-- don't have to do a lot of scrolling to get an idea what is being presented,
-- but if I left off the limit clause, I would get the whole thing.
bigNUT> select * from mealfoods where meal_id >= 2017030101 limit 10;
2017030101|1009|20.7769953051641
2017030101|2047|1.0
2017030101|11457|28.349523
2017030101|11529|42.5242845
2017030101|12563|11.4830311483027
2017030101|15088|31.1844753
2017030101|19165|5.4
2017030101|99000|240.9709455
2017030101|99010|17.0
2017030101|99014|9.89645784739827
-- Good start! Do we want nutrients per meal or per day or what? Don't we
-- want nutrients per day? Here's how we change it to get days:
bigNUT> select meal_id / 100 as day, NDB_No, Gm_Wgt from mealfoods
...> where meal_id >= 2017030101 limit 10;
20170301|1009|20.7769953051641
20170301|2047|1.0
20170301|11457|28.349523
20170301|11529|42.5242845
20170301|12563|11.4830311483027
20170301|15088|31.1844753
20170301|19165|5.4
20170301|99000|240.9709455
20170301|99010|17.0
20170301|99014|9.89645784739827
-- We had to actually name the columns instead of the asterisk and make a new
-- column called day.
-- Now, for each combination of day and food, let's add the weights together
-- to get the total weight of each food per day:
bigNUT> select meal_id / 100 as day, NDB_No, sum(Gm_Wgt) from mealfoods
...> where meal_id >= 2017030101 group by day, NDB_No limit 10;
20170301|1009|63.1549295774641
20170301|2047|3.0
20170301|11098|85.048569
20170301|11457|85.048569
20170301|11529|127.5728535
20170301|12563|29.0097629009752
20170301|15088|93.5534259
20170301|19041|17.0097138
20170301|19165|16.2
20170301|20037|319.13830518051
-- We had to use the sum function and the "group by" clause to show what to add
-- together, namely each day's individual foods.
-- So, we have the day, the food, and its total gram weight. Remember, we are
-- actually concerned with Calories and Protein. How do attach the Calories
-- to these records? Calories per 100 grams of food are in the nut_data table,
-- and so you don't have to look it up, I'll mention Calories are nutrient
-- number 208 (Nutr_No = 208). So, to chain it together we do a join using
-- the food identifier, the NDB_No, and ask for only the calories records:
bigNUT> select meal_id / 100 as day, NDB_No, sum(Gm_Wgt), cals.Nutr_Val
...> from mealfoods join nut_data cals using (NDB_No)
...> where meal_id >= 2017030101 and cals.Nutr_No = 208
...> group by day, NDB_No limit 10;
20170301|1009|63.1549295774641|404.0
20170301|2047|3.0|0.0
20170301|11098|85.048569|43.0
20170301|11457|85.048569|23.0
20170301|11529|127.5728535|18.0
20170301|12563|29.0097629009752|598.0
20170301|15088|93.5534259|208.0
20170301|19041|17.0097138|544.0
20170301|19165|16.2|228.0
20170301|20037|319.13830518051|123.0
-- We provided an alias for the nut_data called "cals" so we know which nutrient
-- value is which because we are going to now add Protein the same way:
bigNUT> select meal_id / 100 as day, NDB_No, sum(Gm_Wgt), cals.Nutr_Val,
...> pro.Nutr_Val from mealfoods join nut_data cals using (NDB_No)
...> join nut_data pro using (NDB_No)
...> where meal_id >= 2017030101 and cals.Nutr_No = 208
...> and pro.Nutr_No = 203 group by day, NDB_No limit 10;
20170301|1009|63.1549295774641|404.0|22.87
20170301|2047|3.0|0.0|0.0
20170301|11098|85.048569|43.0|3.38
20170301|11457|85.048569|23.0|2.86
20170301|11529|127.5728535|18.0|0.88
20170301|12563|29.0097629009752|598.0|20.96
20170301|15088|93.5534259|208.0|24.62
20170301|19041|17.0097138|544.0|61.3
20170301|19165|16.2|228.0|19.6
20170301|20037|319.13830518051|123.0|2.74
-- nut_data records are per 100 grams, but we rarely eat exactly 100 grams so
-- we have to scale the nut_data to what we actually ate using the gram weight:
bigNUT> select meal_id / 100 as day, NDB_No,
...> sum(Gm_Wgt / 100.0 * cals.Nutr_Val) as calories,
...> sum(Gm_Wgt / 100.0 * pro.Nutr_Val) as protein from mealfoods
...> join nut_data cals using (NDB_No) join nut_data pro using (NDB_No)
...> where meal_id >= 2017030101 and cals.Nutr_No = 208
...> and pro.Nutr_No = 203 group by day, NDB_No limit 10;
20170301|1009|255.145915492955|14.443532394366
20170301|2047|0.0|0.0
20170301|11098|36.57088467|2.8746416322
20170301|11457|19.56117087|2.4323890734
20170301|11529|22.96311363|1.1226411108
20170301|12563|173.478382147832|6.0804463040444
20170301|15088|194.591125872|23.03285345658
20170301|19041|92.532843072|10.4269545594
20170301|19165|36.936|3.1752
20170301|20037|392.540115372027|8.74438956194598
-- We don't care about foods at this point, just the day and the sums of the
-- calories and protein. So we treat this output as a whole table by putting
-- it in parentheses and then we select from it and sum it and group it just
-- like we did before!
bigNUT> select day, round(sum(calories)), round(sum(protein)) from
...> (select meal_id / 100 as day, NDB_No,
...> sum(Gm_Wgt / 100.0 * cals.Nutr_Val) as calories,
...> sum(Gm_Wgt / 100.0 * pro.Nutr_Val) as protein
...> from mealfoods join nut_data cals using (NDB_No)
...> join nut_data pro using (NDB_No)
...> where meal_id >= 2017030101 and cals.Nutr_No = 208
...> and pro.Nutr_No = 203 group by day, NDB_No)
...> group by day;
20170301|2379.0|125.0
20170302|2388.0|125.0
20170303|2470.0|125.0
20170304|2453.0|125.0
20170305|2669.0|125.0
20170306|2465.0|125.0
20170307|2415.0|125.0
20170308|2401.0|125.0
20170309|2489.0|125.0
20170310|2528.0|125.0
20170311|2580.0|120.0
20170312|2701.0|113.0
20170313|2398.0|115.0
20170314|2400.0|120.0
20170315|2400.0|120.0
20170316|2402.0|120.0
20170317|2399.0|120.0
20170318|2401.0|122.0
20170319|2401.0|125.0
20170320|2340.0|125.0
20170321|2311.0|125.0
-- Thank you, Senorita! That was a complicated example, though. Maybe we
-- should get back to some simpler examples...
-- FOODS and SERVING SIZES
-- Find the fast food tacos
select NDB_No, Long_Desc from food_des where Long_Desc like '%fast food%taco%';
-- See the "preferred weight" of a soft chicken taco
select Gm_Wgt, Amount, Msre_Desc from pref_Gm_Wgt where NDB_No = 21487;
-- Change the preferred weight to show 220 grams of soft chicken tacos
update pref_Gm_Wgt set Gm_Wgt = 220.0 where NDB_No = 21487;
select Gm_Wgt, Amount, Msre_Desc from pref_Gm_Wgt where NDB_No = 21487;
-- List the USDA-defined serving units for doughnuts, NDB_No = 18255
select * from weight where NDB_No = 18255;
-- Show the preferred serving for NDB_No = 18255
select * from pref_Gm_Wgt where NDB_No = 18255;
-- The second column of a weight record, Seq, controls which serving unit is
-- preferred. Set Seq = 0 to make "jumbo" (Seq = 5) the preferred serving unit.
-- (The previous Seq = 0, if there is one, will be moved out of the
-- way by a "trigger".)
update weight set Seq = 0 where NDB_No = 18255 and Seq = 5;
select * from pref_Gm_Wgt where NDB_No = 18255;
-- See all the nutrients in soft chicken tacos at the preferred weight
select * from view_foods where NDB_No = 21487;
-- See selected nutrients in doughnuts at the preferred weight
select * from view_foods where NDB_No = 18255 and
NutrDesc in ('Calories', 'Protein', 'Non-Fiber Carb', 'Total Fat');
-- RECORD MEALS
-- Set the current meal to April 1, 2017 meal #1
update options set currentmeal = 2017040101;
-- Insert a food into the current meal at the preferred weight with no portion
-- control.
insert into currentmeal values (99051, null, null);
-- Insert a food into the current meal with portion control for Panto. Acid.
insert into currentmeal values (99051, null, 'Panto. Acid');
-- Insert 90 grams of sardines into the current meal
insert into currentmeal values (15088, 90, null);
-- Update weight of sardines in the current meal to 2.5 ounces
uodate currentmeal set Gm_Wgt = 2.5 * 28.35 where NDB_No = 15088;
-- Update Amount of sardines in the current meal to 4 sardines
update pref_Gm_Wgt set Amount = 4 where NDB_No = 15088;
-- Delete a food from the current meal
delete from currentmeal where NDB_No = 99051;
-- CUSTOMARY MEALS AKA theusual
-- Insert customary meal 'Breakfast' into currentmeal
insert into currentmeal select NDB_No, Gm_Wgt, NutrDesc from theusual
where meal_name = 'Breakfast';
-- Save currentmeal as customary meal called 'Keto Chicken'
insert into theusual values ('Keto Chicken', null, null, null);
-- Delete a customary meal named 'FrankenFood'
delete from theusual where meal_name = 'FrankenFood';
-- MEAL ANALYSIS
-- See an analysis where the Calories are coming from in your meals
select * from nut_in_meals where NutrDesc = 'Calories';
-- See the previous in terms of percent of Daily Value
select * from nutdv_in_meals where NutrDesc = 'Calories';
-- See your average daily food consumption during the analysis period
select * from daily_food;
-- Show the nutrient name and percent of the Daily Value for the nutrients
-- for which you have not achieved the DV during the analysis period
select NutrDesc, dvpct_offset + 100 from am_analysis natural join am_dv natural join nutr_def where dvpct_offset < 0.0;
-- Show your average intake of the amino acid Glycine
select Nutr_Val from am_analysis natural join nutr_def
where NutrDesc = 'Glycine';
-- WEIGHT LOG
-- View the weight log
select * from wlog;
-- Insert today's weight and bodyfat percentage measurements into the
-- weight log.
insert into wlog values (144.1, 14.1, null, null);
-- View an expanded version of the weight log that presents the date of
-- measurement, the weight, the bodyfat percentage, the total lean mass,
-- the total fat mass, a body composition index where higher is better,
-- and the cleardate for the entry (if it has been cleared).
select * from wlview;
-- View a summary of the uncleared part of the weight log
select * from wlsummary;
-- Clear the weight log (only when not using the Calorie Auto-Set feature)
insert into wlsummary select 'clear';
-- Enable the Calorie Auto-Set feature which, based on daily measurements,
-- attempts to achieve a calorie level which allows both lean mass gain and
-- fat mass loss, and then clears the weight log and starts another cycle.
update options set autocal = 2;
--
-- Senorita SQL has returned to offer a benediction on our examples.
-- Senorita, what would be the ultimate example?
-- Senorita SQL: Let's ask the question "What is the most nutritious food in
-- the database?" It's a complicated question, but we can start just by listing
-- all the foods:
bigNUT> select NDB_No, Long_Desc from food_des limit 10;
1001|Butter, salted
1002|Butter, whipped, with salt
1003|Butter oil, anhydrous
1004|Cheese, blue
1005|Cheese, brick
1006|Cheese, brie
1007|Cheese, camembert
1008|Cheese, caraway
1009|Cheese, cheddar
1010|Cheese, cheshire
-- As before, we will use a limit clause so we can get an idea of the output
-- without a lot of scrolling. Let's define "most nutritious" first.
-- Wouldn't it be a food that meets as many of the daily values as possible
-- in a single food? Let's use the "dv_default" field of the table nutr_def
-- as a standard, but exclude the macronutrients, protein, fat, and carbs:
bigNUT> select NDB_No, Long_Desc, Nutr_No, NutrDesc, dv_default
...> from food_des join nutr_def
...> where dv_default > 0.0
...> and NutrDesc not in ('Calories', 'Protein', 'Total Fat',
...> 'Total Carb', 'Non-Fiber Carb', 'Fiber', 'Sat Fat', 'Mono Fat',
...> 'Poly Fat', 'Omega-6', 'LA', 'AA', 'Omega-3', 'ALA', 'EPA',
...> 'DHA', 'Cholesterol')
...> limit 10;
1001|Butter, salted|301|Calcium|1000.0
1002|Butter, whipped, with salt|301|Calcium|1000.0
1003|Butter oil, anhydrous|301|Calcium|1000.0
1004|Cheese, blue|301|Calcium|1000.0
1005|Cheese, brick|301|Calcium|1000.0
1006|Cheese, brie|301|Calcium|1000.0
1007|Cheese, camembert|301|Calcium|1000.0
1008|Cheese, caraway|301|Calcium|1000.0
1009|Cheese, cheddar|301|Calcium|1000.0
1010|Cheese, cheshire|301|Calcium|1000.0
-- A good start, but let's repeat the previous ordered by food so we see
-- if we are getting more nutrients than just Calcium:
bigNUT> select NDB_No, Long_Desc, Nutr_No, NutrDesc, dv_default
...> from food_des join nutr_def
...> where dv_default > 0.0
...> and NutrDesc not in ('Calories', 'Protein', 'Total Fat',
...> 'Total Carb', 'Non-Fiber Carb', 'Fiber', 'Sat Fat', 'Mono Fat',
...> 'Poly Fat', 'Omega-6', 'LA', 'AA', 'Omega-3', 'ALA', 'EPA',
...> 'DHA', 'Cholesterol')
...> order by NDB_No limit 10;
1001|Butter, salted|301|Calcium|1000.0
1001|Butter, salted|303|Iron|18.0
1001|Butter, salted|304|Magnesium|400.0
1001|Butter, salted|305|Phosphorus|1000.0
1001|Butter, salted|306|Potassium|3500.0
1001|Butter, salted|307|Sodium|2400.0
1001|Butter, salted|309|Zinc|15.0
1001|Butter, salted|312|Copper|2.0
1001|Butter, salted|315|Manganese|2.0
1001|Butter, salted|317|Selenium|70.0
-- Remember how we add the nutrient values from nut_data?
bigNUT> select NDB_No, Long_Desc, Nutr_No, NutrDesc,
...> dv_default, Nutr_Val
...> from food_des join nutr_def natural join nut_data
...> where dv_default > 0.0
...> and NutrDesc not in ('Calories', 'Protein', 'Total Fat',
...> 'Total Carb', 'Non-Fiber Carb', 'Fiber', 'Sat Fat', 'Mono Fat',
...> 'Poly Fat', 'Omega-6', 'LA', 'AA', 'Omega-3', 'ALA', 'EPA',
...> 'DHA', 'Cholesterol')
...> order by NDB_No limit 10;
1001|Butter, salted|301|Calcium|1000.0|24.0
1001|Butter, salted|303|Iron|18.0|0.02
1001|Butter, salted|304|Magnesium|400.0|2.0
1001|Butter, salted|305|Phosphorus|1000.0|24.0
1001|Butter, salted|306|Potassium|3500.0|24.0
1001|Butter, salted|307|Sodium|2400.0|643.0
1001|Butter, salted|309|Zinc|15.0|0.09
1001|Butter, salted|312|Copper|2.0|0.0
1001|Butter, salted|315|Manganese|2.0|0.0
1001|Butter, salted|317|Selenium|70.0|1.0
-- Well, this time the join was easier! We used a natural join which means
-- there is only one record in nut_data which will correspond to the NDB_No
-- and Nutr_No of the original record, so attach it!
-- Now let's create a new column, a nutrient index which is the Nutr_Val
-- divided by the dv_default. In other words, how many DVs are there in
-- 100 grams of this food?
bigNUT> select NDB_No, Long_Desc, Nutr_No, NutrDesc,
...> Nutr_Val / dv_default as nutindex
...> from food_des join nutr_def natural join nut_data
...> where dv_default > 0.0
...> and NutrDesc not in ('Calories', 'Protein', 'Total Fat',
...> 'Total Carb', 'Non-Fiber Carb', 'Fiber', 'Sat Fat', 'Mono Fat',
...> 'Poly Fat', 'Omega-6', 'LA', 'AA', 'Omega-3', 'ALA', 'EPA',
...> 'DHA', 'Cholesterol')
...> order by NDB_No limit 10;
1001|Butter, salted|301|Calcium|0.024
1001|Butter, salted|303|Iron|0.00111111111111111
1001|Butter, salted|304|Magnesium|0.005
1001|Butter, salted|305|Phosphorus|0.024
1001|Butter, salted|306|Potassium|0.00685714285714286
1001|Butter, salted|307|Sodium|0.267916666666667
1001|Butter, salted|309|Zinc|0.006
1001|Butter, salted|312|Copper|0.0
1001|Butter, salted|315|Manganese|0.0
1001|Butter, salted|317|Selenium|0.0142857142857143
-- Now let's sum the nutrient indices by food and see what comes out on top!
bigNUT> select NDB_No, Long_Desc, sum(Nutr_Val / dv_default) as nutindex
...> from food_des join nutr_def natural join nut_data
...> where dv_default > 0.0
...> and NutrDesc not in ('Calories', 'Protein', 'Total Fat',
...> 'Total Carb', 'Non-Fiber Carb', 'Fiber', 'Sat Fat', 'Mono Fat',
...> 'Poly Fat', 'Omega-6', 'LA', 'AA', 'Omega-3', 'ALA', 'EPA',
...> 'DHA', 'Cholesterol')
...> group by NDB_No order by nutindex desc limit 1;
23424|Beef, New Zealand, imported, variety meats and by-products liver, cooked, boiled|210.575222197513
-- Thank you, Senorita. See you next time!
|