TiDB 中的基本 SQL 操作

本文详细介绍TiDB中如何进行数据库、表、索引的基本管理,包括创建、查看、删除等操作,以及如何进行数据的增删改查,同时涵盖用户管理及历史数据读取方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

TiDB 中的基本 SQL 操作

因为 TiDB 兼容 MySQL,你可以使用 MySQL 客户端连接 TiDB,并且大多数情况下可以直接执行 MySQL 语句。

本文介绍 CRUD 操作等基本的 SQL 语句。完整的 SQL 语句列表,参见 TiDB SQL 语法详解

创建、查看和删除数据库

使用 CREATE DATABASE 语句创建数据库。语法如下:

CREATE DATABASE db_name [options];

例如,要创建一个名为 samp_db 的数据库,可使用一下语句:

CREATE DATABASE IF NOT EXISTS samp_db;

使用 SHOW DATABASES 语句查看数据库:

SHOW DATABASES;

使用 DROP DATABASE 语句删除数据库,例如:

DROP DATABASE samp_db;

创建、查看和删除表

使用 CREATE TABLE 语句创建表。语法如下:

CREATE TABLE table_name column_name data_type constraint;

例如:

CREATE TABLE person(
	number INT(11),
	name VARCHAR(255),
	birthday DATE
	);

如果表已存在,添加 IF NOT EXISTS 可防止发生错误:

CREATE TABLE IF NOT EXISTS person(
	number INT(11),
	name VARCHAR(255),
	birthday DATE
	);

使用 SHOW CREATE 语句查看建表语句。例如:

SHOW CREATE table person;

使用 SHOW FULL COLUMNS 语句查看表的列。例如:

SHOW FULL COLUMNS FROM person;

使用 DROP TABLE 语句删除表。 例如:

DROP TABLE person;

或者

DROP TABLE IF EXISTS person;

使用 SHOW TABLES 语句查看数据库中的所有表。例如:

SHOW TABLES FROM samp_db;

创建、查看和删除索引

对于值不唯一的列,可使用 CREATE INDEX 或 ALTER TABLE 语句。例如:

CREATE INDEX person_num ON person (number);

或者

ALTER TABLE person ADD INDEX person_num (number);

对于值唯一的列,可以创建唯一索引。例如:

CREATE UNIQUE INDEX person_num ON person (number);

或者

ALTER TABLE person ADD UNIQUE person_num (number);

使用 SHOW INDEX 语句查看表内所有索引:

SHOW INDEX FROM person;

使用 ALTER TABLE 或 DROP INDEX 语句来删除索引。与 CREATE INDEX 语句类似, DROP INDEX 也可以嵌入 ALTER TABLE 语句。 例如:

DROP INDEX person_num ON person;
ALTER TABLE person DROP INDEX person_num ;

增删改查数据

使用 INSERT 语句向表内插入数据。例如:

INSERT INTO person VALUES("1","TOM","20170912");

或者

INSERT INTO person VALUES
	("2", "cat", "20170912"),
	("3", "lee", "20170912"),
	("4", "honhg", "20170912"),
	("5", "en", "20170912"),
	("6", "hahha", "20170912");

插入多条数据。
使用 SELECT 语句检索表内数据。例如:

SELECT * FROM person;
+--------+------+------------+
| number | name | birthday   |
+--------+------+------------+
|      1 | tom  | 2017-09-12 |
+--------+------+------------+

根据条件检索语句。例如:

select * from person where name='TOM';
+--------+------+------------+
| number | name | birthday   |
+--------+------+------------+
|      1 | TOM  | 2017-09-12 |
+--------+------+------------+
1 row in set

使用 DELETE 语句删除表内数据:

DELETE FROM person WHERE NUMBER=1;
SELECT * FROM PERSON;
Empty set(0.00 sec);

使用 UPDATE语句修改表内数据。例如:

UPDATE person SET birthday='20191124' WHERE name='TOM';

使用LIMIT 查询表内数据固定条数。例如:

SELECT * FROM person LIMIT 3;
+--------+------+------------+
| number | name | birthday   |
+--------+------+------------+
|      1 | TOM  | 2019-11-24 |
|      2 | cat  | 2017-09-12 |
|      3 | lee  | 2017-09-12 |
+--------+------+------------+
3 rows in set

创建、授权和删除用户

使用 CREATE USER 语句创建一个用户 tiuser, 密码为 123445:

CREATE USER 'tiuser'@'localhost' IDENTIFIED BY '123456';

授权用户 tiuser 可检索数据库 samp_db 内的表:

GRANT SELECT ON samp_db.* TO 'tiuser'@'localhost';

查询用户 tiuser 的权限:

SHOW GRANTS FOR tiuser@localhost;

删除用户 tiuser :

DROP USER 'tiuser'@'localhost';

读取历史数据

历史数据保留策略

TiDB 使用 MVCC 管理版本,当更新/删除数据时,不会做真正的数据删除,只会添加一个新版本数据,所以可以保留历史数据。历史数据不会全部保留,超过一定时间的历史数据会被彻底删除,以减小空间占用以及避免历史版本过多引入的性能开销。

TiDB 使用周期性运行的 GC(Garbage Collection,垃圾回收)来进行清理,关于 GC 的详细介绍参见 TiDB 垃圾回收 (GC)。

这里需要重点关注的是 tikv_gc_life_time 和 tikv_gc_safe_point 这条。tikv_gc_life_time 用于配置历史版本保留时间,可以手动修改;tikv_gc_safe_point 记录了当前的 safePoint,用户可以安全地使用大于 safePoint 的时间戳创建 snapshot 读取历史版本。safePoint 在每次 GC 开始运行时自动更新。

示例

  1. 初始化阶段,创建一个表,并插入几行数据:
create table user (id int,name varchar(20));
Query OK, 0 rows affected

插入数据:

insert into user values (1,"张三"), (2,"李四"), (3,"王二麻子");
Query OK, 3 rows affected
Records: 3  Duplicates: 0  Warnings: 0
  1. 查看表中的数据:
select * from user;
+----+----------+
| id | name     |
+----+----------+
|  1 | 张三     |
|  2 | 李四     |
|  3 | 王二麻子 |
+----+----------+
3 rows in set

  1. 查看当前时间:
select now();
+---------------------+
| now()               |
+---------------------+
| 2019-11-25 03:00:18 |
+---------------------+
1 row in set
  1. 更新某一行数据:
update user set name="张全蛋" where id=1;
Query OK, 1 row affected
Rows matched: 1  Changed: 1  Warnings: 0
  1. 确认数据已经被更新:
select * from user;
+----+----------+
| id | name     |
+----+----------+
|  1 | 张全蛋   |
|  2 | 李四     |
|  3 | 王二麻子 |
+----+----------+
3 rows in set

  1. 设置一个特殊的环境变量,这个是一个 session scope 的变量,其意义为读取这个时间之前的最新的一个版本。
set @@tidb_snapshot="2019-11-25 03:00:18";
Query OK, 0 rows affected

注意:

  • 这里的时间设置的是 update 语句之前的那个时间。
  • 在 tidb_snapshot 前须使用 @@ 而非 @,因为 @@ 表示系统变量,@ 表示用户变量。

这里读取到的内容即为 update 之前的内容,也就是历史版本:

select * from user;
+----+----------+
| id | name     |
+----+----------+
|  1 | 张三     |
|  2 | 李四     |
|  3 | 王二麻子 |
+----+----------+
3 rows in set

  1. 清空这个变量后,即可读取最新版本数据:
set @@tidb_snapshot="";
Query OK, 0 rows affected
select * from user;
+----+----------+
| id | name     |
+----+----------+
|  1 | 张全蛋   |
|  2 | 李四     |
|  3 | 王二麻子 |
+----+----------+
3 rows in set
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值