那个mysql 子查询和连接查询 一般常用哪个 谁效率高些

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了那个mysql 子查询和连接查询 一般常用哪个 谁效率高些相关的知识,希望对你有一定的参考价值。

子查询优化策略

对于不同类型的子查询,优化器会选择不同的策略。

1. 对于 IN、=ANY 子查询,优化器有如下策略选择:

    semijoin

    Materialization

    exists

    2. 对于 NOT IN、<>ALL 子查询,优化器有如下策略选择:

    Materialization

    exists

    3. 对于 derived 派生表,优化器有如下策略选择:

    derived_merge,将派生表合并到外部查询中(5.7 引入 );

    将派生表物化为内部临时表,再用于外部查询。

    注意:update 和 delete 语句中子查询不能使用 semijoin、materialization 优化策略

参考技术A 1、SQL语言
SQL,英文全称:Structured Query Language,是可以对数据进行操作和定义等多种功能的语言。语言的特点,具有交互性,能为用户提供极大的便利,数据库管理系统应充分利用SQL语言提高计算机应用系统的工作质量与效率。
2、数据库分类
现在企业常用的数据库分为两大类:
关系型数据库:mysql、Oracle、DB2、SQLite、Teradata等。
非关系型数据库:Redis、MongoDB、Splunk、Hbase等。
3、子查询和连接查询
子查询和连接查询都涉及两个表或多个表,属于多表查询中的方式语句。
子查询是在一个子表查询的结果的基础上进行目的查询的,并且在子查询中会遍历整个子表。
连接查询是通过找到两个或多个表的连接点,通常是表中的共同的列实现连接查询的。查询效率更高,但是不易掌握。
通常认为,连接查询比子查询更快。但是,连接查询对SQL语句的书写要求也更高,而子查询更容易理解,也更容易编写。
4、Mysql子查询
在Mysql数据库中查询语句的结构:
SELECT 查询内容 FROM 查询范围 WHERE 查询条件 GROUP BY 分组条件 HAVING 查询条件 LIMIT 限制条件;
在Mysql中的查询条件中可以添加的子查询的位置:
FROM
WHERE
HAVING
LIMIT等
实例1:
题目1:查询“yezhi”的成绩。
mysql> SELECT score FROM grades WHERE name='yezhi';
题目2:查询比“yezhi”的分数高的学生的信息。
mysql> SELECT * FROM grades WHERE score > (SELECT score from grades WHERE name='yezhi');
实例2:
题目1:查询科目名称是:math或IT的学生id。
mysql> SELECT stu_id FROM courses WHERE course IN (math,IT);
题目2:查询科目id在题目1的学生的信息。
mysql> SELECT * FROM grades WHERE stu_id IN (SELECT DISTINCT stu_id FROM courses WHERE course IN (math,IT));
5、Mysql连接查询
Mysql的连接查询是通过JOIN关键词来实现的,不同的JOIN有:
INNER JOIN:如果表中存在至少一个匹配项,就返回行数据。
LEFT JOIN:即使右表没有匹配项,也会返回左表的所有行。
RIGHT JOIN:即使左表没有匹配项,也会返回右表的所有行。
:只要任意一张表有匹配项,就返回行数据。
在Mysql中的查询中连接查询的位置:
内连接:SELECT 查询内容 FROM 查询范围 (INNER) JOIN 条件;
外连接:SELECT 查询内容 FROM 查询范围 LEFT JOIN 条件;
外连接:SELECT 查询内容 FROM 查询范围 RIGHT JOIN 条件;
全连接:SELECT 查询内容 FROM 查询范围 条件;
实例1:
题目1:查询所有学生的sno、cname和degree列。
mysql> SELECT g.sno,c.cname,g.degree FROM course c INNER JOIN grade g ON c.cno=g.cno;
实例2:
题目2:查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩(没成绩的显示为null)。
mysql> SELECT s.sid,s.sname,sc.count,sc.sum FROM student s LEFT JOIN (SELECT sid id, count(sid) count, sum(score) sum FROM score GROUP BY sid) sc ON s.sid=sc.id;
实例3:
题目3:查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩。
mysql> SELECT s.sid,s.sname,sc.count,sc.sum FROM student s RIGHT JOIN (SELECT sid id, count(sid) count, sum(score) sum FROM score GROUP BY sid) sc ON s.sid=sc.id;
实例4:
题目:4:查询所有学生和所有老师的全部信息。
mysql> SELECT * FROM students SELECT * FROM teachers;
参考技术B 涉及的表比较少的,业务逻辑不是很麻烦的,用子查询应该快一些 涉及业务逻辑很复杂的,用多次查询会好一点

2020/6/20 mysql表连接和子查询

一、表连接

  连接语法的基本形式:

    from 表1 [连接方式] join 表2 [on 连接条件];

    连接的结果可以当作一个“表”来使用。常用有以下几种连接方式:1、交叉连接:

                                    实际上,交叉连接是将两个表不设定任何条件的连接结果。

                                    交叉连接通常也被叫做“笛卡尔积”——数学上可能比较多。

                                    语法:

                                      from  表1  [cross]  join  表2  ;      //可见交叉连接只是没有on条件而已。

                                      cross这个词也可以省略,还可以使用inner这个词代替

                                 2、内连接:

                                    语法:

                                      from  表1  [inner]  join  表2  on  表1.字段1=表2.字段2;

                                    含义:找出(过滤)在交叉连接的结果表中的表1的字段1的值等于表2的字段2的值的那些行。

                                 3、左外连接:

                                    形式:    

                                      from  表1  left  [outer]  join   表2   on  连接条件。

                                    说明:

                                      1,这里,left是关键字。

                                      2,连接条件跟内连接一样。

                                      3,含义是:内连接的结果基础上,加上左边表中所有不符合连接条件的数据,相应放右边表的字段的位置就自动补为“null”值。

                                   4、右[外]连接:

                                    右连接跟左连接恰恰相反:

                                    形式:    

                                      from  表1  right  [outer]  join   表2   on  连接条件。

                                    说明:

                                      1,这里,right是关键字。

                                      2,连接条件跟内连接一样。

                                      3,含义是:在内连接的结果基础上,加上右边表中所有不符合连接条件的数据,相应本应放左边表的字段的位置就自动补为“null”值。

二、子查询

  什么叫子查询:子查询就是把一个查询的结果当作另一个查询的条件。

  使用in子查询

    in的基本语法形式为:

      where  操作数  in (值1,值2, ....)

      则in子查询就是:

      where  操作数  in ( 列子查询 );

  含义:

    表示该操作数(字段值) 等于 该子查询的其中任意一个只,就算满足条件。

以上是关于那个mysql 子查询和连接查询 一般常用哪个 谁效率高些的主要内容,如果未能解决你的问题,请参考以下文章

mysql常用基础操作语法~~子查询命令行模式

MySQL笔记--- 连接查询;子查询;union;limit;

数据库(比如MYSQL) ,表连结查询与子查询哪个效率高些? 为啥

2020/6/20 mysql表连接和子查询

SQL学习笔记 ----Mysql数据库的条件查询

MySQL子查询概述