🦏 第1章 数据库简介
📄 一句话概括

Navicat 是图形客户端,不是数据库。 它把「连接、看表、改字段、跑 SQL」这些动作画成界面, 背后发给服务端的还是 SQL。 Demo 把左边那棵对象树的来源查出来了: 表的清单来自 sqlite_master(MySQL 是 SHOW TABLES), 字段清单来自 PRAGMA table_info(MySQL 是 DESC)—— 图形工具没有魔法,就是把这两句查出来画成树。

📝 本章和前面几章的关系

上一章装的是服务端,这一章装的是「用的那一头」。 两者完全独立:服务端只有一个, 客户端可以装好几个。 本篇也不写查询,只讲工具在做什么、为什么还得会 SQL。

一、Navicat 是什么:一个收费的图形客户端

它的定位:连上 MySQL/MariaDB/PostgreSQL/SQLite 等一堆数据库, 用界面管理表、跑查询、导数据、看结构。 它不是免费的(有 14 天试用;后来出了免费的 Navicat Premium Lite)。 要免费的替代:DBeaver(社区版免费、跨库)、MySQL Workbench(Oracle 官方免费)、 DataGrip(JetBrains,收费)。 选哪个都行,因为它们干的事一样:管理连接、画对象树、编辑表结构、跑 SQL、导出结果。 学会一个,换另一个半小时就能上手。

二、左边那棵树,数据从哪来

第一层「连接」是你自己建的,名字随便起,不影响连到哪台机器。 第二层「数据库」来自 SHOW DATABASES。 第三层「表」来自 SHOW TABLES。 第四层「字段」来自 DESC 表名。 这四句在沙箱里都能找到对应:sqlite_master 给表与视图清单,PRAGMA table_info 给字段清单。 Demo 就是把这两句真跑了一遍。 知道这一点有个实际好处:树刷不出来的时候, 你能自己去敲那句 SQL 看看到底是「没权限」还是「真空库」,而不是干瞪着转圈。

三、为什么装了 Navicat 还得会 SQL

图形工具擅长「看得见的操作」:改个字段类型、看十行数据、导个 CSV,点两下就完。 它不擅长三件事:批量(给一百张表加同一个字段)、复现(同事问你「上次那个数怎么来的」, 截图说不清)、排查(查询慢、锁住了、权限不对)。这三件全靠 SQL。 更关键的是:界面上每个动作都会翻译成 SQL 发出去, 看不懂那句 SQL,就不知道它到底改了什么。 生产库上「点错一下」和「敲错一句」后果一样重。

四、小结

教材小结: Navicat 是图形化的 MySQL 客户端,装上、连上就能管理数据库;它适合看结构和做日常操作。 本课补三条:一是客户端与服务端是两回事,客户端可以随便换; 二是对象树背后就是几句查系统表的 SQL;三是批量、复现、排查这三件事,图形工具替不了 SQL。

五、动手 Demo:把对象树和字段清单查出来

Demo 四段:建一张小表,然后查「对象树」和「字段清单」——这正是 Navicat 左侧面板显示的两层内容。 每一段后面都标了 MySQL 里对应的那句。

import sqlite3
c = sqlite3.connect(":memory:")
# 建一张小表,才有东西可看
c.execute("CREATE TABLE goods (id INTEGER PRIMARY KEY, "
          "name TEXT, price REAL)")

# 对象树:所有表与视图
c.execute("SELECT type, name FROM sqlite_master "
          "WHERE type IN ('table','view') ORDER BY type, name")

# 展开一张表:字段名、类型、能不能空、默认值
c.execute("PRAGMA table_info(goods)")

实跑输出:

--------------------------------------------------------------------
第三课:Navicat 这类图形工具,替你做的是哪几句 SQL
--------------------------------------------------------------------

  左边那棵对象树,数据来自一张系统表
  SQL> SELECT type, name FROM sqlite_master WHERE type IN ('table','view') ORDER BY type, name
  type      name
  -----------------------
  table     classes
  table     goods
  table     order_detail
  table     orders
  table     scores
  table     students
  (6 行)

  **MySQL 里对应的是** `SHOW TABLES;`**,它查的是**
  `information_schema` **那套系统库。图形工具没有魔法,就是把这几句查出来画成树。**

  展开一张表,看到的字段清单来自 PRAGMA
  位置  字段名      类型      允许空    默认值
  --------------------------------------------------
  0     id          INTEGER   是        NULL
  1     name        TEXT      否        NULL
  2     cat         TEXT      是        NULL
  3     price       REAL      否        NULL
  4     stock       INTEGER   否        0
  5     on_sale     INTEGER   否        1
  (6 行)
  **MySQL 里是** `DESC goods;`**(`DESCRIBE` 的缩写),输出几乎一模一样。**

  图形界面上每个动作,背后都是一句 SQL
  点「新建数据库」 → `CREATE DATABASE shop;`
  点「新建表」 → `CREATE TABLE goods (...);`
  点「设计表」改字段 → `ALTER TABLE goods MODIFY ...;`
  点「运行」那个绿色三角 → 把编辑区里的 SQL 发给服务端
  **会用 SQL 的人用图形工具是图快;只会图形工具的人,出了错就查不下去。**

  所以本课的路线:图形工具当放大镜,SQL 当手
  **每一节先给 SQL,再说图形工具里点哪里。** 沙箱里没有 Navicat,
  **但每一句 SQL 都能真跑,跑出来的数就是图形工具里会看到的数。**

第一段建表。 三个字段,简单到能一眼看完。 第二段查对象树。 sqlite_master 里躺着六张样例表加这张 goods, MySQL 里对应 SHOW TABLES;,查的是 information_schema 那套系统库。 第三段查字段。 位置、名字、类型、能不能空、默认值五列,这就是「设计表」界面里那个表格。 第四段讲每个点击背后的 SQL。 新建库、新建表、改字段、运行——四句话全在正文里列出来了。

30 秒实验

  1. sqlite_master 里 type 有哪几种值?index 和 table 有什么不同?
  2. (先想再跑)PRAGMA table_info 的第五列是默认值,那 NOT NULL 体现在哪一列?
  3. MySQL 里 SHOW TABLES 和 DESC 表名 分别对应这里的哪一句?

常见误区

  1. 以为 Navicat 是数据库。 它只是客户端,卸了它数据一行不少,卸了服务端才真没了。
  2. 只会在界面上点,不会看它发出的 SQL。 点错一下就是一条 DROP,界面不会问你第二次。
  3. 树刷不出来就重装客户端。 先敲一句 SHOW TABLES / PRAGMA table_info, 分清是权限问题还是空的。
自测三问(点开对答案) 1. Navicat 属于哪一头? —— 客户端。它连服务端、发 SQL、显示结果,自己不存数据。 2. Navicat 左边那棵树的数据从哪来? —— 来自查系统表的 SQL:库来自 SHOW DATABASES,表来自 SHOW TABLES,字段来自 DESC 表名。 3. 为什么装了图形工具还要会 SQL? —— 批量操作、复现别人的查询、排查慢与锁,这三件图形工具替不了; 而且界面上每个动作背后都是一句 SQL。

工具装好了,下一章就按它那四个格子一步步来:连接、建库、建表、跑代码。

相关笔记