因为 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 开始运行时自动更新。
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
select * from user;
+----+----------+
| id | name |
+----+----------+
| 1 | 张三 |
| 2 | 李四 |
| 3 | 王二麻子 |
+----+----------+
3 rows in set
select now();
+---------------------+
| now() |
+---------------------+
| 2019-11-25 03:00:18 |
+---------------------+
1 row in set
update user set name="张全蛋" where id=1;
Query OK, 1 row affected
Rows matched: 1 Changed: 1 Warnings: 0
select * from user;
+----+----------+
| id | name |
+----+----------+
| 1 | 张全蛋 |
| 2 | 李四 |
| 3 | 王二麻子 |
+----+----------+
3 rows in set
set @@tidb_snapshot="2019-11-25 03:00:18";
Query OK, 0 rows affected
注意:
这里读取到的内容即为 update 之前的内容,也就是历史版本:
select * from user;
+----+----------+
| id | name |
+----+----------+
| 1 | 张三 |
| 2 | 李四 |
| 3 | 王二麻子 |
+----+----------+
3 rows in set
set @@tidb_snapshot="";
Query OK, 0 rows affected
select * from user;
+----+----------+
| id | name |
+----+----------+
| 1 | 张全蛋 |
| 2 | 李四 |
| 3 | 王二麻子 |
+----+----------+
3 rows in set