diff --git a/basic-sql-operations.md b/basic-sql-operations.md index 29d8b5d06a5c..48ef149c3345 100644 --- a/basic-sql-operations.md +++ b/basic-sql-operations.md @@ -1,34 +1,34 @@ --- -title: TiDB 中的基本 SQL 操作 +title: SQL 基本操作 category: how-to aliases: ['/docs-cn/dev/how-to/get-started/explore-sql/'] --- -# TiDB 中的基本 SQL 操作 +# SQL 基本操作 成功部署 TiDB 集群之后,便可以在 TiDB 中执行 SQL 语句了。因为 TiDB 兼容 MySQL,你可以使用 MySQL 客户端连接 TiDB,并且[大多数情况下](/mysql-compatibility.md)可以直接执行 MySQL 语句。 -本文介绍 CRUD 操作等基本的 SQL 语句。完整的 SQL 语句列表,参见 [TiDB SQL 语法详解](https://pingcap.github.io/sqlgram/)。 +SQL 是一门声明性语言,它是数据库用户与数据库交互的方式。它更像是一种自然语言,好像在用英语与数据库进行对话。本文档介绍基本的 SQL 操作。完整的 SQL 语句列表,参见 [TiDB SQL 语法详解](https://pingcap.github.io/sqlgram/)。 -## 创建、查看和删除数据库 +## 分类 -使用 `CREATE DATABASE` 语句创建数据库。语法如下: +SQL 语言通常按照功能划分成以下的 4 个部分: -{{< copyable "sql" >}} +- DDL (Data Definition Language):数据定义语言,用来定义数据库对象,包括库、表、视图和索引等。 -```sql -CREATE DATABASE db_name [options]; -``` +- DML (Data Manipulation Language):数据操作语言,用来操作和业务相关的记录。 -例如,要创建一个名为 `samp_db` 的数据库,可使用以下语句: +- DQL (Data Query Language):数据查询语言,用来查询经过条件筛选的记录。 -{{< copyable "sql" >}} +- DCL (Data Control Language):数据控制语言,用来定义访问权限和安全级别。 -```sql -CREATE DATABASE IF NOT EXISTS samp_db; -``` +常用的 DDL 功能是对象(如表、索引等)的创建、属性修改和删除,对应的命令分别是 CREATE、ALTER 和 DROP。 + +## 查看、创建和删除数据库 + +TiDB 语境中的 Database 或者说数据库,可以认为是表和索引等对象的集合。 -使用 `SHOW DATABASES` 语句查看数据库: +使用 `SHOW DATABASES` 语句查看系统中数据库列表: {{< copyable "sql" >}} @@ -36,104 +36,102 @@ CREATE DATABASE IF NOT EXISTS samp_db; SHOW DATABASES; ``` -使用 `DROP DATABASE` 语句删除数据库,例如: +使用名为 `mysql` 的数据库: {{< copyable "sql" >}} ```sql -DROP DATABASE samp_db; +use mysql; ``` -## 创建、查看和删除表 - -使用 `CREATE TABLE` 语句创建表。语法如下: +使用 `SHOW TABLES` 语句查看数据库中的所有表。例如: {{< copyable "sql" >}} ```sql -CREATE TABLE table_name column_name data_type constraint; +SHOW TABLES FROM mysql; ``` -例如: +使用 `CREATE DATABASE` 语句创建数据库。语法如下: {{< copyable "sql" >}} ```sql -CREATE TABLE person ( - number INT(11), - name VARCHAR(255), - birthday DATE - ); +CREATE DATABASE db_name [options]; ``` -如果表已存在,添加 `IF NOT EXISTS` 可防止发生错误: +例如,要创建一个名为 `samp_db` 的数据库,可使用以下语句: {{< copyable "sql" >}} ```sql -CREATE TABLE IF NOT EXISTS person ( - number INT(11), - name VARCHAR(255), - birthday DATE -); +CREATE DATABASE IF NOT EXISTS samp_db; ``` -使用 `SHOW CREATE` 语句查看建表语句。例如: +添加 `IF NOT EXISTS` 可防止发生错误。 + +使用 `DROP DATABASE` 语句删除数据库。例如: {{< copyable "sql" >}} ```sql -SHOW CREATE table person; +DROP DATABASE samp_db; ``` -使用 `SHOW FULL COLUMNS` 语句查看表的列。 例如: +## 创建、查看和删除表 + +使用 `CREATE TABLE` 语句创建表。语法如下: {{< copyable "sql" >}} ```sql -SHOW FULL COLUMNS FROM person; +CREATE TABLE table_name column_name data_type constraint; ``` -使用 `DROP TABLE` 语句删除表。例如: +例如,要创建一个名为 `person` 的表,包括编号、名字、生日等字段,可使用以下语句: {{< copyable "sql" >}} ```sql -DROP TABLE person; +CREATE TABLE person ( + id INT(11), + name VARCHAR(255), + birthday DATE + ); ``` -或者 +使用 `SHOW CREATE` 语句查看建表语句,即 DDL。例如: {{< copyable "sql" >}} ```sql -DROP TABLE IF EXISTS person; +SHOW CREATE table person; ``` -使用 `SHOW TABLES` 语句查看数据库中的所有表。例如: +使用 `DROP TABLE` 语句删除表。例如: {{< copyable "sql" >}} ```sql -SHOW TABLES FROM samp_db; +DROP TABLE person; ``` ## 创建、查看和删除索引 -对于值不唯一的列,可使用 `CREATE INDEX` 或 `ALTER TABLE` 语句。例如: +索引通常用于加速索引列上的查询。对于值不唯一的列,可使用 `CREATE INDEX` 或 `ALTER TABLE` 语句创建普通索引。例如: {{< copyable "sql" >}} ```sql -CREATE INDEX person_num ON person (number); +CREATE INDEX person_id ON person (id); ``` -或者 +或者: {{< copyable "sql" >}} ```sql -ALTER TABLE person ADD INDEX person_num (number); +ALTER TABLE person ADD INDEX person_id (id); ``` 对于值唯一的列,可以创建唯一索引。例如: @@ -141,15 +139,15 @@ ALTER TABLE person ADD INDEX person_num (number); {{< copyable "sql" >}} ```sql -CREATE UNIQUE INDEX person_num ON person (number); +CREATE UNIQUE INDEX person_unique_id ON person (id); ``` -或者 +或者: {{< copyable "sql" >}} ```sql -ALTER TABLE person ADD UNIQUE person_num (number); +ALTER TABLE person ADD UNIQUE person_unique_id (id); ``` 使用 `SHOW INDEX` 语句查看表内所有索引: @@ -165,18 +163,22 @@ SHOW INDEX from person; {{< copyable "sql" >}} ```sql -DROP INDEX person_num ON person; +DROP INDEX person_id ON person; ``` {{< copyable "sql" >}} ```sql -ALTER TABLE person DROP INDEX person_num; +ALTER TABLE person DROP INDEX person_unique_id; ``` -## 增删改查数据 +注意:DDL 操作不是事务,在执行 DDL 时,不需要对应 COMMIT 语句。 + +常用的 DML 功能是对表记录的新增、修改和删除,对应的命令分别是 INSERT、UPDATE 和 DELETE。 -使用 `INSERT` 语句向表内插入数据。例如: +## 记录的增删改 + +使用 `INSERT` 语句向表内插入表记录。例如: {{< copyable "sql" >}} @@ -184,61 +186,66 @@ ALTER TABLE person DROP INDEX person_num; INSERT INTO person VALUES("1","tom","20170912"); ``` -使用 `SELECT` 语句检索表内数据。例如: +使用 `INSERT` 语句向表内插入包含部分字段数据的表记录。例如: {{< copyable "sql" >}} ```sql -SELECT * FROM person; +INSERT INTO person(id,name) VALUES("2","bob"); ``` -``` -+--------+------+------------+ -| number | name | birthday | -+--------+------+------------+ -| 1 | tom | 2017-09-12 | -+--------+------+------------+ +使用 `UPDATE` 语句向表内修改表记录的部分字段数据。例如: + +{{< copyable "sql" >}} + +```sql +UPDATE person SET birthday="20180808" WHERE id=2; ``` -使用 `UPDATE` 语句修改表内数据。例如: +使用 `DELETE` 语句向表内删除部分表记录。例如: {{< copyable "sql" >}} ```sql -UPDATE person SET birthday='20171010' WHERE name='tom'; +DELETE FROM person WHERE id=2; ``` +注意:UPDATE 和 DELETE 操作如果不带 WHERE 过滤条件是对全表进行操作。 + +DQL 数据查询语言是从一个表或多个表中检索出想要的数据行,通常是业务开发的核心内容。 + +## 查询数据 + +使用 `SELECT` 语句检索表内数据。例如: + {{< copyable "sql" >}} ```sql SELECT * FROM person; ``` -``` -+--------+------+------------+ -| number | name | birthday | -+--------+------+------------+ -| 1 | tom | 2017-10-10 | -+--------+------+------------+ -``` - -使用 `DELETE` 语句删除表内数据: +在 SELECT 后面加上要查询的列名。例如: {{< copyable "sql" >}} ```sql -DELETE FROM person WHERE number=1; +SELECT name FROM person; ++------+ +| name | ++------+ +| tom | ++------+ ``` +使用 WHERE 子句,对所有记录进行是否符合条件的筛选后再返回。例如: + {{< copyable "sql" >}} ```sql -SELECT * FROM person; +SELECT * FROM person where id<5; ``` -``` -Empty set (0.00 sec) -``` +常用的 DCL 功能是创建或删除用户,和对用户权限的管理。 ## 创建、授权和删除用户