MySQL5.7-连接查询子查询关键字顺序存储引擎

Posted 花_城

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL5.7-连接查询子查询关键字顺序存储引擎相关的知识,希望对你有一定的参考价值。

系列文章目录

一、连接查询

连接查询会将多个表的记录横向对接,形成一整张的临时表并返回。

图片中的演示,如果有连接条件,均为左表.班级id=右表.id

  • 内连接:

    返回两个表中满足连接条件的记录。

    SELECT 字段,…… FOR 左表 INNER JOIN 右表 ON 连接条件;
    

    多个表的连接查询:

    SELECT 字段,…… FOR 左表 INNER JOIN 右表  INNER JOIN 表 …… ON 连接条件;
    

    下面各种连接的多个表查询,也是上面这个格式。

  • 左连接:

    返回左表的所有记录和右表中满足连接条件的记录,不满足的,就用NULL补充。

    SELECT 字段,…… FOR 左表 LEFT JOIN 右表 ON 连接条件;
    

  • 右连接:

    返回右表的所有记录和左表中满足连接条件的记录,不满足的,就用NULL补充。

    SELECT 字段,…… FOR 左表 RIGHT JOIN 右表 ON 连接条件;
    

  • 全连接:

    返回左右表中所有的记录,不满足连接条件的,就用NULL补充。

    mysql不支持全连接,使用UNION连接左连接和右连接,可以实现全连接的效果。

    左连接语句 UNION 右连接语句;
    

  • 交叉连接(笛卡尔积):

    返回左表中的每一行与右表中每一行的组合。

    SELECT 字段,…… FOR 表名,……;
    

    为了避免箭头混乱,箭头只连接了右表的第一行,其他两行也是同样的道理:

二、子查询

  • 子查询的概念:

    将一个查询语句的结果当作另外一个查询语句的条件去使用。

  • 语法:

    SELECT 字段,…… FOR 表名 WHERE 表达式 操作符 (子查询)
    

    操作符可以是 IN、NOT IN、EXISTS、NOT EXISTS 等关键字。

    IN和NOT IN已经讲过,补充一下EXISTS、NOT EXISTS:

    EXISTS用于判断子查询的结果集是否为空,若子查询的结果集不为空,返回 TRUE(执行子查询外层语句),否则返回 FALSE(不执行子查询外层语句);若使用关键字 NOT,则返回的值正好相反。

  • 举例:

    使用子查询在students表和course表中查询学习Python课程的学生姓名:

    SELECT name FROM students WHERE course_id IN (SELECT id FROM tb_course WHERE course_name = 'Python');
    

三、关键字顺序

  • 关键字书写顺序:

    SELECT DISTINCT
    	字段名…… 
    FROM
    	表名 
    	连接方式 JOIN 表名 ON 连接条件 
    WHERE
    	过滤条件 
    GROUP BY
    	分组依据 
    HAVING
    	过滤条件 
    ORDER BY
    	排序依据 
    	LIMIT 数量;
    
  • 关键字执行顺序:

    FROM --> JOIN --> ON --> WHERE --> GROUP BY --> HAVING --> SELECT --> DISTINCT --> ORDER BY --> LIMIT

四、存储引擎

  • 常见存储引擎:

    • InnoDB:

      该引擎是MySQL5.5版本及之后的默认存储引擎。支持事务、外键安全性更高
      事务会在后面详细讲解。

      创建表会生成:表结构文件、表数据文件。

    • MyISAM:

      该引擎是MySQL5.5版本之前的默认存储引擎。速度比InnoDB更快,但不支持事务和外键,安全性低。

      创建表会生成:表结构文件、表数据文件、表索引文件。

    • MEMORY:

      也叫内存引擎,数据全部存放在内存中,速度快,但断电数据会丢失。主要用于临时存储

      创建表会生成:表结构文件。

    • BLACKHOLE:

      直译过来就是“黑洞”,它的特点如同其名,无论存入任何数据,都会立刻消失。使用select查询,结果永远为空。该引擎有一些高级特性,在特定的场所很有用,但暂时不做讲解。

      创建表会生成:表结构文件 。

  • 查看所有引擎:

    SHOW ENGINES;
    
  • 设置引擎:
    创建表的同时,设置引擎:

    CREATE TABLE 表名 (
        ……
        ) ENGINE = 存储引擎名称;
    

    临时修改,当前会话有效:

    SET default_storage_engine=存储引擎名称;
    

以上是关于MySQL5.7-连接查询子查询关键字顺序存储引擎的主要内容,如果未能解决你的问题,请参考以下文章

mysql5.7——innodb存储引擎总结

MySQL5.7性能优化系列——SQL语句优化——使用物化策略优化子查询

MySQL实战01の一条查询语句怎么执行的

mysql存储引擎MyISAM和InnoDB

MySQL5.7查询性能改进

MariaDB 连接查询与子查询