第十六节:Mysql中的关键字

Like

  1. like:用于字符串匹配,利用通配符可以在不完全确定比较值的情形下创建一个比较特定数据的搜索模式,并置于关键字 LIKE 之后。可以在搜索模式的任意位置使用通配符,并且可以使用多个通配符
  2. 语法格式:表达式1 [not] like 表达式2
  3. MySQL支持的通配符有以下两种:
    1. %:在过滤条件中,百分号可以匹配任何任意字符,且该字符可以出现任意次(0次、一次或者多次),但是不能匹配空值
    2. _:在过滤条件中,下划线只能匹配单个的任意字符(即一个下划线匹配一个任意字符)
  4. 实例:
    select * from Teacher where name like '%a%'; #查询名字里面含有字母a的学生信息
    select * from Teacher where name like 'T%'; #查询名字以T开头的学生信息
    select * from Teacher where name like 'T__'; #查询名字以T开头且T后面只有两个字母的学生信息

Distinct

  1. 作用:在MySQL中使用 select 语句查询数据的时候返回的是所有匹配的行,使用distinct关键字可指示MySQL消除重复的记录值
  2. 语法格式:distinct 字段名
  3. 实例:select distinct age  from Teacher;

As

表别名只在执行查询时使用,并不在返回结果中显示,而列定义别名之后,将返回给客户端显示,显示的结果字段为字段列的别名

在为表取别名时,要保证不能与数据库中的其他表的名称冲突

为表设置别名

  1. 作用:在查询时,当表名很长或者执行一些特殊查询的时候,为了方便操作或者需要多次使用相同的表时,可以为表指定别名来代替表原来的名称
  2. 为表取别名的语法:表名  [AS]  别名
  3. 语法解释如下:
    1. 表名:数据库中存储数据的表的名称
    2. 别名:指定的表的新名称
    3. AS:关键字为可选参数,可有省略
  4. 实例:select tea.name from Teacher as tea;

为字段设置别名

  1. 作用:在使用 SELECT 语句显示查询结果时,MySQL 会显示每个 SELECT 后面指定输出的列,在有些情况下,显示的列名称会很长或者名称不够直观,MySQL 可以指定列的别名
  2. 为列取别名语法:列名 [AS] 列别名
  3. 语法解释如下:
    1. 列名:为表中字段的名称
    2. 列别名:为表中字段新的名称
    3. AS:关键字为可选参数,可以省略
  4. 实例:select name as TeacherName from Teacher;

explain

  1. explain:是查看优化器如何执行查询的主要方法 (用来查看优化器生成的的执行计划)
  2. 语法:  
    1. explain select ……
    2. explain extended select …… (将执行计划"反编译"成select语句,运行show warnings可得到被mysql优化器优化后的查询语句)
    3. explain partitions select …… (用于分区表的explain生成qep的信息)
  3. 实例:explain  select * from Teacher1 where id = 1;
  4. 作用:
    1. 可以帮助我们深入了解mysql的基于开销的优化器
    2. 可以获得很多可能被优化器考虑到的访问策略的细节,以及当运行sql语句时哪种策略预计会被优化器采用
  5. 注意点:
    1. 优化器生成的执行计划(qep)并不确定,它可能会根据很多因素发生改变
    2. mysql不会将一个qep和某个给定查询绑定,qep将由sql语句每次执行时的实际情况确定,即便使用存储过程也是如此。尽管在存储过程中sql语句都是预先解析过的,但qep仍然会在每次调用存储过程的时候才被确定
    3. explain不会告诉你关于触发器、存储过程的信息或用户自定义函数对查询的影响情况
    4. explain不考虑各种cache
    5. explain不能显示mysql在执行查询时所作的优化工作
    6. 部分统计信息是估算的,并非精确值
    7.  expalin只能解释select操作,其他操作要重写为select后查看执行计划
  6. explain结果字段的含义介绍
    id select识别符
    select_type

    select类型,可以为以下任何一种:

    simple:简单select(不使用union或子查询)

    primary:最外面的select
    union:union中的第二个或后面的select语句
    dependent union:union中的第二个或后面的select语句,取决于外面的查询
    union result:union 的结果
    subquery:子查询中的第一个select
    dependent subquery:子查询中的第一个select,取决于外面的查询
    derived:导出表的select(from子句的子查询)

     table  输出的行所引用的表
     type

     联接类型。下面给出各种联接类型,按照从最佳类型到最坏类型进行排序:

    system:表仅有一行(=系统表)。这是const联接类型的一个特例。
    const:表最多有一个匹配行,它将在查询开始时被读取。因为仅有一行,在这行的列值可被优化器剩余部分认为是常数。const表很快,因为它们只读取一次!
    eq_ref:对于每个来自于前面的表的行组合,从该表中读取一行。这可能是最好的联接类型,除了const类型。
    ref:对于每个来自于前面的表的行组合,所有有匹配索引值的行将从这张表中读取。
    ref_or_null:该联接类型如同ref,但是添加了mysql可以专门搜索包含null值的行。
    index_merge:该联接类型表示使用了索引合并优化方法。
    unique_subquery:该类型替换了下面形式的in子查询的ref: value in (select primary_key from single_table where some_expr) unique_subquery是一个索引查找函数,可以完全替换子查询,效率更高。
    index_subquery:该联接类型类似于unique_subquery。可以替换in子查询,但只适合下列形式的子查询中的非唯一索引: value in (select key_column from single_table where some_expr)
    range:只检索给定范围的行,使用一个索引来选择行。
    index:该联接类型与all相同,除了只有索引树被扫描。这通常比all快,因为索引文件通常比数据文件小。
    all:对于每个来自于先前的表的行组合,进行完整的表扫描。

     possible_keys  指出mysql能使用哪个索引在表中找到记录,查询涉及到的字段上若存在索引,则该索引将被列出,但不一定被查询使用
     key  显示mysql在查询中实际使用的索引,若没有使用索引,显示为null
     key_len  表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度(key_len显示的值为索引字段的最大可能长度,并非实际使用长度,即key_len是根据表定义计算而得,不是通过表内检索出的)
     ref  表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值
     rows  显示mysql认为它执行查询时必须检查的行数。多行之间的数据相乘可以估算要处理的行数
     filtered  显示了通过条件过滤出的行数的百分比估计值
     extra

     该列包含mysql解决查询的详细信息,取的值可以为以下任一种:

    distinct:mysql发现第1个匹配行后,停止为当前的行组合搜索更多的行。
    not exists:mysql能够对查询进行left join优化,发现1个匹配left join标准的行后,不再为前面的的行组合在该表内检查更多的行。
    range checked for each record (index map: #):mysql没有发现好的可以使用的索引,但发现如果来自前面的表的列值已知,可能部分索引可以使用。
    using filesort:mysql需要额外的一次传递,以找出如何按排序顺序检索行。
    using index:从只使用索引树中的信息而不需要进一步搜索读取实际的行来检索表中的列信息。
    using temporary:为了解决查询,mysql需要创建一个临时表来容纳结果。
    using where:where 子句用于限制哪一个行匹配下一个表或发送到客户。
    using sort_union(…), using union(…), using intersect(…):这些函数说明如何为index_merge联接类型合并索引扫描。
    using index for group-by:类似于访问表的using index方式,using index for group-by表示mysql发现了一个索引,可以用来查 询group by或distinct查询的所有列,而不要额外搜索硬盘访问实际的表。

posted @ 2020-01-15 15:01  WeiKing  阅读(357)  评论(0编辑  收藏  举报