本文示例 SQL 中的表,都来自于官方提供的测试数据库 sakila,下载链接如下:https://downloads.mysql.com/docs/sakila-db.tar.gz
对应的是限制条件(格式类似“field<op>consant”, field表示列对象,op是操作符如"="、">"等)。
前面说了mysql会吧一些冗余的sql语句查询优化重写,比如多于的括号,比如有的外连接其实跟内连接类似,可以优化查询表的顺序。子查询又分为相关和不相关子查询,如果子查询过滤条件里有外层查询的参数,则是相关子查询,反之则是不相关子查询。Any函数就代表只要有一个就行,最小的,all代表必须所有的都满足这个条件,所以必须最大的也满足。当我们判断子查询里是否存在的时候,则用exists判断,有则返回true。
经过上一篇 where field in (...) 的开场准备,本文正式开启子查询系列,这个系列会介绍子查询的各种执行策略,计划包括以下主题:
在上面的执行示例中,我们已经了解到了什么是子查询。那么子查询可以按照查询返回的不同结果,进行一些简单的分类,如下:
分类方式1: 按内查询的结果返回一条还是多条记录,将子查询分为 单行子查询 、 多行子查询
上篇文章说了,mysql的访问效率有几大类别,const,ref,Ref_null,rang,index,all,以及连接查询走索引,驱动表和被驱动表的查询效率。
上篇文章说了统计数据可以用show table status和show index from 表名查看,可以存着永久性和非永久性,innodb_stats_persistent控制着是否开启永久性,innoDb_stats_persistent_sample_pages和innoDB_stats_transient_sample_pages可以控制采集页面统计,innoDb_stats_auto_recalc控制是否自动计算,都可以在创建表的时候设置。
前面说了explain的table是表名,显示在前面的代表驱动表,正常select会出现不同的id,但如果子查询本来是两个select,但被优化成连接查询,就会导致是相同的id,union查询会出现临时表,id为null,这个临时表作用于去重,union all不需要去重,所以也就不需要建立临时表。
1. 常见的几个聚合函数 1.1 Avg / Sum 平均值 / 求和 (不适用于字符串) select avg(salary),sum(salary),avg(salary)*107 from employess 1.2 Max / Min 最大 / 最小 (字符串中按 a最小 z最大) select max(salary),min(salary) from employess 1.3 Count (1). 计算指定字段再查询你结构中出现的个数(不包含null) 📷
首先我们要了解mysql查询优化器的执行效率,大约有10个,重点几个主要就是const,ref,range ,index,all。Const效率是最块的,成本可以忽略不计,主要通过主键或者唯一值查询的sql。还有比const更快的system,这种时候必须是mysql优化器内部精确计算查询成本,所以system不适用于innoDB,只适用于myISAM。Ref代表用的是索引b+tree查询的时候,比如用连接查询的时候,连接查询的条件是索引唯一值,这时候还分为eq-ref,er-ef是当被驱动表查询的是主键或者唯一二级索引的时候,这时候就是显示eq-ref。当连接表的条件是普通索引查询的时候,这时候显示就是ref,range顾名思义就是索引区间查询的时候,index代表查询覆盖索引的时候,all就是放弃索引全盘扫描了。
答:Oracle、SQL Server、MySQL、Sybase、DB2、Access 等。
1.常见的关系型数据库管理系统产品有? 答:Oracle、SQL Server、MySQL、Sybase、DB2、Access等。 2.SQL语言包括哪几部分?每部分都有哪些操作关键字? 答:SQL语言包括数据定义(DDL)、数据操纵(DML),数据控制(DCL)和数据查询(DQL)四个部分。 数据定义:Create Table,Alter Table,Drop Table, Craete/Drop Index等 数据操纵:Select ,insert,update,delete, 数
前面说了子查询里有no/any/all不能用limit,group by,order by等,他会被查询优化器优化掉,子查询可能会物化转成内连接semi-join查询,物化就是会吧子查询看做一个表,如果数据太大,超过系统变量tmp_table_size,则会在磁盘里创建b+树的临时表,如果比较小,则会创建内存里hash树的临时表,之后会物化表转连接,但如果直接转where 和on,则可能会出现子查询多条的情况,我们的真实需求并不需要多条,所以有了semi-join。
爱可生 DBA 团队成员,擅长故障分析、性能优化,个人博客:https://www.jianshu.com/u/a95ec11f67a8,欢迎讨论。
子查询指一个查询语句嵌套在另一个查询语句内部的查询,这个特性从MySQL 4.1开始引入。
在嵌套查询中,最外面查询结果集返回给调用方,称为外部查询。嵌套在外部查询内的查询称为子查询,子查询的结果集供外部查询使用。
子查询指一个查询语句嵌套在另一个查询语句内部的查询,这个特性从 MySQL 4.1 开始引入。
需求:查询表一(Person)条件是表二(Person_Visison)里有没有表一(Person)的 id 如果有则不返回 结果集,没有则返回。
你真的会玩SQL吗?系列目录 你真的会玩SQL吗?之逻辑查询处理阶段 你真的会玩SQL吗?和平大使 内连接、外连接 你真的会玩SQL吗?三范式、数据完整性 你真的会玩SQL吗?查询指定节点及其所有父节点的方法 你真的会玩SQL吗?让人晕头转向的三值逻辑 你真的会玩SQL吗?EXISTS和IN之间的区别 你真的会玩SQL吗?无处不在的子查询 你真的会玩SQL吗?Case也疯狂 你真的会玩SQL吗?表表达式,排名函数 你真的会玩SQL吗?简单的 数据修改 你真的会玩SQL吗?你所不知道的 数据聚合 你真的会玩S
相关子查询执行过程:先在外层查询中取“学生表”的第一行记录,用该记录的相关的属性值(在内层WHERE子句中给定的)处理内层查询,若外层的WHERE子句返回“TRUE”值,则这条记录放入结果表中。然后再取下一行记录;重复上述过程直到外层表的记录全部遍历一次为止。
子查询 用于当一次查询的结果是另一次查询所需要的时候, 可以使 用子查询 1 单行子查询 子查询的返回结果是单行数据. a) 查询所有比“CLARK”工资高的员工的信息 select * from emp where sal > (select sal from emp where ename='CLARK'); b) 查询工资高于平均工资的雇员名字和工资 select ename, sal from emp where sal>(select avg(sal) from emp);
EXISTS用于检查子查询是否至少会返回一行数据,该子查询实际上并不返回任何数据,而是返回值True或False。
浏览器中打开链接:http://www.itsoku.com/article/209
1.安装配置MySQL workbench或者sqlyog客户端,并实现服务的连接。
如果子查询的执行依赖于外部查询,通常情况下都是因为子查询中的表用到了外部的表,并进行了条件关联,因此每执行一次外部查询,子查询都要重新计算一次,这样的子查询就称之为 关联子查询 。相关子查询按照一行接一行的顺序执行,主查询的每一行都执行一次子查询。
➢ 如果需要综合多个表的数据,形成一个结果,可以考虑用临时表和表变量分步汇总这多个表的数据。
本篇博客讲解(子查询)非相关子查询/相关子查询,一对一,一对多,多对一,多对的的关系!
1. 如何设计一个高并发的系统 ① 数据库的优化,包括合理的事务隔离级别、SQL语句优化、索引的优化 ② 使用缓存,尽量减少数据库 IO ③ 分布式数据库、分布式缓存 ④ 服务器的负载均衡 2. 锁的优化策略 ① 读写分离 ② 分段加锁 ③ 减少锁持有的时间 ④ 多个线程尽量以相同的顺序去获取资源 等等,这些都不是绝对原则,都要根据情况,比如不能将锁的粒度过于细化,不然可能会出现线程的加锁和释放次数过多,反而效率不如一次加一把大锁。这部分跟面试官谈了很久 3. 索引的底层实现原理和优化 B+树,经过优化
普通的 select…from 很明显不能满足我们的更细化的查询需求,它除了基本语法外,还可以拓展使用一些判断语法和过滤、分组语法。本文介绍一些 select 的进阶查询语法。其中包括等值连接、不等值连接、外连接(左外连接、右外连接)自连接、层次查询、子查询(相关子查询)等语法。本文所操作的均是 oracle 下 scott 用户下的表。大家可参考查阅。
相关子查询执行过程:先在外层查询中取“学生表”的第一行记录,利用该记录的相关属性值(在exists子查询的where子句中用到的列)处理内层查询,若外层的where子句返回“true”,则本条记录放入结果表中。然后再取下一行记录,重复上述过程直到外层表遍历完毕。
指一个查询语句嵌套在另一个查询语句内部的查询,这个特性从MySQL 4.1开始引入。
例如:子查询是查询学生表中姓名为张三的学生所在的系,父查询是查询该系所有学生的姓名和学号。张三只能在一个系,所以子查询的结果是单个值,可以使用比较运算符连接。
子查询定义在一个完整的查询语句中包含的子查询块被称为子查询。通常情况下,我们可以将出现在SELECT、WHERE和HAVING语法中的子查询块称为嵌套子查询,出现在FROM语法后的子查询块称为内联视图或派生表。
其中,相关子查询概念是内部依赖于外部,外部每次执行一次内部都执行一次,都是外部先执行,然后内部再执行,子查询需要外部传入值。而非相关子查询是内部查询独立于外部查询,仅需要执行一次并将结果作为外部查询条件使用。数据结构Plan中initPlan成员即为非相关子查询的链表指针。从上面的例子中可以知道子查询仅执行一次且独立于外部查询,所以他的执行计划中有InitPlan节点。其关系参考下图。
在 SQL 中,一个形如 SELECT-FROM-WHERE的语句称为一个查询快;当一个查询块存在于另一个查询块的 WHERE子句或 HAVING子句中时,称前一个查询块为子查询,称包含它的查询块为父查询或外部查询; 采用子查询的查询称为嵌套查询,嵌套查询可将多个简单的查询构造成一个复杂的查询,体现了 SQL 强大的查询能力; 嵌套查询在执行时由内向外处理语句,因为处理父查询时要用到子查询的查询结果,所以子查询的处理要先于它的父查询;
分组中也可以加入筛选条件WHERE,不过这里一定要注意的是,执行顺序为:WHERE过滤→分组→聚合函数。牢记!
以前总是追求新东西,发现基础才是最重要的,今年主要的目标是精通SQL查询和SQL性能优化。 本系列【T-SQL基础】主要是针对T-SQL基础的总结。 练习题: 1.写一条查询语句,返回Orders表中
子查询是出现在WHERE子句中的SELECT语句被称为子查询,子查询返回了一个集合。
一开始在学习的SQL语句的时候,没有感受到嵌套子查询的厉害,尤其是相关子查询。现在发现它的厉害之处,写下来记录!
就拿上面的的student 表与 SC表来说 我们把他们合到一起 可以比较的列在一起进行比较,如果值相等,那么这列的元素所在的 行就会合并
该文介绍了如何去除重复数据的方法,分为完全重复和部分重复。对于完全重复,使用distinct关键字去重;对于部分重复,使用子查询和row_number()分析函数。这些方法适用于不同的数据库系统,如Oracle、MySQL和Hive。
例如:select user_id from usertable where mobile_no in (select mobile_no from mobile where mobile_id = '10086');
子查询也称嵌套查询,是一种嵌套在其他SQL语句的WHERE子句中的查询。子查询用于为主查询返回其所需数据,或者对检索数据进行进一步的限制。语法如下:
在MySQL 8.0.17中,我们在TPC-H基准测试中观察到一个特定的查询。该查询的执行速度比MySQL 8.0.16快20%。这项改进的原因是实施了“ antijoin”优化。
大家好,我是架构君,一个会写代码吟诗的架构师。今天说一说mysql 优化面试题,希望能够帮助大家进步!!!
领取专属 10元无门槛券
手把手带您无忧上云