目录
回顾
1. 命令行下的 MySql 客户端
2. 图形化界面的 MySQL-Client
3. 数据库概述
3.1 数据库管理系统是什么
3.2 工作模式
3.3 RDBMS 管理数据的结构
3.4 客户端连接服务器的信息
4. MySQL 中的数据类型
4.1 整型类型
4.2 字符串
4.3 日期/时间
5. MySQL 每个字段的选项约束
6. 练习:将我们做过的题目记录到数据库中
回顾
上一篇博客中,我们具体包括以下内容:
-
安装 mysql-server,通过 Ubuntu 的包管理工具
apt
,自动启动了 MySQLapt list sudo apt install <包名>
-
检查 MySQL-Server 进程(/usr/sbin/mysqld)是否启动成功
ps aux | grep mysqld #进程 sudo netstat -nlpt | grep 3306 #端口
-
查看对应的进程是否存在
-
MySQL-Server 进程应该监听 TCP 3306 端口,查看端口监听情况
-
-
通过 MySQL-Client (/usr/sbin/mysql) 建立和 MySQL-Server 的连接(via 3306 端口)
在 Unix(Linux) OS中,习惯于把服务器(Server:提供 服务(Service)的进程) 进程叫做 xxxd。d 是 daemon(守护精灵):表示这类进程都是看不到的,默默在背后工作。
通过 MySQL-Client 要连接 MySQL-Server 是通过网络连接的,所以需要知道如下信息:
1.MySQL-Server 进程工作在网络中的哪台主机(host)上?
通过域名(domain)或者 ip 地址。 其中 127.0.0.1 是一个特殊的 ip 地址,代表本机。对应的域名 localhost。
2.MySQL-Server 进程是这台主机上的哪个进程?
通过端口(3306 MySQL 服务器进程的默认端口)
-
当主机是 127.0.0.1、端口是 3306 时,可以省略
-
授权信息:mysql 的用户名,mysql 的密码
-
所以从默认的配置文件中 (/etc/mysql/debian.conf)下获取用户名和密码
sudo cat /etc/mysql/debian.cnf
连接数据库
mysql -h127.0.0.1 -P3306 -u<用户名> -p
接下来,我们开始学习 MySQL 的相关知识。
1. 命令行下的 MySql 客户端
-- 这个是注释
-- 创建一个库(schema)名叫 learn,默认字符集 utf8mb4
create database learn charset utf8mb4;
-- 切换自己的工作环境为 learn 库,俗称把 learn 设成默认库
use learn;
-- 创建一张学生表(students),列
-- 学号(sn)整型 int primary key(pk) 主键
-- 姓名(name)字符串 varchar(20) 字符串最长 20 个字
-- 入学时间(entried_at) datetime 年-月-日 时:分:秒
create table students (
sn int primary key,
name varchar(20),
entried_at datetime
);
-- 在这张表中插入一些数据,注意:数据必须整行的形式存在
insert into students (sn, name, entried_at)
values (101, '张三', '2021-09-01 18:32:18');
-- 查看表中的数据
select * from students;
2. 图形化界面的 MySQL-Client
- 需要在云服务器(Web控制台)上开启 3306 的访问权限;
- Mysql-server 默认不允许从非本地连接。
以上两点都是为了保证数据的安全,数据库的数据一旦泄露后果不堪设想。 如果默尔曼采用直接连接的方式连接数据库十分的麻烦且不安全。因此,我们采用SSH 隧道(Tunnel)的方式,具体流程如下图所示。
接下来我们就需要使用 WindTerm 的隧道功能了。
3. 数据库概述
3.1 数据库管理系统是什么
Database Manage System(DBMS)是一类数据库管理系统软件。
其中目前主流的是关系型数据库管理系统 Relational Database Manage System RDBMS。
知名的产品有 MySQL、Oracle、Postgres、Sqlite 等。
通常将数据存储在二级存储(硬盘)上 —— 断电后数据仍然保留。
内部实现中,通过一个 schema(database) 是一个文件夹,每个 table 是该文件夹下的几个文件。
3.2 工作模式
客户端-服务器模型
3.3 RDBMS 管理数据的结构
RDBMS -> Database/Schema -> Table -> Row -> Column/Field
3.4 客户端连接服务器的信息
主机(host)、端口(port)、用户名(user)、密码(password)、默认库
4. MySQL 中的数据类型
4.1 整型类型
int (32位)/ smallint (16位)/ bigint(64位)
4.2 字符串
- char(10) 定长字符串
- varchar(10) 变长字符串 variable(变量/变化的)
10:最多存 10 个字(不区分英文/中文)
text / longtext --- blob / longblob (存放视频数据和音频数据 Binary Large Object)
SQL 中,不区分单引号、双引号
4.3 日期/时间
- date 年月日 '2023-04-20'
- time 时分秒 '21:02:38'
- datetime 年月日 + 时分秒 '2023-04-20 21:02:38'
5. MySQL 每个字段的选项约束
- PK Primary Key 勾选之后,代表这列是主键
- NNNot Null 勾选之后,此列不允许填入 Null null NuLL
- UQ Unique(唯一的) 勾选之后,此列的数据不能重复
- AI Auto Incremental 只能配合 Int + PK 使用,填入之后,此列的值自动加 1
建库的原则:
一定要选择字符集编码为 utf8mb4
建表的通常原则:
必须有一个列,这个列的名称叫做 users uid,作为主键存在,并且选择 NN、AI
如果没有意外情况,各个列都把 NN 勾选上
6. 练习:将我们做过的题目记录到数据库中
oj_records
0) oj_id int pk ai
1)题目来源(牛客 or leetcode) source varchar(10) NN 可以重复
2)题目链接 link varchar(200) NN 不重复
3)题目 question varchar(100) NN 不重复
4)难度 difficulty varchar(10) Null
5)是否通过 passed int NN
6)上次通过时间 last_passed_at datetime Null
CREATE TABLE `learn`.`oj_records` (
`oj_id` INT NOT NULL AUTO_INCREMENT,
`source` VARCHAR(10) NOT NULL,
`link` VARCHAR(200) NOT NULL,
`question` VARCHAR(100) NOT NULL,
`difficulty` VARCHAR(10) NULL,
`passed` INT NOT NULL DEFAULT 0 COMMENT '1: 通过\n0: 未通过',
`last_passed_at` DATETIME NULL,
PRIMARY KEY (`oj_id`),
UNIQUE INDEX `link_UNIQUE` (`link` ASC) VISIBLE,
UNIQUE INDEX `question_UNIQUE` (`question` ASC) VISIBLE)
COMMENT = 'OJ 刷题记录';