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!='张三';
练习题

 

posted @ 2019-07-10 22:45  maplethefox  阅读(1091)  评论(0编辑  收藏  举报