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