你在一张表格里见过几百行学生数据,知道它们“存在某个数据库里”,可那个数据库到底在哪、怎么用命令把它调出来?数据库不在你眼前的窗口里,它跑在另一台服务器上。想进去,得先拿连接信息连上服务器,再选定 learning 这个库,然后用 SHOW TABLES 列出表、用 DESCRIBE 看清 students 表有哪些列。这几步里藏着最容易踩空的一步——很多人把“打开客户端窗口”当成了“已经进库”。

连接信息里的五样东西:主机、端口、账号、密码和库

要连进学习库,手里必须先有一套连接信息。它一共五样,每一样回答一个问题:

  • 主机(host):数据库服务器运行在哪台机器上,比如 db.learning.cn 或一个 IP 地址。它回答“往哪连”。
  • 端口(port):服务器从哪个端口接收连接。MySQL 的默认端口是 3306,图形客户端里常常已经帮你填好。
  • 账号(user):以谁的身份连进去,比如 reader。
  • 密码(password):证明这个账号确实是你的。
  • 库名(database):进去之后要打开哪个数据库,本次用 learning库。

五样里最容易忽略的是端口:很多人以为有了主机地址就能连上,结果发现地址对了还是连不上,往往就是端口没填对。

把这五样填进客户端,大概长这个样子:

要素 输入的值
主机 host db.learning.cn
端口 port 3306
账号 user reader
密码 password (自己输入)
库名 database learning

这五样是一个样例,使用时需要根据实际情况修改。主机和端口的关系,可以想成寄快递要同时写清地址和门牌号:主机是“哪栋楼”,端口是“哪个门”。MySQL 默认就开 3306 这个门,所以图形客户端常常已经帮你填好了。

Mermaid 图 1

客户端窗口不是服务器:先连上,再选库

先纠正一个最容易想歪的地方:你眼前这个黑窗口(或图形客户端)不是数据库本身。它只是一个客户端,负责两件事——把你敲的语句发给服务器,再把服务器返回的结果显示出来。真正的数据,存在另一台机器上的服务器里,就像上图里那样,learning 库和它的表都在“服务器”那一边,不在你的窗口里。 粘贴图片

把“窗口”和“服务器”分开,很多奇怪现象就能解释了:为什么别人关掉窗口,数据还在?因为数据存在服务器上,不在窗口里。窗口关了,只是你和服务器之间的这条连线断了,数据本身没动。反过来,也有人以为只要数据在自己电脑上显示出来,就说明数据存在自己电脑里——其实只是服务器把结果“送”到了你的窗口里,数据本体一直留在服务器上。

因为数据在服务器上,而且服务器上可能同时放着多个库,所以“进库”要分两步:

  1. 连接服务器:用主机、端口、账号、密码敲门,服务器核对通过后,窗口里出现一个 mysql> 提示符。这一步只说明“门开了、我进来了”,还没说进哪个库。
  2. 选定数据库:服务器上可能同时放着 learning、test、mysql 好几个库,learning 只是其中一个。你得再告诉它“接下来我要用 learning 这个库”。

拿办公楼打个比方:连接服务器就像走进大楼的大门,保安核对身份后放你进去;USE 选库就像再坐电梯进到具体的某个房间。你进了大门,不等于你已经在 learning 这个房间里了——数据放在一个个“房间”里,你得先告诉服务器要去哪个房间。

把这两步分开,后面很多报错就能看懂了。比如你连是连上了,可没选库就去列表,服务器自然不知道该看哪个库。

一条命令连上去:mysql -h host -u user -p

在命令行里,第一步连接对应这样一条命令:

mysql -h host -u user -p

其中 -h 后面是主机,-u 后面是账号,-p 表示“我要用密码,但别让我把密码直接写在命令里”。敲回车后,客户端会单独弹出一行:

Enter password:

你在这里输入密码。输入的时候屏幕上什么都不显示,这是故意设计——避免旁边的人看到你的密码。按回车后,如果主机、账号、密码都对了,就会看到欢迎信息和这个提示符:

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 25338 to server version: 8.4

mysql>

看到 mysql> 就说明连接成功,可以往里敲语句了。欢迎信息里的 server version: 8.4 是服务器端的版本号,connection id 是这次连接的编号,对新手来说看到 mysql> 就够了。三个短横线参数可以对照着记:-h 是 host 的 h,-u 是 user 的 u,-p 是 password 的 p。密码错了、主机写错、账号不存在,都会在这一步被服务器拦下来,返回一条报错,比如 Access denied for user,这时候回来看这五样里哪一样没填对就行。注意这里的 host、user 是占位写法,你要换成真实主机名和账号名。如果服务器就在你登录的这台机器上,-h host 这一节可以省掉,直接写 mysql -u user -p。

图形客户端干的是同一件事:它把主机、端口、账号、密码、库名做成输入框,你填同样的五样信息后点连接即可。

用完要退出,敲 QUIT(或者更短的 \q)再回车:

mysql> QUIT
Bye

USE learning 选定数据库

连上服务器只是第一步。mysql> 出现时,你还没告诉服务器要用哪个库——服务器上可能有 learning、test、mysql 好几个库。接下来这条命令就是选库:

USE learning;

如果库名写对了,服务器回你一句:

Database changed

这句话就是服务器在确认:“当前库已经切到 learning 了。”从这一刻起,你后面敲的 SHOW TABLES、DESCRIBE,默认都是对着 learning 这个库说话。“默认库”的意思是:从这一句往后,凡是只写表名、不写库名的语句,服务器都自动认为那张表属于 learning,这样你写 SHOW TABLES、写 DESCRIBE students 时,就不用每次都带上库名前缀。没选库就敲这些命令,服务器会因为“不知道你说的是哪个库”而报错,或者返回空结果。

Mermaid 图 2

一个小提醒:USE 和 QUIT 一样,不写分号也行。它还有一条特殊要求——USE 必须单独占一行,不能和别的内容挤在一起,否则服务器会当成你还没输完这一句,继续等你补全。

SHOW TABLES 看看库里有哪些表

选好库以后,先看看这个库里有哪些表:

SHOW TABLES;

mysql大概会返回这样的结果:

+---------------------+
| Tables_in_learning  |
+---------------------+
| students            |
| courses             |
+---------------------+

结果只有一列,列名是 Tables_in_learning,意思是“learning 库里的表名”。下面每一行就是一个表:这里能看到 students 表和 courses 表,你要找的 students 就在里面。列名里的 learning 会跟着当前库名变——你选了哪个库,这一列就写 Tables_in_<库名>,这也能顺便确认自己到底选对了库没有。

进库之后先列一遍表,就像进档案室先看有哪些档案柜;知道表名之后,才能继续看某张表的结构。

如果这一列里没有你预期的表,别急着怀疑表不存在,先核对两件事:

  1. 当前选的是不是 learning 库。可以用 SELECT DATABASE(); 看当前库,没选库它会返回 NULL。
  2. 你的账号有没有访问这个库的权限。服务器只把你有权限看的表列给你,看不到不等于表没了。

DESCRIBE students 读表结构:一行一列

找到 students 表后,再看它里面有哪些列、每列是什么类型。用这条命令:

DESCRIBE students;

DESCRIBE 可以简写成 DESC。它返回的是这张表的结构,看起来是这样:

+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id       | int         | NO   | PRI | NULL    |       |
| name     | varchar(20) | YES  |     | NULL    |       |
| age      | int         | YES  |     | NULL    |       |
| enrolled | date        | YES  |     | NULL    |       |
+----------+-------------+------+-----+---------+-------+

先只看最前面的两列,这是你现在最需要的:

  • Field:这一列的名字,比如 id、name、age、enrolled。
  • Type:这一列存的类型。int 是整数,varchar(20) 是长度不超过 20 个字符的字符串,date 是日期。

顺着表读下来,这张表的意思就清楚了:每个学生有 id(整数编号)、name(最多 20 个字符的姓名)、age(整数年龄)、enrolled(入学日期)四样属性。类型还预告了你能对每一列做什么:age 是 int,所以两个学生的年龄可以直接比大小、可以直接相减;name 是 varchar(20) 字符串,比较时按字符顺序(字典序)来,而不是按数字。列的类型没看对,后面的查询就容易跟着出错。

看懂列名和类型,后面挑数据时才清楚:有哪些列能挑,每一列能不能用来算数、能不能用来比大小。

关键要记住一个对应关系:这个输出里的每一行,描述表里的一列。上面有四行,就说明 students 表有四列——而不是四个学生。

剩下的 Null、Key、Default、Extra 四列,眼下只当个记号看就行:它们分别在说“这列能不能为空”“是不是主键”“默认值是什么”“有没有特殊属性”。

表结构是空表格式,表数据是一条条记录

把表结构和表数据放在一起对比,更容易分清。

表结构(DESCRIBE 给的)回答“这张表长什么样”——它有 id、name、age、enrolled 四列,每列是什么类型。它像一个空表格的列头,说明这张表能装什么格式的数据。

表数据(真正存在表里的内容)回答“表里存了什么”,比如这几行已经存好的学生:

+----+--------+-----+------------+
| id | name   | age | enrolled   |
+----+--------+-----+------------+
|  1 | 张伟   |  20 | 2024-09-01 |
|  2 | 李娜   |  21 | 2024-09-01 |
|  3 | 王强   |  19 | 2024-09-02 |
+----+--------+-----+------------+

这里每一行是一条学生记录:数据里的三行对应三个学生;表结构输出里的“一行代表一列”,四行对应四列。两个“一行”不是同一套对应关系,混淆了就会把四列当成四个学生。

这就像普通表格软件里“表头那一行”和“表格里填的内容”的区别:表头固定列,内容按行填。

Mermaid 图 3

把这两种“一行”分清,就不会把列数当成学生数;