目录
前置建表
编辑 编辑
一、子查询
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);
数据如下
一、子查询
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从一开始就能够很好地支持连接,现在还以支持标准的SQL2连接语句而自夸,这种连接语句可以以多种高级方法来组合表记录。
1、连接分类
1.1、交叉连接 (CROSS JOIN)
连接的最简单类型是交叉连接,它是对涉及到的表相乘创建一个包含所有内容的产物,就是结果集两个表条数相乘。也称之为笛卡尔积,比如student表6条数据,score表6条数据,结果就是6x6=36条,
当然 CROSS JOIN 关键字可以省略,直接用逗号隔开两个表也行。
SELECT* FROM student CROSS JOIN score ;
SELECT* FROM student,score ; --这两条语句等效
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 ;
1.3、外连接(left join ,right join,full join)
根据连接的哪一方要被保留, SQL定义了左外连接和右外连接。在左外连接中,与WHERE子句相匹配的连接左部的表的所有记录都将出现在最后结果集中。在右外连接中,与WHERE子句相匹配的连接的右部的表的所有记录都将出现在最后结果集中。
这里之前有写过其对应区别,这里不在赘述,参考地址:http://t.csdn.cn/rXKTG
1.4、自连接(self join)
自连接的连接把-一个表与它自身进行连接,它通常用来取出表中彼此包含内连接的记录。比如一个菜单表,有一级菜单,二级菜单,则可以使用自连接查询对应数据。