• 【MySQL】_自连接与子查询


    目录

     1. 自连接

    2. 子查询(嵌套查询)

    2.1 子查询分类

    2.2 单行子查询示例1:查询不想毕业同学的同班同学

    2.3 多行子查询示例2:查询语文或英语课程的信息成绩

    3. 合并查询

    3.1 示例1:查询id=3或者名字为英文的课程


    本专栏关于联合查询已建立相应库与表,原文链接如下:

    【MySQL】_联合查询基础表-CSDN博客

    内连接原文如下:

    【MySQL】_内连接-CSDN博客

    外连接原文如下:

    【MySQL】_外连接-CSDN博客

    基于以上内容,本篇介绍自连接与子查询、合并查询;

     1. 自连接

            自连接是表自身与自身做笛卡尔积,在SQL中进行条件查询,都是指定某一列或多个列之间进行关系运算,无法进行行与行之间的运算,在某些情况下需要对行与行之间进行关系运算,就要使用到自连接。自连接的本质是将行转为列

    示例:显示所有“课程id为3”比“课程id为1”成绩高的成绩信息:

    (成绩信息在score表中)

    (1)对score进行自连接(别名求笛卡尔积)并删除无效信息:

    mysql> select* from score as s1, score as s2 where s1.student_id = s2.student_id;

    (2)选出第一列id=1的课程与第二列id=3的课程:

    1. mysql> select* from score as s1, score as s2
    2. -> where s1.student_id = s2.student_id
    3. -> and s1.course_id = 1
    4. -> and s2.course_id = 3;

    (该结果表示有三个同学同时选修了这两门课程)

    (3)增加左列成绩小于右列成绩条件,SQL指令与查询结果为:

    1. mysql> select* from score as s1,score as s2
    2. -> where s1.student_id = s2.student_id
    3. -> and s1.course_id = 1
    4. -> and s2.course_id = 3
    5. -> and s1.score < s2.score;
    6. +-------+------------+-----------+-------+------------+-----------+
    7. | score | student_id | course_id | score | student_id | course_id |
    8. +-------+------------+-----------+-------+------------+-----------+
    9. | 70.5 | 1 | 1 | 98.5 | 1 | 3 |
    10. | 33.0 | 3 | 1 | 68.0 | 3 | 3 |
    11. +-------+------------+-----------+-------+------------+-----------+
    12. 2 rows in set (0.00 sec)

    注:(1)不能直接进行自连接:

    1. mysql> select* from score,score;
    2. ERROR 1066 (42000): Not unique table/alias: 'score'

    需要为表指定两个别名,即:

    mysql> select* from score as s1, score as s2;

    2. 子查询(嵌套查询)

    子查询是指嵌入其他SQL语句中的select语句,即将多个查询语句合并为一个语句;

    2.1 子查询分类

    (1)单行子查询:查询结果只有一条记录;

    (2)多行子查询:查询结果为多条记录;

    2.2 单行子查询示例1:查询不想毕业同学的同班同学

    (1)分步查询SQL指令及查询结果为:

    1. mysql> select classes_id from student where name="不想毕业";
    2. +------------+
    3. | classes_id |
    4. +------------+
    5. | 1 |
    6. +------------+
    7. 1 row in set (0.00 sec)
    8. mysql> select name from student where classes_id =1;
    9. +------------+
    10. | name |
    11. +------------+
    12. | 黑旋风李逵 |
    13. | 菩提老祖 |
    14. | 白素贞 |
    15. | 许仙 |
    16. | 不想毕业 |
    17. +------------+
    18. 5 rows in set (0.00 sec)

    (2)子查询SQL指令及查询结果为:

    1. mysql> select name from student where classes_id = (select classes_id from student where name="不想毕业");
    2. +------------+
    3. | name |
    4. +------------+
    5. | 黑旋风李逵 |
    6. | 菩提老祖 |
    7. | 白素贞 |
    8. | 许仙 |
    9. | 不想毕业 |
    10. +------------+
    11. 5 rows in set (0.00 sec)

    即将条件查询的某一个值替换为一个select查询语句;

    2.3 多行子查询示例2:查询语文或英语课程的信息成绩

    先查询出两个课程的课程id,再根据course_id在score表中查询;

    (1)分步查询SQL指令及查询结果为:

    1. mysql> select id from course where name="语文" or name="英文";
    2. +----+
    3. | id |
    4. +----+
    5. | 4 |
    6. | 6 |
    7. +----+
    8. 2 rows in set (0.00 sec)
    9. mysql> select* from score where course_id in(4,6);
    10. +-------+------------+-----------+
    11. | score | student_id | course_id |
    12. +-------+------------+-----------+
    13. | 98.0 | 1 | 6 |
    14. | 72.0 | 4 | 6 |
    15. | 43.0 | 6 | 4 |
    16. | 79.0 | 6 | 6 |
    17. | 92.0 | 7 | 6 |
    18. +-------+------------+-----------+
    19. 5 rows in set (0.00 sec)

    (2)子查询SQL指令及查询结果为:

    1. mysql> select* from score where course_id in(select id from course where name="语文" or name="英文");
    2. +-------+------------+-----------+
    3. | score | student_id | course_id |
    4. +-------+------------+-----------+
    5. | 98.0 | 1 | 6 |
    6. | 72.0 | 4 | 6 |
    7. | 43.0 | 6 | 4 |
    8. | 79.0 | 6 | 6 |
    9. | 92.0 | 7 | 6 |
    10. +-------+------------+-----------+
    11. 5 rows in set (0.00 sec)

    3. 合并查询

    合并查询就是将两个查询语句的结果合并到一起;

    3.1 示例1:查询id=3或者名字为英文的课程

    (1)使用逻辑或实现查询:

    1. mysql> select* from course where id<3 or name="英文";
    2. +----+--------------+
    3. | id | name |
    4. +----+--------------+
    5. | 1 | Java |
    6. | 2 | 中国传统文化 |
    7. | 6 | 英文 |
    8. +----+--------------+
    9. 3 rows in set (0.00 sec)

    (2)使用union关键字进行合并查询:

    1. mysql> select* from course where id<3 union select* from course where name="英文";
    2. +----+--------------+
    3. | id | name |
    4. +----+--------------+
    5. | 1 | Java |
    6. | 2 | 中国传统文化 |
    7. | 6 | 英文 |
    8. +----+--------------+
    9. 3 rows in set (0.00 sec)

    注:(1)union与逻辑或的区别:

    逻辑或只能对一张表的查询结果进行合并,但union可以对多张表的查询结果进行合并(要求多个结果的列须对应)

    (2)union与union all的区别:

    使用union关键字对多个查询结果进行合并时会自动去重,但unionall不会去重

  • 相关阅读:
    【java面试题】Redis多线程模型怎么理解,那它会有线程安全问题吗?
    黑白简约个人网页制作 大学生个人网页设计模板 学生个人博客网页成品 简单个人网站作品下载 静态HTML CSS个人网页作业源代码
    UCI手写数字的数据降维
    每天五分钟机器学习:逻辑回归的损失函数为什么不能是误差平方和
    Python3 学习笔记
    【GNN报告】加拿大蒙特利尔唐建:Geometric Deep Learning For Drug Discovery
    TOGAF标准第10版读书会第12场——大厂专家专业解读业务参考模型!
    学成在线_课程查询_前端分页条不显示
    PTA 浙大版《C语言程序设计(第4版)》题目集 参考答案(编程题)
    JAVAEE:采用HTML和JavaScript实现几个基本的页面
  • 原文地址:https://blog.csdn.net/m0_63299495/article/details/136354011