目录

  前置建表

编辑     编辑

一、子查询

1、什么是子查询

2、子查询的类型

 二、表关联查询

1、连接分类

1.1、交叉连接 (CROSS JOIN)

1.2、内连接(inner join)

1.3、外连接(left join ,right join,full join)

1.4、自连接(self join)


  前置建表

CREATE TABLE student (
  id int NOT NULL AUTO_INCREMENT COMMENT '主键',
  code varchar(255) NOT NULL COMMENT '学号',
  name varchar(255) DEFAULT NULL COMMENT '姓名',
  sex enum('男','女') DEFAULT NULL COMMENT '性别',
  age  int(0)  NULL COMMENT '年龄',
  PRIMARY KEY (`id`)
);

INSERT INTO `test`.`student`(`id`, `code`, `name`, `sex`, `age`) VALUES (1, '20220101', '张三', '男', 12);
INSERT INTO `test`.`student`(`id`, `code`, `name`, `sex`, `age`) VALUES (2, '202202', '李四', '男', 14);
INSERT INTO `test`.`student`(`id`, `code`, `name`, `sex`, `age`) VALUES (3, '202203', '王五', '女', 10);
INSERT INTO `test`.`student`(`id`, `code`, `name`, `sex`, `age`) VALUES (4, '202204', '张三飞', '男', 20);
INSERT INTO `test`.`student`(`id`, `code`, `name`, `sex`, `age`) VALUES (5, '202205', '小丽', '女', 10);
INSERT INTO `test`.`student`(`id`, `code`, `name`, `sex`, `age`) VALUES (6, '202206', '小明', '男', 11);


CREATE TABLE `score` (
  `id` int NOT NULL AUTO_INCREMENT,
  `studentcode` int DEFAULT NULL,
  `score` int DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

INSERT INTO `test`.`score`(`id`, `studentcode`, `score`) VALUES (1, 20220101, 70);
INSERT INTO `test`.`score`(`id`, `studentcode`, `score`) VALUES (2, 202202, 99);
INSERT INTO `test`.`score`(`id`, `studentcode`, `score`) VALUES (3, 202203, 100);
INSERT INTO `test`.`score`(`id`, `studentcode`, `score`) VALUES (6, 202206, 69);

数据如下

子查询关联其他表会走索引吗_子查询

     

子查询关联其他表会走索引吗_数据库_02

一、子查询

1、什么是子查询

        顾名思义,子查询就是一个SELECT查询是另一个查询的附属。MySQL4.1可以嵌套多个查询,在外面一层的查询中使用里面一层查询产生的结果集。这样就不是执行两个(或者多个)独立的查询,而是执行包含一个〔或者多个)子查询的单独查询。
        当遇到这样的多层查询时,MySQL从最内层的查询开始,然后从它开始向外向上移动到外层(主)查询。在这个过程中每个查询产生的结果集都被赋给包围它的父查询,接着这个父查询被执行,它的结果也被指定给它的父查询。
        除了结果集经常由包含一个或者多个值的一列组成外,子查询和常规SELECT查询的执行方式--样。子查询可以用在任何可以使用表达式的地方,它必须由父查询包围,而且,如同常规的SELECT查询,它必须包含一个字段列表(这是--个单列列表)、一个具有一个或者多个表名字的FROM子句以及可选的WHERE,HAVING和GROUP BY子句。

2、子查询的类型

1、在一个WHERE或者HAVING子句中使用。
2、与比较和逻辑操作符一起使用。
3、与IN成员测试--起使用。
4、与EXISTS布尔测试一起使用。
5、在一个FROM子句中使用。
6、与连接一起使用。
7、与UPDATE 与 DELETE查询--起使用。

如以下查询结果

SELECT * from student a where a.code in (SELECT b.studentcode from score b where b.score>60)  -- 与in一起使用 ,查询及格的学生信息

SELECT * from score a where a.studentcode in (SELECT b.code from student b where b.name='张三')  -- 与比较逻辑一起使用 ,查询姓名为“张三”学生的成绩

DELETE score a where a.studentcode in (SELECT b.code from student b where b.name='张三')  -- 与delete一起使用 ,删除姓名为“张三”学生的成绩

子查询关联其他表会走索引吗_mysql_03

 

子查询关联其他表会走索引吗_子查询_04

 二、表关联查询

         连接是把不同表的记录链到一起的最普遍的方法。MySQL从一开始就能够很好地支持连接,现在还以支持标准的SQL2连接语句而自夸,这种连接语句可以以多种高级方法来组合表记录。

1、连接分类

1.1、交叉连接 (CROSS JOIN)

        连接的最简单类型是交叉连接,它是对涉及到的表相乘创建一个包含所有内容的产物,就是结果集两个表条数相乘。也称之为笛卡尔积,比如student表6条数据,score表6条数据,结果就是6x6=36条,

 当然 CROSS JOIN 关键字可以省略,直接用逗号隔开两个表也行。

SELECT* FROM student CROSS JOIN score ;
SELECT* FROM student,score ; --这两条语句等效

子查询关联其他表会走索引吗_子查询关联其他表会走索引吗_05

1.2、内连接(inner join)

        内连接是最普通的连接类型,而且是最匀称的,因为它们要求构成连接的每一部分的每个表的匹配,不匹配的行将被排除在最后的结果集之外。也就相当于取交集,两个表同时有的数据才会查询出来。通过on 后边加关联条件进行关联查询,inner关键字可以省略。

SELECT* FROM student a INNER   JOIN score b on  a.code=b.studentcode ;

SELECT* FROM student a  JOIN score b on  a.code=b.studentcode ;

子查询关联其他表会走索引吗_子查询关联其他表会走索引吗_06

1.3、外连接(left join ,right join,full join)

         根据连接的哪一方要被保留, SQL定义了左外连接和右外连接。在左外连接中,与WHERE子句相匹配的连接左部的表的所有记录都将出现在最后结果集中。在右外连接中,与WHERE子句相匹配的连接的右部的表的所有记录都将出现在最后结果集中。

这里之前有写过其对应区别,这里不在赘述,参考地址:

1.4、自连接(self join)

 自连接的连接把-一个表与它自身进行连接,它通常用来取出表中彼此包含内连接的记录。比如一个菜单表,有一级菜单,二级菜单,则可以使用自连接查询对应数据。