• MYSQL表连接查询


    表连接查询

    一、交叉连接 - 笛卡尔积

    ​   查询teacher和course表中所有的数据

    ​   select * from teacher,course;

    ​   select name,courseid,course.id,cname from teacher,course where teacher.courseid=course.id;

    二、内连接

      在关联的两张表中,把满足条件的数据筛选出来

      select 字段,... ...

      from 表1

      inner join 表2

      on 条件

      inner join 表3

      on 条件

    -- 使用内连接查询teacher和course 表中的数据(姓名,年龄,课程名称,课时)
        select t.name,t.age,c.cname,c.cduration
        from teacher as t
        inner join course as c
        on t.course_id=c.id;
     -- 查询学员的姓名,年龄,所在班级名称,专业名称 并筛选出1902的学员
        select s.name,s.age,c.classname,m.m_name
        from student as s
        inner join classinfo as c
        on s.class_id=c.id
        inner join major as m
        on s.major_id=m.id
        where c.classname='1902';
    -- 查询学员的姓名,毕业院校,所在班级,考试科目,考试成绩
        select s.name,s.school,c.classname,course.cname,sc.score
        from student as s
        inner join classinfo as c
        on s.class_id=c.id
        inner join score as sc
        on s.id=sc.stu_id
        inner join course
        on sc.course_id = course.id;

    三、外链接

      1.左外链接

      作用:(1)左表中所有的数据都会查询出来(即便不满足条件)

         (2)将右表中满足关联条件的数据查询出来

         (3)关键不上的数据关联字段将以null作为填充(查询哪些课程没有老师去讲 就用左外链)

         语法:select 字

            from A left join B

            on 关联条件

    -- 左外链接,左表:course 右表:teacher
    -- 关联条件:teacher.course_id=course.id
    -- 以左表为主 左表的id都显示出来 查询右表关联信息,未关联到的信息显示为null,一般用来查询null的值
    select * from
    course left join teacher
    on teacher.course_id = course.id
    where teacher.id is null;

    ​   2.右外链接

    ​   作用:1.右表中所有的数据都会查询出来(即便不满足条件)

          2.将左表中满足关联条件的数据查询出来

          3.关键不上的数据关联字段将以null作为填充

    ​   语法:select 字段

          from A right join B

            on 关键条件

    -- 右外链接,左表:teacher,右表:course,
    -- 关联条件:teacher.course_id=course.id
    select * from
    teacher right join course
    on teacher.course_id = course.id
    where teacher.id is null;
    -- 练习:查询没有参加考试的学生
    select student.name,score.score from
    student left join score
    on student.id=score.stu_id
    where score.score is null;

    四、子查询

      1.什么是子查询:将一个查询的结果作为外侧操作的一个条件出现

      2.语法:select ... from 表名 where 条件=(select ...);

    -- 查询student表中比‘李四’年龄大的学员的信息
    select * from student
    where age>(select age from student where name='李四');
     1 -- 练习:1、查询考过‘王老师’老师所教课程的学校的信息
     2 -- 方法1
     3 select * from student where id in(
     4     select stu_id from score where course_id=(
     5         select course_id from teacher  where name='王老师'
     6     )
     7 );
     8 -- 方法2
     9 select s.name,s.school
    10 from student as s
    11 inner join score as sc
    12 on s.id =sc.stu_id
    13 inner join teacher as t
    14 on t.course_id=sc.course_id
    15 where t.name='王老师';
    16 
    17 -- 练习:2、查询在score表中有成绩的学员的信息
    18 select * from student where id in(select stu_id from score);
    19 
    20 -- 练习:3、查询'python基础'课程并且分数在80分以上的学员的姓名和学校
    21 -- 方法1
    22 select student.name,student.school from
    23 student left join score
    24 on student.id = score.stu_id
    25 left join course
    26 on score.course_id = course.id
    27 where score>80 and  cname='python基础';
    28 -- 方法2
    29 select name,school from student where id in(
    30     select stu_id from score where score>80 and course_id = (
    31         select id from course where cname='python基础'
    32     )
    33 );
    34 
    35 -- 练习:4、查询和‘张三’相同班级以及相同专业的同学的信息
    36 -- 方法1
    37 select student.name,classinfo.classname,major.m_name from
    38 student left join classinfo
    39 on student.class_id=classinfo.id
    40 left join major
    41 on student.major_id=major.id
    42 where class_id=(select class_id from student where name='张三')
    43 and major_id=(select major_id from student where name='张三')
    44 and student.name!='张三';
    45 -- 方法2
    46 select student.name,classinfo.classname,major.m_name
    47 from student
    48 inner join classinfo
    49 on student.class_id=classinfo.id
    50 inner join major
    51 on student.major_id=major.id
    52 where class_id=(select class_id from student where name='张三')
    53 and major_id=(select major_id from student where name='张三')
    54 and student.name!='张三';
    练习题
  • 相关阅读:
    python的多线程是否没有用了
    解决“mongoengine.fields.ImproperlyConfigured: PIL library was not found”报错
    Django JSON 时间
    伪装浏览器根据经纬度解析地理位置
    Excel——使用VLOOKUP函数关联跨工作薄数据
    Python发送邮件(支持中文)
    Excel实用技巧
    修改tomcat应用日志默认编码格式
    AWS多个EIP的解决方案
    解决荣耀7烦人的情景智能提醒
  • 原文地址:https://www.cnblogs.com/maplethefox/p/11167131.html
Copyright © 2020-2023  润新知