当前位置: 首页 > news >正文

【MySQL】联合查询(上)

目录

一. 什么是联合查询

二. 笛卡尔积

 三. 内连接查询

示例演示

 四. 外连接

 示例演示

五. 自连接

 自连接

示例演示


一. 什么是联合查询

在之前学习的增删改查中都是对于单表进行查询,但是因为在数据库设计时需要遵循范式的要求,数据就会被拆分到多张表中,那么此时需要查询一条完整的信息,就需要从多张表中获取数据最终返回给用户,此时就需要使用联合查询。

示例:查询学生信息和学生的班级信息

此时就需要将学生表和班级表建立关联,通过联合查询同时得到两张表中的信息。

二. 笛卡尔积

什么是笛卡尔积,笛卡尔积其实就是将关联的表进行数据全排列得出的结果集存放在一张临时表中。

查看笛卡尔积的语法:

select *from table1_name,table2_name;

上表就是学生表和班级表生成的笛卡尔积,只有圈起来的是有效数据,其他的都是数据全排列产生 的无效数据,那么我们联合查询其实就是在这个笛卡尔积中取出我们需要的有效数据啦。

联合查询表的个数越多,表中的数据量越⼤,临时表就会越⼤,所以根据实际情况确定联合查询表的个数,在我们的企业中一般不会联合查询超过3张表

 三. 内连接查询

内连接是通过比较连接条件中指定列的值,将不同表中的相互匹配的行组合在一起,生成一张包含多张表相关数据的结果集,只有满足条件的数据才会被包含在结果集中,不满足条件的的行将被排除。

内连接查询的语法:

方法1:
select 字段 from 表1 别名1,表2 别名2 where 连接条件 and 其他条件;
方法2:
select 字段 from 表1 别名1, join 表2 别名2 on 连接条件 where 其他条件

构建测试数据:

-- 重新创建学生表
create table student(id BIGINT PRIMARY KEY auto_increment,name varchar(20),sno varchar(20) comment'学号',age INT,gender char(1),class_id BIGINT
);-- 创建课程表
create table course(id BIGINT PRIMARY KEY auto_increment,name varchar(20)
);-- 创建成绩表
create table score(sco FLOAT,student_id BIGINT,course_id BIGINT
);-- 创建班级表
CREATE table class(id BIGINT PRIMARY KEY auto_increment,name varchar(20)
);-- 添加班级数据
insert into class values(null,'软件班'),(null,'机械班'),(null,'电子班');-- 添加学生表数据
insert into student (name, sno, age, gender, class_id) values
('唐三藏', '100001', 18,'男',  1),
('孙悟空', '100002', 18, '女',  1),
('猪悟能', '100003', 18, '男',  1),
('沙悟净', '100004', 18, '男',  1),
('宋江', '200001', 18, '女',  2),
('武松', '200002', 18, '男',  2),
('李逹', '200003', 18, '男',  2),
('不想毕业', '200004', 18,'女' , 2);-- 添加课程数据
insert into course (name) values ('Java'), ('C++'), ('MySQL'), ('操作系统'), ('计
算机⽹络'), ('数据结构');-- 添加成绩表数据insert into score (sco, student_id, course_id) values
(70.5, 1, 1),(98.5, 1, 3),(33, 1, 5),(98, 1, 6),
(60, 2, 1),(59.5, 2, 5),
(33, 3, 1),(68, 3, 3),(99, 3, 5),
(67, 4, 1),(23, 4, 3),(56, 4, 5),(72, 4, 6),
(81, 5, 1),(37, 5, 5),
(56, 6, 2),(43, 6, 4),(79, 6, 6),
(80, 7, 2),(92, 7, 6);

查看构建信息:

mysql> select *from student;
+----+--------------+--------+------+--------+----------+
| id | name         | sno    | age  | gender | class_id |
+----+--------------+--------+------+--------+----------+
|  1 | 唐三藏       | 100001 |   18 | 男     |        1 |
|  2 | 孙悟空       | 100002 |   18 | 女     |        1 |
|  3 | 猪悟能       | 100003 |   18 | 男     |        1 |
|  4 | 沙悟净       | 100004 |   18 | 男     |        1 |
|  5 | 宋江         | 200001 |   18 | 女     |        2 |
|  6 | 武松         | 200002 |   18 | 男     |        2 |
|  7 | 李逹         | 200003 |   18 | 男     |        2 |
|  8 | 不想毕业     | 200004 |   18 | 女     |        2 |
+----+--------------+--------+------+--------+----------+
8 rows in set (0.00 sec)mysql> select *from class;
+----+-----------+
| id | name      |
+----+-----------+
|  1 | 软件班    |
|  2 | 机械班    |
|  3 | 电子班    |
+----+-----------+
3 rows in set (0.00 sec)mysql> select *from course;
+----+-----------------+
| id | name            |
+----+-----------------+
|  1 | Java            |
|  2 | C++             |
|  3 | MySQL           |
|  4 | 操作系统        |
|  5 | 计算机网络      |
|  6 | 数据结构        |
+----+-----------------+
6 rows in set (0.00 sec)mysql> select *from score;
+------+------------+-----------+
| sco  | student_id | course_id |
+------+------------+-----------+
| 70.5 |          1 |         1 |
| 98.5 |          1 |         3 |
|   33 |          1 |         5 |
|   98 |          1 |         6 |
|   60 |          2 |         1 |
| 59.5 |          2 |         5 |
|   33 |          3 |         1 |
|   68 |          3 |         3 |
|   99 |          3 |         5 |
|   67 |          4 |         1 |
|   23 |          4 |         3 |
|   56 |          4 |         5 |
|   72 |          4 |         6 |
|   81 |          5 |         1 |
|   37 |          5 |         5 |
|   56 |          6 |         2 |
|   43 |          6 |         4 |
|   79 |          6 |         6 |
|   80 |          7 |         2 |
|   92 |          7 |         6 |
+------+------------+-----------+
20 rows in set (0.00 sec)

示例演示

1. 查看学生名为宋江的学生信息和班级信息:

-- 首先查看学生表和班级表的笛卡尔积
mysql> select *from student,class;
+----+--------------+--------+------+--------+----------+----+-----------+
| id | name         | sno    | age  | gender | class_id | id | name      |
+----+--------------+--------+------+--------+----------+----+-----------+
|  1 | 唐三藏       | 100001 |   18 | 男     |        1 |  3 | 电子班    |
|  1 | 唐三藏       | 100001 |   18 | 男     |        1 |  2 | 机械班    |
|  1 | 唐三藏       | 100001 |   18 | 男     |        1 |  1 | 软件班    |
|  2 | 孙悟空       | 100002 |   18 | 女     |        1 |  3 | 电子班    |
|  2 | 孙悟空       | 100002 |   18 | 女     |        1 |  2 | 机械班    |
|  2 | 孙悟空       | 100002 |   18 | 女     |        1 |  1 | 软件班    |
|  3 | 猪悟能       | 100003 |   18 | 男     |        1 |  3 | 电子班    |
|  3 | 猪悟能       | 100003 |   18 | 男     |        1 |  2 | 机械班    |
|  3 | 猪悟能       | 100003 |   18 | 男     |        1 |  1 | 软件班    |
|  4 | 沙悟净       | 100004 |   18 | 男     |        1 |  3 | 电子班    |
|  4 | 沙悟净       | 100004 |   18 | 男     |        1 |  2 | 机械班    |
|  4 | 沙悟净       | 100004 |   18 | 男     |        1 |  1 | 软件班    |
|  5 | 宋江         | 200001 |   18 | 女     |        2 |  3 | 电子班    |
|  5 | 宋江         | 200001 |   18 | 女     |        2 |  2 | 机械班    |
|  5 | 宋江         | 200001 |   18 | 女     |        2 |  1 | 软件班    |
|  6 | 武松         | 200002 |   18 | 男     |        2 |  3 | 电子班    |
|  6 | 武松         | 200002 |   18 | 男     |        2 |  2 | 机械班    |
|  6 | 武松         | 200002 |   18 | 男     |        2 |  1 | 软件班    |
|  7 | 李逹         | 200003 |   18 | 男     |        2 |  3 | 电子班    |
|  7 | 李逹         | 200003 |   18 | 男     |        2 |  2 | 机械班    |
|  7 | 李逹         | 200003 |   18 | 男     |        2 |  1 | 软件班    |
|  8 | 不想毕业     | 200004 |   18 | 女     |        2 |  3 | 电子班    |
|  8 | 不想毕业     | 200004 |   18 | 女     |        2 |  2 | 机械班    |
|  8 | 不想毕业     | 200004 |   18 | 女     |        2 |  1 | 软件班    |
+----+--------------+--------+------+--------+----------+----+-----------+
24 rows in set (0.00 sec)-- 再从笛卡尔积中筛选出有效数据
mysql> select *from student stu,class c where stu.class_id=c.id;
+----+--------------+--------+------+--------+----------+----+-----------+
| id | name         | sno    | age  | gender | class_id | id | name      |
+----+--------------+--------+------+--------+----------+----+-----------+
|  1 | 唐三藏       | 100001 |   18 | 男     |        1 |  1 | 软件班    |
|  2 | 孙悟空       | 100002 |   18 | 女     |        1 |  1 | 软件班    |
|  3 | 猪悟能       | 100003 |   18 | 男     |        1 |  1 | 软件班    |
|  4 | 沙悟净       | 100004 |   18 | 男     |        1 |  1 | 软件班    |
|  5 | 宋江         | 200001 |   18 | 女     |        2 |  2 | 机械班    |
|  6 | 武松         | 200002 |   18 | 男     |        2 |  2 | 机械班    |
|  7 | 李逹         | 200003 |   18 | 男     |        2 |  2 | 机械班    |
|  8 | 不想毕业     | 200004 |   18 | 女     |        2 |  2 | 机械班    |
+----+--------------+--------+------+--------+----------+----+-----------+
8 rows in set (0.00 sec)-- 最后从这些有效数据中得出答案
mysql> select *from student stu,class c where stu.class_id=c.id and stu.name='宋江';
+----+--------+--------+------+--------+----------+----+-----------+
| id | name   | sno    | age  | gender | class_id | id | name      |
+----+--------+--------+------+--------+----------+----+-----------+
|  5 | 宋江   | 200001 |   18 | 女     |        2 |  2 | 机械班    |
+----+--------+--------+------+--------+----------+----+-----------+
1 row in set (0.00 sec)
(此时的class_id和id是不需要的,我们则不需要进行输出)-- 输出最后答案
mysql> select stu.name,stu.sno,stu.age,stu.gender,c.name from student stu,class c where stu.class_id=c.id and stu.name='宋江';
+--------+--------+------+--------+-----------+
| name   | sno    | age  | gender | name      |
+--------+--------+------+--------+-----------+
| 宋江   | 200001 |   18 | 女     | 机械班    |
+--------+--------+------+--------+-----------+
1 row in set (0.00 sec)

代码分析:

 2. 查询所有同学的总成绩和同学的个人信息

-- 先查看两张表的笛卡尔积
mysql> select *from student stu,score;
(数据量大就不放了)-- 取出笛卡尔积中的有效数据
mysql> select *from student stu ,score sc where stu.id=sc.student_id;
+----+-----------+--------+------+--------+----------+------+------------+-----------+
| id | name      | sno    | age  | gender | class_id | sco  | student_id | course_id |
+----+-----------+--------+------+--------+----------+------+------------+-----------+
|  1 | 唐三藏    | 100001 |   18 | 男     |        1 | 70.5 |          1 |         1 |
|  1 | 唐三藏    | 100001 |   18 | 男     |        1 | 98.5 |          1 |         3 |
|  1 | 唐三藏    | 100001 |   18 | 男     |        1 |   33 |          1 |         5 |
|  1 | 唐三藏    | 100001 |   18 | 男     |        1 |   98 |          1 |         6 |
|  2 | 孙悟空    | 100002 |   18 | 女     |        1 |   60 |          2 |         1 |
|  2 | 孙悟空    | 100002 |   18 | 女     |        1 | 59.5 |          2 |         5 |
|  3 | 猪悟能    | 100003 |   18 | 男     |        1 |   33 |          3 |         1 |
|  3 | 猪悟能    | 100003 |   18 | 男     |        1 |   68 |          3 |         3 |
|  3 | 猪悟能    | 100003 |   18 | 男     |        1 |   99 |          3 |         5 |
|  4 | 沙悟净    | 100004 |   18 | 男     |        1 |   67 |          4 |         1 |
|  4 | 沙悟净    | 100004 |   18 | 男     |        1 |   23 |          4 |         3 |
|  4 | 沙悟净    | 100004 |   18 | 男     |        1 |   56 |          4 |         5 |
|  4 | 沙悟净    | 100004 |   18 | 男     |        1 |   72 |          4 |         6 |
|  5 | 宋江      | 200001 |   18 | 女     |        2 |   81 |          5 |         1 |
|  5 | 宋江      | 200001 |   18 | 女     |        2 |   37 |          5 |         5 |
|  6 | 武松      | 200002 |   18 | 男     |        2 |   56 |          6 |         2 |
|  6 | 武松      | 200002 |   18 | 男     |        2 |   43 |          6 |         4 |
|  6 | 武松      | 200002 |   18 | 男     |        2 |   79 |          6 |         6 |
|  7 | 李逹      | 200003 |   18 | 男     |        2 |   80 |          7 |         2 |
|  7 | 李逹      | 200003 |   18 | 男     |        2 |   92 |          7 |         6 |
+----+-----------+--------+------+--------+----------+------+------------+-----------+
20 rows in set (0.00 sec)
(此时就能找到每个同学对应的成绩)-- 那么要查看每个同学的总成绩,肯定需要对每个同学进行分组,再计算每个同学的总成绩
mysql> select stu.name,count(*)from student stu ,score sc where stu.id=sc.student_id group by (stu.id);
+-----------+----------+
| name      | count(*) |
+-----------+----------+
| 唐三藏    |        4 |
| 孙悟空    |        2 |
| 猪悟能    |        3 |
| 沙悟净    |        4 |
| 宋江      |        2 |
| 武松      |        3 |
| 李逹      |        2 |
+-----------+----------+
7 rows in set (0.00 sec)
(此时就得出了每个同学的有效成绩的数量)-- 那么现在只需要将这些分组好的对应的每个同学的成绩进行相加就好了
mysql> select stu.name,sum(sc.sco)as '总分' from student stu ,score sc where stu.id=sc.student_id group by (stu.id);
+-----------+--------+
| name      | 总分   |
+-----------+--------+
| 唐三藏    |    300 |
| 孙悟空    |  119.5 |
| 猪悟能    |    200 |
| 沙悟净    |    218 |
| 宋江      |    118 |
| 武松      |    178 |
| 李逹      |    172 |
+-----------+--------+
7 rows in set (0.00 sec)

代码分析:

 3. 查询所有同学每门课程的成绩和个人信息

-- 先查找学生表,课程表,成绩表的笛卡尔积
mysql> select *from student,course,score;
(这里数据量非常大,就不放了960条数据)
960 rows in set (0.00 sec)-- 再从笛卡尔积中取出有效数据
mysql> select *from student stu,course c,score sc where stu.id=sc.student_id and c.id=sc.course_id;
+----+-----------+--------+------+--------+----------+----+-----------------+------+------------+-----------+
| id | name      | sno    | age  | gender | class_id | id | name            | sco  | student_id | course_id |
+----+-----------+--------+------+--------+----------+----+-----------------+------+------------+-----------+
|  1 | 唐三藏    | 100001 |   18 | 男     |        1 |  1 | Java            | 70.5 |          1 |         1 |
|  1 | 唐三藏    | 100001 |   18 | 男     |        1 |  3 | MySQL           | 98.5 |          1 |         3 |
|  1 | 唐三藏    | 100001 |   18 | 男     |        1 |  5 | 计算机网络      |   33 |          1 |         5 |
|  1 | 唐三藏    | 100001 |   18 | 男     |        1 |  6 | 数据结构        |   98 |          1 |         6 |
|  2 | 孙悟空    | 100002 |   18 | 女     |        1 |  1 | Java            |   60 |          2 |         1 |
|  2 | 孙悟空    | 100002 |   18 | 女     |        1 |  5 | 计算机网络      | 59.5 |          2 |         5 |
|  3 | 猪悟能    | 100003 |   18 | 男     |        1 |  1 | Java            |   33 |          3 |         1 |
|  3 | 猪悟能    | 100003 |   18 | 男     |        1 |  3 | MySQL           |   68 |          3 |         3 |
|  3 | 猪悟能    | 100003 |   18 | 男     |        1 |  5 | 计算机网络      |   99 |          3 |         5 |
|  4 | 沙悟净    | 100004 |   18 | 男     |        1 |  1 | Java            |   67 |          4 |         1 |
|  4 | 沙悟净    | 100004 |   18 | 男     |        1 |  3 | MySQL           |   23 |          4 |         3 |
|  4 | 沙悟净    | 100004 |   18 | 男     |        1 |  5 | 计算机网络      |   56 |          4 |         5 |
|  4 | 沙悟净    | 100004 |   18 | 男     |        1 |  6 | 数据结构        |   72 |          4 |         6 |
|  5 | 宋江      | 200001 |   18 | 女     |        2 |  1 | Java            |   81 |          5 |         1 |
|  5 | 宋江      | 200001 |   18 | 女     |        2 |  5 | 计算机网络      |   37 |          5 |         5 |
|  6 | 武松      | 200002 |   18 | 男     |        2 |  2 | C++             |   56 |          6 |         2 |
|  6 | 武松      | 200002 |   18 | 男     |        2 |  4 | 操作系统        |   43 |          6 |         4 |
|  6 | 武松      | 200002 |   18 | 男     |        2 |  6 | 数据结构        |   79 |          6 |         6 |
|  7 | 李逹      | 200003 |   18 | 男     |        2 |  2 | C++             |   80 |          7 |         2 |
|  7 | 李逹      | 200003 |   18 | 男     |        2 |  6 | 数据结构        |   92 |          7 |         6 |
+----+-----------+--------+------+--------+----------+----+-----------------+------+------------+-----------+
20 rows in set (0.00 sec)-- 再将查询结果进行精简一下,得到我们需要的数据
mysql> select stu.name,stu.sno,stu.age,stu.gender,c.name,sc.sco from student stu,course c,score sc where stu.id=sc.student_id and sc.course_id=c.id;
+-----------+--------+------+--------+-----------------+------+
| name      | sno    | age  | gender | name            | sco  |
+-----------+--------+------+--------+-----------------+------+
| 唐三藏    | 100001 |   18 | 男     | Java            | 70.5 |
| 唐三藏    | 100001 |   18 | 男     | MySQL           | 98.5 |
| 唐三藏    | 100001 |   18 | 男     | 计算机网络      |   33 |
| 唐三藏    | 100001 |   18 | 男     | 数据结构        |   98 |
| 孙悟空    | 100002 |   18 | 女     | Java            |   60 |
| 孙悟空    | 100002 |   18 | 女     | 计算机网络      | 59.5 |
| 猪悟能    | 100003 |   18 | 男     | Java            |   33 |
| 猪悟能    | 100003 |   18 | 男     | MySQL           |   68 |
| 猪悟能    | 100003 |   18 | 男     | 计算机网络      |   99 |
| 沙悟净    | 100004 |   18 | 男     | Java            |   67 |
| 沙悟净    | 100004 |   18 | 男     | MySQL           |   23 |
| 沙悟净    | 100004 |   18 | 男     | 计算机网络      |   56 |
| 沙悟净    | 100004 |   18 | 男     | 数据结构        |   72 |
| 宋江      | 200001 |   18 | 女     | Java            |   81 |
| 宋江      | 200001 |   18 | 女     | 计算机网络      |   37 |
| 武松      | 200002 |   18 | 男     | C++             |   56 |
| 武松      | 200002 |   18 | 男     | 操作系统        |   43 |
| 武松      | 200002 |   18 | 男     | 数据结构        |   79 |
| 李逹      | 200003 |   18 | 男     | C++             |   80 |
| 李逹      | 200003 |   18 | 男     | 数据结构        |   92 |
+-----------+--------+------+--------+-----------------+------+
20 rows in set (0.00 sec)

代码分析:

 四. 外连接

外连接分为左外连接、右外连接和全外连接三种类型,但是我们的MySQL不支持全外连接,所以这里我们就将一下左连接和右连接。

  • 左外连接:返回左表中所有记录和右表中与左表匹配的记录,如果右表中没有匹配的记录,那么结果集中的对应字段就会显示为NULL
  • 右外连接:与左外连接相反,返回右表的所有记录和左表中匹配的记录。如果左表中没有匹配的记录,则结果集中对应字段会显⽰为NULL。

 左外连接和右外连接的语法:

-- 左外连接
select 字段 from 表名1 left join 表名2 on 连接条件-- 右外连接
select 字段 from 表名1 right join 表名2 on 连接条件

 示例演示

1.查询没有参加考试的学生:


-- 通过左外连接,将两张表中的有效数据连接起来
mysql> select *from student stu left join score sc on sc.student_id=stu.id;
+----+--------------+--------+------+--------+----------+------+------------+-----------+
| id | name         | sno    | age  | gender | class_id | sco  | student_id | course_id |
+----+--------------+--------+------+--------+----------+------+------------+-----------+
|  1 | 唐三藏       | 100001 |   18 | 男     |        1 |   98 |          1 |         6 |
|  1 | 唐三藏       | 100001 |   18 | 男     |        1 |   33 |          1 |         5 |
|  1 | 唐三藏       | 100001 |   18 | 男     |        1 | 98.5 |          1 |         3 |
|  1 | 唐三藏       | 100001 |   18 | 男     |        1 | 70.5 |          1 |         1 |
|  2 | 孙悟空       | 100002 |   18 | 女     |        1 | 59.5 |          2 |         5 |
|  2 | 孙悟空       | 100002 |   18 | 女     |        1 |   60 |          2 |         1 |
|  3 | 猪悟能       | 100003 |   18 | 男     |        1 |   99 |          3 |         5 |
|  3 | 猪悟能       | 100003 |   18 | 男     |        1 |   68 |          3 |         3 |
|  3 | 猪悟能       | 100003 |   18 | 男     |        1 |   33 |          3 |         1 |
|  4 | 沙悟净       | 100004 |   18 | 男     |        1 |   72 |          4 |         6 |
|  4 | 沙悟净       | 100004 |   18 | 男     |        1 |   56 |          4 |         5 |
|  4 | 沙悟净       | 100004 |   18 | 男     |        1 |   23 |          4 |         3 |
|  4 | 沙悟净       | 100004 |   18 | 男     |        1 |   67 |          4 |         1 |
|  5 | 宋江         | 200001 |   18 | 女     |        2 |   37 |          5 |         5 |
|  5 | 宋江         | 200001 |   18 | 女     |        2 |   81 |          5 |         1 |
|  6 | 武松         | 200002 |   18 | 男     |        2 |   79 |          6 |         6 |
|  6 | 武松         | 200002 |   18 | 男     |        2 |   43 |          6 |         4 |
|  6 | 武松         | 200002 |   18 | 男     |        2 |   56 |          6 |         2 |
|  7 | 李逹         | 200003 |   18 | 男     |        2 |   92 |          7 |         6 |
|  7 | 李逹         | 200003 |   18 | 男     |        2 |   80 |          7 |         2 |
|  8 | 不想毕业     | 200004 |   18 | 女     |        2 | NULL |       NULL |      NULL |
+----+--------------+--------+------+--------+----------+------+------------+-----------+
21 rows in set (0.00 sec)
(那么此时可以看到,不想毕业这个同学的成绩为NULL,那么就是我们要找的人)-- 在有效数据中查找没参加考试的同学
mysql> select *from student stu left join score sc on sc.student_id=stu.id where sc.sco is null;
+----+--------------+--------+------+--------+----------+------+------------+-----------+
| id | name         | sno    | age  | gender | class_id | sco  | student_id | course_id |
+----+--------------+--------+------+--------+----------+------+------------+-----------+
|  8 | 不想毕业     | 200004 |   18 | 女     |        2 | NULL |       NULL |      NULL |
+----+--------------+--------+------+--------+----------+------+------------+-----------+
1 row in set (0.00 sec)

代码分析:

2. 查询没有学生的班级

-- 先通过右外连接的方式,将两种表的有效数据进行连接
mysql> select *from student stu right join class c on stu.class_id=c.id;
+------+--------------+--------+------+--------+----------+----+-----------+
| id   | name         | sno    | age  | gender | class_id | id | name      |
+------+--------------+--------+------+--------+----------+----+-----------+
|    4 | 沙悟净       | 100004 |   18 | 男     |        1 |  1 | 软件班    |
|    3 | 猪悟能       | 100003 |   18 | 男     |        1 |  1 | 软件班    |
|    2 | 孙悟空       | 100002 |   18 | 女     |        1 |  1 | 软件班    |
|    1 | 唐三藏       | 100001 |   18 | 男     |        1 |  1 | 软件班    |
|    8 | 不想毕业     | 200004 |   18 | 女     |        2 |  2 | 机械班    |
|    7 | 李逹         | 200003 |   18 | 男     |        2 |  2 | 机械班    |
|    6 | 武松         | 200002 |   18 | 男     |        2 |  2 | 机械班    |
|    5 | 宋江         | 200001 |   18 | 女     |        2 |  2 | 机械班    |
| NULL | NULL         | NULL   | NULL | NULL   |     NULL |  3 | 电子班    |
+------+--------------+--------+------+--------+----------+----+-----------+
9 rows in set (0.00 sec)
(此时可以看见电子版的学生信息都为空,那么电子班就是没有学生的班级咯)-- 取出学生信息为空的班级
mysql> select *from student stu right join class c on stu.class_id=c.id where stu.id is null;
+------+------+------+------+--------+----------+----+-----------+
| id   | name | sno  | age  | gender | class_id | id | name      |
+------+------+------+------+--------+----------+----+-----------+
| NULL | NULL | NULL | NULL | NULL   |     NULL |  3 | 电子班    |
+------+------+------+------+--------+----------+----+-----------+
1 row in set (0.00 sec)

代码分析:

五. 自连接

大家可以想一下,如果我想要让比较学生每科成绩的分数,我可以跨行进行比较吗?这显然是不行的,这个时候就要用到我们的自连接(实现行与行之间的比较)

mysql> select *from student,score where student.id=score.student_id;
+----+-----------+--------+------+--------+----------+------+------------+-----------+
| id | name      | sno    | age  | gender | class_id | sco  | student_id | course_id |
+----+-----------+--------+------+--------+----------+------+------------+-----------+
|  1 | 唐三藏    | 100001 |   18 | 男     |        1 | 70.5 |          1 |         1 |
|  1 | 唐三藏    | 100001 |   18 | 男     |        1 | 98.5 |          1 |         3 |
|  1 | 唐三藏    | 100001 |   18 | 男     |        1 |   33 |          1 |         5 |
|  1 | 唐三藏    | 100001 |   18 | 男     |        1 |   98 |          1 |         6 |
|  2 | 孙悟空    | 100002 |   18 | 女     |        1 |   60 |          2 |         1 |
|  2 | 孙悟空    | 100002 |   18 | 女     |        1 | 59.5 |          2 |         5 |
|  3 | 猪悟能    | 100003 |   18 | 男     |        1 |   33 |          3 |         1 |
|  3 | 猪悟能    | 100003 |   18 | 男     |        1 |   68 |          3 |         3 |
|  3 | 猪悟能    | 100003 |   18 | 男     |        1 |   99 |          3 |         5 |
|  4 | 沙悟净    | 100004 |   18 | 男     |        1 |   67 |          4 |         1 |
|  4 | 沙悟净    | 100004 |   18 | 男     |        1 |   23 |          4 |         3 |
|  4 | 沙悟净    | 100004 |   18 | 男     |        1 |   56 |          4 |         5 |
|  4 | 沙悟净    | 100004 |   18 | 男     |        1 |   72 |          4 |         6 |
|  5 | 宋江      | 200001 |   18 | 女     |        2 |   81 |          5 |         1 |
|  5 | 宋江      | 200001 |   18 | 女     |        2 |   37 |          5 |         5 |
|  6 | 武松      | 200002 |   18 | 男     |        2 |   56 |          6 |         2 |
|  6 | 武松      | 200002 |   18 | 男     |        2 |   43 |          6 |         4 |
|  6 | 武松      | 200002 |   18 | 男     |        2 |   79 |          6 |         6 |
|  7 | 李逹      | 200003 |   18 | 男     |        2 |   80 |          7 |         2 |
|  7 | 李逹      | 200003 |   18 | 男     |        2 |   92 |          7 |         6 |
+----+-----------+--------+------+--------+----------+------+------------+-----------+
20 rows in set (0.00 sec)

 自连接

⾃连接是⾃⼰与⾃⼰取笛卡尔积,可以把⾏转化成列,在查询的时候可以使⽤where条件对结果进⾏过滤,或者说实现⾏与⾏之间的⽐较。在做表连接时为表起不同的别名

 查看自己与自己取笛卡尔积:

通过这样的方式就可以将行与行之间数据转换成列与列之间的数据,那么就可以进行比较了~

示例演示

 1.找出所有“MySQL”成绩比java成绩高的学生信息和成绩信息

-- 将成绩表与成绩表进行自连接后,对应的数据进行连接,进行比较
mysql> select *from student stu,score s1,score s2 where stu.id=s1.student_id and s1.student_id=s2.student_id and s1.course_id=3 and s2.course_id=1  and s1.sco>s2.sco;
+----+-----------+--------+------+--------+----------+------+------------+-----------+------+------------+-----------+
| id | name      | sno    | age  | gender | class_id | sco  | student_id | course_id | sco  | student_id | course_id |
+----+-----------+--------+------+--------+----------+------+------------+-----------+------+------------+-----------+
|  1 | 唐三藏    | 100001 |   18 | 男     |        1 | 98.5 |          1 |         3 | 70.5 |          1 |         1 |
|  3 | 猪悟能    | 100003 |   18 | 男     |        1 |   68 |          3 |         3 |   33 |          3 |         1 |
+----+-----------+--------+------+--------+----------+------+------------+-----------+------+------------+-----------+
2 rows in set (0.00 sec)mysql> select  stu.name,stu.sno,stu.gender,s1.sco as 'MySQL成绩',s2.sco as 'Java成绩' from student stu,score s1,score s2 where stu.id=s1.student_id and s1.student_id=s2.student_id and s1.course_id=3 and s2.course_id=1 and s1.sco>s2.sco;
+-----------+--------+--------+-------------+------------+
| name      | sno    | gender | MySQL成绩   | Java成绩   |
+-----------+--------+--------+-------------+------------+
| 唐三藏    | 100001 | 男     |        98.5 |       70.5 |
| 猪悟能    | 100003 | 男     |          68 |         33 |
+-----------+--------+--------+-------------+------------+
2 rows in set (0.00 sec)

代码分析:

 2. 找出所有MySQL成绩比Java成绩高的学生信息和班级信息和成绩信息

此时就找出了成绩表1中为MySQL成绩和成绩表2中为Java成绩的对应的学生信息和班级信息和成绩信息,此时只需要对当前结果集中的MySQL成绩和Java成绩进行比较就能得出最终答案:


相关文章:

【MySQL】联合查询(上)

目录 一. 什么是联合查询 二. 笛卡尔积 三. 内连接查询 示例演示 四. 外连接 示例演示 五. 自连接 自连接 示例演示 一. 什么是联合查询 在之前学习的增删改查中都是对于单表进行查询,但是因为在数据库设计时需要遵循范式的要求,数据就会被拆分到多…...

Model 是 Agent 的大脑(以camel为例)

Model 是 Agent 的大脑,负责处理所有输入和输出数据。通过有效调用不同的模型,智能体可以根据任务需求执行文本分析、图像识别和复杂推理等操作。CAMEL 提供了一系列标准和可定制的接口,并与各种组件无缝集成,以赋能大语言模型&am…...

Linux条件变量

在 Linux 系统中,pthread_cond_init() 函数和条件变量(Condition Variable)是多线程编程中用于线程同步的核心机制。它们通过协调线程间的等待与通知逻辑,解决共享资源的竞争问题。以下从功能、工作机制、使用场景和注意事项等方面…...

k8s-NetworkPolicy

在 Kubernetes 中,NetworkPolicy 是一种资源对象,用于定义 Pod 之间的网络通信策略。它允许你控制哪些 Pod 可以相互通信,以及如何通信。通过使用 NetworkPolicy,可以实现更细粒度的网络访问控制,增强集群的安全性。 1…...

什么是“架构孤岛”?如何识别与整合?为什么现代企业在追求敏捷开发的同时,反而更容易陷入架构孤岛陷阱?

在现代信息技术飞速发展的时代,系统架构日益复杂,组织在构建与演进其信息系统时,面临着前所未有的挑战。然而,就在不断追求敏捷性、可扩展性与数字化创新的过程中,一个被广泛忽视却日益严峻的问题悄然浮现——“架构孤岛”。它们像岛屿一样,彼此孤立,通信不畅,数据难以…...

nfs存储IO等待,导致k8s业务系统卡慢问题处理

注:服务器配置:64C,128G,麒麟v10系统,系统磁盘使用空间(5T)均低于50%,存储磁盘iops约为800左右 发现业务系统卡慢,使用top 命令查看.系统负载较高长期保持在60以上,发现wa值的指标参数长期高于15,返现CPU用于写入磁盘IO等待的时间较高,系统的磁盘I/O压力较大. 配合开发查看日志…...

如何使用两块硬盘作为 Ubuntu24 的系统盘,实现坏掉一块不影响系统运行。

最近我想使用Ubuntu组一个NAS系统,想实现系统盘冗余,各位大佬可以给点建议吗。 Deep Seek 为了实现两块硬盘作为 Ubuntu 24 系统盘的冗余配置(RAID 1),确保一块硬盘损坏时系统仍可运行,以下是详细步骤&am…...

电子电气架构 --- 细化造车阶段流程

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 钝感力的“钝”,不是木讷、迟钝,而是直面困境的韧劲和耐力,是面对外界噪音的通透淡然。 生活中有两种人,一种人格外在意别人的眼光;另一种人无论…...

物联网之使用Vertx实现UDP最佳实践【响应式】

小伙伴们,你们好呀,我是老寇,跟我一起学习使用Vertx实现UDP-Server 实现UDP【响应式】 Vertx-Core地址 注意 UDP是无连接的传输,这意味着您与远程客户端没有建立持续的连接。 所以,您发送和接收的数据包都要包含有…...

代码管理平台Gitlab如何通过快解析实现远程访问?

一、Gitlab功能介绍 Gitlab是被广泛使用的基于git的开源代码管理平台,用于管理、存储开发人员代码,同时可以协同开发 二、外网试用Gitlab遇到的问题 运维人员将Gitlab服务器部署在总部机房,而分公司开发人员和出差运维人员就无法访问Gitlab…...

七彩喜防摔马甲:科技守护银发安全的“隐形铠甲”

随着现代人生活方式的多样化,尤其是在户外运动和骑行等活动中,安全问题日益受到重视。 七彩喜防摔马甲,作为一款兼具防护性与舒适性的智能穿戴设备,正在改变人们对传统防护装备的认知。 创新设计 防摔马甲的设计灵感来源于人体…...

IDEA推送到gitlab,jenkins识别,然后自动发布到需要的主机

实验环境 192.168.8.100 gitlab 192.168.8.200 jenkins mvn 192.168.8.10 测试主机 默认都关闭了防火墙和setenforce 实验要求 实验在IDEA上面推送代码然后gitlab推送给jenkins,然后mvn构建,最后发布到测试主机上面 实验开始 在tomcat上安装manve…...

五、【API 开发篇(下)】:使用 Django REST Framework构建测试用例模型的 CRUD API

【API 开发篇】:使用 Django REST Framework构建测试用例模型的 CRUD API 前言第一步:增强 Serializers (序列化器) - 处理关联和选择项第二步:创建 TestCaseViewSet (视图集) - 支持过滤第三步:注册 TestCaseViewSet 到 Router第…...

IDEA推送到gitlab,jenkins识别,然后自动发布到需要的主机(流水线)

jenkins流水线 新建项目 找到流水线选择脚本 3.点击流水线语法开始编辑脚本 4.生成流水线脚本复制 5.修改脚本 6.继续添加(手打) 7.继续生成添加 8.最终脚本 9.保存测试 10.构建 11.访问主页查看是否修改...

四、【API 开发篇 (上)】:使用 Django REST Framework 构建项目与模块 CRUD API

【API 开发篇 】:使用 Django REST Framework 构建项目与模块 CRUD API 前言为什么选择 Django REST Framework (DRF)?第一步:创建 Serializers (序列化器)第二步:创建 ViewSets (视图集)第三步:配置 URLs (路由)第四步…...

vscode连接本地Ubuntu

因为在学习项目的时候,自己的云服务器性能太差一直要编译很长时间,而且总是连接失败,所以搞了一个Ubuntu25.04的系统在自己的vmare中。 其中参考了以下文章。 Ubuntu 24.04 桌面版安装指南(2025版) | 官网镜像下载启动盘制作保姆级图文教程…...

idea无法识别Maven项目

把.mvn相关都删除了 导致Idea无法识别maven项目 或者 添加导入各个模块 最后把父模块也要导入...

Redis应用--缓存

目录 一、什么是缓存 1.1 二八定律 二、使用Redis作为缓存 三、缓存的更新策略 3.1 定期更新 3.2 实时生成 四、缓存预热、缓存穿透、缓存雪崩和缓存击穿 4.1 缓存预热 4.2 缓存穿透 4.3 缓存雪崩 4.4 缓存击穿 一、什么是缓存 缓存(cache)是计算机的一个经典的概念…...

大语言模型与人工智能:技术演进、生态重构与未来挑战

目录 技术演进:从专用AI到通用智能的跃迁核心能力:LLM如何重构AI技术栈应用场景:垂直领域的技术革命生态关系:LLM与AI技术矩阵的协同演进挑战局限:智能天花板与伦理困境未来趋势:从语言理解到世界模型1. 技术演进:从专用AI到通用智能的跃迁 1.1 三次技术浪潮的跨越 #me…...

多模态大语言模型arxiv论文略读(八十六)

EVALALIGN: Supervised Fine-Tuning Multimodal LLMs with Human-Aligned Data for Evaluating Text-to-Image Models ➡️ 论文标题:EVALALIGN: Supervised Fine-Tuning Multimodal LLMs with Human-Aligned Data for Evaluating Text-to-Image Models ➡️ 论文作…...

C++--string类对象

一,引言 string类对象在于更好的处理字符串问题,为对于字符串这一类型提供更加方便的接口和运算符的重载。本片文章首先会引入auto关键字和范围for两个C11小语法。之后按照如下网站所提供的顺序经行讲解。cplusplus.com - The C Resources Networkhttps://legacy.c…...

云计算与大数据进阶 | 28、存储系统如何突破容量天花板?可扩展架构的核心技术与实践—— 分布式、弹性扩展、高可用的底层逻辑(下)

在上篇中,我们围绕存储系统可扩展架构详细探讨了基础技术原理与典型实践。然而,在实际应用场景中,存储系统面临的挑战远不止于此。随着数据规模呈指数级增长,业务需求日益复杂多变,存储系统还需不断优化升级&#xff0…...

Python _day31

DAY 31 文件的规范拆分和写法 今日的示例代码包含2个部分 notebook文件夹内的ipynb文件,介绍下今天的思路项目文件夹中其他部分:拆分后的信贷项目,学习下如何拆分的,未来你看到的很多大项目都是类似的拆分方法 知识点回顾 规范的文…...

【JavaWeb】MyBatis

1 介绍 什么是MyBatis? MyBatis是一款优秀的 持久层 框架,用于简化JDBC的开发。 MyBatis本是 Apache的一个开源项目iBatis,2010年这个项目由apache迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。 MyBatis官网https://my…...

vue2实现【瀑布流布局】

瀑布流 1. 解释2. 形成结构和样式3. 自定义指令 1. 解释 瀑布流特征: 等宽不等高:元素宽度固定,高度根据内容自适应。错落排列:元素像瀑布一样从上到下依次填充,自动寻找最短列插入 体现:图中第一排1&…...

系统架构设计(十六):敏感点、权衡点、风险点和非风险点

术语定义 概念定义说明敏感点(Sensitivity Point)架构设计中对某个质量属性有显著影响的点,一旦改变该点,会显著影响系统的某个质量属性。风险点(Risk Point)由于架构决策带来的潜在失败风险,可…...

优化dp贪心数论

这次三个题目都来自牛客周赛93,个人觉得出的很好,收获颇多。 1.简单贪心 题目意思: 任意选定两个数字,相加之和替代两个数字中的一个,另一个抹除。求操作之后最大字典序之和 思路: 最大字典序之和&…...

详解MySQL 的 binlog,redo log,undo log

MySQL 的 binlog、redo log 和 undo log 是数据库事务处理与数据一致性的核心组件,各自承担不同的职责。 1. binlog(二进制日志) 定位:MySQL Server 层实现的逻辑日志,与存储引擎无关。作用: 主从复制&…...

SymPy|主元、重新表示、分数、约分表达式、极限、级数、ode、获取值、输出形式

SymPy 是一个 Python 的符号计算库,广泛应用于数学计算、物理建模、工程分析等领域。本文将详细介绍 SymPy 在处理主元操作、重新表示、分数、约分表达式、极限、级数、常微分方程(ODE)以及获取值和输出形式等方面的应用,通过完整…...

Java 05正则表达式

正则表达式 1.简介 一个字符串,指定一些规则,来校验其他的字符串 String s"";规则 需要进行匹配的字符串.matches(s);来判断2.字符类**(单个) [abc] String s"[ABC]"; "A".matches(s);返回true…...

IEEE 802.1Q协议下封装的VLAN数据帧格式

1.概要 802.1d定义了生成树 802.1w定义了快速生成树 802.1s定义了多生成树 802.1q定义了VLAN 2.说明 IEEE802.1q协议的作用是(生成VLAN标记)VLAN编号取值范围:0-4095,其中0和4095是保留编号,所最大值是&#xff…...

VMware三种网络配置对比

​桥接模式(Bridged Mode)​​ ​​核心特点​​: 虚拟机被视为局域网中的独立设备,直接使用物理网络适配器,需配置与宿主机同一网段的IP地址。 ​​典型场景​​: 虚拟机需对外提供服务(如Web…...

再来1章linux系列-19 防火墙 iptables 双网卡主机的内核 firewall-cmd firewalld的高级规则

学习目标: 实验实验需求实验配置内容和分析 (每一个设备的每一步操作)实验结果验证其他 学习内容: 实验实验需求实验配置内容和分析 (每一个设备的每一步操作)实验结果验证其他 1.实验 2.实验需求 图…...

Word 转 HTML API 接口

Word 转 HTML API 接口 图像/转换 Word 文档转换为 HTML 文件转换 / 超高精度与还原度 文件转换 / Word。 1. 产品功能 超高精度与还原度的 HTML 文件转换;支持将 Word 文档转换为 HTML 格式;支持 .doc 和 .docx 格式;保持原始 Word 文档的…...

深入解析MATLAB codegen生成MEX文件的原理与优势

一、MATLAB codegen底层工作机制 1.1 MATLAB执行引擎的局限性 MATLAB作为解释型语言,其执行过程包含多个关键步骤: 语法解析:将.m文件代码转换为抽象语法树(AST) 类型推断:运行时动态确定变量类型 内存管理:自动处…...

PEFT简介及微调大模型DeepSeek-R1-Distill-Qwen-1.5B

🤗 PEFT(参数高效微调)是由Huggingface团队开发的开源框架,专为大型预训练模型(如GPT、LLaMA、T5等)设计,用于高效地将大型预训练模型适配到各种下游应用,而无需对模型的所有参数进行…...

Python训练营打卡 Day31

文件的规范拆分和写法 今日的示例代码包含2个部分 notebook文件夹内的ipynb文件,介绍下今天的思路项目文件夹中其他部分:拆分后的信贷项目,学习下如何拆分的,未来你看到的很多大项目都是类似的拆分方法 知识点回顾:文件…...

Google精准狙击OpenAI Codex,发布AI编程助手Jules!

自从OpenAI推出 Codex之后,Google就憋不住了,悄悄得瞄准了OpenAI的最新成果。 原计划是是打算在明天举行的Google I/O年度开发者大会上发布相关产品,但Google似乎已经一刻也等不了了。 就在昨天,谷歌正式推出了其AI编程——Ju…...

【办公类-18-04】(Python)“验血单信息”批量生成打印(学校、班级、姓名、性别)

背景说明 督导结束了,准备春游(夏游),搭档在给孩子写打卡单、心愿单,感慨“好多字都不会写了!” 此时,保健老师来发体检材料,叮嘱红色验血单的填写方法。 我觉得我的字也是一塌糊涂。我想用以前做“毕业证书”的方式,将班级幼儿信息打印在体检单上。 【办公类-18-03…...

如何使用通义灵码提高前端开发效率

工欲善其事,必先利其器。对于前端开发而言,使用VSCode已经能够极大地提高前端的开发效率了。但有了AI加持后,前端开发的效率又更上一层楼了! 本文采用的AI是通义灵码插件提供的通义千问大模型,是目前AI性能榜第一梯队…...

苍穹外卖04 新增菜品菜品分页查询删除菜品修改菜品

2-6 新增菜品 02 05-新增菜品_需求分析和设计 03 06-新增菜品_代码开发_1 文件上传接口开发: 在这一部分我们主要在于对阿里云oss的代码开发和实现 1.配置阿里云oss: alioss:endpoint: oss-cn-beijing-internal.aliyuncs.comaccess-key-id: access-ke…...

C++ 读取英伟达显卡名称、架构及算力

C++ 读取英伟达显卡名称、架构及算力 通过CUDA Runtime API获取计算能力(推荐)​​CUDA计算能力(Compute Capability)的版本号直接对应显卡架构(如8.6=Ampere,9.0=Hopper)。实现步骤: ​​1.安装依赖​​: 安装 NVIDIA CUDA Toolkit。确保显卡驱动支持CUDA。2. ​​C…...

VitePress 中以中文字符结尾的字体加粗 Markdown 格式无法解析

背景 在编写vitepress项目过程中,发现了一个markdown格式解析的问题。 md文件中,以中文句号结尾的字体加粗,无法正确解析: 不只是中文句号,只要是加粗语句中以中文字符结尾,都无法被正确解析 需要将中文…...

2.前端汇总

框架 html5 html语法 css css3 css语法 框架 tailwind css 官网 JavaScript JavaScript语法 typescript 语法 nodejs 语法 vue3 官网 组件 vite 打包 vue router -路由 pinia - 状态管理 ui element plus axios - ajax 后台管理系统前端快速开发框架 …...

外部因素导致的 ADC误差来源分析

前面分享了ADC自身因素带来的误差,现在再分享一波由于外部因素导致的ADC采样误差。 一、模拟信号源输入减少带来的误差 看一个STM32的ADC转换器的示意图: 从图中可以看到,输入源与采样引脚之间存在阻抗RAIN,流入引脚的电压可能因…...

集成运算放大器知识汇总

一、集成运放的组成 集成运算放大器,就是通过内部元器件的电参量关系将电参量进行运算,达到放大的目的。我们拆解来看: 集成:将电路封装,留出接口,使其模块化,便于移植。运算:这里…...

HBCPC2025 补题 (F、I)

HBCPC2025 补题 补题连接:Codeforces I 感染 做法1&#xff1a;std做法&#xff1a;树上dp统计贡献找最大 #include <bits/stdc.h> using namespace std; typedef long long ll; #define endl \n #define int long long #define pb push_back #define pii pair<int,…...

针对 CSDN高质量博文发布 的详细指南

结合技术写作规范与平台特性&#xff0c;分为 内容规划、写作技巧、排版优化、发布策略 四部分&#xff0c;确保专业性与传播效果&#xff1a; 一、内容规划&#xff1a;精准定位与深度挖掘 选题策略 热点结合&#xff1a;追踪技术趋势&#xff08;如2025年AIGC、量子计算&am…...

python读写bin文件

import numpy as np# 创建二进制数据 data np.array([0x33, 0x34, 0x35, 0x36], dtypenp.uint8)# 写入bin文件 with open(example.bin, wb) as f:data.tofile(f)print("bin文件生成成功")data np.fromfile(example.bin, dtypenp.uint8) print("numpy读取结果:…...

矩阵的秩(Rank)

矩阵的秩&#xff08;Rank&#xff09;是线性代数中的核心概念&#xff0c;表示矩阵中线性无关的行&#xff08;或列&#xff09;的最大数量&#xff0c;反映了矩阵所包含的“独立信息”的多少。以下是其核心要点&#xff1a; 1. 秩的定义 行秩&#xff1a;矩阵中线性无关的行…...