[{"data":1,"prerenderedAt":4560},["ShallowReactive",2],{"post:\u002Fposts\u002Fmysql\u002Fmysql-learning-03":3,"posts:ordered":4270},{"id":4,"title":5,"body":6,"category":4254,"cover":4255,"date":4256,"description":4257,"extension":4258,"featured":4259,"meta":4260,"navigation":371,"path":4261,"seo":4262,"series":4263,"seriesOrder":368,"stem":4264,"tags":4265,"__hash__":4269},"posts\u002Fposts\u002Fmysql\u002Fmysql-learning-03.md","MySQL 学习笔记 03：聚合、分组与输出控制",{"type":7,"value":8,"toc":4217},"minimark",[9,16,21,26,31,212,216,303,306,310,314,379,422,486,524,604,674,677,719,721,725,785,855,941,944,957,959,963,1052,1055,1065,1067,1071,1116,1126,1129,1178,1181,1221,1224,1232,1234,1238,1320,1322,1340,1342,1346,1350,1400,1477,1480,1486,1491,1555,1558,1604,1609,1611,1615,1689,1764,1767,1783,1786,1843,1845,1849,1972,1974,1994,1996,2000,2127,2129,2150,2222,2224,2228,2234,2282,2285,2338,2340,2344,2348,2421,2488,2490,2508,2510,2514,2599,2601,2609,2611,2615,2689,2692,2743,2746,2820,2822,2826,2856,2866,2869,2922,2924,2928,2931,2966,2981,3054,3057,3071,3073,3077,3132,3135,3175,3178,3184,3187,3210,3212,3216,3238,3241,3253,3256,3287,3289,3303,3305,3309,3312,3366,3369,3375,3378,3467,3469,3473,3477,3572,3574,3578,3769,3771,3800,3802,3806,3950,3952,3963,3965,3969,4076,4078,4094,4096,4100,4202,4205,4211,4213],[10,11,12],"blockquote",{},[13,14,15],"p",{},"本文是《SQL 学习笔记》系列的一篇：示例数据和 SQL 都是我整理并在 MySQL 8 上跑过的，讲解部分按自己的理解写的。",[17,18,20],"h1",{"id":19},"_6-聚合分组与输出控制","6 聚合、分组与输出控制",[22,23,25],"h2",{"id":24},"_60-示例数据","6.0 示例数据",[27,28,30],"h3",{"id":29},"customers-表","Customers 表",[32,33,34,60],"table",{},[35,36,37],"thead",{},[38,39,40,45,48,51,54,57],"tr",{},[41,42,44],"th",{"align":43},"right","Id",[41,46,47],{},"Name",[41,49,50],{},"CountryCode",[41,52,53],{"align":43},"Age",[41,55,56],{},"Category",[41,58,59],{},"Email",[61,62,63,88,108,130,152,169,190],"tbody",{},[38,64,65,69,72,75,78,81],{},[66,67,68],"td",{"align":43},"1",[66,70,71],{},"Chia",[66,73,74],{},"CN",[66,76,77],{"align":43},"22",[66,79,80],{},"A",[66,82,83],{},[84,85,87],"a",{"href":86},"mailto:chia@example.com","chia@example.com",[38,89,90,93,96,99,102,105],{},[66,91,92],{"align":43},"2",[66,94,95],{},"Tom",[66,97,98],{},"ML",[66,100,101],{"align":43},"18",[66,103,104],{},"B",[66,106,107],{},"NULL",[38,109,110,113,116,119,122,124],{},[66,111,112],{"align":43},"3",[66,114,115],{},"Alice",[66,117,118],{},"IND",[66,120,121],{"align":43},"25",[66,123,80],{},[66,125,126],{},[84,127,129],{"href":128},"mailto:alice@example.com","alice@example.com",[38,131,132,135,138,140,143,146],{},[66,133,134],{"align":43},"4",[66,136,137],{},"Bob",[66,139,74],{},[66,141,142],{"align":43},"17",[66,144,145],{},"C",[66,147,148],{},[84,149,151],{"href":150},"mailto:bob@example.com","bob@example.com",[38,153,154,157,160,162,165,167],{},[66,155,156],{"align":43},"5",[66,158,159],{},"Chen",[66,161,74],{},[66,163,164],{"align":43},"30",[66,166,80],{},[66,168,107],{},[38,170,171,174,177,179,182,184],{},[66,172,173],{"align":43},"6",[66,175,176],{},"Anna",[66,178,118],{},[66,180,181],{"align":43},"28",[66,183,104],{},[66,185,186],{},[84,187,189],{"href":188},"mailto:anna@example.com","anna@example.com",[38,191,192,195,198,201,204,206],{},[66,193,194],{"align":43},"7",[66,196,197],{},"Mike",[66,199,200],{},"US",[66,202,203],{"align":43},"35",[66,205,145],{},[66,207,208],{},[84,209,211],{"href":210},"mailto:mike@example.com","mike@example.com",[27,213,215],{"id":214},"orders-表","Orders 表",[32,217,218,231],{},[35,219,220],{},[38,221,222,225,228],{},[41,223,224],{"align":43},"OrderId",[41,226,227],{"align":43},"CustId",[41,229,230],{"align":43},"Amount",[61,232,233,243,253,263,273,283,293],{},[38,234,235,238,240],{},[66,236,237],{"align":43},"1001",[66,239,68],{"align":43},[66,241,242],{"align":43},"99",[38,244,245,248,250],{},[66,246,247],{"align":43},"1002",[66,249,112],{"align":43},[66,251,252],{"align":43},"150",[38,254,255,258,260],{},[66,256,257],{"align":43},"1003",[66,259,68],{"align":43},[66,261,262],{"align":43},"200",[38,264,265,268,270],{},[66,266,267],{"align":43},"1004",[66,269,156],{"align":43},[66,271,272],{"align":43},"50",[38,274,275,278,280],{},[66,276,277],{"align":43},"1005",[66,279,173],{"align":43},[66,281,282],{"align":43},"300",[38,284,285,288,290],{},[66,286,287],{"align":43},"1006",[66,289,68],{"align":43},[66,291,292],{"align":43},"20",[38,294,295,298,300],{},[66,296,297],{"align":43},"1007",[66,299,173],{"align":43},[66,301,302],{"align":43},"80",[304,305],"hr",{},[22,307,309],{"id":308},"_61-聚合函数与-group-by","6.1 聚合函数与 GROUP BY",[27,311,313],{"id":312},"_611-常用聚合函数","6.1.1 常用聚合函数",[315,316,321],"pre",{"className":317,"code":318,"language":319,"meta":320,"style":320},"language-sql shiki shiki-themes github-light github-dark","-- 统计总行数\nSELECT COUNT(*) AS Total FROM Customers;\n\n-- 结果：7\n","sql","",[322,323,324,333,366,373],"code",{"__ignoreMap":320},[325,326,329],"span",{"class":327,"line":328},"line",1,[325,330,332],{"class":331},"sJ8bj","-- 统计总行数\n",[325,334,336,340,344,348,351,354,357,360,363],{"class":327,"line":335},2,[325,337,339],{"class":338},"szBVR","SELECT",[325,341,343],{"class":342},"sj4cs"," COUNT",[325,345,347],{"class":346},"sVt8B","(",[325,349,350],{"class":338},"*",[325,352,353],{"class":346},") ",[325,355,356],{"class":338},"AS",[325,358,359],{"class":346}," Total ",[325,361,362],{"class":338},"FROM",[325,364,365],{"class":346}," Customers;\n",[325,367,369],{"class":327,"line":368},3,[325,370,372],{"emptyLinePlaceholder":371},true,"\n",[325,374,376],{"class":327,"line":375},4,[325,377,378],{"class":331},"-- 结果：7\n",[315,380,382],{"className":317,"code":381,"language":319,"meta":320,"style":320},"-- COUNT(Email) 只统计 Email 非 NULL 的行\nSELECT COUNT(Email) AS EmailCount FROM Customers;\n\n-- 结果：5\n-- Tom、Chen 的 Email 为 NULL，不计数\n",[322,383,384,389,407,411,416],{"__ignoreMap":320},[325,385,386],{"class":327,"line":328},[325,387,388],{"class":331},"-- COUNT(Email) 只统计 Email 非 NULL 的行\n",[325,390,391,393,395,398,400,403,405],{"class":327,"line":335},[325,392,339],{"class":338},[325,394,343],{"class":342},[325,396,397],{"class":346},"(Email) ",[325,399,356],{"class":338},[325,401,402],{"class":346}," EmailCount ",[325,404,362],{"class":338},[325,406,365],{"class":346},[325,408,409],{"class":327,"line":368},[325,410,372],{"emptyLinePlaceholder":371},[325,412,413],{"class":327,"line":375},[325,414,415],{"class":331},"-- 结果：5\n",[325,417,419],{"class":327,"line":418},5,[325,420,421],{"class":331},"-- Tom、Chen 的 Email 为 NULL，不计数\n",[315,423,425],{"className":317,"code":424,"language":319,"meta":320,"style":320},"-- COUNT(*) 包含 NULL；COUNT(列) 忽略 NULL\nSELECT COUNT(*) AS Total, COUNT(Email) AS EmailCount\nFROM Customers;\n\n-- 结果：\n-- Total = 7\n-- EmailCount = 5\n",[322,426,427,432,459,465,469,474,480],{"__ignoreMap":320},[325,428,429],{"class":327,"line":328},[325,430,431],{"class":331},"-- COUNT(*) 包含 NULL；COUNT(列) 忽略 NULL\n",[325,433,434,436,438,440,442,444,446,449,452,454,456],{"class":327,"line":335},[325,435,339],{"class":338},[325,437,343],{"class":342},[325,439,347],{"class":346},[325,441,350],{"class":338},[325,443,353],{"class":346},[325,445,356],{"class":338},[325,447,448],{"class":346}," Total, ",[325,450,451],{"class":342},"COUNT",[325,453,397],{"class":346},[325,455,356],{"class":338},[325,457,458],{"class":346}," EmailCount\n",[325,460,461,463],{"class":327,"line":368},[325,462,362],{"class":338},[325,464,365],{"class":346},[325,466,467],{"class":327,"line":375},[325,468,372],{"emptyLinePlaceholder":371},[325,470,471],{"class":327,"line":418},[325,472,473],{"class":331},"-- 结果：\n",[325,475,477],{"class":327,"line":476},6,[325,478,479],{"class":331},"-- Total = 7\n",[325,481,483],{"class":327,"line":482},7,[325,484,485],{"class":331},"-- EmailCount = 5\n",[315,487,489],{"className":317,"code":488,"language":319,"meta":320,"style":320},"-- 求平均年龄\nSELECT AVG(Age) AS AvgAge FROM Customers;\n\n-- 结果：25\n",[322,490,491,496,515,519],{"__ignoreMap":320},[325,492,493],{"class":327,"line":328},[325,494,495],{"class":331},"-- 求平均年龄\n",[325,497,498,500,503,506,508,511,513],{"class":327,"line":335},[325,499,339],{"class":338},[325,501,502],{"class":342}," AVG",[325,504,505],{"class":346},"(Age) ",[325,507,356],{"class":338},[325,509,510],{"class":346}," AvgAge ",[325,512,362],{"class":338},[325,514,365],{"class":346},[325,516,517],{"class":327,"line":368},[325,518,372],{"emptyLinePlaceholder":371},[325,520,521],{"class":327,"line":375},[325,522,523],{"class":331},"-- 结果：25\n",[315,525,527],{"className":317,"code":526,"language":319,"meta":320,"style":320},"-- SUM、MIN、MAX\nSELECT SUM(Age) AS SumAge,\n       MIN(Age) AS MinAge,\n       MAX(Age) AS MaxAge\nFROM Customers;\n\n-- 结果：\n-- SumAge = 175\n-- MinAge = 17\n-- MaxAge = 35\n",[322,528,529,534,548,560,572,578,582,586,592,598],{"__ignoreMap":320},[325,530,531],{"class":327,"line":328},[325,532,533],{"class":331},"-- SUM、MIN、MAX\n",[325,535,536,538,541,543,545],{"class":327,"line":335},[325,537,339],{"class":338},[325,539,540],{"class":342}," SUM",[325,542,505],{"class":346},[325,544,356],{"class":338},[325,546,547],{"class":346}," SumAge,\n",[325,549,550,553,555,557],{"class":327,"line":368},[325,551,552],{"class":342},"       MIN",[325,554,505],{"class":346},[325,556,356],{"class":338},[325,558,559],{"class":346}," MinAge,\n",[325,561,562,565,567,569],{"class":327,"line":375},[325,563,564],{"class":342},"       MAX",[325,566,505],{"class":346},[325,568,356],{"class":338},[325,570,571],{"class":346}," MaxAge\n",[325,573,574,576],{"class":327,"line":418},[325,575,362],{"class":338},[325,577,365],{"class":346},[325,579,580],{"class":327,"line":476},[325,581,372],{"emptyLinePlaceholder":371},[325,583,584],{"class":327,"line":482},[325,585,473],{"class":331},[325,587,589],{"class":327,"line":588},8,[325,590,591],{"class":331},"-- SumAge = 175\n",[325,593,595],{"class":327,"line":594},9,[325,596,597],{"class":331},"-- MinAge = 17\n",[325,599,601],{"class":327,"line":600},10,[325,602,603],{"class":331},"-- MaxAge = 35\n",[315,605,607],{"className":317,"code":606,"language":319,"meta":320,"style":320},"-- COUNT(DISTINCT 列) 统计不同值的数量\nSELECT COUNT(DISTINCT CountryCode) AS CountryNum,\n       COUNT(DISTINCT Category) AS CategoryNum\nFROM Customers;\n\n-- 结果：\n-- CountryNum = 4\n-- CategoryNum = 3\n",[322,608,609,614,633,650,656,660,664,669],{"__ignoreMap":320},[325,610,611],{"class":327,"line":328},[325,612,613],{"class":331},"-- COUNT(DISTINCT 列) 统计不同值的数量\n",[325,615,616,618,620,622,625,628,630],{"class":327,"line":335},[325,617,339],{"class":338},[325,619,343],{"class":342},[325,621,347],{"class":346},[325,623,624],{"class":338},"DISTINCT",[325,626,627],{"class":346}," CountryCode) ",[325,629,356],{"class":338},[325,631,632],{"class":346}," CountryNum,\n",[325,634,635,638,640,642,645,647],{"class":327,"line":368},[325,636,637],{"class":342},"       COUNT",[325,639,347],{"class":346},[325,641,624],{"class":338},[325,643,644],{"class":346}," Category) ",[325,646,356],{"class":338},[325,648,649],{"class":346}," CategoryNum\n",[325,651,652,654],{"class":327,"line":375},[325,653,362],{"class":338},[325,655,365],{"class":346},[325,657,658],{"class":327,"line":418},[325,659,372],{"emptyLinePlaceholder":371},[325,661,662],{"class":327,"line":476},[325,663,473],{"class":331},[325,665,666],{"class":327,"line":482},[325,667,668],{"class":331},"-- CountryNum = 4\n",[325,670,671],{"class":327,"line":588},[325,672,673],{"class":331},"-- CategoryNum = 3\n",[13,675,676],{},"注释：",[678,679,680,687,693,703,713],"ul",{},[681,682,683,686],"li",{},[322,684,685],{},"COUNT(*)"," 统计行数，包括 NULL。",[681,688,689,692],{},[322,690,691],{},"COUNT(column)"," 统计该列非 NULL 的行数。",[681,694,695,698,699,702],{},[322,696,697],{},"AVG(column)","、",[322,700,701],{},"SUM(column)"," 通常忽略 NULL。",[681,704,705,708,709,712],{},[322,706,707],{},"SUM"," 如果所有行都是 NULL，结果可能是 NULL，不是 0；必要时用 ",[322,710,711],{},"COALESCE(SUM(...), 0)","。",[681,714,715,718],{},[322,716,717],{},"COUNT(DISTINCT column)"," 用于统计去重后的数量。",[304,720],{},[27,722,724],{"id":723},"_612-group-by-单列分组","6.1.2 GROUP BY 单列分组",[315,726,728],{"className":317,"code":727,"language":319,"meta":320,"style":320},"-- 查询有哪些国家\nSELECT CountryCode\nFROM Customers\nGROUP BY CountryCode;\n\n-- 结果：\n-- CN\n-- ML\n-- IND\n-- US\n",[322,729,730,735,742,749,757,761,765,770,775,780],{"__ignoreMap":320},[325,731,732],{"class":327,"line":328},[325,733,734],{"class":331},"-- 查询有哪些国家\n",[325,736,737,739],{"class":327,"line":335},[325,738,339],{"class":338},[325,740,741],{"class":346}," CountryCode\n",[325,743,744,746],{"class":327,"line":368},[325,745,362],{"class":338},[325,747,748],{"class":346}," Customers\n",[325,750,751,754],{"class":327,"line":375},[325,752,753],{"class":338},"GROUP BY",[325,755,756],{"class":346}," CountryCode;\n",[325,758,759],{"class":327,"line":418},[325,760,372],{"emptyLinePlaceholder":371},[325,762,763],{"class":327,"line":476},[325,764,473],{"class":331},[325,766,767],{"class":327,"line":482},[325,768,769],{"class":331},"-- CN\n",[325,771,772],{"class":327,"line":588},[325,773,774],{"class":331},"-- ML\n",[325,776,777],{"class":327,"line":594},[325,778,779],{"class":331},"-- IND\n",[325,781,782],{"class":327,"line":600},[325,783,784],{"class":331},"-- US\n",[315,786,788],{"className":317,"code":787,"language":319,"meta":320,"style":320},"-- 每个国家的客户数\nSELECT CountryCode, COUNT(*) AS Num\nFROM Customers\nGROUP BY CountryCode;\n\n-- 结果：\n-- CN   3\n-- ML   1\n-- IND  2\n-- US   1\n",[322,789,790,795,815,821,827,831,835,840,845,850],{"__ignoreMap":320},[325,791,792],{"class":327,"line":328},[325,793,794],{"class":331},"-- 每个国家的客户数\n",[325,796,797,799,802,804,806,808,810,812],{"class":327,"line":335},[325,798,339],{"class":338},[325,800,801],{"class":346}," CountryCode, ",[325,803,451],{"class":342},[325,805,347],{"class":346},[325,807,350],{"class":338},[325,809,353],{"class":346},[325,811,356],{"class":338},[325,813,814],{"class":346}," Num\n",[325,816,817,819],{"class":327,"line":368},[325,818,362],{"class":338},[325,820,748],{"class":346},[325,822,823,825],{"class":327,"line":375},[325,824,753],{"class":338},[325,826,756],{"class":346},[325,828,829],{"class":327,"line":418},[325,830,372],{"emptyLinePlaceholder":371},[325,832,833],{"class":327,"line":476},[325,834,473],{"class":331},[325,836,837],{"class":327,"line":482},[325,838,839],{"class":331},"-- CN   3\n",[325,841,842],{"class":327,"line":588},[325,843,844],{"class":331},"-- ML   1\n",[325,846,847],{"class":327,"line":594},[325,848,849],{"class":331},"-- IND  2\n",[325,851,852],{"class":327,"line":600},[325,853,854],{"class":331},"-- US   1\n",[315,856,858],{"className":317,"code":857,"language":319,"meta":320,"style":320},"-- 每个国家的客户数和平均年龄\nSELECT CountryCode,\n       COUNT(*) AS Num,\n       AVG(Age) AS AvgAge\nFROM Customers\nGROUP BY CountryCode;\n\n-- 结果：\n-- CN   3  23.0\n-- ML   1  18.0\n-- IND  2  26.5\n-- US   1  35.0\n",[322,859,860,865,872,887,899,905,911,915,919,924,929,935],{"__ignoreMap":320},[325,861,862],{"class":327,"line":328},[325,863,864],{"class":331},"-- 每个国家的客户数和平均年龄\n",[325,866,867,869],{"class":327,"line":335},[325,868,339],{"class":338},[325,870,871],{"class":346}," CountryCode,\n",[325,873,874,876,878,880,882,884],{"class":327,"line":368},[325,875,637],{"class":342},[325,877,347],{"class":346},[325,879,350],{"class":338},[325,881,353],{"class":346},[325,883,356],{"class":338},[325,885,886],{"class":346}," Num,\n",[325,888,889,892,894,896],{"class":327,"line":375},[325,890,891],{"class":342},"       AVG",[325,893,505],{"class":346},[325,895,356],{"class":338},[325,897,898],{"class":346}," AvgAge\n",[325,900,901,903],{"class":327,"line":418},[325,902,362],{"class":338},[325,904,748],{"class":346},[325,906,907,909],{"class":327,"line":476},[325,908,753],{"class":338},[325,910,756],{"class":346},[325,912,913],{"class":327,"line":482},[325,914,372],{"emptyLinePlaceholder":371},[325,916,917],{"class":327,"line":588},[325,918,473],{"class":331},[325,920,921],{"class":327,"line":594},[325,922,923],{"class":331},"-- CN   3  23.0\n",[325,925,926],{"class":327,"line":600},[325,927,928],{"class":331},"-- ML   1  18.0\n",[325,930,932],{"class":327,"line":931},11,[325,933,934],{"class":331},"-- IND  2  26.5\n",[325,936,938],{"class":327,"line":937},12,[325,939,940],{"class":331},"-- US   1  35.0\n",[13,942,943],{},"作用：",[678,945,946,951,954],{},[681,947,948,950],{},[322,949,753],{}," 把相同值的行归为一组。",[681,952,953],{},"每组只返回一行。",[681,955,956],{},"聚合函数对每一组进行计算。",[304,958],{},[27,960,962],{"id":961},"_613-group-by-多列分组","6.1.3 GROUP BY 多列分组",[315,964,966],{"className":317,"code":965,"language":319,"meta":320,"style":320},"-- 按国家和类别分组\nSELECT CountryCode, Category, COUNT(*) AS Num\nFROM Customers\nGROUP BY CountryCode, Category\nORDER BY CountryCode, Category;\n\n-- 结果：\n-- CN   A  2\n-- CN   C  1\n-- IND  A  1\n-- IND  B  1\n-- ML   B  1\n-- US   C  1\n",[322,967,968,973,992,998,1005,1013,1017,1021,1026,1031,1036,1041,1046],{"__ignoreMap":320},[325,969,970],{"class":327,"line":328},[325,971,972],{"class":331},"-- 按国家和类别分组\n",[325,974,975,977,980,982,984,986,988,990],{"class":327,"line":335},[325,976,339],{"class":338},[325,978,979],{"class":346}," CountryCode, Category, ",[325,981,451],{"class":342},[325,983,347],{"class":346},[325,985,350],{"class":338},[325,987,353],{"class":346},[325,989,356],{"class":338},[325,991,814],{"class":346},[325,993,994,996],{"class":327,"line":368},[325,995,362],{"class":338},[325,997,748],{"class":346},[325,999,1000,1002],{"class":327,"line":375},[325,1001,753],{"class":338},[325,1003,1004],{"class":346}," CountryCode, Category\n",[325,1006,1007,1010],{"class":327,"line":418},[325,1008,1009],{"class":338},"ORDER BY",[325,1011,1012],{"class":346}," CountryCode, Category;\n",[325,1014,1015],{"class":327,"line":476},[325,1016,372],{"emptyLinePlaceholder":371},[325,1018,1019],{"class":327,"line":482},[325,1020,473],{"class":331},[325,1022,1023],{"class":327,"line":588},[325,1024,1025],{"class":331},"-- CN   A  2\n",[325,1027,1028],{"class":327,"line":594},[325,1029,1030],{"class":331},"-- CN   C  1\n",[325,1032,1033],{"class":327,"line":600},[325,1034,1035],{"class":331},"-- IND  A  1\n",[325,1037,1038],{"class":327,"line":931},[325,1039,1040],{"class":331},"-- IND  B  1\n",[325,1042,1043],{"class":327,"line":937},[325,1044,1045],{"class":331},"-- ML   B  1\n",[325,1047,1049],{"class":327,"line":1048},13,[325,1050,1051],{"class":331},"-- US   C  1\n",[13,1053,1054],{},"说明：",[678,1056,1057,1060],{},[681,1058,1059],{},"多列分组时，只有这些分组列的组合相同，才会被分到同一组。",[681,1061,1062,1064],{},[322,1063,1009],{}," 只是控制输出顺序，不影响分组。",[304,1066],{},[27,1068,1070],{"id":1069},"_614-select-中列与-group-by-的规则","6.1.4 SELECT 中列与 GROUP BY 的规则",[315,1072,1074],{"className":317,"code":1073,"language":319,"meta":320,"style":320},"-- 错误示例：Name 没有在 GROUP BY 中，也不是聚合函数\nSELECT CountryCode, Name, COUNT(*) AS Num\nFROM Customers\nGROUP BY CountryCode;\n",[322,1075,1076,1081,1104,1110],{"__ignoreMap":320},[325,1077,1078],{"class":327,"line":328},[325,1079,1080],{"class":331},"-- 错误示例：Name 没有在 GROUP BY 中，也不是聚合函数\n",[325,1082,1083,1085,1087,1089,1092,1094,1096,1098,1100,1102],{"class":327,"line":335},[325,1084,339],{"class":338},[325,1086,801],{"class":346},[325,1088,47],{"class":338},[325,1090,1091],{"class":346},", ",[325,1093,451],{"class":342},[325,1095,347],{"class":346},[325,1097,350],{"class":338},[325,1099,353],{"class":346},[325,1101,356],{"class":338},[325,1103,814],{"class":346},[325,1105,1106,1108],{"class":327,"line":368},[325,1107,362],{"class":338},[325,1109,748],{"class":346},[325,1111,1112,1114],{"class":327,"line":375},[325,1113,753],{"class":338},[325,1115,756],{"class":346},[13,1117,1118,1119,1122,1123,1125],{},"在启用 ",[322,1120,1121],{},"ONLY_FULL_GROUP_BY"," 的 MySQL 中会报错，因为一个国家有多个 ",[322,1124,47],{},"，数据库不知道要显示哪一个。",[13,1127,1128],{},"正确写法：",[315,1130,1132],{"className":317,"code":1131,"language":319,"meta":320,"style":320},"-- 如果要显示 Name，就要把 Name 也放进 GROUP BY\nSELECT CountryCode, Name, COUNT(*) AS Num\nFROM Customers\nGROUP BY CountryCode, Name;\n",[322,1133,1134,1139,1161,1167],{"__ignoreMap":320},[325,1135,1136],{"class":327,"line":328},[325,1137,1138],{"class":331},"-- 如果要显示 Name，就要把 Name 也放进 GROUP BY\n",[325,1140,1141,1143,1145,1147,1149,1151,1153,1155,1157,1159],{"class":327,"line":335},[325,1142,339],{"class":338},[325,1144,801],{"class":346},[325,1146,47],{"class":338},[325,1148,1091],{"class":346},[325,1150,451],{"class":342},[325,1152,347],{"class":346},[325,1154,350],{"class":338},[325,1156,353],{"class":346},[325,1158,356],{"class":338},[325,1160,814],{"class":346},[325,1162,1163,1165],{"class":327,"line":368},[325,1164,362],{"class":338},[325,1166,748],{"class":346},[325,1168,1169,1171,1173,1175],{"class":327,"line":375},[325,1170,753],{"class":338},[325,1172,801],{"class":346},[325,1174,47],{"class":338},[325,1176,1177],{"class":346},";\n",[13,1179,1180],{},"但通常更好的做法是：",[315,1182,1184],{"className":317,"code":1183,"language":319,"meta":320,"style":320},"-- 只显示分组列和聚合结果\nSELECT CountryCode, COUNT(*) AS Num\nFROM Customers\nGROUP BY CountryCode;\n",[322,1185,1186,1191,1209,1215],{"__ignoreMap":320},[325,1187,1188],{"class":327,"line":328},[325,1189,1190],{"class":331},"-- 只显示分组列和聚合结果\n",[325,1192,1193,1195,1197,1199,1201,1203,1205,1207],{"class":327,"line":335},[325,1194,339],{"class":338},[325,1196,801],{"class":346},[325,1198,451],{"class":342},[325,1200,347],{"class":346},[325,1202,350],{"class":338},[325,1204,353],{"class":346},[325,1206,356],{"class":338},[325,1208,814],{"class":346},[325,1210,1211,1213],{"class":327,"line":368},[325,1212,362],{"class":338},[325,1214,748],{"class":346},[325,1216,1217,1219],{"class":327,"line":375},[325,1218,753],{"class":338},[325,1220,756],{"class":346},[13,1222,1223],{},"规则：",[315,1225,1230],{"className":1226,"code":1228,"language":1229,"meta":320},[1227],"language-text","SELECT 中的列，要么出现在 GROUP BY 中，\n要么被聚合函数包起来。\n","text",[322,1231,1228],{"__ignoreMap":320},[304,1233],{},[27,1235,1237],{"id":1236},"_615-where-先过滤再-group-by","6.1.5 WHERE 先过滤，再 GROUP BY",[315,1239,1241],{"className":317,"code":1240,"language":319,"meta":320,"style":320},"-- 先过滤出年龄 >= 18 的客户，再按国家统计\nSELECT CountryCode, COUNT(*) AS Num\nFROM Customers\nWHERE Age >= 18\nGROUP BY CountryCode;\n\n-- 结果：\n-- CN   2   -- Chia 22、Chen 30\n-- ML   1   -- Tom 18\n-- IND  2   -- Alice 25、Anna 28\n-- US   1   -- Mike 35\n",[322,1242,1243,1248,1266,1272,1286,1292,1296,1300,1305,1310,1315],{"__ignoreMap":320},[325,1244,1245],{"class":327,"line":328},[325,1246,1247],{"class":331},"-- 先过滤出年龄 >= 18 的客户，再按国家统计\n",[325,1249,1250,1252,1254,1256,1258,1260,1262,1264],{"class":327,"line":335},[325,1251,339],{"class":338},[325,1253,801],{"class":346},[325,1255,451],{"class":342},[325,1257,347],{"class":346},[325,1259,350],{"class":338},[325,1261,353],{"class":346},[325,1263,356],{"class":338},[325,1265,814],{"class":346},[325,1267,1268,1270],{"class":327,"line":368},[325,1269,362],{"class":338},[325,1271,748],{"class":346},[325,1273,1274,1277,1280,1283],{"class":327,"line":375},[325,1275,1276],{"class":338},"WHERE",[325,1278,1279],{"class":346}," Age ",[325,1281,1282],{"class":338},">=",[325,1284,1285],{"class":342}," 18\n",[325,1287,1288,1290],{"class":327,"line":418},[325,1289,753],{"class":338},[325,1291,756],{"class":346},[325,1293,1294],{"class":327,"line":476},[325,1295,372],{"emptyLinePlaceholder":371},[325,1297,1298],{"class":327,"line":482},[325,1299,473],{"class":331},[325,1301,1302],{"class":327,"line":588},[325,1303,1304],{"class":331},"-- CN   2   -- Chia 22、Chen 30\n",[325,1306,1307],{"class":327,"line":594},[325,1308,1309],{"class":331},"-- ML   1   -- Tom 18\n",[325,1311,1312],{"class":327,"line":600},[325,1313,1314],{"class":331},"-- IND  2   -- Alice 25、Anna 28\n",[325,1316,1317],{"class":327,"line":931},[325,1318,1319],{"class":331},"-- US   1   -- Mike 35\n",[13,1321,676],{},[678,1323,1324,1329,1334],{},[681,1325,1326,1328],{},[322,1327,1276],{}," 在分组前过滤单行。",[681,1330,1331,1333],{},[322,1332,753],{}," 对剩下的行分组。",[681,1335,1336,1337,1339],{},"如果过滤条件不依赖聚合结果，优先用 ",[322,1338,1276],{},"，性能通常更好。",[304,1341],{},[22,1343,1345],{"id":1344},"_62-having","6.2 HAVING",[27,1347,1349],{"id":1348},"_621-where-与-having-的区别","6.2.1 WHERE 与 HAVING 的区别",[315,1351,1353],{"className":317,"code":1352,"language":319,"meta":320,"style":320},"-- WHERE 过滤单行：只保留年龄 >= 18 的客户\nSELECT CountryCode, COUNT(*) AS Num\nFROM Customers\nWHERE Age >= 18\nGROUP BY CountryCode;\n",[322,1354,1355,1360,1378,1384,1394],{"__ignoreMap":320},[325,1356,1357],{"class":327,"line":328},[325,1358,1359],{"class":331},"-- WHERE 过滤单行：只保留年龄 >= 18 的客户\n",[325,1361,1362,1364,1366,1368,1370,1372,1374,1376],{"class":327,"line":335},[325,1363,339],{"class":338},[325,1365,801],{"class":346},[325,1367,451],{"class":342},[325,1369,347],{"class":346},[325,1371,350],{"class":338},[325,1373,353],{"class":346},[325,1375,356],{"class":338},[325,1377,814],{"class":346},[325,1379,1380,1382],{"class":327,"line":368},[325,1381,362],{"class":338},[325,1383,748],{"class":346},[325,1385,1386,1388,1390,1392],{"class":327,"line":375},[325,1387,1276],{"class":338},[325,1389,1279],{"class":346},[325,1391,1282],{"class":338},[325,1393,1285],{"class":342},[325,1395,1396,1398],{"class":327,"line":418},[325,1397,753],{"class":338},[325,1399,756],{"class":346},[315,1401,1403],{"className":317,"code":1402,"language":319,"meta":320,"style":320},"-- HAVING 过滤分组：只保留客户数 > 1 的国家\nSELECT CountryCode, COUNT(*) AS Num\nFROM Customers\nGROUP BY CountryCode\nHAVING COUNT(*) > 1;\n\n-- 结果：\n-- CN   3\n-- IND  2\n",[322,1404,1405,1410,1428,1434,1440,1461,1465,1469,1473],{"__ignoreMap":320},[325,1406,1407],{"class":327,"line":328},[325,1408,1409],{"class":331},"-- HAVING 过滤分组：只保留客户数 > 1 的国家\n",[325,1411,1412,1414,1416,1418,1420,1422,1424,1426],{"class":327,"line":335},[325,1413,339],{"class":338},[325,1415,801],{"class":346},[325,1417,451],{"class":342},[325,1419,347],{"class":346},[325,1421,350],{"class":338},[325,1423,353],{"class":346},[325,1425,356],{"class":338},[325,1427,814],{"class":346},[325,1429,1430,1432],{"class":327,"line":368},[325,1431,362],{"class":338},[325,1433,748],{"class":346},[325,1435,1436,1438],{"class":327,"line":375},[325,1437,753],{"class":338},[325,1439,741],{"class":346},[325,1441,1442,1445,1447,1449,1451,1453,1456,1459],{"class":327,"line":418},[325,1443,1444],{"class":338},"HAVING",[325,1446,343],{"class":342},[325,1448,347],{"class":346},[325,1450,350],{"class":338},[325,1452,353],{"class":346},[325,1454,1455],{"class":338},">",[325,1457,1458],{"class":342}," 1",[325,1460,1177],{"class":346},[325,1462,1463],{"class":327,"line":476},[325,1464,372],{"emptyLinePlaceholder":371},[325,1466,1467],{"class":327,"line":482},[325,1468,473],{"class":331},[325,1470,1471],{"class":327,"line":588},[325,1472,839],{"class":331},[325,1474,1475],{"class":327,"line":594},[325,1476,849],{"class":331},[13,1478,1479],{},"记忆：",[315,1481,1484],{"className":1482,"code":1483,"language":1229,"meta":320},[1227],"WHERE  → 分组前过滤行，不能直接用聚合函数。\nHAVING → 分组后过滤组，通常包含聚合函数。\n",[322,1485,1483],{"__ignoreMap":320},[13,1487,1488,1490],{},[322,1489,1444],{}," 也可以使用分组列，例如：",[315,1492,1494],{"className":317,"code":1493,"language":319,"meta":320,"style":320},"SELECT CountryCode, COUNT(*) AS Num\nFROM Customers\nGROUP BY CountryCode\nHAVING CountryCode = 'CN';\n\n-- 结果：\n-- CN 3\n",[322,1495,1496,1514,1520,1526,1542,1546,1550],{"__ignoreMap":320},[325,1497,1498,1500,1502,1504,1506,1508,1510,1512],{"class":327,"line":328},[325,1499,339],{"class":338},[325,1501,801],{"class":346},[325,1503,451],{"class":342},[325,1505,347],{"class":346},[325,1507,350],{"class":338},[325,1509,353],{"class":346},[325,1511,356],{"class":338},[325,1513,814],{"class":346},[325,1515,1516,1518],{"class":327,"line":335},[325,1517,362],{"class":338},[325,1519,748],{"class":346},[325,1521,1522,1524],{"class":327,"line":368},[325,1523,753],{"class":338},[325,1525,741],{"class":346},[325,1527,1528,1530,1533,1536,1540],{"class":327,"line":375},[325,1529,1444],{"class":338},[325,1531,1532],{"class":346}," CountryCode ",[325,1534,1535],{"class":338},"=",[325,1537,1539],{"class":1538},"sZZnC"," 'CN'",[325,1541,1177],{"class":346},[325,1543,1544],{"class":327,"line":418},[325,1545,372],{"emptyLinePlaceholder":371},[325,1547,1548],{"class":327,"line":476},[325,1549,473],{"class":331},[325,1551,1552],{"class":327,"line":482},[325,1553,1554],{"class":331},"-- CN 3\n",[13,1556,1557],{},"但这种情况下，更推荐写成：",[315,1559,1561],{"className":317,"code":1560,"language":319,"meta":320,"style":320},"SELECT CountryCode, COUNT(*) AS Num\nFROM Customers\nWHERE CountryCode = 'CN'\nGROUP BY CountryCode;\n",[322,1562,1563,1581,1587,1598],{"__ignoreMap":320},[325,1564,1565,1567,1569,1571,1573,1575,1577,1579],{"class":327,"line":328},[325,1566,339],{"class":338},[325,1568,801],{"class":346},[325,1570,451],{"class":342},[325,1572,347],{"class":346},[325,1574,350],{"class":338},[325,1576,353],{"class":346},[325,1578,356],{"class":338},[325,1580,814],{"class":346},[325,1582,1583,1585],{"class":327,"line":335},[325,1584,362],{"class":338},[325,1586,748],{"class":346},[325,1588,1589,1591,1593,1595],{"class":327,"line":368},[325,1590,1276],{"class":338},[325,1592,1532],{"class":346},[325,1594,1535],{"class":338},[325,1596,1597],{"class":1538}," 'CN'\n",[325,1599,1600,1602],{"class":327,"line":375},[325,1601,753],{"class":338},[325,1603,756],{"class":346},[13,1605,1606,1607,712],{},"因为能提前过滤的行，不应该留到 ",[322,1608,1444],{},[304,1610],{},[27,1612,1614],{"id":1613},"_622-having-使用聚合条件","6.2.2 HAVING 使用聚合条件",[315,1616,1618],{"className":317,"code":1617,"language":319,"meta":320,"style":320},"-- 客户数大于 1 的国家\nSELECT CountryCode, COUNT(*) AS Num\nFROM Customers\nGROUP BY CountryCode\nHAVING COUNT(*) > 1;\n\n-- 结果：\n-- CN   3\n-- IND  2\n",[322,1619,1620,1625,1643,1649,1655,1673,1677,1681,1685],{"__ignoreMap":320},[325,1621,1622],{"class":327,"line":328},[325,1623,1624],{"class":331},"-- 客户数大于 1 的国家\n",[325,1626,1627,1629,1631,1633,1635,1637,1639,1641],{"class":327,"line":335},[325,1628,339],{"class":338},[325,1630,801],{"class":346},[325,1632,451],{"class":342},[325,1634,347],{"class":346},[325,1636,350],{"class":338},[325,1638,353],{"class":346},[325,1640,356],{"class":338},[325,1642,814],{"class":346},[325,1644,1645,1647],{"class":327,"line":368},[325,1646,362],{"class":338},[325,1648,748],{"class":346},[325,1650,1651,1653],{"class":327,"line":375},[325,1652,753],{"class":338},[325,1654,741],{"class":346},[325,1656,1657,1659,1661,1663,1665,1667,1669,1671],{"class":327,"line":418},[325,1658,1444],{"class":338},[325,1660,343],{"class":342},[325,1662,347],{"class":346},[325,1664,350],{"class":338},[325,1666,353],{"class":346},[325,1668,1455],{"class":338},[325,1670,1458],{"class":342},[325,1672,1177],{"class":346},[325,1674,1675],{"class":327,"line":476},[325,1676,372],{"emptyLinePlaceholder":371},[325,1678,1679],{"class":327,"line":482},[325,1680,473],{"class":331},[325,1682,1683],{"class":327,"line":588},[325,1684,839],{"class":331},[325,1686,1687],{"class":327,"line":594},[325,1688,849],{"class":331},[315,1690,1692],{"className":317,"code":1691,"language":319,"meta":320,"style":320},"-- 平均年龄大于 20 的国家\nSELECT CountryCode, AVG(Age) AS AvgAge\nFROM Customers\nGROUP BY CountryCode\nHAVING AVG(Age) > 20;\n\n-- 结果：\n-- CN   23.0\n-- IND  26.5\n-- US   35.0\n",[322,1693,1694,1699,1714,1720,1726,1741,1745,1749,1754,1759],{"__ignoreMap":320},[325,1695,1696],{"class":327,"line":328},[325,1697,1698],{"class":331},"-- 平均年龄大于 20 的国家\n",[325,1700,1701,1703,1705,1708,1710,1712],{"class":327,"line":335},[325,1702,339],{"class":338},[325,1704,801],{"class":346},[325,1706,1707],{"class":342},"AVG",[325,1709,505],{"class":346},[325,1711,356],{"class":338},[325,1713,898],{"class":346},[325,1715,1716,1718],{"class":327,"line":368},[325,1717,362],{"class":338},[325,1719,748],{"class":346},[325,1721,1722,1724],{"class":327,"line":375},[325,1723,753],{"class":338},[325,1725,741],{"class":346},[325,1727,1728,1730,1732,1734,1736,1739],{"class":327,"line":418},[325,1729,1444],{"class":338},[325,1731,502],{"class":342},[325,1733,505],{"class":346},[325,1735,1455],{"class":338},[325,1737,1738],{"class":342}," 20",[325,1740,1177],{"class":346},[325,1742,1743],{"class":327,"line":476},[325,1744,372],{"emptyLinePlaceholder":371},[325,1746,1747],{"class":327,"line":482},[325,1748,473],{"class":331},[325,1750,1751],{"class":327,"line":588},[325,1752,1753],{"class":331},"-- CN   23.0\n",[325,1755,1756],{"class":327,"line":594},[325,1757,1758],{"class":331},"-- IND  26.5\n",[325,1760,1761],{"class":327,"line":600},[325,1762,1763],{"class":331},"-- US   35.0\n",[13,1765,1766],{},"注意：",[678,1768,1769,1777],{},[681,1770,1771,1773,1774,712],{},[322,1772,1276],{}," 中不能写 ",[322,1775,1776],{},"WHERE COUNT(*) > 1",[681,1778,1779,1780,1782],{},"因为 ",[322,1781,1276],{}," 执行时还没有分组，也没有聚合结果。",[13,1784,1785],{},"错误示例：",[315,1787,1789],{"className":317,"code":1788,"language":319,"meta":320,"style":320},"SELECT CountryCode, COUNT(*) AS Num\nFROM Customers\nWHERE COUNT(*) > 1\nGROUP BY CountryCode;\n-- 通常报错：Invalid use of group function\n",[322,1790,1791,1809,1815,1832,1838],{"__ignoreMap":320},[325,1792,1793,1795,1797,1799,1801,1803,1805,1807],{"class":327,"line":328},[325,1794,339],{"class":338},[325,1796,801],{"class":346},[325,1798,451],{"class":342},[325,1800,347],{"class":346},[325,1802,350],{"class":338},[325,1804,353],{"class":346},[325,1806,356],{"class":338},[325,1808,814],{"class":346},[325,1810,1811,1813],{"class":327,"line":335},[325,1812,362],{"class":338},[325,1814,748],{"class":346},[325,1816,1817,1819,1821,1823,1825,1827,1829],{"class":327,"line":368},[325,1818,1276],{"class":338},[325,1820,343],{"class":342},[325,1822,347],{"class":346},[325,1824,350],{"class":338},[325,1826,353],{"class":346},[325,1828,1455],{"class":338},[325,1830,1831],{"class":342}," 1\n",[325,1833,1834,1836],{"class":327,"line":375},[325,1835,753],{"class":338},[325,1837,756],{"class":346},[325,1839,1840],{"class":327,"line":418},[325,1841,1842],{"class":331},"-- 通常报错：Invalid use of group function\n",[304,1844],{},[27,1846,1848],{"id":1847},"_623-having-带子查询","6.2.3 HAVING 带子查询",[315,1850,1852],{"className":317,"code":1851,"language":319,"meta":320,"style":320},"-- 找出客户数大于 IND 客户数的国家\nSELECT CountryCode, COUNT(*) AS Num\nFROM Customers\nGROUP BY CountryCode\nHAVING COUNT(*) > (\n    SELECT COUNT(*)\n    FROM Customers\n    WHERE CountryCode = 'IND'\n);\n\n-- IND 的客户数是 2\n-- 所以结果是客户数 > 2 的国家\n\n-- 结果：\n-- CN 3\n",[322,1853,1854,1859,1877,1883,1889,1906,1920,1927,1939,1944,1948,1953,1958,1962,1967],{"__ignoreMap":320},[325,1855,1856],{"class":327,"line":328},[325,1857,1858],{"class":331},"-- 找出客户数大于 IND 客户数的国家\n",[325,1860,1861,1863,1865,1867,1869,1871,1873,1875],{"class":327,"line":335},[325,1862,339],{"class":338},[325,1864,801],{"class":346},[325,1866,451],{"class":342},[325,1868,347],{"class":346},[325,1870,350],{"class":338},[325,1872,353],{"class":346},[325,1874,356],{"class":338},[325,1876,814],{"class":346},[325,1878,1879,1881],{"class":327,"line":368},[325,1880,362],{"class":338},[325,1882,748],{"class":346},[325,1884,1885,1887],{"class":327,"line":375},[325,1886,753],{"class":338},[325,1888,741],{"class":346},[325,1890,1891,1893,1895,1897,1899,1901,1903],{"class":327,"line":418},[325,1892,1444],{"class":338},[325,1894,343],{"class":342},[325,1896,347],{"class":346},[325,1898,350],{"class":338},[325,1900,353],{"class":346},[325,1902,1455],{"class":338},[325,1904,1905],{"class":346}," (\n",[325,1907,1908,1911,1913,1915,1917],{"class":327,"line":476},[325,1909,1910],{"class":338},"    SELECT",[325,1912,343],{"class":342},[325,1914,347],{"class":346},[325,1916,350],{"class":338},[325,1918,1919],{"class":346},")\n",[325,1921,1922,1925],{"class":327,"line":482},[325,1923,1924],{"class":338},"    FROM",[325,1926,748],{"class":346},[325,1928,1929,1932,1934,1936],{"class":327,"line":588},[325,1930,1931],{"class":338},"    WHERE",[325,1933,1532],{"class":346},[325,1935,1535],{"class":338},[325,1937,1938],{"class":1538}," 'IND'\n",[325,1940,1941],{"class":327,"line":594},[325,1942,1943],{"class":346},");\n",[325,1945,1946],{"class":327,"line":600},[325,1947,372],{"emptyLinePlaceholder":371},[325,1949,1950],{"class":327,"line":931},[325,1951,1952],{"class":331},"-- IND 的客户数是 2\n",[325,1954,1955],{"class":327,"line":937},[325,1956,1957],{"class":331},"-- 所以结果是客户数 > 2 的国家\n",[325,1959,1960],{"class":327,"line":1048},[325,1961,372],{"emptyLinePlaceholder":371},[325,1963,1965],{"class":327,"line":1964},14,[325,1966,473],{"class":331},[325,1968,1970],{"class":327,"line":1969},15,[325,1971,1554],{"class":331},[13,1973,676],{},[678,1975,1976,1979,1989],{},[681,1977,1978],{},"子查询返回单值，可以用于比较。",[681,1980,1981,1982,698,1985,1988],{},"如果子查询返回多行，通常要用 ",[322,1983,1984],{},"ALL",[322,1986,1987],{},"ANY"," 或先聚合。",[681,1990,1991,1993],{},[322,1992,1444],{}," 中的子查询可以引用外层分组结果，也可以独立查询。",[304,1995],{},[27,1997,1999],{"id":1998},"_624-join-与-group-by","6.2.4 JOIN 与 GROUP BY",[315,2001,2003],{"className":317,"code":2002,"language":319,"meta":320,"style":320},"-- 统计每个客户的订单数\nSELECT C.Id, C.Name, COUNT(*) AS Num\nFROM Customers C\nJOIN Orders O ON C.Id = O.CustId\nGROUP BY C.Id, C.Name;\n\n-- 结果：\n-- 1  Chia   3\n-- 3  Alice  1\n-- 5  Chen   1\n-- 6  Anna   2\n",[322,2004,2005,2010,2044,2051,2079,2099,2103,2107,2112,2117,2122],{"__ignoreMap":320},[325,2006,2007],{"class":327,"line":328},[325,2008,2009],{"class":331},"-- 统计每个客户的订单数\n",[325,2011,2012,2014,2017,2020,2022,2024,2026,2028,2030,2032,2034,2036,2038,2040,2042],{"class":327,"line":335},[325,2013,339],{"class":338},[325,2015,2016],{"class":342}," C",[325,2018,2019],{"class":346},".",[325,2021,44],{"class":342},[325,2023,1091],{"class":346},[325,2025,145],{"class":342},[325,2027,2019],{"class":346},[325,2029,47],{"class":342},[325,2031,1091],{"class":346},[325,2033,451],{"class":342},[325,2035,347],{"class":346},[325,2037,350],{"class":338},[325,2039,353],{"class":346},[325,2041,356],{"class":338},[325,2043,814],{"class":346},[325,2045,2046,2048],{"class":327,"line":368},[325,2047,362],{"class":338},[325,2049,2050],{"class":346}," Customers C\n",[325,2052,2053,2056,2059,2062,2064,2066,2068,2071,2074,2076],{"class":327,"line":375},[325,2054,2055],{"class":338},"JOIN",[325,2057,2058],{"class":346}," Orders O ",[325,2060,2061],{"class":338},"ON",[325,2063,2016],{"class":342},[325,2065,2019],{"class":346},[325,2067,44],{"class":342},[325,2069,2070],{"class":338}," =",[325,2072,2073],{"class":342}," O",[325,2075,2019],{"class":346},[325,2077,2078],{"class":342},"CustId\n",[325,2080,2081,2083,2085,2087,2089,2091,2093,2095,2097],{"class":327,"line":418},[325,2082,753],{"class":338},[325,2084,2016],{"class":342},[325,2086,2019],{"class":346},[325,2088,44],{"class":342},[325,2090,1091],{"class":346},[325,2092,145],{"class":342},[325,2094,2019],{"class":346},[325,2096,47],{"class":342},[325,2098,1177],{"class":346},[325,2100,2101],{"class":327,"line":476},[325,2102,372],{"emptyLinePlaceholder":371},[325,2104,2105],{"class":327,"line":482},[325,2106,473],{"class":331},[325,2108,2109],{"class":327,"line":588},[325,2110,2111],{"class":331},"-- 1  Chia   3\n",[325,2113,2114],{"class":327,"line":594},[325,2115,2116],{"class":331},"-- 3  Alice  1\n",[325,2118,2119],{"class":327,"line":600},[325,2120,2121],{"class":331},"-- 5  Chen   1\n",[325,2123,2124],{"class":327,"line":931},[325,2125,2126],{"class":331},"-- 6  Anna   2\n",[13,2128,676],{},[678,2130,2131,2139,2144],{},[681,2132,2133,2135,2136,2138],{},[322,2134,2055],{}," 后可能产生多行，",[322,2137,753],{}," 用于按客户汇总。",[681,2140,2141,2143],{},[322,2142,685],{}," 统计的是连接后的行数。",[681,2145,2146,2147,712],{},"如果只想统计客户数量，不希望因为订单重复而重复计数，可以用 ",[322,2148,2149],{},"COUNT(DISTINCT C.Id)",[315,2151,2153],{"className":317,"code":2152,"language":319,"meta":320,"style":320},"-- 统计有多少客户至少有一张订单\nSELECT COUNT(DISTINCT C.Id) AS OrderedCustomerNum\nFROM Customers C\nJOIN Orders O ON C.Id = O.CustId;\n\n-- 结果：4\n",[322,2154,2155,2160,2183,2189,2213,2217],{"__ignoreMap":320},[325,2156,2157],{"class":327,"line":328},[325,2158,2159],{"class":331},"-- 统计有多少客户至少有一张订单\n",[325,2161,2162,2164,2166,2168,2170,2172,2174,2176,2178,2180],{"class":327,"line":335},[325,2163,339],{"class":338},[325,2165,343],{"class":342},[325,2167,347],{"class":346},[325,2169,624],{"class":338},[325,2171,2016],{"class":342},[325,2173,2019],{"class":346},[325,2175,44],{"class":342},[325,2177,353],{"class":346},[325,2179,356],{"class":338},[325,2181,2182],{"class":346}," OrderedCustomerNum\n",[325,2184,2185,2187],{"class":327,"line":368},[325,2186,362],{"class":338},[325,2188,2050],{"class":346},[325,2190,2191,2193,2195,2197,2199,2201,2203,2205,2207,2209,2211],{"class":327,"line":375},[325,2192,2055],{"class":338},[325,2194,2058],{"class":346},[325,2196,2061],{"class":338},[325,2198,2016],{"class":342},[325,2200,2019],{"class":346},[325,2202,44],{"class":342},[325,2204,2070],{"class":338},[325,2206,2073],{"class":342},[325,2208,2019],{"class":346},[325,2210,227],{"class":342},[325,2212,1177],{"class":346},[325,2214,2215],{"class":327,"line":418},[325,2216,372],{"emptyLinePlaceholder":371},[325,2218,2219],{"class":327,"line":476},[325,2220,2221],{"class":331},"-- 结果：4\n",[304,2223],{},[27,2225,2227],{"id":2226},"_625-having-使用-select-别名","6.2.5 HAVING 使用 SELECT 别名",[13,2229,2230,2231,2233],{},"MySQL 中可以在 ",[322,2232,1444],{}," 中使用别名：",[315,2235,2237],{"className":317,"code":2236,"language":319,"meta":320,"style":320},"SELECT CountryCode, COUNT(*) AS Num\nFROM Customers\nGROUP BY CountryCode\nHAVING Num > 1;\n",[322,2238,2239,2257,2263,2269],{"__ignoreMap":320},[325,2240,2241,2243,2245,2247,2249,2251,2253,2255],{"class":327,"line":328},[325,2242,339],{"class":338},[325,2244,801],{"class":346},[325,2246,451],{"class":342},[325,2248,347],{"class":346},[325,2250,350],{"class":338},[325,2252,353],{"class":346},[325,2254,356],{"class":338},[325,2256,814],{"class":346},[325,2258,2259,2261],{"class":327,"line":335},[325,2260,362],{"class":338},[325,2262,748],{"class":346},[325,2264,2265,2267],{"class":327,"line":368},[325,2266,753],{"class":338},[325,2268,741],{"class":346},[325,2270,2271,2273,2276,2278,2280],{"class":327,"line":375},[325,2272,1444],{"class":338},[325,2274,2275],{"class":346}," Num ",[325,2277,1455],{"class":338},[325,2279,1458],{"class":342},[325,2281,1177],{"class":346},[13,2283,2284],{},"但标准 SQL 不一定允许，跨数据库时更推荐写成：",[315,2286,2288],{"className":317,"code":2287,"language":319,"meta":320,"style":320},"SELECT CountryCode, COUNT(*) AS Num\nFROM Customers\nGROUP BY CountryCode\nHAVING COUNT(*) > 1;\n",[322,2289,2290,2308,2314,2320],{"__ignoreMap":320},[325,2291,2292,2294,2296,2298,2300,2302,2304,2306],{"class":327,"line":328},[325,2293,339],{"class":338},[325,2295,801],{"class":346},[325,2297,451],{"class":342},[325,2299,347],{"class":346},[325,2301,350],{"class":338},[325,2303,353],{"class":346},[325,2305,356],{"class":338},[325,2307,814],{"class":346},[325,2309,2310,2312],{"class":327,"line":335},[325,2311,362],{"class":338},[325,2313,748],{"class":346},[325,2315,2316,2318],{"class":327,"line":368},[325,2317,753],{"class":338},[325,2319,741],{"class":346},[325,2321,2322,2324,2326,2328,2330,2332,2334,2336],{"class":327,"line":375},[325,2323,1444],{"class":338},[325,2325,343],{"class":342},[325,2327,347],{"class":346},[325,2329,350],{"class":338},[325,2331,353],{"class":346},[325,2333,1455],{"class":338},[325,2335,1458],{"class":342},[325,2337,1177],{"class":346},[304,2339],{},[22,2341,2343],{"id":2342},"_63-order-by-与-limit","6.3 ORDER BY 与 LIMIT",[27,2345,2347],{"id":2346},"_631-order-by-基本排序","6.3.1 ORDER BY 基本排序",[315,2349,2351],{"className":317,"code":2350,"language":319,"meta":320,"style":320},"-- 按年龄升序，默认 ASC\nSELECT * FROM Customers\nORDER BY Age;\n\n-- 结果年龄顺序：\n-- Bob 17\n-- Tom 18\n-- Chia 22\n-- Alice 25\n-- Anna 28\n-- Chen 30\n-- Mike 35\n",[322,2352,2353,2358,2370,2377,2381,2386,2391,2396,2401,2406,2411,2416],{"__ignoreMap":320},[325,2354,2355],{"class":327,"line":328},[325,2356,2357],{"class":331},"-- 按年龄升序，默认 ASC\n",[325,2359,2360,2362,2365,2368],{"class":327,"line":335},[325,2361,339],{"class":338},[325,2363,2364],{"class":338}," *",[325,2366,2367],{"class":338}," FROM",[325,2369,748],{"class":346},[325,2371,2372,2374],{"class":327,"line":368},[325,2373,1009],{"class":338},[325,2375,2376],{"class":346}," Age;\n",[325,2378,2379],{"class":327,"line":375},[325,2380,372],{"emptyLinePlaceholder":371},[325,2382,2383],{"class":327,"line":418},[325,2384,2385],{"class":331},"-- 结果年龄顺序：\n",[325,2387,2388],{"class":327,"line":476},[325,2389,2390],{"class":331},"-- Bob 17\n",[325,2392,2393],{"class":327,"line":482},[325,2394,2395],{"class":331},"-- Tom 18\n",[325,2397,2398],{"class":327,"line":588},[325,2399,2400],{"class":331},"-- Chia 22\n",[325,2402,2403],{"class":327,"line":594},[325,2404,2405],{"class":331},"-- Alice 25\n",[325,2407,2408],{"class":327,"line":600},[325,2409,2410],{"class":331},"-- Anna 28\n",[325,2412,2413],{"class":327,"line":931},[325,2414,2415],{"class":331},"-- Chen 30\n",[325,2417,2418],{"class":327,"line":937},[325,2419,2420],{"class":331},"-- Mike 35\n",[315,2422,2424],{"className":317,"code":2423,"language":319,"meta":320,"style":320},"-- 按年龄降序\nSELECT * FROM Customers\nORDER BY Age DESC;\n\n-- 结果年龄顺序：\n-- Mike 35\n-- Chen 30\n-- Anna 28\n-- Alice 25\n-- Chia 22\n-- Tom 18\n-- Bob 17\n",[322,2425,2426,2431,2441,2452,2456,2460,2464,2468,2472,2476,2480,2484],{"__ignoreMap":320},[325,2427,2428],{"class":327,"line":328},[325,2429,2430],{"class":331},"-- 按年龄降序\n",[325,2432,2433,2435,2437,2439],{"class":327,"line":335},[325,2434,339],{"class":338},[325,2436,2364],{"class":338},[325,2438,2367],{"class":338},[325,2440,748],{"class":346},[325,2442,2443,2445,2447,2450],{"class":327,"line":368},[325,2444,1009],{"class":338},[325,2446,1279],{"class":346},[325,2448,2449],{"class":338},"DESC",[325,2451,1177],{"class":346},[325,2453,2454],{"class":327,"line":375},[325,2455,372],{"emptyLinePlaceholder":371},[325,2457,2458],{"class":327,"line":418},[325,2459,2385],{"class":331},[325,2461,2462],{"class":327,"line":476},[325,2463,2420],{"class":331},[325,2465,2466],{"class":327,"line":482},[325,2467,2415],{"class":331},[325,2469,2470],{"class":327,"line":588},[325,2471,2410],{"class":331},[325,2473,2474],{"class":327,"line":594},[325,2475,2405],{"class":331},[325,2477,2478],{"class":327,"line":600},[325,2479,2400],{"class":331},[325,2481,2482],{"class":327,"line":931},[325,2483,2395],{"class":331},[325,2485,2486],{"class":327,"line":937},[325,2487,2390],{"class":331},[13,2489,676],{},[678,2491,2492,2498,2503],{},[681,2493,2494,2497],{},[322,2495,2496],{},"ASC"," 升序，默认。",[681,2499,2500,2502],{},[322,2501,2449],{}," 降序。",[681,2504,2505,2507],{},[322,2506,1009],{}," 只影响输出顺序，不改变数据内容。",[304,2509],{},[27,2511,2513],{"id":2512},"_632-多列排序","6.3.2 多列排序",[315,2515,2517],{"className":317,"code":2516,"language":319,"meta":320,"style":320},"-- 先按国家升序，再按年龄降序\nSELECT CountryCode, Name, Age\nFROM Customers\nORDER BY CountryCode ASC, Age DESC;\n\n-- 结果：\n-- CN   Chen  30\n-- CN   Chia  22\n-- CN   Bob   17\n-- IND  Anna  28\n-- IND  Alice 25\n-- ML   Tom   18\n-- US   Mike  35\n",[322,2518,2519,2524,2535,2541,2556,2560,2564,2569,2574,2579,2584,2589,2594],{"__ignoreMap":320},[325,2520,2521],{"class":327,"line":328},[325,2522,2523],{"class":331},"-- 先按国家升序，再按年龄降序\n",[325,2525,2526,2528,2530,2532],{"class":327,"line":335},[325,2527,339],{"class":338},[325,2529,801],{"class":346},[325,2531,47],{"class":338},[325,2533,2534],{"class":346},", Age\n",[325,2536,2537,2539],{"class":327,"line":368},[325,2538,362],{"class":338},[325,2540,748],{"class":346},[325,2542,2543,2545,2547,2549,2552,2554],{"class":327,"line":375},[325,2544,1009],{"class":338},[325,2546,1532],{"class":346},[325,2548,2496],{"class":338},[325,2550,2551],{"class":346},", Age ",[325,2553,2449],{"class":338},[325,2555,1177],{"class":346},[325,2557,2558],{"class":327,"line":418},[325,2559,372],{"emptyLinePlaceholder":371},[325,2561,2562],{"class":327,"line":476},[325,2563,473],{"class":331},[325,2565,2566],{"class":327,"line":482},[325,2567,2568],{"class":331},"-- CN   Chen  30\n",[325,2570,2571],{"class":327,"line":588},[325,2572,2573],{"class":331},"-- CN   Chia  22\n",[325,2575,2576],{"class":327,"line":594},[325,2577,2578],{"class":331},"-- CN   Bob   17\n",[325,2580,2581],{"class":327,"line":600},[325,2582,2583],{"class":331},"-- IND  Anna  28\n",[325,2585,2586],{"class":327,"line":931},[325,2587,2588],{"class":331},"-- IND  Alice 25\n",[325,2590,2591],{"class":327,"line":937},[325,2592,2593],{"class":331},"-- ML   Tom   18\n",[325,2595,2596],{"class":327,"line":1048},[325,2597,2598],{"class":331},"-- US   Mike  35\n",[13,2600,943],{},[678,2602,2603,2606],{},[681,2604,2605],{},"第一列相同时，才比较第二列。",[681,2607,2608],{},"常用于“先按部门，再按工资降序”这类需求。",[304,2610],{},[27,2612,2614],{"id":2613},"_633-order-by-聚合结果","6.3.3 ORDER BY 聚合结果",[315,2616,2618],{"className":317,"code":2617,"language":319,"meta":320,"style":320},"-- 按每个国家的客户数降序\nSELECT CountryCode, COUNT(*) AS Num\nFROM Customers\nGROUP BY CountryCode\nORDER BY Num DESC;\n\n-- 结果：\n-- CN   3\n-- IND  2\n-- ML   1\n-- US   1\n",[322,2619,2620,2625,2643,2649,2655,2665,2669,2673,2677,2681,2685],{"__ignoreMap":320},[325,2621,2622],{"class":327,"line":328},[325,2623,2624],{"class":331},"-- 按每个国家的客户数降序\n",[325,2626,2627,2629,2631,2633,2635,2637,2639,2641],{"class":327,"line":335},[325,2628,339],{"class":338},[325,2630,801],{"class":346},[325,2632,451],{"class":342},[325,2634,347],{"class":346},[325,2636,350],{"class":338},[325,2638,353],{"class":346},[325,2640,356],{"class":338},[325,2642,814],{"class":346},[325,2644,2645,2647],{"class":327,"line":368},[325,2646,362],{"class":338},[325,2648,748],{"class":346},[325,2650,2651,2653],{"class":327,"line":375},[325,2652,753],{"class":338},[325,2654,741],{"class":346},[325,2656,2657,2659,2661,2663],{"class":327,"line":418},[325,2658,1009],{"class":338},[325,2660,2275],{"class":346},[325,2662,2449],{"class":338},[325,2664,1177],{"class":346},[325,2666,2667],{"class":327,"line":476},[325,2668,372],{"emptyLinePlaceholder":371},[325,2670,2671],{"class":327,"line":482},[325,2672,473],{"class":331},[325,2674,2675],{"class":327,"line":588},[325,2676,839],{"class":331},[325,2678,2679],{"class":327,"line":594},[325,2680,849],{"class":331},[325,2682,2683],{"class":327,"line":600},[325,2684,844],{"class":331},[325,2686,2687],{"class":327,"line":931},[325,2688,854],{"class":331},[13,2690,2691],{},"也可以直接写聚合：",[315,2693,2695],{"className":317,"code":2694,"language":319,"meta":320,"style":320},"SELECT CountryCode, COUNT(*) AS Num\nFROM Customers\nGROUP BY CountryCode\nORDER BY COUNT(*) DESC;\n",[322,2696,2697,2715,2721,2727],{"__ignoreMap":320},[325,2698,2699,2701,2703,2705,2707,2709,2711,2713],{"class":327,"line":328},[325,2700,339],{"class":338},[325,2702,801],{"class":346},[325,2704,451],{"class":342},[325,2706,347],{"class":346},[325,2708,350],{"class":338},[325,2710,353],{"class":346},[325,2712,356],{"class":338},[325,2714,814],{"class":346},[325,2716,2717,2719],{"class":327,"line":335},[325,2718,362],{"class":338},[325,2720,748],{"class":346},[325,2722,2723,2725],{"class":327,"line":368},[325,2724,753],{"class":338},[325,2726,741],{"class":346},[325,2728,2729,2731,2733,2735,2737,2739,2741],{"class":327,"line":375},[325,2730,1009],{"class":338},[325,2732,343],{"class":342},[325,2734,347],{"class":346},[325,2736,350],{"class":338},[325,2738,353],{"class":346},[325,2740,2449],{"class":338},[325,2742,1177],{"class":346},[13,2744,2745],{},"如果人数相同，再按国家升序：",[315,2747,2749],{"className":317,"code":2748,"language":319,"meta":320,"style":320},"SELECT CountryCode, COUNT(*) AS Num\nFROM Customers\nGROUP BY CountryCode\nORDER BY Num DESC, CountryCode ASC;\n\n-- 结果：\n-- CN   3\n-- IND  2\n-- ML   1\n-- US   1\n",[322,2750,2751,2769,2775,2781,2796,2800,2804,2808,2812,2816],{"__ignoreMap":320},[325,2752,2753,2755,2757,2759,2761,2763,2765,2767],{"class":327,"line":328},[325,2754,339],{"class":338},[325,2756,801],{"class":346},[325,2758,451],{"class":342},[325,2760,347],{"class":346},[325,2762,350],{"class":338},[325,2764,353],{"class":346},[325,2766,356],{"class":338},[325,2768,814],{"class":346},[325,2770,2771,2773],{"class":327,"line":335},[325,2772,362],{"class":338},[325,2774,748],{"class":346},[325,2776,2777,2779],{"class":327,"line":368},[325,2778,753],{"class":338},[325,2780,741],{"class":346},[325,2782,2783,2785,2787,2789,2792,2794],{"class":327,"line":375},[325,2784,1009],{"class":338},[325,2786,2275],{"class":346},[325,2788,2449],{"class":338},[325,2790,2791],{"class":346},", CountryCode ",[325,2793,2496],{"class":338},[325,2795,1177],{"class":346},[325,2797,2798],{"class":327,"line":418},[325,2799,372],{"emptyLinePlaceholder":371},[325,2801,2802],{"class":327,"line":476},[325,2803,473],{"class":331},[325,2805,2806],{"class":327,"line":482},[325,2807,839],{"class":331},[325,2809,2810],{"class":327,"line":588},[325,2811,849],{"class":331},[325,2813,2814],{"class":327,"line":594},[325,2815,844],{"class":331},[325,2817,2818],{"class":327,"line":600},[325,2819,854],{"class":331},[304,2821],{},[27,2823,2825],{"id":2824},"_634-limit-基础","6.3.4 LIMIT 基础",[315,2827,2829],{"className":317,"code":2828,"language":319,"meta":320,"style":320},"-- 只返回前 2 行\nSELECT * FROM Customers\nLIMIT 2;\n",[322,2830,2831,2836,2846],{"__ignoreMap":320},[325,2832,2833],{"class":327,"line":328},[325,2834,2835],{"class":331},"-- 只返回前 2 行\n",[325,2837,2838,2840,2842,2844],{"class":327,"line":335},[325,2839,339],{"class":338},[325,2841,2364],{"class":338},[325,2843,2367],{"class":338},[325,2845,748],{"class":346},[325,2847,2848,2851,2854],{"class":327,"line":368},[325,2849,2850],{"class":338},"LIMIT",[325,2852,2853],{"class":342}," 2",[325,2855,1177],{"class":346},[13,2857,2858,2859,2861,2862,2865],{},"注意：如果没有 ",[322,2860,1009],{},"，",[322,2863,2864],{},"LIMIT 2"," 返回哪两行通常是不确定的，因为 SQL 表本身没有默认顺序。",[13,2867,2868],{},"所以更推荐：",[315,2870,2872],{"className":317,"code":2871,"language":319,"meta":320,"style":320},"-- 年龄最大的前 2 个客户\nSELECT * FROM Customers\nORDER BY Age DESC\nLIMIT 2;\n\n-- 结果：\n-- Mike 35\n-- Chen 30\n",[322,2873,2874,2879,2889,2898,2906,2910,2914,2918],{"__ignoreMap":320},[325,2875,2876],{"class":327,"line":328},[325,2877,2878],{"class":331},"-- 年龄最大的前 2 个客户\n",[325,2880,2881,2883,2885,2887],{"class":327,"line":335},[325,2882,339],{"class":338},[325,2884,2364],{"class":338},[325,2886,2367],{"class":338},[325,2888,748],{"class":346},[325,2890,2891,2893,2895],{"class":327,"line":368},[325,2892,1009],{"class":338},[325,2894,1279],{"class":346},[325,2896,2897],{"class":338},"DESC\n",[325,2899,2900,2902,2904],{"class":327,"line":375},[325,2901,2850],{"class":338},[325,2903,2853],{"class":342},[325,2905,1177],{"class":346},[325,2907,2908],{"class":327,"line":418},[325,2909,372],{"emptyLinePlaceholder":371},[325,2911,2912],{"class":327,"line":476},[325,2913,473],{"class":331},[325,2915,2916],{"class":327,"line":482},[325,2917,2420],{"class":331},[325,2919,2920],{"class":327,"line":588},[325,2921,2415],{"class":331},[304,2923],{},[27,2925,2927],{"id":2926},"_635-获取订单数最多的前-2-个客户","6.3.5 获取订单数最多的前 2 个客户",[13,2929,2930],{},"原笔记中写法：",[315,2932,2934],{"className":317,"code":2933,"language":319,"meta":320,"style":320},"SELECT CustID\nFROM Customers\nORDER BY NumOfOrders DESC\nLIMIT 2;\n",[322,2935,2936,2943,2949,2958],{"__ignoreMap":320},[325,2937,2938,2940],{"class":327,"line":328},[325,2939,339],{"class":338},[325,2941,2942],{"class":346}," CustID\n",[325,2944,2945,2947],{"class":327,"line":335},[325,2946,362],{"class":338},[325,2948,748],{"class":346},[325,2950,2951,2953,2956],{"class":327,"line":368},[325,2952,1009],{"class":338},[325,2954,2955],{"class":346}," NumOfOrders ",[325,2957,2897],{"class":338},[325,2959,2960,2962,2964],{"class":327,"line":375},[325,2961,2850],{"class":338},[325,2963,2853],{"class":342},[325,2965,1177],{"class":346},[13,2967,2968,2969,2972,2973,2976,2977,2980],{},"如果 ",[322,2970,2971],{},"Customers"," 表没有 ",[322,2974,2975],{},"NumOfOrders"," 列，这条 SQL 会失败。更常见的做法是从 ",[322,2978,2979],{},"Orders"," 聚合：",[315,2982,2984],{"className":317,"code":2983,"language":319,"meta":320,"style":320},"SELECT CustId, COUNT(*) AS NumOfOrders\nFROM Orders\nGROUP BY CustId\nORDER BY NumOfOrders DESC\nLIMIT 2;\n\n-- 结果：\n-- 1  3\n-- 6  2\n",[322,2985,2986,3006,3013,3020,3028,3036,3040,3044,3049],{"__ignoreMap":320},[325,2987,2988,2990,2993,2995,2997,2999,3001,3003],{"class":327,"line":328},[325,2989,339],{"class":338},[325,2991,2992],{"class":346}," CustId, ",[325,2994,451],{"class":342},[325,2996,347],{"class":346},[325,2998,350],{"class":338},[325,3000,353],{"class":346},[325,3002,356],{"class":338},[325,3004,3005],{"class":346}," NumOfOrders\n",[325,3007,3008,3010],{"class":327,"line":335},[325,3009,362],{"class":338},[325,3011,3012],{"class":346}," Orders\n",[325,3014,3015,3017],{"class":327,"line":368},[325,3016,753],{"class":338},[325,3018,3019],{"class":346}," CustId\n",[325,3021,3022,3024,3026],{"class":327,"line":375},[325,3023,1009],{"class":338},[325,3025,2955],{"class":346},[325,3027,2897],{"class":338},[325,3029,3030,3032,3034],{"class":327,"line":418},[325,3031,2850],{"class":338},[325,3033,2853],{"class":342},[325,3035,1177],{"class":346},[325,3037,3038],{"class":327,"line":476},[325,3039,372],{"emptyLinePlaceholder":371},[325,3041,3042],{"class":327,"line":482},[325,3043,473],{"class":331},[325,3045,3046],{"class":327,"line":588},[325,3047,3048],{"class":331},"-- 1  3\n",[325,3050,3051],{"class":327,"line":594},[325,3052,3053],{"class":331},"-- 6  2\n",[13,3055,3056],{},"解释：",[678,3058,3059,3062,3065,3068],{},[681,3060,3061],{},"先按客户分组。",[681,3063,3064],{},"统计每个客户的订单数。",[681,3066,3067],{},"按订单数降序。",[681,3069,3070],{},"取前 2 个。",[304,3072],{},[27,3074,3076],{"id":3075},"_636-limit-offset-分页","6.3.6 LIMIT OFFSET 分页",[315,3078,3080],{"className":317,"code":3079,"language":319,"meta":320,"style":320},"-- 跳过前 2 行，取接下来的 2 行\nSELECT * FROM Customers\nORDER BY Age DESC\nLIMIT 2 OFFSET 2;\n\n-- 年龄降序为：Mike 35、Chen 30、Anna 28、Alice 25...\n-- 跳过 Mike、Chen，返回 Anna、Alice\n",[322,3081,3082,3087,3097,3105,3118,3122,3127],{"__ignoreMap":320},[325,3083,3084],{"class":327,"line":328},[325,3085,3086],{"class":331},"-- 跳过前 2 行，取接下来的 2 行\n",[325,3088,3089,3091,3093,3095],{"class":327,"line":335},[325,3090,339],{"class":338},[325,3092,2364],{"class":338},[325,3094,2367],{"class":338},[325,3096,748],{"class":346},[325,3098,3099,3101,3103],{"class":327,"line":368},[325,3100,1009],{"class":338},[325,3102,1279],{"class":346},[325,3104,2897],{"class":338},[325,3106,3107,3109,3111,3114,3116],{"class":327,"line":375},[325,3108,2850],{"class":338},[325,3110,2853],{"class":342},[325,3112,3113],{"class":346}," OFFSET ",[325,3115,92],{"class":342},[325,3117,1177],{"class":346},[325,3119,3120],{"class":327,"line":418},[325,3121,372],{"emptyLinePlaceholder":371},[325,3123,3124],{"class":327,"line":476},[325,3125,3126],{"class":331},"-- 年龄降序为：Mike 35、Chen 30、Anna 28、Alice 25...\n",[325,3128,3129],{"class":327,"line":482},[325,3130,3131],{"class":331},"-- 跳过 Mike、Chen，返回 Anna、Alice\n",[13,3133,3134],{},"MySQL 也支持：",[315,3136,3138],{"className":317,"code":3137,"language":319,"meta":320,"style":320},"SELECT * FROM Customers\nORDER BY Age DESC\nLIMIT 2, 2;\n-- 等价于 LIMIT 2 OFFSET 2\n",[322,3139,3140,3150,3158,3170],{"__ignoreMap":320},[325,3141,3142,3144,3146,3148],{"class":327,"line":328},[325,3143,339],{"class":338},[325,3145,2364],{"class":338},[325,3147,2367],{"class":338},[325,3149,748],{"class":346},[325,3151,3152,3154,3156],{"class":327,"line":335},[325,3153,1009],{"class":338},[325,3155,1279],{"class":346},[325,3157,2897],{"class":338},[325,3159,3160,3162,3164,3166,3168],{"class":327,"line":368},[325,3161,2850],{"class":338},[325,3163,2853],{"class":342},[325,3165,1091],{"class":346},[325,3167,92],{"class":342},[325,3169,1177],{"class":346},[325,3171,3172],{"class":327,"line":375},[325,3173,3174],{"class":331},"-- 等价于 LIMIT 2 OFFSET 2\n",[13,3176,3177],{},"分页公式：",[315,3179,3182],{"className":3180,"code":3181,"language":1229,"meta":320},[1227],"第 1 页：LIMIT pageSize OFFSET 0\n第 2 页：LIMIT pageSize OFFSET pageSize\n第 3 页：LIMIT pageSize OFFSET 2 * pageSize\n",[322,3183,3181],{"__ignoreMap":320},[13,3185,3186],{},"其他数据库：",[678,3188,3189,3199,3205],{},[681,3190,3191,3192,3195,3196],{},"SQL Server：",[322,3193,3194],{},"TOP"," 或 ",[322,3197,3198],{},"OFFSET ... FETCH",[681,3200,3201,3202],{},"Oracle：",[322,3203,3204],{},"FETCH FIRST n ROWS ONLY",[681,3206,3207,3208],{},"PostgreSQL \u002F SQLite \u002F MySQL：通常支持 ",[322,3209,2850],{},[304,3211],{},[27,3213,3215],{"id":3214},"_637-null-排序","6.3.7 NULL 排序",[315,3217,3219],{"className":317,"code":3218,"language":319,"meta":320,"style":320},"SELECT * FROM Customers\nORDER BY Email;\n",[322,3220,3221,3231],{"__ignoreMap":320},[325,3222,3223,3225,3227,3229],{"class":327,"line":328},[325,3224,339],{"class":338},[325,3226,2364],{"class":338},[325,3228,2367],{"class":338},[325,3230,748],{"class":346},[325,3232,3233,3235],{"class":327,"line":335},[325,3234,1009],{"class":338},[325,3236,3237],{"class":346}," Email;\n",[13,3239,3240],{},"不同数据库对 NULL 的排序不同。MySQL 中：",[678,3242,3243,3248],{},[681,3244,3245,3247],{},[322,3246,2496],{},"：NULL 通常排在最前。",[681,3249,3250,3252],{},[322,3251,2449],{},"：NULL 通常排在最后。",[13,3254,3255],{},"如果想让 NULL 固定排在最后：",[315,3257,3259],{"className":317,"code":3258,"language":319,"meta":320,"style":320},"SELECT * FROM Customers\nORDER BY Email IS NULL, Email;\n",[322,3260,3261,3271],{"__ignoreMap":320},[325,3262,3263,3265,3267,3269],{"class":327,"line":328},[325,3264,339],{"class":338},[325,3266,2364],{"class":338},[325,3268,2367],{"class":338},[325,3270,748],{"class":346},[325,3272,3273,3275,3278,3281,3284],{"class":327,"line":335},[325,3274,1009],{"class":338},[325,3276,3277],{"class":346}," Email ",[325,3279,3280],{"class":338},"IS",[325,3282,3283],{"class":338}," NULL",[325,3285,3286],{"class":346},", Email;\n",[13,3288,3056],{},[678,3290,3291,3297,3300],{},[681,3292,3293,3296],{},[322,3294,3295],{},"Email IS NULL"," 为 0 或 1。",[681,3298,3299],{},"非 NULL 为 0，排在前面。",[681,3301,3302],{},"NULL 为 1，排在后面。",[304,3304],{},[22,3306,3308],{"id":3307},"_64-逻辑执行顺序","6.4 逻辑执行顺序",[13,3310,3311],{},"SQL 书写顺序：",[315,3313,3315],{"className":317,"code":3314,"language":319,"meta":320,"style":320},"SELECT ...\nFROM ...\nJOIN ...\nWHERE ...\nGROUP BY ...\nHAVING ...\nORDER BY ...\nLIMIT ...\n",[322,3316,3317,3324,3330,3336,3342,3348,3354,3360],{"__ignoreMap":320},[325,3318,3319,3321],{"class":327,"line":328},[325,3320,339],{"class":338},[325,3322,3323],{"class":346}," ...\n",[325,3325,3326,3328],{"class":327,"line":335},[325,3327,362],{"class":338},[325,3329,3323],{"class":346},[325,3331,3332,3334],{"class":327,"line":368},[325,3333,2055],{"class":338},[325,3335,3323],{"class":346},[325,3337,3338,3340],{"class":327,"line":375},[325,3339,1276],{"class":338},[325,3341,3323],{"class":346},[325,3343,3344,3346],{"class":327,"line":418},[325,3345,753],{"class":338},[325,3347,3323],{"class":346},[325,3349,3350,3352],{"class":327,"line":476},[325,3351,1444],{"class":338},[325,3353,3323],{"class":346},[325,3355,3356,3358],{"class":327,"line":482},[325,3357,1009],{"class":338},[325,3359,3323],{"class":346},[325,3361,3362,3364],{"class":327,"line":588},[325,3363,2850],{"class":338},[325,3365,3323],{"class":346},[13,3367,3368],{},"逻辑执行顺序大致是：",[315,3370,3373],{"className":3371,"code":3372,"language":1229,"meta":320},[1227],"FROM \u002F JOIN\n→ WHERE\n→ GROUP BY\n→ HAVING\n→ SELECT\n→ DISTINCT\n→ ORDER BY\n→ LIMIT\n",[322,3374,3372],{"__ignoreMap":320},[13,3376,3377],{},"这个顺序能解释很多规则：",[315,3379,3381],{"className":317,"code":3380,"language":319,"meta":320,"style":320},"-- WHERE 不能使用 SELECT 中定义的别名\nSELECT Age + 1 AS NextAge\nFROM Customers\nWHERE NextAge > 20; -- 通常报错\n\n-- ORDER BY 可以使用 SELECT 中定义的别名\nSELECT Age + 1 AS NextAge\nFROM Customers\nORDER BY NextAge DESC;\n",[322,3382,3383,3388,3405,3411,3428,3432,3437,3451,3457],{"__ignoreMap":320},[325,3384,3385],{"class":327,"line":328},[325,3386,3387],{"class":331},"-- WHERE 不能使用 SELECT 中定义的别名\n",[325,3389,3390,3392,3394,3397,3399,3402],{"class":327,"line":335},[325,3391,339],{"class":338},[325,3393,1279],{"class":346},[325,3395,3396],{"class":338},"+",[325,3398,1458],{"class":342},[325,3400,3401],{"class":338}," AS",[325,3403,3404],{"class":346}," NextAge\n",[325,3406,3407,3409],{"class":327,"line":368},[325,3408,362],{"class":338},[325,3410,748],{"class":346},[325,3412,3413,3415,3418,3420,3422,3425],{"class":327,"line":375},[325,3414,1276],{"class":338},[325,3416,3417],{"class":346}," NextAge ",[325,3419,1455],{"class":338},[325,3421,1738],{"class":342},[325,3423,3424],{"class":346},"; ",[325,3426,3427],{"class":331},"-- 通常报错\n",[325,3429,3430],{"class":327,"line":418},[325,3431,372],{"emptyLinePlaceholder":371},[325,3433,3434],{"class":327,"line":476},[325,3435,3436],{"class":331},"-- ORDER BY 可以使用 SELECT 中定义的别名\n",[325,3438,3439,3441,3443,3445,3447,3449],{"class":327,"line":482},[325,3440,339],{"class":338},[325,3442,1279],{"class":346},[325,3444,3396],{"class":338},[325,3446,1458],{"class":342},[325,3448,3401],{"class":338},[325,3450,3404],{"class":346},[325,3452,3453,3455],{"class":327,"line":588},[325,3454,362],{"class":338},[325,3456,748],{"class":346},[325,3458,3459,3461,3463,3465],{"class":327,"line":594},[325,3460,1009],{"class":338},[325,3462,3417],{"class":346},[325,3464,2449],{"class":338},[325,3466,1177],{"class":346},[304,3468],{},[22,3470,3472],{"id":3471},"_65-综合例子","6.5 综合例子",[27,3474,3476],{"id":3475},"_651-每个国家客户数平均年龄过滤客户数-1按人数降序取前-2","6.5.1 每个国家客户数、平均年龄，过滤客户数 > 1，按人数降序，取前 2",[315,3478,3480],{"className":317,"code":3479,"language":319,"meta":320,"style":320},"SELECT CountryCode,\n       COUNT(*) AS Num,\n       AVG(Age) AS AvgAge\nFROM Customers\nGROUP BY CountryCode\nHAVING COUNT(*) > 1\nORDER BY Num DESC\nLIMIT 2;\n\n-- 结果：\n-- CN   3  23.0\n-- IND  2  26.5\n",[322,3481,3482,3488,3502,3512,3518,3524,3540,3548,3556,3560,3564,3568],{"__ignoreMap":320},[325,3483,3484,3486],{"class":327,"line":328},[325,3485,339],{"class":338},[325,3487,871],{"class":346},[325,3489,3490,3492,3494,3496,3498,3500],{"class":327,"line":335},[325,3491,637],{"class":342},[325,3493,347],{"class":346},[325,3495,350],{"class":338},[325,3497,353],{"class":346},[325,3499,356],{"class":338},[325,3501,886],{"class":346},[325,3503,3504,3506,3508,3510],{"class":327,"line":368},[325,3505,891],{"class":342},[325,3507,505],{"class":346},[325,3509,356],{"class":338},[325,3511,898],{"class":346},[325,3513,3514,3516],{"class":327,"line":375},[325,3515,362],{"class":338},[325,3517,748],{"class":346},[325,3519,3520,3522],{"class":327,"line":418},[325,3521,753],{"class":338},[325,3523,741],{"class":346},[325,3525,3526,3528,3530,3532,3534,3536,3538],{"class":327,"line":476},[325,3527,1444],{"class":338},[325,3529,343],{"class":342},[325,3531,347],{"class":346},[325,3533,350],{"class":338},[325,3535,353],{"class":346},[325,3537,1455],{"class":338},[325,3539,1831],{"class":342},[325,3541,3542,3544,3546],{"class":327,"line":482},[325,3543,1009],{"class":338},[325,3545,2275],{"class":346},[325,3547,2897],{"class":338},[325,3549,3550,3552,3554],{"class":327,"line":588},[325,3551,2850],{"class":338},[325,3553,2853],{"class":342},[325,3555,1177],{"class":346},[325,3557,3558],{"class":327,"line":594},[325,3559,372],{"emptyLinePlaceholder":371},[325,3561,3562],{"class":327,"line":600},[325,3563,473],{"class":331},[325,3565,3566],{"class":327,"line":931},[325,3567,923],{"class":331},[325,3569,3570],{"class":327,"line":937},[325,3571,934],{"class":331},[304,3573],{},[27,3575,3577],{"id":3576},"_652-每个客户订单数总金额只显示总金额-100","6.5.2 每个客户订单数、总金额，只显示总金额 > 100",[315,3579,3581],{"className":317,"code":3580,"language":319,"meta":320,"style":320},"SELECT C.Id,\n       C.Name,\n       COUNT(O.OrderId) AS OrderCount,\n       COALESCE(SUM(O.Amount), 0) AS TotalAmount\nFROM Customers C\nLEFT JOIN Orders O ON C.Id = O.CustId\nGROUP BY C.Id, C.Name\nHAVING COALESCE(SUM(O.Amount), 0) > 100\nORDER BY TotalAmount DESC;\n\n-- 结果：\n-- 6  Anna   2  380\n-- 1  Chia   3  319\n-- 3  Alice  1  150\n",[322,3582,3583,3596,3607,3627,3657,3663,3686,3705,3735,3746,3750,3754,3759,3764],{"__ignoreMap":320},[325,3584,3585,3587,3589,3591,3593],{"class":327,"line":328},[325,3586,339],{"class":338},[325,3588,2016],{"class":342},[325,3590,2019],{"class":346},[325,3592,44],{"class":342},[325,3594,3595],{"class":346},",\n",[325,3597,3598,3601,3603,3605],{"class":327,"line":335},[325,3599,3600],{"class":342},"       C",[325,3602,2019],{"class":346},[325,3604,47],{"class":342},[325,3606,3595],{"class":346},[325,3608,3609,3611,3613,3616,3618,3620,3622,3624],{"class":327,"line":368},[325,3610,637],{"class":342},[325,3612,347],{"class":346},[325,3614,3615],{"class":342},"O",[325,3617,2019],{"class":346},[325,3619,224],{"class":342},[325,3621,353],{"class":346},[325,3623,356],{"class":338},[325,3625,3626],{"class":346}," OrderCount,\n",[325,3628,3629,3632,3634,3636,3638,3640,3642,3644,3647,3650,3652,3654],{"class":327,"line":375},[325,3630,3631],{"class":342},"       COALESCE",[325,3633,347],{"class":346},[325,3635,707],{"class":342},[325,3637,347],{"class":346},[325,3639,3615],{"class":342},[325,3641,2019],{"class":346},[325,3643,230],{"class":342},[325,3645,3646],{"class":346},"), ",[325,3648,3649],{"class":342},"0",[325,3651,353],{"class":346},[325,3653,356],{"class":338},[325,3655,3656],{"class":346}," TotalAmount\n",[325,3658,3659,3661],{"class":327,"line":418},[325,3660,362],{"class":338},[325,3662,2050],{"class":346},[325,3664,3665,3668,3670,3672,3674,3676,3678,3680,3682,3684],{"class":327,"line":476},[325,3666,3667],{"class":338},"LEFT JOIN",[325,3669,2058],{"class":346},[325,3671,2061],{"class":338},[325,3673,2016],{"class":342},[325,3675,2019],{"class":346},[325,3677,44],{"class":342},[325,3679,2070],{"class":338},[325,3681,2073],{"class":342},[325,3683,2019],{"class":346},[325,3685,2078],{"class":342},[325,3687,3688,3690,3692,3694,3696,3698,3700,3702],{"class":327,"line":482},[325,3689,753],{"class":338},[325,3691,2016],{"class":342},[325,3693,2019],{"class":346},[325,3695,44],{"class":342},[325,3697,1091],{"class":346},[325,3699,145],{"class":342},[325,3701,2019],{"class":346},[325,3703,3704],{"class":342},"Name\n",[325,3706,3707,3709,3712,3714,3716,3718,3720,3722,3724,3726,3728,3730,3732],{"class":327,"line":588},[325,3708,1444],{"class":338},[325,3710,3711],{"class":342}," COALESCE",[325,3713,347],{"class":346},[325,3715,707],{"class":342},[325,3717,347],{"class":346},[325,3719,3615],{"class":342},[325,3721,2019],{"class":346},[325,3723,230],{"class":342},[325,3725,3646],{"class":346},[325,3727,3649],{"class":342},[325,3729,353],{"class":346},[325,3731,1455],{"class":338},[325,3733,3734],{"class":342}," 100\n",[325,3736,3737,3739,3742,3744],{"class":327,"line":594},[325,3738,1009],{"class":338},[325,3740,3741],{"class":346}," TotalAmount ",[325,3743,2449],{"class":338},[325,3745,1177],{"class":346},[325,3747,3748],{"class":327,"line":600},[325,3749,372],{"emptyLinePlaceholder":371},[325,3751,3752],{"class":327,"line":931},[325,3753,473],{"class":331},[325,3755,3756],{"class":327,"line":937},[325,3757,3758],{"class":331},"-- 6  Anna   2  380\n",[325,3760,3761],{"class":327,"line":1048},[325,3762,3763],{"class":331},"-- 1  Chia   3  319\n",[325,3765,3766],{"class":327,"line":1964},[325,3767,3768],{"class":331},"-- 3  Alice  1  150\n",[13,3770,1054],{},[678,3772,3773,3779,3785,3795],{},[681,3774,3775,3776,3778],{},"用 ",[322,3777,3667],{}," 可以保留没有订单的客户。",[681,3780,3781,3784],{},[322,3782,3783],{},"COUNT(O.OrderId)"," 不会统计 NULL，所以无订单客户显示 0。",[681,3786,3787,3790,3791,3794],{},[322,3788,3789],{},"SUM(O.Amount)"," 对无订单客户为 NULL，用 ",[322,3792,3793],{},"COALESCE"," 转成 0。",[681,3796,3797,3799],{},[322,3798,1444],{}," 过滤的是分组后的总金额。",[304,3801],{},[27,3803,3805],{"id":3804},"_653-每个国家年龄最大的客户","6.5.3 每个国家年龄最大的客户",[315,3807,3809],{"className":317,"code":3808,"language":319,"meta":320,"style":320},"SELECT C.CountryCode, C.Name, C.Age\nFROM Customers C\nJOIN (\n    SELECT CountryCode, MAX(Age) AS MaxAge\n    FROM Customers\n    GROUP BY CountryCode\n) M\n  ON C.CountryCode = M.CountryCode\n AND C.Age = M.MaxAge;\n\n-- 结果：\n-- CN   Chen  30\n-- ML   Tom   18\n-- IND  Anna  28\n-- US   Mike  35\n",[322,3810,3811,3838,3844,3850,3865,3871,3878,3883,3904,3926,3930,3934,3938,3942,3946],{"__ignoreMap":320},[325,3812,3813,3815,3817,3819,3821,3823,3825,3827,3829,3831,3833,3835],{"class":327,"line":328},[325,3814,339],{"class":338},[325,3816,2016],{"class":342},[325,3818,2019],{"class":346},[325,3820,50],{"class":342},[325,3822,1091],{"class":346},[325,3824,145],{"class":342},[325,3826,2019],{"class":346},[325,3828,47],{"class":342},[325,3830,1091],{"class":346},[325,3832,145],{"class":342},[325,3834,2019],{"class":346},[325,3836,3837],{"class":342},"Age\n",[325,3839,3840,3842],{"class":327,"line":335},[325,3841,362],{"class":338},[325,3843,2050],{"class":346},[325,3845,3846,3848],{"class":327,"line":368},[325,3847,2055],{"class":338},[325,3849,1905],{"class":346},[325,3851,3852,3854,3856,3859,3861,3863],{"class":327,"line":375},[325,3853,1910],{"class":338},[325,3855,801],{"class":346},[325,3857,3858],{"class":342},"MAX",[325,3860,505],{"class":346},[325,3862,356],{"class":338},[325,3864,571],{"class":346},[325,3866,3867,3869],{"class":327,"line":418},[325,3868,1924],{"class":338},[325,3870,748],{"class":346},[325,3872,3873,3876],{"class":327,"line":476},[325,3874,3875],{"class":338},"    GROUP BY",[325,3877,741],{"class":346},[325,3879,3880],{"class":327,"line":482},[325,3881,3882],{"class":346},") M\n",[325,3884,3885,3888,3890,3892,3894,3896,3899,3901],{"class":327,"line":588},[325,3886,3887],{"class":338},"  ON",[325,3889,2016],{"class":342},[325,3891,2019],{"class":346},[325,3893,50],{"class":342},[325,3895,2070],{"class":338},[325,3897,3898],{"class":342}," M",[325,3900,2019],{"class":346},[325,3902,3903],{"class":342},"CountryCode\n",[325,3905,3906,3909,3911,3913,3915,3917,3919,3921,3924],{"class":327,"line":594},[325,3907,3908],{"class":338}," AND",[325,3910,2016],{"class":342},[325,3912,2019],{"class":346},[325,3914,53],{"class":342},[325,3916,2070],{"class":338},[325,3918,3898],{"class":342},[325,3920,2019],{"class":346},[325,3922,3923],{"class":342},"MaxAge",[325,3925,1177],{"class":346},[325,3927,3928],{"class":327,"line":600},[325,3929,372],{"emptyLinePlaceholder":371},[325,3931,3932],{"class":327,"line":931},[325,3933,473],{"class":331},[325,3935,3936],{"class":327,"line":937},[325,3937,2568],{"class":331},[325,3939,3940],{"class":327,"line":1048},[325,3941,2593],{"class":331},[325,3943,3944],{"class":327,"line":1964},[325,3945,2583],{"class":331},[325,3947,3948],{"class":327,"line":1969},[325,3949,2598],{"class":331},[13,3951,1054],{},[678,3953,3954,3957,3960],{},[681,3955,3956],{},"子查询先求每个国家的最大年龄。",[681,3958,3959],{},"再和原表连接，找出对应客户。",[681,3961,3962],{},"如果同一个国家有多个同龄最大客户，会返回多行。",[304,3964],{},[27,3966,3968],{"id":3967},"_654-条件聚合统计每个国家-25-岁及以上人数","6.5.4 条件聚合：统计每个国家 25 岁及以上人数",[315,3970,3972],{"className":317,"code":3971,"language":319,"meta":320,"style":320},"SELECT CountryCode,\n       SUM(CASE WHEN Age >= 25 THEN 1 ELSE 0 END) AS Age25Plus,\n       COUNT(*) AS Total\nFROM Customers\nGROUP BY CountryCode;\n\n-- 结果：\n-- CN   1  3\n-- ML   0  1\n-- IND  2  2\n-- US   1  1\n",[322,3973,3974,3980,4021,4036,4042,4048,4052,4056,4061,4066,4071],{"__ignoreMap":320},[325,3975,3976,3978],{"class":327,"line":328},[325,3977,339],{"class":338},[325,3979,871],{"class":346},[325,3981,3982,3985,3987,3990,3993,3995,3997,4000,4003,4005,4008,4011,4014,4016,4018],{"class":327,"line":335},[325,3983,3984],{"class":342},"       SUM",[325,3986,347],{"class":346},[325,3988,3989],{"class":338},"CASE",[325,3991,3992],{"class":338}," WHEN",[325,3994,1279],{"class":346},[325,3996,1282],{"class":338},[325,3998,3999],{"class":342}," 25",[325,4001,4002],{"class":338}," THEN",[325,4004,1458],{"class":342},[325,4006,4007],{"class":338}," ELSE",[325,4009,4010],{"class":342}," 0",[325,4012,4013],{"class":338}," END",[325,4015,353],{"class":346},[325,4017,356],{"class":338},[325,4019,4020],{"class":346}," Age25Plus,\n",[325,4022,4023,4025,4027,4029,4031,4033],{"class":327,"line":368},[325,4024,637],{"class":342},[325,4026,347],{"class":346},[325,4028,350],{"class":338},[325,4030,353],{"class":346},[325,4032,356],{"class":338},[325,4034,4035],{"class":346}," Total\n",[325,4037,4038,4040],{"class":327,"line":375},[325,4039,362],{"class":338},[325,4041,748],{"class":346},[325,4043,4044,4046],{"class":327,"line":418},[325,4045,753],{"class":338},[325,4047,756],{"class":346},[325,4049,4050],{"class":327,"line":476},[325,4051,372],{"emptyLinePlaceholder":371},[325,4053,4054],{"class":327,"line":482},[325,4055,473],{"class":331},[325,4057,4058],{"class":327,"line":588},[325,4059,4060],{"class":331},"-- CN   1  3\n",[325,4062,4063],{"class":327,"line":594},[325,4064,4065],{"class":331},"-- ML   0  1\n",[325,4067,4068],{"class":327,"line":600},[325,4069,4070],{"class":331},"-- IND  2  2\n",[325,4072,4073],{"class":327,"line":931},[325,4074,4075],{"class":331},"-- US   1  1\n",[13,4077,943],{},[678,4079,4080,4086,4091],{},[681,4081,4082,4085],{},[322,4083,4084],{},"CASE WHEN"," 在聚合前把满足条件的行标记为 1，否则为 0。",[681,4087,4088,4090],{},[322,4089,707],{}," 后得到满足条件的行数。",[681,4092,4093],{},"这是“条件统计”的常用写法。",[304,4095],{},[22,4097,4099],{"id":4098},"_66-常见坑总结","6.6 常见坑总结",[4101,4102,4103,4111,4116,4124,4129,4136,4144,4155,4163,4174,4185,4197],"ol",{},[681,4104,4105,4107,4108,4110],{},[322,4106,1276],{}," 不能直接使用聚合函数，例如 ",[322,4109,1776],{}," 是错的。",[681,4112,4113,4115],{},[322,4114,1444],{}," 用于过滤分组后的结果，通常包含聚合，也可以使用分组列。",[681,4117,4118,4120,4121,4123],{},[322,4119,685],{}," 包含 NULL，",[322,4122,691],{}," 忽略 NULL。",[681,4125,4126,4128],{},[322,4127,697],{}," 忽略 NULL，所以分母不是总行数，而是非 NULL 行数。",[681,4130,4131,4133,4134,712],{},[322,4132,707],{}," 全为 NULL 时可能返回 NULL，可用 ",[322,4135,711],{},[681,4137,4138,4140,4141,4143],{},[322,4139,339],{}," 中非聚合列必须出现在 ",[322,4142,753],{}," 中，否则可能报错。",[681,4145,4146,4148,4149,4151,4152,4154],{},[322,4147,1009],{}," 可以使用 ",[322,4150,339],{}," 别名，",[322,4153,1276],{}," 通常不可以。",[681,4156,4157,4159,4160,4162],{},[322,4158,2850],{}," 最好和 ",[322,4161,1009],{}," 一起使用，否则返回顺序不确定。",[681,4164,4165,4167,4168,4170,4171,712],{},[322,4166,2055],{}," 后 ",[322,4169,685],{}," 可能因为一对多关系而重复计数，必要用 ",[322,4172,4173],{},"COUNT(DISTINCT ...)",[681,4175,4176,4178,4179,4181,4182,4184],{},[322,4177,1444],{}," 能晚过滤就晚过滤，但能提前用 ",[322,4180,1276],{}," 过滤的行应尽量放 ",[322,4183,1276],{},"，性能更好。",[681,4186,4187,4189,4190,4192,4193,4196],{},[322,4188,1009],{}," 在 ",[322,4191,2850],{}," 之前逻辑执行，所以 ",[322,4194,4195],{},"ORDER BY + LIMIT"," 才能稳定取 Top N。",[681,4198,4199,4201],{},[322,4200,753],{}," 后排序，通常排序的是分组列或聚合结果。",[13,4203,4204],{},"核心记忆点：",[315,4206,4209],{"className":4207,"code":4208,"language":1229,"meta":320},[1227],"WHERE 过滤行；\nGROUP BY 分组；\n聚合函数算每组；\nHAVING 过滤组；\nORDER BY 排序；\nLIMIT 截取；\nCOUNT(*) 含 NULL，COUNT(列) 不含 NULL。\n",[322,4210,4208],{"__ignoreMap":320},[304,4212],{},[4214,4215,4216],"style",{},"html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}",{"title":320,"searchDepth":368,"depth":368,"links":4218},[4219,4223,4230,4237,4246,4247,4253],{"id":24,"depth":335,"text":25,"children":4220},[4221,4222],{"id":29,"depth":368,"text":30},{"id":214,"depth":368,"text":215},{"id":308,"depth":335,"text":309,"children":4224},[4225,4226,4227,4228,4229],{"id":312,"depth":368,"text":313},{"id":723,"depth":368,"text":724},{"id":961,"depth":368,"text":962},{"id":1069,"depth":368,"text":1070},{"id":1236,"depth":368,"text":1237},{"id":1344,"depth":335,"text":1345,"children":4231},[4232,4233,4234,4235,4236],{"id":1348,"depth":368,"text":1349},{"id":1613,"depth":368,"text":1614},{"id":1847,"depth":368,"text":1848},{"id":1998,"depth":368,"text":1999},{"id":2226,"depth":368,"text":2227},{"id":2342,"depth":335,"text":2343,"children":4238},[4239,4240,4241,4242,4243,4244,4245],{"id":2346,"depth":368,"text":2347},{"id":2512,"depth":368,"text":2513},{"id":2613,"depth":368,"text":2614},{"id":2824,"depth":368,"text":2825},{"id":2926,"depth":368,"text":2927},{"id":3075,"depth":368,"text":3076},{"id":3214,"depth":368,"text":3215},{"id":3307,"depth":335,"text":3308},{"id":3471,"depth":335,"text":3472,"children":4248},[4249,4250,4251,4252],{"id":3475,"depth":368,"text":3476},{"id":3576,"depth":368,"text":3577},{"id":3804,"depth":368,"text":3805},{"id":3967,"depth":368,"text":3968},{"id":4098,"depth":335,"text":4099},"学习",null,"2026-10-09","MySQL 学习笔记第三篇：COUNT\u002FSUM\u002FAVG 等聚合函数、GROUP BY 分组、HAVING 过滤、ORDER BY 与 LIMIT，以及一条 SELECT 的完整逻辑执行顺序。","md",false,{},"\u002Fposts\u002Fmysql\u002Fmysql-learning-03",{"title":5,"description":4257},"SQL 学习笔记","posts\u002Fmysql\u002Fmysql-learning-03",[4266,4267,4268],"SQL","MySQL","学习笔记","GdYmwDm2OOuFFEi9MZaWQMZek1hLAecmanuqHInnCHM",[4271,4278,4284,4290,4296,4302,4308,4314,4320,4326,4332,4338,4344,4350,4355,4360,4365,4370,4375,4380,4385,4390,4395,4400,4405,4410,4415,4420,4425,4431,4435,4439,4443,4447,4451,4455,4459,4463,4467,4471,4475,4481,4485,4490,4494,4498,4502,4506,4510,4514,4518,4522,4526,4527,4532,4537,4543,4547,4552,4556],{"path":4272,"title":4273,"description":4274,"date":4275,"series":4276,"seriesOrder":4277},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-28","软件分析与设计笔记 28：draw.io 作图手册：五张图的符号位置、落笔顺序与自检","不模拟软件界面，只讲清三件事：每个 UML 符号在 draw.io 里搜什么词、一张图该按什么顺序落笔、画完拿什么标准自查。覆盖用例图、活动图、顺序图、类图、界面草图五种图纸，末尾附「最容易画反的十二笔」总检表。","2026-11-19","软件分析与设计笔记",28,{"path":4279,"title":4280,"description":4281,"date":4282,"series":4276,"seriesOrder":4283},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-27","软件分析与设计笔记 27：Paper 1 应试：从读案例到交卷的一次完整演算","拿一份完整的案例，从头到尾走一遍：怎么读案例列角色、怎么在四个小问之间分配时间、每一张图从哪一句话推出来、两张表怎么填、交卷前拿什么清单自查。附 C25 真题与样卷的题型分值对照。","2026-11-18",27,{"path":4285,"title":4286,"description":4287,"date":4288,"series":4276,"seriesOrder":4289},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-26","软件分析与设计笔记 26：总结：把整条链路串起来","系列收尾：从需求到代码的完整链路回顾、每一环的产出与验收方式、六条贯穿全系列的原则，以及一份可以直接拿去做项目自查的清单。","2026-11-17",26,{"path":4291,"title":4292,"description":4293,"date":4294,"series":4276,"seriesOrder":4295},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-25","软件分析与设计笔记 25：代码重构：坏味道与手法","重构不改变外部行为、只改善内部结构：四种常见坏味道与对应手法、为什么动手之前必须先有测试、什么时候该重构，以及重构和前面那些设计模型是什么关系。","2026-11-16",25,{"path":4297,"title":4298,"description":4299,"date":4300,"series":4276,"seriesOrder":4301},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-24","软件分析与设计笔记 24：设计原则：内聚、耦合与多态","好设计怎么衡量：内聚与耦合分别在说什么、一次从「差设计」到「多态重设计」的完整对照、抽象类与接口的选择依据，以及复用为什么会从优势变成风险。","2026-11-15",24,{"path":4303,"title":4304,"description":4305,"date":4306,"series":4276,"seriesOrder":4307},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-23","软件分析与设计笔记 23：设计建模：从对象模型到能实现的方案","分析模型能用但还不能直接开工：对象模型怎么映射到关系模型、继承映射的三种方案怎么选、数据访问层与 Data Broker 解决什么问题，以及三层架构与 MVC 的分工。","2026-11-14",23,{"path":4309,"title":4310,"description":4311,"date":4312,"series":4276,"seriesOrder":4313},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-22","软件分析与设计笔记 22：分析建模：边界、实体与控制对象","不经过分析直接写代码会踩什么坑、三种分析对象各管一段、怎么用顺序图完成一次用例实现，以及从顺序图导出类的属性、操作与关系的方法。","2026-11-13",22,{"path":4315,"title":4316,"description":4317,"date":4318,"series":4276,"seriesOrder":4319},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-21","软件分析与设计笔记 21：UML：类图与顺序图","为什么需要一种共同的画法：类符号三格怎么画、五种关系的符号与设计含义、每种关系落到 Java 是什么写法，顺序图的三要素怎么摆；以及这三种最容易找不到的符号在 draw.io 里各搜什么词。","2026-11-12",21,{"path":4321,"title":4322,"description":4323,"date":4324,"series":4276,"seriesOrder":4325},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-20","软件分析与设计笔记 20：面向对象概念：对象、关系与多态","面向对象不是「用某个语言写代码」：对象与类的区别、封装真正在保护什么、五种关系（依赖、关联、聚合、组合、继承）各自何时用，以及多态为什么能减少条件判断。","2026-11-11",20,{"path":4327,"title":4328,"description":4329,"date":4330,"series":4276,"seriesOrder":4331},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-19","软件分析与设计笔记 19：规范化与逻辑数据模型","一次改地址引发的数据不一致，讲清规范化的真正动机；UNF 到 3NF 每一步在解决什么问题，派生字段为什么不能存，优化为什么和规范化方向相反，以及逻辑数据模型在 3NF 之上补了什么。","2026-11-10",19,{"path":4333,"title":4334,"description":4335,"date":4336,"series":4276,"seriesOrder":4337},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-18","软件分析与设计笔记 18：数据库分析：实体、关系与数据字典","为什么不能拿到需求就动手建表：实体与关系怎么判定、基数为什么必须由业务方确认、数据命名要遵守什么规则，以及数据字典四列里最容易被空着的那一列。","2026-11-09",18,{"path":4339,"title":4340,"description":4341,"date":4342,"series":4276,"seriesOrder":4343},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-17","软件分析与设计笔记 17：用生成式 AI 做设计与开发：能用的场景与要防的坑","生成式 AI 在工作流里真正站得住的三个场景 —— 造示例数据、解释陌生代码、起草初稿；它为什么会复现社会偏见、为什么会编得像真的，以及哪些内容绝不能直接采用。","2026-11-08",17,{"path":4345,"title":4346,"description":4347,"date":4348,"series":4276,"seriesOrder":4349},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-16","软件分析与设计笔记 16：从 persona 到 URS：一份交付物的完整骨架","把前面十几篇串成一份能交出去的东西：用户需求规格说明书的九个部分、每一章来自哪个环节、由谁确认，以及面向决策者的提案该讲清哪三件事。","2026-11-07",16,{"path":4351,"title":4352,"description":4353,"date":4354,"series":4276,"seriesOrder":1969},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-15","软件分析与设计笔记 15：非功能需求：把「快、稳、安全」变成数字","为什么「系统要快」不是一条需求：非功能需求怎么量化，决定性能的用户量、交易量、数据量三张表怎么估，安全需求要写清什么，以及可靠性的「不可用」该怎么定义。","2026-11-06",{"path":4356,"title":4357,"description":4358,"date":4359,"series":4276,"seriesOrder":1964},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-14","软件分析与设计笔记 14：软件测试：层级、方法与等价类划分","「我们测过了」这句话问题在哪：为什么静态评审和动态测试缺一不可，五个测试层级各自验证什么，白盒与黑盒的差别，以及用等价类划分和边界值把无限输入变成有限用例的方法。","2026-11-05",{"path":4361,"title":4362,"description":4363,"date":4364,"series":4276,"seriesOrder":1048},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-13","软件分析与设计笔记 13：需求获取：五种调查方法与一场访谈","需求从哪里来：五种事实调查方法各自适合回答什么、代价是什么，访谈从准备到记录的全过程，问卷设计里最容易犯的错，以及访谈记录必须写下来的那几项信息。","2026-11-04",{"path":4366,"title":4367,"description":4368,"date":4369,"series":4276,"seriesOrder":937},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-12","软件分析与设计笔记 12：前端设计：把流程变成屏幕","界面设计不是「画得好看」：从活动图走到屏幕的三步，CRUD 任务流怎么当检查表，界面必须回答的三个问题，信息架构与五种导航类型，视觉一致性与留白，以及移动端与 Web 端的差别。","2026-11-03",{"path":4371,"title":4372,"description":4373,"date":4374,"series":4276,"seriesOrder":931},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-11","软件分析与设计笔记 11：Agentic AI 与业务流程自动化","AI agent 到底是什么：五项能力与四个核心组件，什么场景该用定时任务、什么该用程序、什么才值得用 agent，两种实现路径的差别，必须提前防住的四类失败模式，以及设计方法从提示词到编排的演进。","2026-11-02",{"path":4376,"title":4377,"description":4378,"date":4379,"series":4276,"seriesOrder":600},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-10","软件分析与设计笔记 10：精炼用例模型：include、extend 与泛化","三种精炼用例关系的判断标准：include 什么时候用、它和 extend 的区别到底在哪、参与者泛化与用例泛化各解决什么问题，以及精炼到什么程度就该停手。","2026-11-01",{"path":4381,"title":4382,"description":4383,"date":4384,"series":4276,"seriesOrder":594},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-09","软件分析与设计笔记 09：功能需求（二）：从流程到业务实体","活动图画完之后，怎么从流程里筛出真正的业务实体：三条判断标准、哪些名词其实不该建实体、属性从哪里来，以及领域模型和后面的数据模型分别负责什么。","2026-10-31",{"path":4386,"title":4387,"description":4388,"date":4389,"series":4276,"seriesOrder":588},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-08","软件分析与设计笔记 08：功能需求（一）：用例模型与活动图","从用户故事到用例的翻译过程：什么才算「好」的参与者，系统边界怎么划，用例描述必须写清哪四件事，活动图怎么把分支、并行与泳道画清楚，以及这两个图在 draw.io 里各用哪个形状、最容易画错哪一笔。","2026-10-30",{"path":4391,"title":4392,"description":4393,"date":4394,"series":4276,"seriesOrder":482},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-07","软件分析与设计笔记 07：用户故事：把需求写成可验收的一句话","用户故事的三段结构，怎么从用户画像和数据地图里把它提取出来，一条故事多大算合适、时序为什么也是需求的一部分，以及验收标准怎么写才算真的可验收。","2026-10-29",{"path":4396,"title":4397,"description":4398,"date":4399,"series":4276,"seriesOrder":476},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-06","软件分析与设计笔记 06：范围界定（数据侧）：用数据校验你的判断","访谈结论和数字对不上时该怎么办：分析的四个层次分别在回答什么问题、为什么不能跳级、数据准备与搜集怎么做成一张应用地图，以及数据最容易在哪几个地方骗你。","2026-10-28",{"path":4401,"title":4402,"description":4403,"date":4404,"series":4276,"seriesOrder":418},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-05","软件分析与设计笔记 05：范围界定（用户侧）：用户画像与客户旅程图","为什么「所有用户」是一个陷阱，项目边界该怎么划，用户画像要写哪五个要素、最容易写成什么废纸，客户旅程图怎么把阶段、想法和情绪画在同一张纸上，以及怎么从这两样东西一步步推到可验证的需求。","2026-10-27",{"path":4406,"title":4407,"description":4408,"date":4409,"series":4276,"seriesOrder":375},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-04","软件分析与设计笔记 04：接手陌生案例的第一步：三问与一张表","拿到一个完全陌生的业务案例，怎么从零开始不跑偏：只问 Who、What、Why 三个问题，把「问题—事实—假设—理由」记成一张四列表，说清为什么假设必须写明理由，以及带着问题进访谈为什么比空手去有效得多。","2026-10-26",{"path":4411,"title":4412,"description":4413,"date":4414,"series":4276,"seriesOrder":368},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-03","软件分析与设计笔记 03：Agile 与 Scrum：迭代、角色与产出物","从「三周做完交付，客户说这不是我要的」讲起，说清瀑布式与迭代式的根本差别，Scrum 的三个角色和三种产出物，一个 sprint 里四次固定活动各自在解决什么问题，以及敏捷里最常见的几个误解。","2026-10-25",{"path":4416,"title":4417,"description":4418,"date":4419,"series":4276,"seriesOrder":335},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-02","软件分析与设计笔记 02：设计思维、用户驱动与数据驱动","从「客服要一个能一次看完所有排期的界面」这个翻车案例讲起，说清设计思维到底是什么、用户驱动与数据驱动各自能看见什么又看不见什么、为什么真正的落点是把两者合起来的 data-informed design，以及访谈中怎么问出有用的信息。","2026-10-24",{"path":4421,"title":4422,"description":4423,"date":4424,"series":4276,"seriesOrder":328},"\u002Fposts\u002Fswdesign\u002Fsw-design-notes-01","软件分析与设计笔记 01：课程地图与从需求到设计的主干","这一篇不写具体方法，先把整条链路铺开：软件分析与设计到底要解决什么问题，从需求到设计分成哪两段，中间有哪十几个环节，一份完整的交付物里应该有什么，以及后面 27 篇笔记怎么排、新人该按什么顺序读。","2026-10-23",{"path":4426,"title":4427,"description":4428,"date":4429,"series":4430,"seriesOrder":328},"\u002Fposts\u002Fjavaspring\u002Fspring-notes-01","Spring 学习笔记 01：IoC、依赖注入与第一个 Spring Boot 应用","从「手写 new 出来的三层结构」的痛点讲起，说清 IoC 容器、Bean 与依赖注入是怎么回事，再用 Maven 与 Spring Initializr 跑起第一个能返回 JSON 的应用。","2026-10-15","Spring 学习笔记",{"path":4432,"title":4433,"description":4434,"date":4429,"series":4430,"seriesOrder":335},"\u002Fposts\u002Fjavaspring\u002Fspring-notes-02","Spring 学习笔记 02：Spring Data JPA 基础——实体映射与 Repository","用 ORM 把类映射到表：@Entity、@Id、@GeneratedValue 怎么用，CrudRepository 三层接口怎么选，H2 与 MySQL 怎么配，以及 ddl-auto 到底该写哪个值。",{"path":4436,"title":4437,"description":4438,"date":4429,"series":4430,"seriesOrder":368},"\u002Fposts\u002Fjavaspring\u002Fspring-notes-03","Spring 学习笔记 03：JPA 查询——派生方法、JPQL 与分页排序","Repository 自带的方法只够按主键查，这篇讲三种自己造查询的方式：方法名派生、@Query 写 JPQL、原生 SQL，以及 Pageable 分页排序和投影返回。",{"path":4440,"title":4441,"description":4442,"date":4429,"series":4430,"seriesOrder":375},"\u002Fposts\u002Fjavaspring\u002Fspring-notes-04","Spring 学习笔记 04：JPA 关联映射与仓储测试","一对多、多对多怎么映射，谁负责维护外键，FetchType 与 CascadeType 该怎么选，顺带用 @DataJpaTest 与 AssertJ 把仓储层测起来。",{"path":4444,"title":4445,"description":4446,"date":4429,"series":4430,"seriesOrder":418},"\u002Fposts\u002Fjavaspring\u002Fspring-notes-05","Spring 学习笔记 05：Spring MVC 与 Thymeleaf 入门","一次页面请求在 Spring MVC 里走了哪几步，@Controller 怎么把数据交给模板，@PathVariable 与 @RequestParam 怎么取参数，以及控制器为什么必须是无状态的。",{"path":4448,"title":4449,"description":4450,"date":4429,"series":4430,"seriesOrder":476},"\u002Fposts\u002Fjavaspring\u002Fspring-notes-06","Spring 学习笔记 06：表单绑定与服务端校验","把表单字段绑到对象上，用 Bean Validation 注解做服务端校验，把错误信息显示回用户刚填的那一页，再补上自定义校验注解与全局异常处理。",{"path":4452,"title":4453,"description":4454,"date":4429,"series":4430,"seriesOrder":482},"\u002Fposts\u002Fjavaspring\u002Fspring-notes-07","Spring 学习笔记 07：Thymeleaf 片段复用与国际化","用 th:fragment 与 th:insert\u002Fth:replace 把导航栏、页脚抽成片段，页面套用统一布局，再用 messages.properties 与 LocaleResolver 做中英文切换。",{"path":4456,"title":4457,"description":4458,"date":4429,"series":4430,"seriesOrder":588},"\u002Fposts\u002Fjavaspring\u002Fspring-notes-08","Spring 学习笔记 08：HTTP Session 与会话状态管理","HTTP 无状态带来的问题，Cookie 与 Session 怎么分工，Spring 里读写会话的几种方式，以及会话固定、超时、多实例共享这些必须想清楚的事。",{"path":4460,"title":4461,"description":4462,"date":4429,"series":4430,"seriesOrder":594},"\u002Fposts\u002Fjavaspring\u002Fspring-notes-09","Spring 学习笔记 09：拦截器 HandlerInterceptor","登录检查、权限判断、请求耗时统计这类横切逻辑该放哪：HandlerInterceptor 的三个回调各在什么时机执行，怎么注册与排除路径，以及它和过滤器的分工。",{"path":4464,"title":4465,"description":4466,"date":4429,"series":4430,"seriesOrder":600},"\u002Fposts\u002Fjavaspring\u002Fspring-notes-10","Spring 学习笔记 10：Service 层与事务","一组数据库操作要么全成功要么全失败，靠 @Transactional 怎么做到；传播行为、隔离级别、回滚规则怎么选，以及自调用失效、乐观锁悲观锁这些实战里的坑。",{"path":4468,"title":4469,"description":4470,"date":4429,"series":4430,"seriesOrder":931},"\u002Fposts\u002Fjavaspring\u002Fspring-notes-11","Spring 学习笔记 11：REST API 基础——把 Service 暴露成接口","同一套 Service 怎么同时服务页面和客户端：@RestController 的路由与方法语义、状态码怎么给、DTO 怎么定，以及 MockMvc 端到端和切片测试的两种写法与各自的坑。",{"path":4472,"title":4473,"description":4474,"date":4429,"series":4430,"seriesOrder":937},"\u002Fposts\u002Fjavaspring\u002Fspring-notes-12","Spring 学习笔记 12：REST 进阶——版本、更新、跨域与文档化","接口能跑通之后要处理的几件事：URL 与响应结构怎么定、版本怎么演进、更新怎么做到可安全重试、CORS 怎么配、HATEOAS 与 Spring Data REST 该不该用。",{"path":4476,"title":4477,"description":4478,"date":4479,"series":4480,"seriesOrder":375},"\u002Fposts\u002Fjava\u002Fjava-functionalprogramming-notes","Java 函数式编程笔记：Lambda、函数式接口与 Streams","学习 Java 函数式编程时的个人笔记：Lambda 表达式的五步简写与方法引用、常见函数式接口、Stream 流水线与惰性求值，以及创建流、中间操作、终止操作与收集器的用法。示例代码均为自写，运行结果来自本地实测。","2026-10-13","Java 学习笔记",{"path":4482,"title":4483,"description":4484,"date":4479,"series":4480,"seriesOrder":368},"\u002Fposts\u002Fjava\u002Fjava-generics-notes","Java 泛型笔记：泛型方法、有界类型与泛型类","学习 Java 泛型时的个人笔记：从重复的重载方法与多态尝试讲起，再到泛型方法与类型推断、有界泛型类型、Comparable 与 Number 边界，以及泛型类在集合中的用法。示例代码均为自写，运行结果来自本地实测。",{"path":4486,"title":4487,"description":4488,"date":4489,"series":4263,"seriesOrder":375},"\u002Fposts\u002Fmysql\u002Fmysql-learning-04","MySQL 学习笔记 04：数据操纵（增删改）","MySQL 学习笔记第四篇：INSERT 插入（含批量插入与 INSERT ... SELECT）、UPDATE 更新、DELETE 删除，以及各自的坑。","2026-10-10",{"path":4491,"title":4492,"description":4493,"date":4489,"series":4263,"seriesOrder":418},"\u002Fposts\u002Fmysql\u002Fmysql-learning-05","MySQL 学习笔记 05：DDL 概览","MySQL 学习笔记第五篇：数据定义语言概览——Schema、Table、View、Index、Constraints 这几类对象分别对应哪些 CREATE \u002F ALTER \u002F DROP 命令。",{"path":4495,"title":4496,"description":4497,"date":4489,"series":4263,"seriesOrder":476},"\u002Fposts\u002Fmysql\u002Fmysql-learning-06","MySQL 学习笔记 06：CREATE TABLE 与数据类型","MySQL 学习笔记第六篇：CREATE TABLE 的完整语法、常用数据类型的选型建议，以及外键的两种定义方式。",{"path":4499,"title":4500,"description":4501,"date":4489,"series":4263,"seriesOrder":482},"\u002Fposts\u002Fmysql\u002Fmysql-learning-07","MySQL 学习笔记 07：索引","MySQL 学习笔记第七篇：索引的作用与 B+ 树结构、单列与复合索引的创建、索引的代价与适用场景。",{"path":4503,"title":4504,"description":4505,"date":4489,"series":4263,"seriesOrder":588},"\u002Fposts\u002Fmysql\u002Fmysql-learning-08","MySQL 学习笔记 08：DROP 与 ALTER","MySQL 学习笔记第八篇：DROP 删除数据库对象、ALTER 修改表结构，以及常见的坑。",{"path":4507,"title":4508,"description":4509,"date":4489,"series":4263,"seriesOrder":594},"\u002Fposts\u002Fmysql\u002Fmysql-learning-09","MySQL 学习笔记 09：约束与数据完整性","MySQL 学习笔记第九篇：SQL 约束——NOT NULL、CHECK、PRIMARY KEY、FOREIGN KEY 等如何保证数据完整性，以及它们的对比。",{"path":4511,"title":4512,"description":4513,"date":4489,"series":4263,"seriesOrder":600},"\u002Fposts\u002Fmysql\u002Fmysql-learning-10","MySQL 学习笔记 10：视图","MySQL 学习笔记第十篇：视图（Views）的定义与特性、和表的对比、创建与使用，以及可更新视图的限制。",{"path":4515,"title":4516,"description":4517,"date":4489,"series":4263,"seriesOrder":931},"\u002Fposts\u002Fmysql\u002Fmysql-learning-11","MySQL 学习笔记 11：存储过程","MySQL 学习笔记第十一篇：存储过程（Stored Procedures）的概念、创建与调用、带参数的写法，以及优缺点。",{"path":4519,"title":4520,"description":4521,"date":4256,"series":4263,"seriesOrder":328},"\u002Fposts\u002Fmysql\u002Fmysql-learning-01","MySQL 学习笔记 01：MySQL 基础知识","MySQL 学习笔记第一篇：MySQL Server 与 Workbench 的安装，数据库与 DBMS 的基本概念，关系模型、ACID 事务、常见数据类型，以及后续的学习路线。",{"path":4523,"title":4524,"description":4525,"date":4256,"series":4263,"seriesOrder":335},"\u002Fposts\u002Fmysql\u002Fmysql-learning-02","MySQL 学习笔记 02：SELECT 查询与过滤","MySQL 学习笔记第二篇：SELECT 的基本语法与逻辑执行顺序，WHERE 过滤（比较、LIKE、IN、BETWEEN、NULL）、各种 JOIN、UNION 与子查询。",{"path":4261,"title":5,"description":4257,"date":4256,"series":4263,"seriesOrder":368},{"path":4528,"title":4529,"description":4530,"date":4531,"series":4480,"seriesOrder":335},"\u002Fposts\u002Fjava\u002Fjava-oop-notes","Java 面向对象笔记：类、继承、多态与异常","学习 Java 面向对象编程时的个人笔记：类与对象、封装与访问修饰符、继承与多态、集合、抽象类与接口、异常处理。示例代码均为自写，运行结果来自本地实测。","2026-10-06",{"path":4533,"title":4534,"description":4535,"date":4536,"series":4480,"seriesOrder":328},"\u002Fposts\u002Fjava\u002Fjava-basics-notes","Java 基础语法笔记：从环境安装到方法与数组","学习 Java 基础语法时的个人笔记：JDK 安装、输入输出、变量与运算符、条件与循环、字符串、数组与方法。示例代码均为自写，运行结果来自本地实测。","2026-10-05",{"path":4538,"title":4539,"description":4540,"date":4541,"series":4542,"seriesOrder":328},"\u002Fposts\u002Fgit\u002Fgit-install-and-basics","Git 安装与基本使用","从装好 Git 到跑通日常提交流程，把最常用的几条命令和它们背后的三个区域讲清楚。","2026-10-04","Git 入门",{"path":4544,"title":4545,"description":4546,"date":4541,"series":4542,"seriesOrder":335},"\u002Fposts\u002Fgit\u002Flocal-remote-repository","本地远程仓库的部署","用自己的机器当 Git 服务器：建一个裸仓库、走 SSH 连上去，把本地提交推上去。",{"path":4548,"title":4549,"description":4550,"date":4541,"series":4551,"seriesOrder":328},"\u002Fposts\u002Fguide\u002Fguide-file-layout","文件都放在哪","文章、图片、封面分别放在仓库的什么位置，哪些目录可以放手改、哪些碰了会出问题。","博客使用指南",{"path":4553,"title":4554,"description":4555,"date":4541,"series":4551,"seriesOrder":335},"\u002Fposts\u002Fguide\u002Fguide-frontmatter","frontmatter 每个字段是什么意思","文章开头那段被横线包住的字段，逐个说明作用、默认行为和写错的后果。",{"path":4557,"title":4558,"description":4559,"date":4541,"series":4551,"seriesOrder":368},"\u002Fposts\u002Fguide\u002Fguide-markdown","正文怎么写 —— Markdown 与排版效果","标题、链接、图片、代码、表格分别怎么写，以及本站对它们做了哪些自定义处理。",1793268153295]