首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【MySQL】多表联合查询、连接查询、子查询「建议收藏」

文章目录 【1】连接查询 内连接查询 外连接查询 左连接 右连接 【2】联合查询 【3】子查询 in关键字子查询 比较运算符子查询 exists子查询 any关键字子查询 all关键字子查询...内连接查询 内连接查询是最常见连接查询,内连接查询可以查询两张或两张以上表 内连接:[inner] join:左表取出每一条记录,去右表与所有的记录进行匹配: 匹配必须是某个条件在左表与右表相同最终才会保留结果...联合查询 联合查询结果是将多个select语句查询结果合并到一块因为在某种情况下需要将几个select语句查询结果合并起来显示。...子查询通常会使复杂查询变得简单,但是相关子查询要对基础表每一条数据都进行子查询动作,所以当表单数据过大时,一定要慎重选择 in关键字子查询 使用in关键字可以将原表特定列值与子查询返回结果集中值进行比较...exists子查询 exists: 是否存在意思, exists子查询就是用来判断某些条件是否满足(跨表), exists是接在where之后 exists返回结果只有0和1.

4K20

MySQL常用性能分析方法-profile,explain,索引

最左前缀参考: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性质决定。...explainExtra列信息: 下面举例 第一条sql和第二条sql都是where相同查询条件,这个已经建了索引,但是select里第一条是都覆盖索引,而第二条是*,自然有不覆盖,所以需要回表...7.文件排序和索引排序 使用索引扫描来优化排序条件 1.索引列顺序和Order by子句顺序完全一致 2.索引中所有列方向(升序,降序)和Order by子句完全一致 3.Order by字段全部在关联表第一张表

1.1K10
您找到你想要的搜索结果了吗?
是的
没有找到

MySQL删库到跑路(五)——SQL查询

左连接结果集包括 LEFT OUTER子句中指定左表所有行,而不仅仅是连接列所匹配行。如果左表某行在右表没有匹配行,则在相关联结果集行右表所有选择列表列均为空值。...全连接: 全连接返回左表和右表所有行。当某行在另一个表没有匹配行时,则另一个表选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表数据值。MySQL不支持全外连接。...4、SQL查询原理 第一、单表查询:根据WHERE条件过滤表记录,形成中间表;然后根据SELECT选择选择相应列进行返回最终结果。...在没有ON单表查询,是限制物理表或者中间查询结果返回记录约束。在两表或多表连接是限制连接形成最终中间表返回结果约束。 将WHERE条件移入ON后面是不恰当。...Where子句:数据源去掉不符合搜索条件数据; GROUP BY子句:分组,使用统计函数(聚合函数)为每组计算统计值; HAVING子句:在分好组中去掉每组不符合条件数据行。

2.5K30

让SQL起飞(优化)

本文给大家总结如何让SQL起飞(优化) 一、SQL写法优化 在SQL,很多时候不同SQL代码能够得出相同结果。...理论上来说,我们认为得到相同结果不同SQL之间应该有相同性能,但遗憾是,查询优化器生成执行计划很大程度上受到SQL代码影响,有快有慢。...因此,如果确信使用IN也能快速获取结果,就没有必要非得改成EXISTS了。 这里用Class_A表和Class_B举例, 图片 我们试着Class_A表查出同时存在于Class_B表员工。...这里用Items表和SalesHistory表举例: 图片 我们思考一下如何从上面的商品表Items找出同时存在于销售记录表SalesHistory商品。简而言之,就是找出有销售记录商品。...在这个场景下,优化器会选择直接进行一遍全表扫描。 2.5 使用联合索引时,列顺序错误 使用联合索引需要满足最左匹配原则,即最左优先。

1.4K42

MySQL索引优化实战

这时候索引作用只是用于优化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值,那么这一列对于此复合索引就是无效

1.1K30

面试必备,MySQL索引优化实战总结,涵盖了几乎所

这时候索引作用只是用于优化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值,那么这一列对于此复合索引就是无效

36910

MYSQL优化有理有据全分析(面试必备)

4、 ref查询条件索引既不是UNIQUE也不是PRIMARY KEY情况。ref可用于=或操作符索引列。 ?...· Using filesort:MySQL需要额外一次传递,以找出如何按排序顺序检索行。 · Using index:只使用索引树信息而不需要进一步搜索读取实际行来检索表列信息。...使用联合索引查询 MySQL可以为多个字段创建索引,一个索引可以包括16个字段。对于联合索引,只有查询条件中使用了这些字段第一个字段时,索引才会生效。 ? ? ?...使用OR关键字查询 查询语句查询条件只有OR关键字,且OR前后两个条件列都是索引时,索引才会生效,否则,索引不生效。 ? ? ?...增加中间表 对于需要经常联合查询表,可以建立中间表以提高查询效率。 通过建立中间表,将需要通过联合查询数据插入到中间表,然后将原来联合查询改为对中间表查询。

1.3K30

小白专属mysql入门

FROM 数据表名 WHERE 条件表达式; 该语句含义是,指定数据表,查找满足查询条件指定字段记录。其中,条件表达式可以是包含'>','=','<=','=','!...2,结果排序SELECT查询 语法格式 SELECT 字段名[,字段名...] FROM 数据表名 WHERE 条件表达式 ORDER BY 字段名[,字段名...]...如果ALL参数被省略,则联合查询结果集合重复行将只保留一行,否则将保留所有重复行。...需要提醒是,使用UNION运算符时应保证每个联合查询语句选择字段具有相同数据类型,或者可以自动将它们转为相同数据类型。...注:联合查询时,查询结果字段标题为第一个SELECT语句字段标题。如果要对联合查询结果进行排序时,也必须使用第一个SELECT语句中字段名。

1.1K40

MySQL(九)之数据表查询详解(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条记录,也可以直接拿到第

2.9K110

Oracle 高级查询-【联合语句】【联合查询】【层次查询】

WHERE expressions -- expressions 过滤条件 利用distinct 获取唯一性记录 distinct 关键字用于获得唯一性记录,被distinct 限制既可以是单个列...建立子查询目的是更加有效限制where 子句中条件,并可以将复杂查询逻辑梳理更加清晰。 子查询可以访问父查询数据源,但是父查询不能够访问子查询from子句所定义数据源。...子查询是根据父查询每条记录执行。...联接查询 联接用于指定多数据源之间如何组合,以形成最终数据源。如果没有未显示指定联接,那么将获得多个数据源笛卡尔积。 什么是多表查询 多个表获取数据就是多表查询。...t,table2_name t2 where t1.column_name=t2.column; 内连接 外联接 核心:通过外链接,把对于连接条件不成立记录,仍然包含在最后结果 左联接 select

2.2K20

mysql查询优化

索引什么时候生效了,但是选择错了索引? 表连接查询时候如何利用索引来减少驱动表和被驱动表之间比较次数? 当我们用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) 取下一个记录,同样取出这三个字段值,作为结果一部分直接返回

1.3K10

索引创建与设计原则(2)(适合创建索引情况 )

由于开启过慢查询日志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....在多个字段都要创建索引情况下,联合索引优于单值索引

32640

MySQL面试题 硬核47问

表读出数据行数索引 不能使用索引,只能在临时结果集操作可以使用索引 聚集函数专门使用聚集函数 不能使用聚集函数 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通配符可能导致索引失效。联合索引,查询时条件列不是联合索引第一个列,索引失效。

1.3K40

我用对了这些场景下索引,技术总监夸我棒

前言 生产上为了高效地查询数据库数据,我们常常会给表字段添加索引,大家是否有考虑过如何添加索引才能使索引更高效,考虑如下问题 添加索引是越多越好吗 为啥有时候明明添加了索引却不生效 索引有哪些类型...如何评判一个索引设计好坏 看了本文相信你会对索引原理有更清晰认识。...上述传输就类比磁道,磁道上菜就类比扇区(sector)信息,磁盘块(block)是由多个相邻扇区组成,是操作系统读取最小单元,这样如果信息能以 block 形式聚集在一起,就能极大减少磁盘...,然后再比较下选择这几个前缀索引选择性,执行以下语句 SELECT COUNT(DISTINCT LEFT(city,3))/COUNT(*) as sel3, COUNT(DISTINCT LEFT...什么是三星索引 第一颗星:WHERE 后面参与查询列可以组成了单列索引或联合索引 第二颗星:避免排序,即如果 SQL 语句中出现 order by colulmn,那么取出结果集就已经是按照 column

54230

MySQL-多表操作

多表查询 联合查询 联合查询是多表查询一种方式,在保证多个SELETE语句查询字段数相同情况下,合并多个查询结果 SELECT··· UNION [ALL|DISTINCT] SELECT···...[UNION [ALL|DISTINCT]SELECT···]; 在上述语法,UNION是实现联合查询关键字,ALL和DISTINCT联合查询选项,其中ALL表示保留所有的查询结果DISTINCT...右外连接 右外连接也是外连接查询一种,可以将其称为右连接。它用于返回连接关键字(RIGHT JOIN)右表(主表)中所有的记录,以及左表(表)符合连接条件记录。...在进行其他方式比较时,各条件之间逻辑关系包含两种情况。 因此,读者在选取行子查询比较运算符时,要根据实际需求慎重选择。...例如,表外键字段不能插入主表不存在数据。

3.2K20

三高Mysql - Mysql索引和查询优化(偏实战部分)

可以优化sql语句或者优化联合索引方式提高覆盖索引命中率。 如何确认选择用什么索引?...如何让sql强制使用索引 可以使用from表之后接条件语句:force index(索引) 方式进行处理,使用强制索引情况比较少,除非优化器真的选择了不符合预期优化规则并且严重影响查询性能,使用强制索引案例如下...回表生成完整结果集 回表生成完整结果集这个操作其实也不是总是执行,会根据会话参数max_length_for_sort_data进行判断,如果当前查询小于这个数值,会生成一个「全字段中间表」结果可以直接全字段中间表获取...❝优化手段:索引覆盖,也是最高效处理方式。索引覆盖可以跳过生成生成中间结果集,直接输出查询结果。❞ order by字段为索引(或者联合索引最左边)。 其他字段(条件、输出)均在上述索引。...临时表获取一行,调用rand(),把结果和数据放入临时表,以此类推。 针对临时表,把rand字段+行位置(主键)放入到sort_buffer。

65710

我用对了这些场景下索引,技术总监夸我棒

前言 生产上为了高效地查询数据库数据,我们常常会给表字段添加索引,大家是否有考虑过如何添加索引才能使索引更高效,考虑如下问题 添加索引是越多越好吗 为啥有时候明明添加了索引却不生效 索引有哪些类型...如何评判一个索引设计好坏 看了本文相信你会对索引原理有更清晰认识。...上述传输就类比磁道,磁道上菜就类比扇区(sector)信息,磁盘块(block)是由多个相邻扇区组成,是操作系统读取最小单元,这样如果信息能以 block 形式聚集在一起,就能极大减少磁盘...,然后再比较下选择这几个前缀索引选择性,执行以下语句 SELECT COUNT(DISTINCT LEFT(city,3))/COUNT(*) as sel3, COUNT(DISTINCT LEFT...什么是三星索引 第一颗星:WHERE 后面参与查询列可以组成了单列索引或联合索引 第二颗星:避免排序,即如果 SQL 语句中出现 order by colulmn,那么取出结果集就已经是按照 column

32720

【两只鱼】SQL 调优之13条锦囊妙计

Count(distinct)优化: 最有效方法是利用索引来做排重操作,先把排重打记录查找出来在通过count统计。...Nested Loop Join 实际上就是通过驱动表结果集作为循环基础数据,然后一条一条通过该结果集中数据作为过滤条件到下一个表查询数据,然后合并结果。...优化left join: 条件尽量能够过滤一些行将驱动表变得小一点,用小表去驱动大表 右表条件列一定要加上索引(主键、唯一索引、前缀索引等),最好能够使type达到range及以上(ref,eq_ref...,const,system) 索引无法命中情况: %字段% 使用or条件字段 使用函数字段 Where string类型时不加单引号。...他每个键对应多个值,即基数很低(low cardinality),因此可能会选择全表扫描 表编码不同 最左前缀匹配原则: 在mysql建立联合索引时会遵循最左前缀匹配原则,即最左优先,在检索数据时联合索引最左边开始匹配

2.1K30
领券