SELECT

SELECT 语句用于从 TiDB 读取数据。

语法图

SelectStmt:

select\_1.png

FromDual:

select\_2.png

WhereClauseOptional:

select\_3.png

SelectStmtOpts:

select\_4.png

SelectStmtFieldList:

select\_5.png

TableRefsClause:

select\_6.png

WhereClauseOptional:

select\_7.png

SelectStmtGroup:

select\_8.png

HavingClause:

select\_9.png

OrderByOptional:

select\_10.png

SelectStmtLimit:

select\_11.png

SelectLockOpt:

select\_12.png

语法元素说明

语法元素 说明
ALL、DISTINCT、DISTINCTROW 查询结果集中可能会包含重复值。指定DISTINCT/DISTINCTROW则在查询结果中过滤掉重复的行;指定ALL则列出所有的行。默认为ALL。
HIGH_PRIORITY 该语句为高优先级语句,TiDB在执行阶段会优先处理这条语句
SQL_CALC_FOUND_ROWS TiDB出于兼容性解析这个语法,但是不做任何处理
SQL_CACHE、SQL_NO_CACHE 是否把请求结果缓存到TiKV(RocksDB)的BlockCache中。对于一次性的大数据量的查询,比如count(*)查询,为了避免冲掉BlockCache中用户的热点数据,建议填上SQL_NO_CACHE
STRAIGHT_JOIN STRAIGHT_JOIN会强制优化器按照FROM子句中所使用的表的顺序做联合查询。当优化器选择的Join顺序并不优秀时,你可以使用这个语法来加速查询的执行
select_expr 投影操作列表,一般包括列名、表达式,或者是用‘*‘表示全部列
FROMtable_references 表示数据来源,数据来源可以是一个表(selectfromt;)或者是多个表(selectfromt1joint2;)或者是0个表(select1+1fromdual;,等价于select1+1;)
WHEREwhere_condition Where子句用于设置过滤条件,查询结果中只会包含满足条件的数据
GROUPBY GroupBy子句用于对查询结果集进行分组
HAVINGwhere_condition Having子句与Where子句作用类似,Having子句可以让过滤GroupBy后的各种数据,Where子句用于在聚合前过滤记录。
ORDERBY OrderBy子句用于指定结果排序顺序,可以按照列、表达式或者是select_expr列表中某个位置的字段进行排序。
LIMIT Limit子句用于限制结果条数。Limit接受一个或两个数字参数,如果只有一个参数,那么表示返回数据的最大行数;如果是两个参数,那么第一个参数表示返回数据的第一行的偏移量(第一行数据的偏移量是0),第二个参数指定返回数据的最大条目数。
FORUPDATE 对查询结果集所有行上锁(对于在查询条件内,但是不在结果集的行,将不会加锁,如事务启动后由其他事务写入的行),以监测其他事务对这些的并发修改。TiDB使用乐观事务模型在语句执行期间不会检测锁,因此,不会像PostgreSQL之类的数据库一样,在当前事务结束前阻止其他事务执行UPDATE、DELETE和SELECTFORUPDATE。在事务的提交阶段SELECTFORUPDATE读到的行,也会进行两阶段提交,因此,它们也可以参与事务冲突检测。如发生写入冲突,那么包含SELECTFORUPDATE语句的事务会提交失败。如果没有冲突,事务将成功提交,当提交结束时,这些被加锁的行,会产生一个新版本,可以让其他尚未提交的事务,在将来提交时发现写入冲突。
LOCKINSHAREMODE TiDB出于兼容性解析这个语法,但是不做任何处理

示例

mysql> CREATE TABLE t1 (id INT NOT NULL PRIMARY KEY auto_increment, c1 INT NOT NULL);
Query OK, 0 rows affected (0.11 sec)
mysql> INSERT INTO t1 (c1) VALUES (1),(2),(3),(4),(5);
Query OK, 5 rows affected (0.03 sec)
Records: 5  Duplicates: 0  Warnings: 0
mysql> SELECT * FROM t1;
+----+----+
| id | c1 |
+----+----+
|  1 |  1 |
|  2 |  2 |
|  3 |  3 |
|  4 |  4 |
|  5 |  5 |
+----+----+
 rows in set (0.00 sec)

MySQL 兼容性

SELECT 语句与 MySQL 完全兼容。如有任何兼容性差异,请在 GitHub 上提交 issue。

另请参阅

  • INSERT
  • DELETE
  • UPDATE
  • REPLACE

看完两件小事

如果你觉得这篇文章对你挺有启发,我想请你帮我两个小忙:

  1. 关注我们的 GitHub 博客,让我们成为长期关系
  2. 把这篇文章分享给你的朋友 / 交流群,让更多的人看到,一起进步,一起成长!
  3. 关注公众号 「方志朋」,公众号后台回复「资源」 免费领取我精心整理的前端进阶资源教程

JS中文网是中国领先的新一代开发者社区和专业的技术媒体,一个帮助开发者成长的社区,目前已经覆盖和服务了超过 300 万开发者,你每天都可以在这里找到技术世界的头条内容。欢迎热爱技术的你一起加入交流与学习,JS中文网的使命是帮助开发者用代码改变世界

results matching ""

    No results matching ""