[{"data":1,"prerenderedAt":1561},["ShallowReactive",2],{"doc-page:\u002Fdocs\u002Fdatabase-basics":3},{"doc":4,"prev":1523,"next":1530,"resolvedType":8,"readingMinutes":124,"audience":1537,"checklist":1541,"related":1545},{"path":5,"title":6,"description":7,"docType":8,"resourceKind":9,"categoryId":10,"categoryLabel":11,"updatedAt":12,"publishedAt":12,"icon":13,"body":14},"\u002Fdocs\u002Fdatabase-basics","数据库基础速查","SQLite、PostgreSQL、MySQL 常用操作、SQL 语法与 GUI 工具推荐","article",null,"programming-languages","编程语言","2026-02-27","i-carbon-application",{"type":15,"value":16,"toc":1486},"minimark",[17,20,24,28,33,46,50,61,65,76,79,82,218,222,234,237,241,300,303,363,366,421,424,427,479,482,508,511,540,543,546,568,571,575,578,698,702,918,921,1048,1051,1102,1105,1230,1233,1236,1250,1253,1256,1259,1262,1276,1279,1283,1286,1300,1303,1306,1323,1326,1353,1357,1438,1447,1450,1482],[18,19,6],"h1",{"id":6},[21,22,23],"p",{},"这页适合做“数据库入门与选型导航”。如果你现在还不确定该用 SQLite、PostgreSQL 还是 MySQL，可以先看下面的场景判断，再回到具体命令。",[25,26,27],"h2",{"id":27},"先按场景选",[29,30,32],"h3",{"id":31},"sqlite","SQLite",[34,35,36,40,43],"ul",{},[37,38,39],"li",{},"适合单机工具、小型站点、本地缓存、桌面应用",[37,41,42],{},"零配置、最省事",[37,44,45],{},"不适合高并发写入和复杂多用户场景",[29,47,49],{"id":48},"postgresql","PostgreSQL",[34,51,52,55,58],{},[37,53,54],{},"适合中大型 Web 应用、后台系统、分析型查询",[37,56,57],{},"功能完整，类型、索引、扩展能力都很强",[37,59,60],{},"如果你没有历史包袱，很多新项目直接选它就够了",[29,62,64],{"id":63},"mysql","MySQL",[34,66,67,70,73],{},[37,68,69],{},"适合传统业务系统、很多托管平台和老项目迁移场景",[37,71,72],{},"生态成熟、资料多",[37,74,75],{},"团队已有 MySQL 经验时，上手和维护成本会更低",[25,77,32],{"id":78},"sqlite-1",[21,80,81],{},"零配置的嵌入式数据库，适合小型项目和本地开发。",[83,84,89],"pre",{"className":85,"code":86,"language":87,"meta":88,"style":88},"language-bash shiki shiki-themes github-light github-dark","# 安装\nscoop install sqlite\n\n# 打开\u002F创建数据库\nsqlite3 mydb.sqlite\n\n# 常用命令\n.tables              -- 列出所有表\n.schema users        -- 查看表结构\n.mode column         -- 列模式显示\n.headers on          -- 显示列名\n.quit                -- 退出\n","bash","",[90,91,92,101,115,122,128,137,142,148,161,176,191,206],"code",{"__ignoreMap":88},[93,94,97],"span",{"class":95,"line":96},"line",1,[93,98,100],{"class":99},"sJ8bj","# 安装\n",[93,102,104,108,112],{"class":95,"line":103},2,[93,105,107],{"class":106},"sScJk","scoop",[93,109,111],{"class":110},"sZZnC"," install",[93,113,114],{"class":110}," sqlite\n",[93,116,118],{"class":95,"line":117},3,[93,119,121],{"emptyLinePlaceholder":120},true,"\n",[93,123,125],{"class":95,"line":124},4,[93,126,127],{"class":99},"# 打开\u002F创建数据库\n",[93,129,131,134],{"class":95,"line":130},5,[93,132,133],{"class":106},"sqlite3",[93,135,136],{"class":110}," mydb.sqlite\n",[93,138,140],{"class":95,"line":139},6,[93,141,121],{"emptyLinePlaceholder":120},[93,143,145],{"class":95,"line":144},7,[93,146,147],{"class":99},"# 常用命令\n",[93,149,151,154,158],{"class":95,"line":150},8,[93,152,153],{"class":106},".tables",[93,155,157],{"class":156},"sj4cs","              --",[93,159,160],{"class":110}," 列出所有表\n",[93,162,164,167,170,173],{"class":95,"line":163},9,[93,165,166],{"class":106},".schema",[93,168,169],{"class":110}," users",[93,171,172],{"class":156},"        --",[93,174,175],{"class":110}," 查看表结构\n",[93,177,179,182,185,188],{"class":95,"line":178},10,[93,180,181],{"class":106},".mode",[93,183,184],{"class":110}," column",[93,186,187],{"class":156},"         --",[93,189,190],{"class":110}," 列模式显示\n",[93,192,194,197,200,203],{"class":95,"line":193},11,[93,195,196],{"class":106},".headers",[93,198,199],{"class":110}," on",[93,201,202],{"class":156},"          --",[93,204,205],{"class":110}," 显示列名\n",[93,207,209,212,215],{"class":95,"line":208},12,[93,210,211],{"class":106},".quit",[93,213,214],{"class":156},"                --",[93,216,217],{"class":110}," 退出\n",[29,219,221],{"id":220},"gui-工具","GUI 工具",[83,223,227],{"className":224,"code":225,"language":226,"meta":88,"style":88},"language-powershell shiki shiki-themes github-light github-dark","winget install DBBrowserForSQLite.DBBrowserForSQLite\n","powershell",[90,228,229],{"__ignoreMap":88},[93,230,231],{"class":95,"line":96},[93,232,225],{"class":233},"sVt8B",[25,235,49],{"id":236},"postgresql-1",[29,238,240],{"id":239},"docker-快速启动","Docker 快速启动",[83,242,244],{"className":85,"code":243,"language":87,"meta":88,"style":88},"docker run -d --name postgres \\\n  -e POSTGRES_PASSWORD=secret \\\n  -e POSTGRES_DB=mydb \\\n  -p 5432:5432 \\\n  postgres:16-alpine\n",[90,245,246,266,276,285,295],{"__ignoreMap":88},[93,247,248,251,254,257,260,263],{"class":95,"line":96},[93,249,250],{"class":106},"docker",[93,252,253],{"class":110}," run",[93,255,256],{"class":156}," -d",[93,258,259],{"class":156}," --name",[93,261,262],{"class":110}," postgres",[93,264,265],{"class":156}," \\\n",[93,267,268,271,274],{"class":95,"line":103},[93,269,270],{"class":156},"  -e",[93,272,273],{"class":110}," POSTGRES_PASSWORD=secret",[93,275,265],{"class":156},[93,277,278,280,283],{"class":95,"line":117},[93,279,270],{"class":156},[93,281,282],{"class":110}," POSTGRES_DB=mydb",[93,284,265],{"class":156},[93,286,287,290,293],{"class":95,"line":124},[93,288,289],{"class":156},"  -p",[93,291,292],{"class":110}," 5432:5432",[93,294,265],{"class":156},[93,296,297],{"class":95,"line":130},[93,298,299],{"class":110},"  postgres:16-alpine\n",[29,301,302],{"id":302},"连接",[83,304,306],{"className":85,"code":305,"language":87,"meta":88,"style":88},"# psql 客户端\npsql -h localhost -U postgres -d mydb\n\n# Docker 内\ndocker exec -it postgres psql -U postgres\n",[90,307,308,313,334,338,343],{"__ignoreMap":88},[93,309,310],{"class":95,"line":96},[93,311,312],{"class":99},"# psql 客户端\n",[93,314,315,318,321,324,327,329,331],{"class":95,"line":103},[93,316,317],{"class":106},"psql",[93,319,320],{"class":156}," -h",[93,322,323],{"class":110}," localhost",[93,325,326],{"class":156}," -U",[93,328,262],{"class":110},[93,330,256],{"class":156},[93,332,333],{"class":110}," mydb\n",[93,335,336],{"class":95,"line":117},[93,337,121],{"emptyLinePlaceholder":120},[93,339,340],{"class":95,"line":124},[93,341,342],{"class":99},"# Docker 内\n",[93,344,345,347,350,353,355,358,360],{"class":95,"line":130},[93,346,250],{"class":106},[93,348,349],{"class":110}," exec",[93,351,352],{"class":156}," -it",[93,354,262],{"class":110},[93,356,357],{"class":110}," psql",[93,359,326],{"class":156},[93,361,362],{"class":110}," postgres\n",[29,364,365],{"id":365},"常用命令",[83,367,371],{"className":368,"code":369,"language":370,"meta":88,"style":88},"language-sql shiki shiki-themes github-light github-dark","\\l                    -- 列出数据库\n\\c mydb               -- 切换数据库\n\\dt                   -- 列出表\n\\d users              -- 查看表结构\n\\di                   -- 列出索引\n\\q                    -- 退出\n","sql",[90,372,373,381,389,397,405,413],{"__ignoreMap":88},[93,374,375,378],{"class":95,"line":96},[93,376,377],{"class":233},"\\l                    ",[93,379,380],{"class":99},"-- 列出数据库\n",[93,382,383,386],{"class":95,"line":103},[93,384,385],{"class":233},"\\c mydb               ",[93,387,388],{"class":99},"-- 切换数据库\n",[93,390,391,394],{"class":95,"line":117},[93,392,393],{"class":233},"\\dt                   ",[93,395,396],{"class":99},"-- 列出表\n",[93,398,399,402],{"class":95,"line":124},[93,400,401],{"class":233},"\\d users              ",[93,403,404],{"class":99},"-- 查看表结构\n",[93,406,407,410],{"class":95,"line":130},[93,408,409],{"class":233},"\\di                   ",[93,411,412],{"class":99},"-- 列出索引\n",[93,414,415,418],{"class":95,"line":139},[93,416,417],{"class":233},"\\q                    ",[93,419,420],{"class":99},"-- 退出\n",[25,422,64],{"id":423},"mysql-1",[29,425,240],{"id":426},"docker-快速启动-1",[83,428,430],{"className":85,"code":429,"language":87,"meta":88,"style":88},"docker run -d --name mysql \\\n  -e MYSQL_ROOT_PASSWORD=secret \\\n  -e MYSQL_DATABASE=mydb \\\n  -p 3306:3306 \\\n  mysql:8\n",[90,431,432,447,456,465,474],{"__ignoreMap":88},[93,433,434,436,438,440,442,445],{"class":95,"line":96},[93,435,250],{"class":106},[93,437,253],{"class":110},[93,439,256],{"class":156},[93,441,259],{"class":156},[93,443,444],{"class":110}," mysql",[93,446,265],{"class":156},[93,448,449,451,454],{"class":95,"line":103},[93,450,270],{"class":156},[93,452,453],{"class":110}," MYSQL_ROOT_PASSWORD=secret",[93,455,265],{"class":156},[93,457,458,460,463],{"class":95,"line":117},[93,459,270],{"class":156},[93,461,462],{"class":110}," MYSQL_DATABASE=mydb",[93,464,265],{"class":156},[93,466,467,469,472],{"class":95,"line":124},[93,468,289],{"class":156},[93,470,471],{"class":110}," 3306:3306",[93,473,265],{"class":156},[93,475,476],{"class":95,"line":130},[93,477,478],{"class":110},"  mysql:8\n",[29,480,302],{"id":481},"连接-1",[83,483,485],{"className":85,"code":484,"language":87,"meta":88,"style":88},"docker exec -it mysql mysql -u root -p\n",[90,486,487],{"__ignoreMap":88},[93,488,489,491,493,495,497,499,502,505],{"class":95,"line":96},[93,490,250],{"class":106},[93,492,349],{"class":110},[93,494,352],{"class":156},[93,496,444],{"class":110},[93,498,444],{"class":110},[93,500,501],{"class":156}," -u",[93,503,504],{"class":110}," root",[93,506,507],{"class":156}," -p\n",[29,509,365],{"id":510},"常用命令-1",[83,512,514],{"className":368,"code":513,"language":370,"meta":88,"style":88},"SHOW DATABASES;\nUSE mydb;\nSHOW TABLES;\nDESCRIBE users;\n",[90,515,516,521,530,535],{"__ignoreMap":88},[93,517,518],{"class":95,"line":96},[93,519,520],{"class":233},"SHOW DATABASES;\n",[93,522,523,527],{"class":95,"line":103},[93,524,526],{"class":525},"szBVR","USE",[93,528,529],{"class":233}," mydb;\n",[93,531,532],{"class":95,"line":117},[93,533,534],{"class":233},"SHOW TABLES;\n",[93,536,537],{"class":95,"line":124},[93,538,539],{"class":233},"DESCRIBE users;\n",[25,541,542],{"id":542},"推荐学习顺序",[21,544,545],{},"如果你刚开始接触数据库，建议按这个顺序：",[547,548,549,552,558,565],"ol",{},[37,550,551],{},"先学表、行、列、主键、索引这些基础概念",[37,553,554,555],{},"再掌握 ",[90,556,557],{},"SELECT \u002F INSERT \u002F UPDATE \u002F DELETE",[37,559,560,561,564],{},"然后补 ",[90,562,563],{},"JOIN","、聚合、排序、分页",[37,566,567],{},"最后再学习事务、迁移、备份、权限控制",[21,569,570],{},"先理解“数据怎么组织”和“查询为什么慢”，比一开始背更多 SQL 语法更重要。",[25,572,574],{"id":573},"sql-语法速查","SQL 语法速查",[29,576,577],{"id":577},"建表",[83,579,581],{"className":368,"code":580,"language":370,"meta":88,"style":88},"CREATE TABLE users (\n  id SERIAL PRIMARY KEY,          -- PostgreSQL\n  -- id INT AUTO_INCREMENT PRIMARY KEY,  -- MySQL\n  name VARCHAR(100) NOT NULL,\n  email VARCHAR(255) UNIQUE NOT NULL,\n  age INT DEFAULT 0,\n  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP\n);\n",[90,582,583,596,613,618,641,664,680,693],{"__ignoreMap":88},[93,584,585,588,591,593],{"class":95,"line":96},[93,586,587],{"class":525},"CREATE",[93,589,590],{"class":525}," TABLE",[93,592,169],{"class":106},[93,594,595],{"class":233}," (\n",[93,597,598,601,604,607,610],{"class":95,"line":103},[93,599,600],{"class":233},"  id ",[93,602,603],{"class":525},"SERIAL",[93,605,606],{"class":525}," PRIMARY KEY",[93,608,609],{"class":233},",          ",[93,611,612],{"class":99},"-- PostgreSQL\n",[93,614,615],{"class":95,"line":117},[93,616,617],{"class":99},"  -- id INT AUTO_INCREMENT PRIMARY KEY,  -- MySQL\n",[93,619,620,623,626,629,632,635,638],{"class":95,"line":124},[93,621,622],{"class":525},"  name",[93,624,625],{"class":525}," VARCHAR",[93,627,628],{"class":233},"(",[93,630,631],{"class":156},"100",[93,633,634],{"class":233},") ",[93,636,637],{"class":525},"NOT NULL",[93,639,640],{"class":233},",\n",[93,642,643,646,649,651,654,656,659,662],{"class":95,"line":130},[93,644,645],{"class":233},"  email ",[93,647,648],{"class":525},"VARCHAR",[93,650,628],{"class":233},[93,652,653],{"class":156},"255",[93,655,634],{"class":233},[93,657,658],{"class":525},"UNIQUE",[93,660,661],{"class":525}," NOT NULL",[93,663,640],{"class":233},[93,665,666,669,672,675,678],{"class":95,"line":139},[93,667,668],{"class":233},"  age ",[93,670,671],{"class":525},"INT",[93,673,674],{"class":525}," DEFAULT",[93,676,677],{"class":156}," 0",[93,679,640],{"class":233},[93,681,682,685,688,690],{"class":95,"line":144},[93,683,684],{"class":233},"  created_at ",[93,686,687],{"class":525},"TIMESTAMP",[93,689,674],{"class":525},[93,691,692],{"class":233}," CURRENT_TIMESTAMP\n",[93,694,695],{"class":95,"line":150},[93,696,697],{"class":233},");\n",[29,699,701],{"id":700},"crud","CRUD",[83,703,705],{"className":368,"code":704,"language":370,"meta":88,"style":88},"-- 插入\nINSERT INTO users (name, email, age) VALUES ('Domi', '[email]', 20);\n\n-- 查询\nSELECT * FROM users WHERE age > 18 ORDER BY created_at DESC LIMIT 10;\nSELECT name, COUNT(*) FROM users GROUP BY name HAVING COUNT(*) > 1;\n\n-- 更新\nUPDATE users SET age = 21 WHERE name = 'Domi';\n\n-- 删除\nDELETE FROM users WHERE id = 1;\n",[90,706,707,712,748,752,757,801,849,853,858,889,893,898],{"__ignoreMap":88},[93,708,709],{"class":95,"line":96},[93,710,711],{"class":99},"-- 插入\n",[93,713,714,717,720,723,726,729,732,735,738,741,743,746],{"class":95,"line":103},[93,715,716],{"class":525},"INSERT INTO",[93,718,719],{"class":233}," users (",[93,721,722],{"class":525},"name",[93,724,725],{"class":233},", email, age) ",[93,727,728],{"class":525},"VALUES",[93,730,731],{"class":233}," (",[93,733,734],{"class":110},"'Domi'",[93,736,737],{"class":233},", ",[93,739,740],{"class":110},"'[email]'",[93,742,737],{"class":233},[93,744,745],{"class":156},"20",[93,747,697],{"class":233},[93,749,750],{"class":95,"line":117},[93,751,121],{"emptyLinePlaceholder":120},[93,753,754],{"class":95,"line":124},[93,755,756],{"class":99},"-- 查询\n",[93,758,759,762,765,768,771,774,777,780,783,786,789,792,795,798],{"class":95,"line":130},[93,760,761],{"class":525},"SELECT",[93,763,764],{"class":525}," *",[93,766,767],{"class":525}," FROM",[93,769,770],{"class":233}," users ",[93,772,773],{"class":525},"WHERE",[93,775,776],{"class":233}," age ",[93,778,779],{"class":525},">",[93,781,782],{"class":156}," 18",[93,784,785],{"class":525}," ORDER BY",[93,787,788],{"class":233}," created_at ",[93,790,791],{"class":525},"DESC",[93,793,794],{"class":525}," LIMIT",[93,796,797],{"class":156}," 10",[93,799,800],{"class":233},";\n",[93,802,803,805,808,810,813,815,818,820,823,825,828,830,833,836,838,840,842,844,847],{"class":95,"line":139},[93,804,761],{"class":525},[93,806,807],{"class":525}," name",[93,809,737],{"class":233},[93,811,812],{"class":156},"COUNT",[93,814,628],{"class":233},[93,816,817],{"class":525},"*",[93,819,634],{"class":233},[93,821,822],{"class":525},"FROM",[93,824,770],{"class":233},[93,826,827],{"class":525},"GROUP BY",[93,829,807],{"class":525},[93,831,832],{"class":525}," HAVING",[93,834,835],{"class":156}," COUNT",[93,837,628],{"class":233},[93,839,817],{"class":525},[93,841,634],{"class":233},[93,843,779],{"class":525},[93,845,846],{"class":156}," 1",[93,848,800],{"class":233},[93,850,851],{"class":95,"line":144},[93,852,121],{"emptyLinePlaceholder":120},[93,854,855],{"class":95,"line":150},[93,856,857],{"class":99},"-- 更新\n",[93,859,860,863,865,868,870,873,876,879,881,884,887],{"class":95,"line":163},[93,861,862],{"class":525},"UPDATE",[93,864,770],{"class":233},[93,866,867],{"class":525},"SET",[93,869,776],{"class":233},[93,871,872],{"class":525},"=",[93,874,875],{"class":156}," 21",[93,877,878],{"class":525}," WHERE",[93,880,807],{"class":525},[93,882,883],{"class":525}," =",[93,885,886],{"class":110}," 'Domi'",[93,888,800],{"class":233},[93,890,891],{"class":95,"line":178},[93,892,121],{"emptyLinePlaceholder":120},[93,894,895],{"class":95,"line":193},[93,896,897],{"class":99},"-- 删除\n",[93,899,900,903,905,907,909,912,914,916],{"class":95,"line":208},[93,901,902],{"class":525},"DELETE",[93,904,767],{"class":525},[93,906,770],{"class":233},[93,908,773],{"class":525},[93,910,911],{"class":233}," id ",[93,913,872],{"class":525},[93,915,846],{"class":156},[93,917,800],{"class":233},[29,919,563],{"id":920},"join",[83,922,924],{"className":368,"code":923,"language":370,"meta":88,"style":88},"-- INNER JOIN\nSELECT u.name, o.total\nFROM users u\nINNER JOIN orders o ON u.id = o.user_id;\n\n-- LEFT JOIN（保留左表所有行）\nSELECT u.name, o.total\nFROM users u\nLEFT JOIN orders o ON u.id = o.user_id;\n",[90,925,926,931,953,960,990,994,999,1017,1023],{"__ignoreMap":88},[93,927,928],{"class":95,"line":96},[93,929,930],{"class":99},"-- INNER JOIN\n",[93,932,933,935,938,941,943,945,948,950],{"class":95,"line":103},[93,934,761],{"class":525},[93,936,937],{"class":156}," u",[93,939,940],{"class":233},".",[93,942,722],{"class":156},[93,944,737],{"class":233},[93,946,947],{"class":156},"o",[93,949,940],{"class":233},[93,951,952],{"class":156},"total\n",[93,954,955,957],{"class":95,"line":117},[93,956,822],{"class":525},[93,958,959],{"class":233}," users u\n",[93,961,962,965,968,971,973,975,978,980,983,985,988],{"class":95,"line":124},[93,963,964],{"class":525},"INNER JOIN",[93,966,967],{"class":233}," orders o ",[93,969,970],{"class":525},"ON",[93,972,937],{"class":156},[93,974,940],{"class":233},[93,976,977],{"class":156},"id",[93,979,883],{"class":525},[93,981,982],{"class":156}," o",[93,984,940],{"class":233},[93,986,987],{"class":156},"user_id",[93,989,800],{"class":233},[93,991,992],{"class":95,"line":130},[93,993,121],{"emptyLinePlaceholder":120},[93,995,996],{"class":95,"line":139},[93,997,998],{"class":99},"-- LEFT JOIN（保留左表所有行）\n",[93,1000,1001,1003,1005,1007,1009,1011,1013,1015],{"class":95,"line":144},[93,1002,761],{"class":525},[93,1004,937],{"class":156},[93,1006,940],{"class":233},[93,1008,722],{"class":156},[93,1010,737],{"class":233},[93,1012,947],{"class":156},[93,1014,940],{"class":233},[93,1016,952],{"class":156},[93,1018,1019,1021],{"class":95,"line":150},[93,1020,822],{"class":525},[93,1022,959],{"class":233},[93,1024,1025,1028,1030,1032,1034,1036,1038,1040,1042,1044,1046],{"class":95,"line":163},[93,1026,1027],{"class":525},"LEFT JOIN",[93,1029,967],{"class":233},[93,1031,970],{"class":525},[93,1033,937],{"class":156},[93,1035,940],{"class":233},[93,1037,977],{"class":156},[93,1039,883],{"class":525},[93,1041,982],{"class":156},[93,1043,940],{"class":233},[93,1045,987],{"class":156},[93,1047,800],{"class":233},[29,1049,1050],{"id":1050},"索引",[83,1052,1054],{"className":368,"code":1053,"language":370,"meta":88,"style":88},"CREATE INDEX idx_users_email ON users(email);\nCREATE UNIQUE INDEX idx_users_name_email ON users(name, email);\nDROP INDEX idx_users_email;\n",[90,1055,1056,1072,1092],{"__ignoreMap":88},[93,1057,1058,1060,1063,1066,1069],{"class":95,"line":96},[93,1059,587],{"class":525},[93,1061,1062],{"class":525}," INDEX",[93,1064,1065],{"class":106}," idx_users_email",[93,1067,1068],{"class":525}," ON",[93,1070,1071],{"class":233}," users(email);\n",[93,1073,1074,1076,1079,1082,1084,1087,1089],{"class":95,"line":103},[93,1075,587],{"class":525},[93,1077,1078],{"class":525}," UNIQUE INDEX",[93,1080,1081],{"class":106}," idx_users_name_email",[93,1083,1068],{"class":525},[93,1085,1086],{"class":233}," users(",[93,1088,722],{"class":525},[93,1090,1091],{"class":233},", email);\n",[93,1093,1094,1097,1099],{"class":95,"line":117},[93,1095,1096],{"class":525},"DROP",[93,1098,1062],{"class":525},[93,1100,1101],{"class":233}," idx_users_email;\n",[29,1103,1104],{"id":1104},"常用函数",[83,1106,1108],{"className":368,"code":1107,"language":370,"meta":88,"style":88},"-- 聚合\nSELECT COUNT(*), AVG(age), MAX(age), MIN(age), SUM(age) FROM users;\n\n-- 字符串\nSELECT UPPER(name), LOWER(name), LENGTH(name) FROM users;\n\n-- 日期\nSELECT NOW(), CURRENT_DATE, EXTRACT(YEAR FROM created_at) FROM users;\n",[90,1109,1110,1115,1155,1159,1164,1199,1203,1208],{"__ignoreMap":88},[93,1111,1112],{"class":95,"line":96},[93,1113,1114],{"class":99},"-- 聚合\n",[93,1116,1117,1119,1121,1123,1125,1128,1131,1134,1137,1139,1142,1144,1147,1150,1152],{"class":95,"line":103},[93,1118,761],{"class":525},[93,1120,835],{"class":156},[93,1122,628],{"class":233},[93,1124,817],{"class":525},[93,1126,1127],{"class":233},"), ",[93,1129,1130],{"class":156},"AVG",[93,1132,1133],{"class":233},"(age), ",[93,1135,1136],{"class":156},"MAX",[93,1138,1133],{"class":233},[93,1140,1141],{"class":156},"MIN",[93,1143,1133],{"class":233},[93,1145,1146],{"class":156},"SUM",[93,1148,1149],{"class":233},"(age) ",[93,1151,822],{"class":525},[93,1153,1154],{"class":233}," users;\n",[93,1156,1157],{"class":95,"line":117},[93,1158,121],{"emptyLinePlaceholder":120},[93,1160,1161],{"class":95,"line":124},[93,1162,1163],{"class":99},"-- 字符串\n",[93,1165,1166,1168,1171,1173,1175,1177,1180,1182,1184,1186,1189,1191,1193,1195,1197],{"class":95,"line":130},[93,1167,761],{"class":525},[93,1169,1170],{"class":156}," UPPER",[93,1172,628],{"class":233},[93,1174,722],{"class":525},[93,1176,1127],{"class":233},[93,1178,1179],{"class":156},"LOWER",[93,1181,628],{"class":233},[93,1183,722],{"class":525},[93,1185,1127],{"class":233},[93,1187,1188],{"class":525},"LENGTH",[93,1190,628],{"class":233},[93,1192,722],{"class":525},[93,1194,634],{"class":233},[93,1196,822],{"class":525},[93,1198,1154],{"class":233},[93,1200,1201],{"class":95,"line":139},[93,1202,121],{"emptyLinePlaceholder":120},[93,1204,1205],{"class":95,"line":144},[93,1206,1207],{"class":99},"-- 日期\n",[93,1209,1210,1212,1215,1218,1221,1223,1226,1228],{"class":95,"line":150},[93,1211,761],{"class":525},[93,1213,1214],{"class":525}," NOW",[93,1216,1217],{"class":233},"(), CURRENT_DATE, EXTRACT(",[93,1219,1220],{"class":525},"YEAR",[93,1222,767],{"class":525},[93,1224,1225],{"class":233}," created_at) ",[93,1227,822],{"class":525},[93,1229,1154],{"class":233},[25,1231,1232],{"id":1232},"建模与索引建议",[21,1234,1235],{},"写 SQL 之前，先把几个原则记住会少走很多弯路：",[34,1237,1238,1241,1244,1247],{},[37,1239,1240],{},"主键尽量稳定，不要频繁变更",[37,1242,1243],{},"会被高频查询、排序、关联的字段，再考虑建索引",[37,1245,1246],{},"索引不是越多越好，写入也要为索引付成本",[37,1248,1249],{},"能用唯一约束表达规则时，优先用数据库约束，而不是只靠业务代码兜底",[21,1251,1252],{},"一个常见误区是：表一慢就盲目加索引。更稳妥的做法是先看查询语句、过滤条件、排序字段和执行计划。",[25,1254,1255],{"id":1255},"备份与迁移",[21,1257,1258],{},"数据库真正容易出问题的地方，往往不是“建不起来”，而是“改结构”和“恢复数据”。",[21,1260,1261],{},"建议至少建立这些习惯：",[34,1263,1264,1267,1270,1273],{},[37,1265,1266],{},"结构变更走 migration，不要手工改线上库",[37,1268,1269],{},"升级前先做备份，尤其是生产环境",[37,1271,1272],{},"把连接信息放进环境变量，不要硬编码在仓库里",[37,1274,1275],{},"本地、测试、生产三套环境尽量分离",[25,1277,1278],{"id":1278},"常见问题",[29,1280,1282],{"id":1281},"为什么本地能连部署后连不上","为什么本地能连，部署后连不上",[21,1284,1285],{},"优先检查：",[34,1287,1288,1291,1294,1297],{},[37,1289,1290],{},"主机、端口、用户名、密码是否正确",[37,1292,1293],{},"容器或服务器的网络是否互通",[37,1295,1296],{},"数据库是否只监听了本地地址",[37,1298,1299],{},"环境变量是否真的被应用读取到了",[29,1301,1302],{"id":1302},"为什么查询越来越慢",[21,1304,1305],{},"高频原因通常包括：",[34,1307,1308,1311,1314,1320],{},[37,1309,1310],{},"没索引或索引没命中",[37,1312,1313],{},"一次查太多列、太多行",[37,1315,1316,1319],{},[90,1317,1318],{},"LIKE '%keyword%'"," 这类查询无法有效利用普通索引",[37,1321,1322],{},"把业务筛选全交给应用层，而不是数据库层",[25,1324,1325],{"id":1325},"延伸阅读",[34,1327,1328,1335,1341,1347],{},[37,1329,1330],{},[1331,1332,1334],"a",{"href":1333},"\u002Fdocs\u002Fenv-variables","环境变量与配置管理",[37,1336,1337],{},[1331,1338,1340],{"href":1339},"\u002Fdocs\u002Fdocker-compose-recipes","Docker Compose 常用配方",[37,1342,1343],{},[1331,1344,1346],{"href":1345},"\u002Fdocs\u002Fredis-guide","Redis 使用指南",[37,1348,1349],{},[1331,1350,1352],{"href":1351},"\u002Fdocs\u002Fmonitoring-logging","监控与日志",[25,1354,1356],{"id":1355},"gui-工具推荐","GUI 工具推荐",[1358,1359,1360,1373],"table",{},[1361,1362,1363],"thead",{},[1364,1365,1366,1370],"tr",{},[1367,1368,1369],"th",{},"工具",[1367,1371,1372],{},"说明",[1374,1375,1376,1390,1402,1414,1426],"tbody",{},[1364,1377,1378,1387],{},[1379,1380,1381],"td",{},[1331,1382,1386],{"href":1383,"rel":1384},"https:\u002F\u002Fdbeaver.io\u002F",[1385],"nofollow","DBeaver",[1379,1388,1389],{},"免费，支持所有主流数据库",[1364,1391,1392,1399],{},[1379,1393,1394],{},[1331,1395,1398],{"href":1396,"rel":1397},"https:\u002F\u002Ftableplus.com\u002F",[1385],"TablePlus",[1379,1400,1401],{},"轻量美观（macOS\u002FWindows）",[1364,1403,1404,1411],{},[1379,1405,1406],{},[1331,1407,1410],{"href":1408,"rel":1409},"https:\u002F\u002Fsqlitebrowser.org\u002F",[1385],"DB Browser for SQLite",[1379,1412,1413],{},"SQLite 专用",[1364,1415,1416,1423],{},[1379,1417,1418],{},[1331,1419,1422],{"href":1420,"rel":1421},"https:\u002F\u002Fwww.adminer.org\u002F",[1385],"Adminer",[1379,1424,1425],{},"Web 界面，单文件 PHP",[1364,1427,1428,1435],{},[1379,1429,1430],{},[1331,1431,1434],{"href":1432,"rel":1433},"https:\u002F\u002Fwww.pgadmin.org\u002F",[1385],"pgAdmin",[1379,1436,1437],{},"PostgreSQL 官方工具",[83,1439,1441],{"className":224,"code":1440,"language":226,"meta":88,"style":88},"winget install dbeaver.dbeaver\n",[90,1442,1443],{"__ignoreMap":88},[93,1444,1445],{"class":95,"line":96},[93,1446,1440],{"class":233},[25,1448,1449],{"id":1449},"参考链接",[34,1451,1452,1460,1467,1474],{},[37,1453,1454,1459],{},[1331,1455,1458],{"href":1456,"rel":1457},"https:\u002F\u002Fwww.postgresql.org\u002Fdocs\u002F",[1385],"PostgreSQL 文档"," — 官方文档",[37,1461,1462,1459],{},[1331,1463,1466],{"href":1464,"rel":1465},"https:\u002F\u002Fdev.mysql.com\u002Fdoc\u002F",[1385],"MySQL 文档",[37,1468,1469,1459],{},[1331,1470,1473],{"href":1471,"rel":1472},"https:\u002F\u002Fwww.sqlite.org\u002Fdocs.html",[1385],"SQLite 文档",[37,1475,1476,1481],{},[1331,1477,1480],{"href":1478,"rel":1479},"https:\u002F\u002Fwww.sqltutorial.org\u002F",[1385],"SQL 教程"," — 在线教程",[1483,1484,1485],"style",{},"html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}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 .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}",{"title":88,"searchDepth":103,"depth":103,"links":1487},[1488,1493,1496,1501,1506,1507,1514,1515,1516,1520,1521,1522],{"id":27,"depth":103,"text":27,"children":1489},[1490,1491,1492],{"id":31,"depth":117,"text":32},{"id":48,"depth":117,"text":49},{"id":63,"depth":117,"text":64},{"id":78,"depth":103,"text":32,"children":1494},[1495],{"id":220,"depth":117,"text":221},{"id":236,"depth":103,"text":49,"children":1497},[1498,1499,1500],{"id":239,"depth":117,"text":240},{"id":302,"depth":117,"text":302},{"id":365,"depth":117,"text":365},{"id":423,"depth":103,"text":64,"children":1502},[1503,1504,1505],{"id":426,"depth":117,"text":240},{"id":481,"depth":117,"text":302},{"id":510,"depth":117,"text":365},{"id":542,"depth":103,"text":542},{"id":573,"depth":103,"text":574,"children":1508},[1509,1510,1511,1512,1513],{"id":577,"depth":117,"text":577},{"id":700,"depth":117,"text":701},{"id":920,"depth":117,"text":563},{"id":1050,"depth":117,"text":1050},{"id":1104,"depth":117,"text":1104},{"id":1232,"depth":103,"text":1232},{"id":1255,"depth":103,"text":1255},{"id":1278,"depth":103,"text":1278,"children":1517},[1518,1519],{"id":1281,"depth":117,"text":1282},{"id":1302,"depth":117,"text":1302},{"id":1325,"depth":103,"text":1325},{"id":1355,"depth":103,"text":1356},{"id":1449,"depth":103,"text":1449},{"path":1524,"title":1525,"description":1526,"docType":8,"resourceKind":9,"categoryId":1527,"categoryLabel":1528,"updatedAt":12,"publishedAt":12,"icon":1529},"\u002Fdocs\u002Fdata-recovery","数据恢复与磁盘工具","磁盘分区、数据恢复、硬盘检测与文件系统修复工具","windows-system","Windows 系统","i-mdi-microsoft-windows",{"path":1531,"title":1532,"description":1533,"docType":8,"resourceKind":9,"categoryId":1534,"categoryLabel":1535,"updatedAt":12,"publishedAt":12,"icon":1536},"\u002Fdocs\u002Fimage-video-processing","图片与视频处理","ImageMagick、Sharp、视频转码、图片压缩与格式转换","media-creation","媒体与创作","i-carbon-media-library",[1538,1539,1540],"希望把零散经验整理成长期可复用工作流的人","想先建立认知，再决定是否深入实践的人","希望阅读时顺手建立自己的操作清单或收藏体系的人",[1542,1543,1544],"先浏览标题、摘要和目录，带着问题阅读会更高效","顺手记录真正对你有用的命令、链接和注意事项，避免重复搜索","如果页面里提到相关文档，尽量一起打开对照，效果通常更完整",[1546,1551,1555,1559],{"path":1547,"title":1548,"description":1549,"docType":8,"resourceKind":9,"categoryId":10,"categoryLabel":11,"updatedAt":1550,"publishedAt":1550,"icon":13},"\u002Fdocs\u002Ftesting-guide","前端测试指南","Vitest 单元测试、Playwright E2E 测试、测试策略与最佳实践","2026-02-28",{"path":1552,"title":1553,"description":1554,"docType":8,"resourceKind":9,"categoryId":10,"categoryLabel":11,"updatedAt":1550,"publishedAt":1550,"icon":13},"\u002Fdocs\u002Fbun-deno","Bun 与 Deno 运行时","Bun 和 Deno 的安装使用、与 Node.js 对比、包管理与实用命令",{"path":1556,"title":1557,"description":1558,"docType":8,"resourceKind":9,"categoryId":10,"categoryLabel":11,"updatedAt":1550,"publishedAt":1550,"icon":13},"\u002Fdocs\u002Fcss-tricks","CSS 实用技巧","现代 CSS 特性、布局技巧、动画、暗色模式与常用代码片段",{"path":1345,"title":1346,"description":1560,"docType":8,"resourceKind":9,"categoryId":10,"categoryLabel":11,"updatedAt":1550,"publishedAt":1550,"icon":13},"Redis 安装、数据类型、常用命令、缓存策略与 Node.js 集成",1776215712525]