深入OceanBase分布式数据库:MySQL 模式下的 SQL 根本操纵 ...

守听  金牌会员 | 2024-6-14 23:46:47 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 812|帖子 812|积分 2436

码到三十五 :   个人主页  
OceanBase与MySQL模式下兼容性序
在当今的大数据期间,数据库技术的选择对于企业的信息化发展至关重要。OceanBase作为一种高性能、高可用的分布式关系数据库,在与MySQL模式的兼容性方面显现出了明显的上风,为企业数据迁徙、整合与升级提供了极大的便利。
OceanBase与MySQL的兼容性不但体现在数据范例、SQL语法等根本面,更深入到了存储引擎、优化器等多个层次。这种高度的兼容性使得企业在不改变原有业务逻辑的情况下,可以大概轻松地将数据和应用从MySQL迁徙到OceanBase,从而享受到OceanBase带来的高性能和可扩展性。

本文将探究OceanBase与MySQL模式下的兼容性和OceanBase的MySQL 模式下的 SQL 根本操纵。

  
媒介:OceanBase与 MySQL 兼容性对比

OceanBase与MySQL模式下的兼容性可以从以下几个方面进行简述:
数据范例兼容性

OceanBase的MySQL模式兼容MySQL 5.7的绝大部分数据范例,包括数值范例(如INT、BIGINT、FLOAT、DOUBLE等)、日期和时间范例(如DATETIME、TIMESTAMP等)、字符串范例(如CHAR、VARCHAR等)以及其他复杂数据范例(如ENUM、SET、JSON等)。此外,OceanBase还支持空间数据范例,这在某些特定应用场景中非常有用。
OceanBase 数据库支持的数据范例有:
数值范例
整数范例:BOOL/BOOLEAN/TINYINT、SMALLINT、MEDIUMINT、INT/INTEGER 和 BIGINT。
定点范例:DECIMAL 和 NUMERIC。
浮点范例:FLOAT 和 DOUBLE。
Bit-Value 范例:BIT。
日期时间范例:DATETIME、TIMESTAMP、DATE、TIME 和 YEAR。
字符范例:CHAR、VARCHAR、BINARY 和 VARBINARY。
大对象范例:TINYBLOB、BLOB、MEDIUMBLOB 和 LONGBLOB。
文本范例:TINYTEXT、TEXT、MEDIUMTEXT 和 LONGTEXT。
罗列范例:ENUM。
聚集范例:SET。
JSON 数据范例
空间数据范例
SQL语法兼容性

OceanBase支持MySQL 5.7版本的大部分SQL语法,包括SELECT、INSERT、UPDATE、DELETE等根本操纵,以及复杂的SQL查询,如子查询、联接操纵、聚合函数等。此外,OceanBase还支持对JSON数据进行查询和操纵,提供了丰富的JSON函数。
SELECT
支持大部分查询功能,包括支持单、多表查询;支持子查询;支持内联接、半联接以及外联接;支持分组、聚合;支持常见的概率、线性回归等数据挖掘函数等。
支持对多个 SELECT 查询的结果进行 UNION、UNION ALL、MINUS、EXCEPT 或 INTERSECT 等聚集操纵。
支持利用 EXPLAIN 语法查看执行计划。
INSERT
支持单行和多行插入数据,同时支持指定分区插入数据。
支持 INSERT INTO … SELECT … 语句。
UPDATE
支持单列和多列更新数据。
支持利用子查询更新数据。
支持聚集更新数据。
DELETE
支持单表和多表删除。
TRUNCATE
支持完全清空指定表。
然而,需要注意的是,OceanBase在某些方面与MySQL存在不兼容的情况。例如,OceanBase不支持SELECT…FOR SHARE语法,也不支持部分JSON范例和空间数据范例。此外,在函数支持方面,OceanBase也有一些与MySQL差别的地方。
存储引擎和分区功能

OceanBase本质上是一个基线加增量的存储引擎,接纳LSM树(Log-Structured Merge Tree)作为存储机制,这与传统的关系数据库存储引擎有所差别。只管如此,OceanBase仍旧提供了与MySQL相似的分区功能,支持分区表和二级分区,可以完全取代MySQL常用的分库分表方案。
优化器和执行计划

OceanBase的优化器在执行查询时会生成与MySQL相似的执行计划。然而,两者在执行计划的表示和细节上可能存在差异。此外,OceanBase还支持利用EXPLAIN语法查看执行计划,这有助于用户明白和优化查询性能。
备份与恢复

与MySQL相比,OceanBase在备份与恢复方面有所差别。例如,OceanBase不支持冷备份、数据库和表级的备份恢复以及备份数据的有用性验证。因此,在利用OceanBase时需要思量这些差异并接纳相应的步伐来确保数据的完整性和可用性。
总的来说,OceanBase在MySQL模式下与MySQL具有较高的兼容性,但仍旧存在一些差异和限定。在利用OceanBase时,发起细致相识其与MySQL的兼容性和差异,并根据实际需求进行相应的调解和优化。
OceanBase 数据库的 MySQL 模式兼容 MySQL 5.7/8.0 的绝大部分功能和语法。
1. 创建数据库

1.1 语法

  1. CREATE TABLE [IF NOT EXISTS] table_name
  2.       (table_definition_list) [table_option_list] [partition_option] [AS] select;
  3. CREATE TABLE [IF NOT EXISTS] table_name
  4.       LIKE table_name;
  5. table_definition_list:
  6.     table_definition [, table_definition ...]
  7. table_definition:
  8.       column_definition
  9.     | [CONSTRAINT [constraint_name]] PRIMARY KEY index_desc
  10.     | [CONSTRAINT [constraint_name]] UNIQUE {INDEX | KEY}
  11.             [index_name] index_desc
  12.     | [CONSTRAINT [constraint_name]] FOREIGN KEY
  13.             [index_name] index_desc
  14.             REFERENCES reference_definition
  15.             [match_action][opt_reference_option_list]
  16.     | [SPATIAL] {INDEX | KEY} [index_name] [index_type] (key_part,...)
  17.       [index_optionn_list]
  18.     | [CONSTRAINT [constraint_name]] CHECK(expression) constranit_state
  19. column_definition_list:
  20.     column_definition [, column_definition ...]
  21. column_definition:
  22.      column_name data_type
  23.          [DEFAULT const_value] [AUTO_INCREMENT]
  24.          [NULL | NOT NULL] [[PRIMARY] KEY] [UNIQUE [KEY]] comment
  25.    | column_name data_type
  26.          [GENERATED ALWAYS] AS (expr) [VIRTUAL | STORED]
  27.          [opt_generated_column_attribute]
  28. index_desc:
  29.    (column_desc_list) [index_type] [index_option_list]
  30. match_action:
  31.    MATCH {SIMPLE | FULL | PARTIAL}
  32. opt_reference_option_list:
  33.    reference_option [,reference_option ...]
  34. reference_option:
  35.    ON {DELETE | UPDATE} {RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT}
  36. key_part:
  37.     {index_col_name [(length)] | (expr)} [ASC | DESC]
  38. index_type:
  39.     USING BTREE
  40. index_option_list:
  41.     index_option [ index_option ...]
  42. index_option:
  43.       [GLOBAL | LOCAL]
  44.     | block_size
  45.     | compression
  46.     | STORING(column_name_list)
  47.     | comment
  48. table_option_list:
  49.     table_option [ table_option ...]
  50. table_option:
  51.       [DEFAULT] {CHARSET | CHARACTER SET} [=] charset_name
  52.     | [DEFAULT] COLLATE [=] collation_name
  53.     | table_tablegroup
  54.     | block_size
  55.     | compression
  56.     | AUTO_INCREMENT [=] INT_VALUE
  57.     | comment
  58.     | ROW_FORMAT [=] REDUNDANT|COMPACT|DYNAMIC|COMPRESSED|DEFAULT
  59.     | PCTFREE [=] num
  60.     | parallel_clause
  61.     | DUPLICATE_SCOPE [=] 'none|cluster'
  62. parallel_clause:
  63.     {NOPARALLEL | PARALLEL integer}
  64. partition_option:
  65.       PARTITION BY HASH(expression)
  66.       [subpartition_option] PARTITIONS partition_count
  67.     | PARTITION BY KEY([column_name_list])
  68.       [subpartition_option] PARTITIONS partition_count
  69.     | PARTITION BY RANGE {(expression) | COLUMNS (column_name_list)}
  70.       [subpartition_option] (range_partition_list)
  71.     | PARTITION BY LIST {(expression) | COLUMNS (column_name_list)}
  72.       [subpartition_option] PARTITIONS partition_count
  73. subpartition_option:
  74.       SUBPARTITION BY HASH(expression)
  75.       SUBPARTITIONS subpartition_count
  76.     | SUBPARTITION BY KEY(column_name_list)
  77.       SUBPARTITIONS subpartition_count
  78.     | SUBPARTITION BY RANGE {(expression) | COLUMNS (column_name_list)}
  79.       (range_subpartition_list)
  80.     | SUBPARTITION BY LIST(expression)
  81. range_partition_list:
  82.     range_partition [, range_partition ...]
  83. range_partition:
  84.     PARTITION partition_name
  85.     VALUES LESS THAN {(expression_list) | MAXVALUE}
  86. range_subpartition_list:
  87.     range_subpartition [, range_subpartition ...]
  88. range_subpartition:
  89.     SUBPARTITION subpartition_name
  90.     VALUES LESS THAN {(expression_list) | MAXVALUE}
  91. expression_list:
  92.     expression [, expression ...]
  93. column_name_list:
  94.     column_name [, column_name ...]
  95. partition_name_list:
  96.     partition_name [, partition_name ...]
  97. partition_count | subpartition_count:
  98.     INT_VALUE
复制代码
1.2 参数说明

参数描述PRIMARY KEY为创建的表指定主键。假如不指定,则利用隐藏主键。 特别地,OceanBase 数据库不支持修改表的主键或通过 ALTER TABLE 语句为表添加主键,因此保举您在创建表时指定好表的主键。FOREIGN KEY为创建的表指定外键。假如不指定外键名,则会利用表名 + OBFK + 创建时间命名。(例如,在 2021 年 8 月 1 日 00:00:00 为 t1 表创建的外键名称为 t1_OBFK_1627747200000000)。KEY , INDEX为创建的表指定键或索引。 假如不指定索引名,则会利用索引引用的第一列作为索引名,假如命名存在重复,则会利用下划线(_)+ 序号的方式命名。(例如,利用 c1 列创建的索引假如命名重复,则会将索引命名为 c1_2。) 您可以通过 SHOW INDEXkey_part定义所创建的索引。index_col_name指定索引的列名,每个列名后都支持 ASC(升序),不支持 DESC(降序)。默以为升序。 建立索引的排序方式为:起首以 index_col_name 中第一个列的值排序;该列值相同的记录,按下一列名的值排序;以此类推。expr表示合法的函数索引表达式,且允许是布尔表达式,例如 c1=c1。OceanBase 数据库当前版本禁止创建生成列上的函数索引。ROW_FORMAT指定表是否开启 Encoding 存储格式。redundant:不开启 Encoding 存储格式。compact:不开启 Encoding 存储格式。dynamic:Encoding 存储格式。compressed:Encoding 存储格式。default:等价 dynamic 模式。[GENERATED ALWAYS] AS (expr) [VIRTUAL . STORED]创建生成列,expr 为用于计算列值的表达式。VIRTUAL:列值不会被存储,而是在读取行时,在任何 BEFORE 触发器之后立刻计算 。捏造列不占用存储空间。STORED:在插入或更新行时评估和存储列值。存储列确实需要存储空间而且可以被索引。BLOCK_SIZE指定表的微块巨细。COMPRESSION指定表的压缩算法,取值如下:none:不利用压缩算法。lz4_1.0: 利用 lz4 压缩算法。zstd_1.0: 利用 zstd 压缩算法。snappy_1.0: 利用 snappy 压缩算法。CHARSET , CHARACTER SET指定表中列的默认字符集,可利用的字符集请参见 字符集。COLLATE指定表中列的默认字符序,可利用的字符序请参见 字符序。table_tablegroup指定表所属的 tablegroup。AUTO_INCREMENT指定表中自增列的初始值。OceanBase 数据库支持利用自增列作为分区键。comment注释。PCTFREE指定宏块保存空间百分比。parallel_clause指定表级别的并行度:NOPARALLEL:并行度为 1,默认设置PARALLEL integer:指定并行度,integer 取值大于等于 1。DUPLICATE_SCOPE 指定复制表的属性,取值如下: 利用 CREATE DATABASE 语句创建数据库。
示例:创建数据库 db1,指定字符集为 utf8mb4,并创建读写属性。
  1. obclient> CREATE DATABASE db1 DEFAULT CHARACTER SET utf8mb4 READ WRITE;
  2. Query OK, 1 row affected
复制代码
创建完成后,可以通过 SHOW DATABASES 命令查看当前数据库服务器中全部的数据库。
  1. obclient> SHOW DATABASES;
  2. +--------------------+
  3. | Database           |
  4. +--------------------+
  5. | oceanbase          |
  6. | db1                |
  7. | test               |
  8. +--------------------+
  9. 3 rows in set
复制代码
2. 表操纵

在 OceanBase 数据库中,表是最基础的数据存储单元,包含了全部用户可以访问的数据,每个表包含多行记录,每个记录由多个列组成。本节主要提供数据库中表的创建、查看、修改和删除的语法和示例。
2.1 创建表

利用 CREATE TABLE 语句在数据库中创建新表。
示例:在数据库 db1 中创建表 test。
  1. obclient> USE db1;
  2. Database changed
  3. obclient> CREATE TABLE test (c1 INT PRIMARY KEY, c2 VARCHAR(3));
  4. Query OK, 0 rows affected
复制代码
更多 CREATE TABLE 语句相干的语法说明,请参见 CREATE TABLE 章节。
2.2 查看表

利用 SHOW CREATE TABLE 语句查看建表语句。
示例:
查看表 test 的建表语句。
  1. obclient> SHOW CREATE TABLE test\G
  2. *************************** 1. row ***************************
  3.       Table: test
  4. Create Table: CREATE TABLE `test` (
  5.   `c1` int(11) NOT NULL,
  6.   `c2` varchar(3) DEFAULT NULL,
  7.   PRIMARY KEY (`c1`)
  8. ) DEFAULT CHARSET = utf8mb4 ROW_FORMAT = DYNAMIC COMPRESSION = 'zstd_1.3.8' REPLICA_NUM = 1 BLOCK_SIZE = 16384 USE_BLOOM_FILTER = FALSE TABLET_SIZE = 134217728 PCTFREE = 0
  9. 1 row in set
复制代码
利用 SHOW TABLES 语句查看 db1 数据库中的全部表。
  1. obclient> SHOW TABLES FROM db1;
  2. +---------------+
  3. | Tables_in_db1 |
  4. +---------------+
  5. | test          |
  6. +---------------+
  7. 1 row in set
复制代码
2.3 修改表

利用 ALTER TABLE 语句来修改已存在的表的结构,包括修改表及表属性、新增列、修改列及属性、删除列等。
示例:
将表 test 的字段 c2 改名为 c3,并同时修改其字段范例。
  1. obclient> DESCRIBE test;
  2. +-------+------------+------+-----+---------+-------+
  3. | Field | Type       | Null | Key | Default | Extra |
  4. +-------+------------+------+-----+---------+-------+
  5. | c1    | int(11)    | NO   | PRI | NULL    |       |
  6. | c2    | varchar(3) | YES  |     | NULL    |       |
  7. +-------+------------+------+-----+---------+-------+
  8. 2 rows in set
  9. obclient> ALTER TABLE test CHANGE COLUMN c2 c3 CHAR(10);
  10. Query OK, 0 rows affected
  11. obclient> DESCRIBE test;
  12. +-------+----------+------+-----+---------+-------+
  13. | Field | Type     | Null | Key | Default | Extra |
  14. +-------+----------+------+-----+---------+-------+
  15. | c1    | int(11)  | NO   | PRI | NULL    |       |
  16. | c3    | char(10) | YES  |     | NULL    |       |
  17. +-------+----------+------+-----+---------+-------+
  18. 2 rows in set
复制代码
在表 test 中增长、删除列。
  1. obclient> DESCRIBE test;
  2. +-------+----------+------+-----+---------+-------+
  3. | Field | Type     | Null | Key | Default | Extra |
  4. +-------+----------+------+-----+---------+-------+
  5. | c1    | int(11)  | NO   | PRI | NULL    |       |
  6. | c3    | char(10) | YES  |     | NULL    |       |
  7. +-------+----------+------+-----+---------+-------+
  8. 2 rows in set
  9. obclient> ALTER TABLE test ADD c4 int;
  10. Query OK, 0 rows affected
  11. obclient> DESCRIBE test;
  12. +-------+----------+------+-----+---------+-------+
  13. | Field | Type     | Null | Key | Default | Extra |
  14. +-------+----------+------+-----+---------+-------+
  15. | c1    | int(11)  | NO   | PRI | NULL    |       |
  16. | c3    | char(10) | YES  |     | NULL    |       |
  17. | c4    | int(11)  | YES  |     | NULL    |       |
  18. +-------+----------+------+-----+---------+-------+
  19. 3 rows in set
  20. obclient> ALTER TABLE test DROP c3;
  21. Query OK, 0 rows affected
  22. obclient> DESCRIBE test;
  23. +-------+---------+------+-----+---------+-------+
  24. | Field | Type    | Null | Key | Default | Extra |
  25. +-------+---------+------+-----+---------+-------+
  26. | c1    | int(11) | NO   | PRI | NULL    |       |
  27. | c4    | int(11) | YES  |     | NULL    |       |
  28. +-------+---------+------+-----+---------+-------+
  29. 2 rows in set
复制代码
2.4 删除表

利用 DROP TABLE 语句删除表。
示例:删除表 test。
  1. obclient> DROP TABLE test;
  2. Query OK, 0 rows affected
复制代码
3. 索引操纵

索引是创建在表上并对数据库表中一列或多列的值进行排序的一种结构。其作用主要在于提高查询的速度,降低数据库体系的性能开销。本节主要介绍数据库中索引的创建、查看、删除的语法和示例。
3.1 创建索引

利用 CREATE INDEX 语句创建表的索引。
示例:在表 test 中创建索引。
  1. obclient> DESCRIBE test;
  2. +-------+----------+------+-----+---------+-------+
  3. | Field | Type     | Null | Key | Default | Extra |
  4. +-------+----------+------+-----+---------+-------+
  5. | c1    | int(11)  | NO   | PRI | NULL    |       |
  6. | c2    | char(3)  | YES  |     | NULL    |       |
  7. +-------+----------+------+-----+---------+-------+
  8. 2 rows in set
  9. obclient> CREATE INDEX test_index ON test (c1, c2);
  10. Query OK, 0 rows affected
复制代码
3.2 查看索引

利用 SHOW INDEX 语句查看表的索引。
示例:查看表 test 中的索引信息。
  1. obclient> SHOW INDEX FROM test\G
  2. *************************** 1. row ***************************
  3.         Table: test
  4.    Non_unique: 0
  5.      Key_name: PRIMARY
  6. Seq_in_index: 1
  7.   Column_name: c1
  8.     Collation: A
  9.   Cardinality: NULL
  10.      Sub_part: NULL
  11.        Packed: NULL
  12.          Null:
  13.    Index_type: BTREE
  14.       Comment: available
  15. Index_comment:
  16.       Visible: YES
  17. *************************** 2. row ***************************
  18.         Table: test
  19.    Non_unique: 1
  20.      Key_name: test_index
  21. Seq_in_index: 1
  22.   Column_name: c1
  23.     Collation: A
  24.   Cardinality: NULL
  25.      Sub_part: NULL
  26.        Packed: NULL
  27.          Null:
  28.    Index_type: BTREE
  29.       Comment: available
  30. Index_comment:
  31.       Visible: YES
  32. *************************** 3. row ***************************
  33.         Table: test
  34.    Non_unique: 1
  35.      Key_name: test_index
  36. Seq_in_index: 2
  37.   Column_name: c2
  38.     Collation: A
  39.   Cardinality: NULL
  40.      Sub_part: NULL
  41.        Packed: NULL
  42.          Null: YES
  43.    Index_type: BTREE
  44.       Comment: available
  45. Index_comment:
  46.       Visible: YES
  47. 3 rows in set
复制代码
3.3 删除索引

利用 DROP INDEX 语句删除表的索引。
示例:删除表 test 中的索引。
  1. obclient> DROP INDEX test_index ON test;
  2. Query OK, 0 rows affected
复制代码
4. 插入数据

利用 INSERT 语句在已经存在的表中插入数据。
示例:
创建表 t1 并插入一行数据。
  1. obclient> CREATE TABLE t1(c1 INT PRIMARY KEY, c2 int) PARTITION BY KEY(c1) PARTITIONS 4;
  2. Query OK, 0 rows affected
  3. obclient> SELECT * FROM t1;
  4. Empty set
  5. obclient> INSERT t1 VALUES(1,1);
  6. Query OK, 1 row affected
  7. obclient> SELECT * FROM t1;
  8. +----+------+
  9. | c1 | c2   |
  10. +----+------+
  11. |  1 |    1 |
  12. +----+------+
  13. 1 row in set
复制代码
向表 t1 中插入多行数据。
  1. obclient> INSERT t1 VALUES(2,2),(3,default),(2+2,3*4);
  2. Query OK, 3 rows affected
  3. Records: 3  Duplicates: 0  Warnings: 0
  4. obclient> SELECT * FROM t1;
  5. +----+------+
  6. | c1 | c2   |
  7. +----+------+
  8. |  1 |    1 |
  9. |  2 |    2 |
  10. |  3 | NULL |
  11. |  4 |   12 |
  12. +----+------+
  13. 4 rows in set
复制代码
更多 INSERT 语句相干的语法,请参见 INSERT 章节。
5. 删除数据

利用 DELETE 语句删除数据,支持单表删除和多表删除数据。
示例:
通过 CREATE TABLE 创建表 t2 和 t3。删除 c1=2 的行,此中 c1 列为表 t2 中的 PRIMARY KEY。
/表 t3 为 KEY 分区表,且分区名由体系根据分区命令规则自动生成,即分区名为 p0、p1、p2、p3/
  1. obclient> CREATE TABLE t2(c1 INT PRIMARY KEY, c2 INT);
  2. Query OK, 0 rows affected
  3. obclient> INSERT t2 VALUES(1,1),(2,2),(3,3),(5,5);
  4. Query OK, 4 rows affected
  5. Records: 4  Duplicates: 0  Warnings: 0
  6. obclient> SELECT * FROM t2;
  7. +----+------+
  8. | c1 | c2   |
  9. +----+------+
  10. |  1 |    1 |
  11. |  2 |    2 |
  12. |  3 |    3 |
  13. |  5 |    5 |
  14. +----+------+
  15. 4 rows in set
  16. obclient> CREATE TABLE t3(c1 INT PRIMARY KEY, c2 INT) PARTITION BY KEY(c1) PARTITIONS 4;
  17. Query OK, 0 rows affected
  18. obclient> INSERT INTO t3 VALUES(5,5),(1,1),(2,2),(3,3);
  19. Query OK, 4 rows affected
  20. Records: 4  Duplicates: 0  Warnings: 0
  21. obclient> SELECT * FROM t3;
  22. +----+------+
  23. | c1 | c2   |
  24. +----+------+
  25. |  5 |    5 |
  26. |  1 |    1 |
  27. |  2 |    2 |
  28. |  3 |    3 |
  29. +----+------+
  30. 4 rows in set
  31. obclient> DELETE FROM t2 WHERE c1 = 2;
  32. Query OK, 1 row affected
  33. obclient> SELECT * FROM t2;
  34. +----+------+
  35. | c1 | c2   |
  36. +----+------+
  37. |  1 |    1 |
  38. |  3 |    3 |
  39. |  5 |    5 |
  40. +----+------+
  41. 3 rows in set
复制代码
删除表 t2 中按照 c2 列排序之后的第一行数据。
  1. obclient> DELETE FROM t2 ORDER BY c2 LIMIT 1;
  2. Query OK, 1 row affected
  3. obclient> SELECT * FROM t2;
  4. +----+------+
  5. | c1 | c2   |
  6. +----+------+
  7. |  3 |    3 |
  8. |  5 |    5 |
  9. +----+------+
  10. 2 rows in set
复制代码
删除表 t3 的 p2 分区的数据。
  1. obclient> SELECT * FROM t3 PARTITION(p2);
  2. +----+------+
  3. | c1 | c2   |
  4. +----+------+
  5. |  1 |    1 |
  6. |  2 |    2 |
  7. |  3 |    3 |
  8. +----+------+
  9. 3 rows in set
  10. obclient> DELETE FROM t3 PARTITION(p2);
  11. Query OK, 3 rows affected
  12. obclient> SELECT * FROM t3;
  13. +----+------+
  14. | c1 | c2   |
  15. +----+------+
  16. |  5 |    5 |
  17. +----+------+
  18. 1 row in set
复制代码
删除 t2、t3 表中 t2.c1 = t3.c1 的数据。
  1. obclient> SELECT * FROM t2;
  2. +----+------+
  3. | c1 | c2   |
  4. +----+------+
  5. |  3 |    3 |
  6. |  5 |    5 |
  7. +----+------+
  8. 2 rows in set
  9. obclient> SELECT * FROM t3;
  10. +----+------+
  11. | c1 | c2   |
  12. +----+------+
  13. |  5 |    5 |
  14. +----+------+
  15. obclient> DELETE t2, t3 FROM t2, t3 WHERE t2.c1 = t3.c1;
  16. Query OK, 3 rows affected
  17. /*等价于
  18. obclient> DELETE FROM t2, t3 USING t2, t3 WHERE t2.c1 = t3.c1;
  19. */
  20. obclient> SELECT * FROM t2;
  21. +----+------+
  22. | c1 | c2   |
  23. +----+------+
  24. |  3 |    3 |
  25. +----+------+
  26. 1 row in set
  27. obclient> SELECT * FROM t3;
  28. Empty set
复制代码
6. 更新数据

利用 UPDATE 语句修改表中的字段值。
示例:
通过 CREATE TABLE 创建表 t4 和 t5,将表 t4 中 t4.c1=10 对应的那一行数据的 c2 列值修改为 100。
  1. obclient> CREATE TABLE t4(c1 INT PRIMARY KEY, c2 INT);
  2. Query OK, 0 rows affected
  3. obclient> INSERT t4 VALUES(10,10),(20,20),(30,30),(40,40);
  4. Query OK, 4 rows affected
  5. Records: 4  Duplicates: 0  Warnings: 0
  6. obclient> SELECT * FROM t4;
  7. +----+------+
  8. | c1 | c2   |
  9. +----+------+
  10. | 10 |   10 |
  11. | 20 |   20 |
  12. | 30 |   30 |
  13. | 40 |   40 |
  14. +----+------+
  15. 4 rows in set
  16. obclient> CREATE TABLE t5(c1 INT PRIMARY KEY, c2 INT) PARTITION BY KEY(c1) PARTITIONS 4;
  17. Query OK, 0 rows affected
  18. obclient> INSERT t5 VALUES(50,50),(10,10),(20,20),(30,30);
  19. Query OK, 4 rows affected
  20. Records: 4  Duplicates: 0  Warnings: 0
  21. obclient> SELECT * FROM t5;
  22. +----+------+
  23. | c1 | c2   |
  24. +----+------+
  25. | 20 |   20 |
  26. | 10 |   10 |
  27. | 50 |   50 |
  28. | 30 |   30 |
  29. +----+------+
  30. 4 rows in set
  31. obclient> UPDATE t4 SET t4.c2 = 100 WHERE t4.c1 = 10;
  32. Query OK, 1 row affected
  33. Rows matched: 1  Changed: 1  Warnings: 0
  34. obclient> SELECT * FROM t4;
  35. +----+------+
  36. | c1 | c2   |
  37. +----+------+
  38. | 10 |  100 |
  39. | 20 |   20 |
  40. | 30 |   30 |
  41. | 40 |   40 |
  42. +----+------+
  43. 4 rows in set
复制代码
将表 t4 中按照 c2 列排序的前两行数据的 c2 列值修改为 100。
  1. obclient> UPDATE t4 set t4.c2 = 100 ORDER BY c2 LIMIT 2;
  2. Query OK, 2 rows affected
  3. Rows matched: 2  Changed: 2  Warnings: 0
  4. obclient> SELECT * FROM t4;
  5. +----+------+
  6. | c1 | c2   |
  7. +----+------+
  8. | 10 |  100 |
  9. | 20 |  100 |
  10. | 30 |  100 |
  11. | 40 |   40 |
  12. +----+------+
  13. 4 rows in set
复制代码
将表 t5 中 p1 分区的数据中 t5.c1 > 20 的对应行数据的 c2 列值修改为 100。
  1. obclient> SELECT * FROM t5 PARTITION (p1);
  2. +----+------+
  3. | c1 | c2   |
  4. +----+------+
  5. | 10 |   10 |
  6. | 50 |   50 |
  7. +----+------+
  8. 2 rows in set
  9. obclient> UPDATE t5 PARTITION(p1) SET t5.c2 = 100 WHERE t5.c1 > 20;
  10. Query OK, 1 row affected
  11. Rows matched: 1  Changed: 1  Warnings: 0
  12. obclient> SELECT * FROM t5 PARTITION(p1);
  13. +----+------+
  14. | c1 | c2   |
  15. +----+------+
  16. | 10 |   10 |
  17. | 50 |  100 |
  18. +----+------+
  19. 2 rows in set
复制代码
对于表 t4 和表 t5 中满意 t4.c2 = t5.c2 对应行的数据,将表 t4 中的 c2 列值修改为 100,表 t5 中的 c2 列值修改为 200。
  1. obclient> UPDATE t4,t5 SET t4.c2 = 100, t5.c2 = 200 WHERE t4.c2 = t5.c2;
  2. Query OK, 1 row affected
  3. Rows matched: 4  Changed: 1  Warnings: 0
  4. obclient> SELECT * FROM t4;
  5. +----+------+
  6. | c1 | c2   |
  7. +----+------+
  8. | 10 |  100 |
  9. | 20 |  100 |
  10. | 30 |  100 |
  11. | 40 |   40 |
  12. +----+------+
  13. 4 rows in set
  14. obclient> SELECT * FROM t5;
  15. +----+------+
  16. | c1 | c2   |
  17. +----+------+
  18. | 20 |   20 |
  19. | 10 |   10 |
  20. | 50 |  200 |
  21. | 30 |   30 |
  22. +----+------+
  23. 4 rows in set
复制代码
7. 查询数据

利用 SELECT 语句查询表中的内容。
示例:
通过 CREATE TABLE 创建表 t6。从表 t6 中读取 name 的数据。
  1. obclient> CREATE TABLE t6 (id INT, name VARCHAR(50), num INT);
  2. Query OK, 0 rows affected
  3. obclient> INSERT INTO t6 VALUES(1,'a',100),(2,'b',200),(3,'a',50);
  4. Query OK, 3 rows affected
  5. Records: 3  Duplicates: 0  Warnings: 0
  6. obclient> SELECT * FROM t6;
  7. +------+------+------+
  8. | ID   | NAME | NUM  |
  9. +------+------+------+
  10. |    1 | a    |  100 |
  11. |    2 | b    |  200 |
  12. |    3 | a    |   50 |
  13. +------+------+------+
  14. 3 rows in set
  15. obclient> SELECT name FROM t6;
  16. +------+
  17. | NAME |
  18. +------+
  19. | a    |
  20. | b    |
  21. | a    |
  22. +------+
  23. 3 rows in set
复制代码
在查询结果中对 name 进行去重处理。
  1. obclient> SELECT DISTINCT name FROM t6;
  2. +------+
  3. | NAME |
  4. +------+
  5. | a    |
  6. | b    |
  7. +------+
  8. 2 rows in set
复制代码
从表 t6 中根据筛选条件 name = ‘a’ ,输出对应的 id 、name 和 num。
  1. obclient> SELECT id, name, num FROM t6 WHERE name = 'a';
  2. +------+------+------+
  3. | ID   | NAME | NUM  |
  4. +------+------+------+
  5. |    1 | a    |  100 |
  6. |    3 | a    |   50 |
  7. +------+------+------+
  8. 2 rows in set
复制代码
8. 提交事故

利用 COMMIT 语句提交事故。
在提交事故(COMMIT)之前:


  • 您的修改只对当前会话可见,对其他数据库会话均不可见。
  • 您的修改没有持久化,您可以通过 ROLLBACK 语句撤销修改。
在提交事故(COMMIT)之后:


  • 您的修改对全部数据库会话可见。
  • 您的修改持久化乐成,不能通过 ROLLBACK 语句回滚修改。
示例:通过 CREATE TABLE 创建表 t_insert。利用 COMMIT 语句提交事故。
  1. obclient> BEGIN;
  2. Query OK, 0 rows affected
  3. obclient> CREATE TABLE t_insert(
  4.     id number NOT NULL PRIMARY KEY,
  5.     name varchar(10) NOT NULL,
  6.     value number,
  7.     gmt_create DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
  8. );
  9. Query OK, 0 rows affected
  10. obclient> INSERT INTO t_insert(id, name, value, gmt_create) VALUES(1,'CN',10001, current_timestamp),(2,'US',10002, current_timestamp),(3,'EN',10003, current_timestamp);
  11. Query OK, 3 rows affected
  12. Records: 3  Duplicates: 0  Warnings: 0
  13. obclient> SELECT * FROM t_insert;
  14. +----+------+-------+---------------------+
  15. | id | name | value | gmt_create          |
  16. +----+------+-------+---------------------+
  17. |  1 | CN   | 10001 | 2022-08-22 16:19:26 |
  18. |  2 | US   | 10002 | 2022-08-22 16:19:26 |
  19. |  3 | EN   | 10003 | 2022-08-22 16:19:26 |
  20. +----+------+-------+---------------------+
  21. 3 rows in set
  22. obclient> INSERT INTO t_insert(id,name) VALUES(4,'JP');
  23. Query OK, 1 row affected
  24. obclient> COMMIT;
  25. Query OK, 0 rows affected
  26. obclient> exit;
  27. Bye
  28. obclient> obclient -h127.0.0.1 -ur**t@mysql -P2881 -p****** -Ddb1
  29. obclient> SELECT * FROM t_insert;
  30. +----+------+-------+---------------------+
  31. | id | name | value | gmt_create          |
  32. +----+------+-------+---------------------+
  33. |  1 | CN   | 10001 | 2022-08-22 16:19:26 |
  34. |  2 | US   | 10002 | 2022-08-22 16:19:26 |
  35. |  3 | EN   | 10003 | 2022-08-22 16:19:26 |
  36. |  4 | JP   |  NULL | 2022-08-22 16:21:39 |
  37. +----+------+-------+---------------------+
  38. 4 rows in set
复制代码
9. 回滚事故

利用 ROLLBACK 语句回滚事故。
回滚一个事故指将事故的修改全部撤销。可以回滚当前整个未提交的事故,也可以回滚到事故中恣意一个保存点。假如要回滚到某个保存点,必须联合利用 ROLLBACK 和 TO SAVEPOINT 语句。 此中:
假如回滚整个事故,则:


  • 事故会竣事
  • 全部的修改会被抛弃
  • 清除全部保存点
  • 释放事故持有的全部锁
    假如回滚到某个保存点,则:
  • 事故不会竣事
  • 保存点之前的修改被保存,保存点之后的修改被抛弃
  • 清除保存点之后的保存点(不包括保存点自身)
  • 释放保存点之后事故持有的全部锁
示例:回滚事故的全部修改。
  1. obclient> SELECT * FROM t_insert;
  2. +----+------+-------+---------------------+
  3. | id | name | value | gmt_create          |
  4. +----+------+-------+---------------------+
  5. |  1 | CN   | 10001 | 2022-08-22 16:19:26 |
  6. |  2 | US   | 10002 | 2022-08-22 16:19:26 |
  7. |  3 | EN   | 10003 | 2022-08-22 16:19:26 |
  8. +----+------+-------+---------------------+
  9. 3 rows in set
  10. obclient> BEGIN;
  11. Query OK, 0 rows affected
  12. obclient> INSERT INTO t_insert(id, name, value) VALUES(4,'JP',10004),(5,'FR',10005),(6,'RU',10006);
  13. Query OK, 3 rows affected
  14. Records: 3  Duplicates: 0  Warnings: 0
  15. obclient> SELECT * FROM t_insert;
  16. +----+------+-------+---------------------+
  17. | id | name | value | gmt_create          |
  18. +----+------+-------+---------------------+
  19. |  1 | CN   | 10001 | 2022-08-22 16:19:26 |
  20. |  2 | US   | 10002 | 2022-08-22 16:19:26 |
  21. |  3 | EN   | 10003 | 2022-08-22 16:19:26 |
  22. |  4 | JP   | 10004 | 2022-08-22 16:26:23 |
  23. |  5 | FR   | 10005 | 2022-08-22 16:26:23 |
  24. |  6 | RU   | 10006 | 2022-08-22 16:26:23 |
  25. +----+------+-------+---------------------+
  26. 6 rows in set
  27. obclient> ROLLBACK;
  28. Query OK, 0 rows affected
  29. +----+------+-------+---------------------+
  30. | id | name | value | gmt_create          |
  31. +----+------+-------+---------------------+
  32. |  1 | CN   | 10001 | 2022-08-22 16:19:26 |
  33. |  2 | US   | 10002 | 2022-08-22 16:19:26 |
  34. |  3 | EN   | 10003 | 2022-08-22 16:19:26 |
  35. +----+------+-------+---------------------+
  36. 3 rows in set
复制代码

    听说...关注下面公众号的人都变牛了,纯技术,纯干货 !   


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

守听

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表