文章目录 【1】连接查询 内连接查询 外连接查询 左连接 右连接 【2】联合查询 【3】子查询 带in关键字的子查询 带比较运算符的子查询 带exists的子查询 带any关键字的子查询 带all关键字的子查询...内连接查询 内连接查询是最常见的连接查询,内连接查询可以查询两张或两张以上的表 内连接:[inner] join:从左表中取出每一条记录,去右表中与所有的记录进行匹配: 匹配必须是某个条件在左表中与右表中相同最终才会保留结果...联合查询 联合查询结果是将多个select语句的查询结果合并到一块因为在某种情况下需要将几个select语句查询的结果合并起来显示。...子查询通常会使复杂的查询变得简单,但是相关的子查询要对基础表的每一条数据都进行子查询的动作,所以当表单中数据过大时,一定要慎重选择 带in关键字的子查询 使用in关键字可以将原表中特定列的值与子查询返回的结果集中的值进行比较...带exists的子查询 exists: 是否存在的意思, exists子查询就是用来判断某些条件是否满足(跨表), exists是接在where之后 exists返回的结果只有0和1.
最左前缀参考:http://blog.codinglabs.org/articles/theory-of-mysql-index.html 联合索引优化策略: 如何选择索引列的顺序 1.经常会被使用到的列优先...:http://www.cnblogs.com/gomysql/p/4004244.html explain小技巧,可以加 \G以按行来显示分析结果,避免因为按列显示不下的情况: 5.索引选择性与前缀索引...显然选择性的取值范围为(0, 1],选择性越高的索引价值越大,这是由B+Tree的性质决定的。...explain的Extra列的信息: 下面举例 第一条sql和第二条sql都是where带相同的查询条件,这个已经建了索引,但是select里第一条是都覆盖索引的,而第二条是*,自然有不覆盖的,所以需要回表...7.文件排序和索引排序 使用索引扫描来优化排序条件 1.索引的列顺序和Order by子句的顺序完全一致 2.索引中所有列的方向(升序,降序)和Order by子句完全一致 3.Order by中的字段全部在关联表中的第一张表中
左连接的结果集包括 LEFT OUTER子句中指定的左表的所有行,而不仅仅是连接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值。...全连接: 全连接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。MySQL不支持全外连接。...4、SQL查询的原理 第一、单表查询:根据WHERE条件过滤表中的记录,形成中间表;然后根据SELECT的选择列选择相应的列进行返回最终结果。...在没有ON的单表查询中,是限制物理表或者中间查询结果返回记录的约束。在两表或多表连接中是限制连接形成最终中间表的返回结果的约束。 将WHERE条件移入ON后面是不恰当的。...Where子句:从数据源去掉不符合搜索条件的数据; GROUP BY子句:分组,使用统计函数(聚合函数)为每组计算统计值; HAVING子句:在分好的组中去掉每组中不符合条件的数据行。
THEN 结果1 WHEN 条件2 THEN 结果2 WHEN 条件3 THEN 结果3 WHEN 条件4 THEN 结果4 ............但 B-树索引必须遵循左边前缀原则,要考虑以下几点约束:查询必须从索引的最左边的列开始。 查询不能跳过某一索引列,必须按照从左到右的顺序进行匹配。 存储引擎不能使用索引中范围条件右边的列。...我们如何优化?使用覆盖索。把 %放后面。四、查询条件不满足联合索引的最左匹配原则Mysql建立联合索引时,会遵循左前缀匹配原则,既最左优先。...最大选择性原则。2.6.1 最左前缀原则最左前缀是一个很重要的原则一般在where条件中两个及以上字段时,我们会建联合索引。...6UNION RESULT从UNION表获取结果的SELECT。
本文给大家总结如何让SQL起飞(优化) 一、SQL写法优化 在SQL中,很多时候不同的SQL代码能够得出相同结果。...从理论上来说,我们认为得到相同结果的不同SQL之间应该有相同的性能,但遗憾的是,查询优化器生成的执行计划很大程度上受到SQL代码影响,有快有慢。...因此,如果确信使用IN也能快速获取结果,就没有必要非得改成EXISTS了。 这里用Class_A表和Class_B举例, 图片 我们试着从Class_A表中查出同时存在于Class_B表中的员工。...这里用Items表和SalesHistory表举例: 图片 我们思考一下如何从上面的商品表Items中找出同时存在于销售记录表SalesHistory中的商品。简而言之,就是找出有销售记录的商品。...在这个场景下,优化器会选择直接进行一遍全表扫描。 2.5 使用联合索引时,列的顺序错误 使用联合索引需要满足最左匹配原则,即最左优先。
这时候索引的作用只是用于优化WHERE条件的查找 如果在a b列上建立联合索引,该如何建立,才能使查询效率最高 select count(distinct a) / count(*), count(distinct...MySQL中,有两种方式生成有序结果集: 通过有序索引顺序扫描直接返回有序数据 Filesort排序,对返回的数据进行排序 因为索引的结构是B+树,索引中的数据是按照一定顺序进行排列的,所以在排序查询中如果能利用索引...可以建立(username, passwd, login_time)的联合索引,由于 login_time的值可以直接从索引中拿到,不用再回表查询,提高了查询效率 经常更改,区分度不高的列上不宜加索引...因此我们选择足够长的前缀保证较高的区分度,同时又不能太长(以便节约空间) 可以进行如下实验 select count(distinct left(email, 5)) / count(*) as col5...,前缀索引不能使用覆盖索引,因为从索引中获取不到完整的数据,还得回表查询 建立索引的列不为NULL 只要列中包含有 NULL 值都将不会被包含在索引中,复合索引中只要有一列含有 NULL值,那么这一列对于此复合索引就是无效的
这时候索引的作用只是用于优化WHERE条件的查找 如果在a b列上建立联合索引,该如何建立,才能使查询效率最高 select count(distinct a) / count(*), count(distinct...MySQL中,有两种方式生成有序结果集: 通过有序索引顺序扫描直接返回有序数据 Filesort排序,对返回的数据进行排序 因为索引的结构是B+树,索引中的数据是按照一定顺序进行排列的,所以在排序查询中如果能利用索引...可以建立(username, passwd, login\_time)的联合索引,由于 login\_time的值可以直接从索引中拿到,不用再回表查询,提高了查询效率 经常更改,区分度不高的列上不宜加索引...因此我们选择足够长的前缀保证较高的区分度,同时又不能太长(以便节约空间) 可以进行如下实验 select count(distinct left(email, 5)) / count(*) as col5...,前缀索引不能使用覆盖索引,因为从索引中获取不到完整的数据,还得回表查询 建立索引的列不为NULL 只要列中包含有 NULL 值都将不会被包含在索引中,复合索引中只要有一列含有 NULL值,那么这一列对于此复合索引就是无效的
4、 ref查询条件索引既不是UNIQUE也不是PRIMARY KEY的情况。ref可用于=或操作符的带索引的列。 ?...· Using filesort:MySQL需要额外的一次传递,以找出如何按排序顺序检索行。 · Using index:从只使用索引树中的信息而不需要进一步搜索读取实际的行来检索表中的列信息。...使用联合索引的查询 MySQL可以为多个字段创建索引,一个索引可以包括16个字段。对于联合索引,只有查询条件中使用了这些字段中第一个字段时,索引才会生效。 ? ? ?...使用OR关键字的查询 查询语句的查询条件中只有OR关键字,且OR前后的两个条件中的列都是索引时,索引才会生效,否则,索引不生效。 ? ? ?...增加中间表 对于需要经常联合查询的表,可以建立中间表以提高查询效率。 通过建立中间表,将需要通过联合查询的数据插入到中间表中,然后将原来的联合查询改为对中间表的查询。
FROM 数据表名 WHERE 条件表达式; 该语句的含义是,从指定的数据表中,查找满足查询条件的指定字段的记录。其中,条件表达式可以是包含'>','=','带结果排序的SELECT查询 语法格式 SELECT 字段名[,字段名...] FROM 数据表名 WHERE 条件表达式 ORDER BY 字段名[,字段名...]...如果ALL参数被省略,则联合查询的结果集合中的重复行将只保留一行,否则将保留所有重复行。...需要提醒的是,使用UNION运算符时应保证每个联合查询的语句的选择字段具有相同的数据类型,或者可以自动将它们转为相同的数据类型。...注:联合查询时,查询的结果字段标题为第一个SELECT语句的字段标题。如果要对联合查询结果进行排序时,也必须使用第一个SELECT语句中的字段名。
带AND的多条件查询、带OR的多条件查询、关键字DISTINCT(查询结果不重复)、对查询结果排序、分组查询(GROUP BY)、使用LIMIT限制查询结果的数量 2.1、查询所有字段 select...2.10、关键字DISTINCT(查询结果不重复) 使用DISTINCT就能消除重复的值 ? 2.11、对查询结果排序 看上面输出的值没顺序,可以给他们进行排序。...使用关键字 ORDER BY,有两个值供选择 DESC 降序 、 ASC 升序(默认值) select distinct s_id from book order by s_id; ?...1)select s_id from book group by s_id; //将s_id进行分组,有实际意义,按书批发商进行分组,从40批发商这里拿的书籍会放在40这个组中 ?...2.13、使用LIMIT限制查询结果的数量 LIMIT[位置偏移量] 行数 通过LIMIT可以选择数据库表中的任意行数,也就是不用从第一条记录开始遍历,可以直接拿到 第5条到第10条的记录,也可以直接拿到第
「索引的选择性」是指不重复的索引值和数据表记录总数的比值,范围从1/N到1之间。...「如何计算完整列的选择性?」...比如student表中的age列的选择性 select count(distinct age)/count(*) from student; 《高性能MySQL》书中说是选择性趋近于0.031,基本就可用...计算合适的前缀长度的即是计算完整列的选择性,并使前缀列的选择性接近于完整列的选择性。 「如何确定n?」...pre4, count(distinct left(remark,5))/count(*) as pre5, from student; 多列索引 索引合并策略有时候是一种优化的结果,但实际上更多时候说明表上的索引建的很糟糕
WHERE expressions -- expressions 过滤条件 利用distinct 获取唯一性记录 distinct 关键字用于获得唯一性记录,被distinct 限制的既可以是单个列...建立子查询的目的是更加有效的限制where 子句中的条件,并可以将复杂的查询逻辑梳理的更加清晰。 子查询可以访问父查询中的数据源,但是父查询不能够访问子查询from子句所定义的数据源。...子查询是根据父查询中的每条记录执行的。...联接查询 联接用于指定多数据源之间如何组合,以形成最终的数据源。如果没有未显示指定联接,那么将获得多个数据源的笛卡尔积。 什么是多表查询 从多个表中获取数据就是多表查询。...t,table2_name t2 where t1.column_name=t2.column; 内连接 外联接 核心:通过外链接,把对于连接条件不成立的记录,仍然包含在最后的结果中 左联接 select
索引什么时候生效了,但是选择错了索引? 表连接查询的时候如何利用索引来减少驱动表和被驱动表之间的比较次数? 当我们用left join关键字的时候驱动表和被驱动表是如何选择的?...5.6 引入的索引下推优化(index condition pushdown), 可以在索引遍历过程中,对索引中包含的字段先做判断,直接过滤掉不满足条件的记录,减少回表次数。 选错索引如何解决 a....city 找到第一个满足 city='杭州’条件的主键 id; 3、到主键 id 索引取出整行,取 name、city、age 三个字段的值,存入 sort_buffer 中; 4、从索引 city...取下一个记录的主键 id; 5、重复步骤 3、4 直到 city 的值不满足查询条件为止,对应的主键 id ; 6、对 sort_buffer 中的数据按照字段 name 做快速排序; 7、按照排序结果取前...’条件的记录,取出其中的 city、name 和 age 这三个字段的值,作为结果集的一部分直接返回; b、从索引 (city,name,age) 取下一个记录,同样取出这三个字段的值,作为结果集的一部分直接返回
由于开启过慢查询日志bin-log, 我们就必须为我们的function指定一个参数。 主从复制,主机会将写操作记录在bin-log日志中。从机读取bin-log日志,执行语句来同步数据。...先看一下字段在全部数据中的选择度: select count(distinct address) / count(*) from shop; 通过不同长度去计算,与全表的选择性对比: 公式: count...-- 截取前10个字符的选择度 count(distinct left(address,15)) / count(*) as sub11, -- 截取前15个字符的选择度 count(distinct...区分度高(散列性高)的列适合作为索引 10. 使用最频繁的列放到联合索引的左侧 这样也可以较少的建立一些索引。同时,由于"最左前缀原则",可以增加联合索引的使用率。 11....在多个字段都要创建索引的情况下,联合索引优于单值索引
(或两者都有)在这种情况下,只从列出的分区中选择行,而忽略表的任何其他分区。...4.WHERE 子句 如果给定 WHERE 子句,则指示行必须满足的一个或多个条件才能被选中。where_condition 是一个表达式,对于要选择的每一行,其计算结果为 true 才会被选择。...MySQL 规定,当非聚合函数中的列不存在于 GROUP BY 子句中,则选择每个分组的第一行。 (3)COUNT DISTINCT 统计符合条件的记录数量。...如果像对符合条件的记录进行 COUNT DISTINCT,那么如何添加条件呢? 参见 MySQL distinct count if conditions unique,可以使用下面的方法。...20000 cat 20001 dog 对两个结果集按照 uin 进行降序排序后再联合。
从表读出数据的行数索引 不能使用索引,只能在临时结果集操作可以使用索引 聚集函数专门使用聚集函数的 不能使用聚集函数 9、如何区分FLOAT和DOUBLE?...,用来指定创建索引;index_name 指定索引的名称,为可选参数,如果不指定,那么MySQL默认col_name为索引名;col_name 为需要创建索引的字段列,该列必须从数据表中定义的多个列中选择...先看一下字段在全部数据中的选择度:select count(distinct address) / count(*) from shop;通过不同长度去计算,与全表的选择性对比:公式:count(distinct...count(distinct left(address,15)) / count(*) as sub11, -- 截取前15个字符的选择度 count(distinct left(address,20...查询条件包含or,可能导致索引失效如何字段类型是字符串,where时一定用引号括起来,否则索引失效like通配符可能导致索引失效。联合索引,查询时的条件列不是联合索引中的第一个列,索引失效。
前言 生产上为了高效地查询数据库中的数据,我们常常会给表中的字段添加索引,大家是否有考虑过如何添加索引才能使索引更高效,考虑如下问题 添加的索引是越多越好吗 为啥有时候明明添加了索引却不生效 索引有哪些类型...如何评判一个索引设计的好坏 看了本文相信你会对索引的原理有更清晰的认识。...上述中传输带就类比磁道,磁道上的菜就类比扇区(sector)中的信息,磁盘块(block)是由多个相邻的扇区组成的,是操作系统读取的最小单元,这样如果信息能以 block 的形式聚集在一起,就能极大减少磁盘...,然后再比较下选择这几个前缀索引的选择性,执行以下语句 SELECT COUNT(DISTINCT LEFT(city,3))/COUNT(*) as sel3, COUNT(DISTINCT LEFT...什么是三星索引 第一颗星:WHERE 后面参与查询的列可以组成了单列索引或联合索引 第二颗星:避免排序,即如果 SQL 语句中出现 order by colulmn,那么取出的结果集就已经是按照 column
多表查询 联合查询 联合查询是多表查询的一种方式,在保证多个SELETE语句的查询字段数相同的情况下,合并多个查询的结果 SELECT··· UNION [ALL|DISTINCT] SELECT···...[UNION [ALL|DISTINCT]SELECT···]; 在上述语法中,UNION是实现联合查询的关键字,ALL和DISTINCT是联合查询的选项,其中ALL表示保留所有的查询结果;DISTINCT...右外连接 右外连接也是外连接查询中的一种,可以将其称为右连接。它用于返回连接关键字(RIGHT JOIN)右表(主表)中所有的记录,以及左表(从表)中符合连接条件的记录。...在进行其他方式比较时,各条件之间的逻辑关系包含两种情况。 因此,读者在选取行子查询的比较运算符时,要根据实际需求慎重选择。...例如,从表外键字段不能插入主表中不存在的数据。
领取专属 10元无门槛券
手把手带您无忧上云