你在一张表格里见过几百行学生数据,知道它们“存在某个数据库里”,可那个数据库到底在哪、怎么用命令把它调出来?数据库不在你眼前的窗口里,它跑在另一台服务器上。想进去,得先拿连接信息连上服务器,再选定 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 这个门,所以图形客户端常常已经帮你填好了。

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

把“窗口”和“服务器”分开,很多奇怪现象就能解释了:为什么别人关掉窗口,数据还在?因为数据存在服务器上,不在窗口里。窗口关了,只是你和服务器之间的这条连线断了,数据本身没动。反过来,也有人以为只要数据在自己电脑上显示出来,就说明数据存在自己电脑里——其实只是服务器把结果“送”到了你的窗口里,数据本体一直留在服务器上。
因为数据在服务器上,而且服务器上可能同时放着多个库,所以“进库”要分两步:
- 连接服务器:用主机、端口、账号、密码敲门,服务器核对通过后,窗口里出现一个
mysql>提示符。这一步只说明“门开了、我进来了”,还没说进哪个库。 - 选定数据库:服务器上可能同时放着 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 时,就不用每次都带上库名前缀。没选库就敲这些命令,服务器会因为“不知道你说的是哪个库”而报错,或者返回空结果。

一个小提醒:USE 和 QUIT 一样,不写分号也行。它还有一条特殊要求——USE 必须单独占一行,不能和别的内容挤在一起,否则服务器会当成你还没输完这一句,继续等你补全。
SHOW TABLES 看看库里有哪些表
选好库以后,先看看这个库里有哪些表:
SHOW TABLES;
mysql大概会返回这样的结果:
+---------------------+
| Tables_in_learning |
+---------------------+
| students |
| courses |
+---------------------+
结果只有一列,列名是 Tables_in_learning,意思是“learning 库里的表名”。下面每一行就是一个表:这里能看到 students 表和 courses 表,你要找的 students 就在里面。列名里的 learning 会跟着当前库名变——你选了哪个库,这一列就写 Tables_in_<库名>,这也能顺便确认自己到底选对了库没有。
进库之后先列一遍表,就像进档案室先看有哪些档案柜;知道表名之后,才能继续看某张表的结构。
如果这一列里没有你预期的表,别急着怀疑表不存在,先核对两件事:
- 当前选的是不是
learning库。可以用SELECT DATABASE();看当前库,没选库它会返回NULL。 - 你的账号有没有访问这个库的权限。服务器只把你有权限看的表列给你,看不到不等于表没了。
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 |
+----+--------+-----+------------+
这里每一行是一条学生记录:数据里的三行对应三个学生;表结构输出里的“一行代表一列”,四行对应四列。两个“一行”不是同一套对应关系,混淆了就会把四列当成四个学生。
这就像普通表格软件里“表头那一行”和“表格里填的内容”的区别:表头固定列,内容按行填。

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