1、三个表连接——多表连接,多表连接必须两两
例子:查询学生的信息,及学生的课程以及对应的学生成绩
1.1:
select * from student,courses,scores where student.studentnumber=scores.studentnumber and course.courseNo=scores.courseNo
(分行,可以点击美化)
1.2:内连接必须注意顺序
select * from student
inner join course on student.studentnumber=scores.studentnumber
inner join scourse on course.courseNo=scores.courseNo
例子:查询所有学生的成绩,要求显示姓名,课程和成绩
select student.name,course.name as 课程名, course.courseNo,score.score from student
inner join course on student.studentnumber=scores.studentnumber
inner join scourse on course.courseNo=scores.courseNo
2、连接查询后过滤
例子:查询袁华的数学成绩,要求显示姓名,课程和成绩
方式一、
select student.name,course.name,scores.score from student,courses,scores where student.studentnumber=scores.studentnumber
and course.courseNo=scores.courseNo
and student.name='袁华' and course.name='数学'
然后点击美化
方式二、
select student.name,course.name , course.courseNo,score.score from student
inner join course on student.studentnumber=scores.studentnumber
inner join scourse on course.courseNo=scores.courseNo
where student.name='袁华' and course.name='数学'
例子2:查询男生中最高的成绩,要求显示姓名,课程和成绩
select student.name,course.name , course.courseNo,score.score from student
inner join course on student.studentnumber=scores.studentnumber
inner join scourse on course.courseNo=scores.courseNo
where student.sex='男'
order by score desc
limit 1
3、左连接
含义:join之前的表就是左边的表,也就是左表;(也就是把左边的表全部显示出来,右边没有的数据为null)
join后边的表称为右表。(也就是把右边的表全部显示出来,左边没有的数据为null)
select * from 表1
left join 表2 on 表1.列=表2.列
例子:查询所有学生的成绩,包括没有成绩的学生
select * from student
left join scores on student.studentnumber=scores.studentnumber
例子:显示所有学生的成绩,包括没有成绩的学生,并且要求显示课程名
select student.name,course.name as 课程名, course.courseNo,score.score from student
left join course on student.studentnumber=scores.studentnumber
left join scourse on course.courseNo=scores.courseNo
4、右连接
right join
例子:查询所有课程的成绩,包括没有成绩的课程
select * from scores
right join courses on course.courseNo=scores.courseNo
例子:查询所有课程的成绩,包括没有成绩的课程,包括学生信息
select * from scores
right join courses on course.courseNo=scores.courseNo
left join student on student.studentnumber=scores.studentnumber
例子:显示所有学生的成绩,包括没有成绩的学生,并且要求显示课程名
select student.name,course.name as 课程名, course.courseNo,score.score from scores
right join student on student.studentnumber=scores.studentnumber
left join courses on course.courseNo=scores.courseNo
5、自关联介绍
表中的某一列,关联了这个表的另外一列,但是他们的业务逻辑是一样的,
例如:城市里的市信息pid引用推广的是省份信息aid
6、自关联查询
例子:查河南省下所有的市(一张表内aid和 pid,后面的pid就是当前省的aid)
以前的方法:
select * from areas ,areas_copy
where areas.aid=areas_copy.pid
and areas.title="河南省"
正确的方法:(将表起别名——从一个表中查询多次)
select * from areas as sheng,areas as shi
where sheng.aid=shi.pid
and sheng.title="河南省"
例子:查询有多少个市
select count(*) from areas.pid is null
7、自关联关联三次
例子:查郑州市下所有的区(一张表内aid和 pid,后面的pid就是当前省的aid和市下面所有的区)
select * from areas as sheng,areas as shi
where sheng.aid=shi.pid 这一步之后查询出来就是,省下面有市区,市下面有区,
and sheng .atitle="郑州市"
例子:查河南省下所有的区县——三次的话,就是自己连接三次
select * from areas as sheng,areas as shi,areas as qu
where sheng.aid=shi.pid
and sheng .atitle="河南省"
and shi.aid = qu.pid
8、标量子查询
子查询——select语句中有多个select。
8.1、标量子查询:子查询返回的值是一个值,也就是一行一列
例子:大于平均年龄的学生
select * from students where age (select avg(age) from students)
例子:查询年龄最小的人
select * from students where age=(select min(age) from students)
例子:查询王华的成绩,
select * from scores where studentsNo=(select studentNo from student where name="王华")
例子:查询王华的数学成绩
select * from scores where studentsNo=(select studentNo from student where name="王华")
and courseNo=(select courseNo from courses where name="数据库")
9、列子查询——子查询返回的结果是一列多行
in
例子:查询18岁的学生的成绩(18岁的学生可能有多个)
select * from scores where studentsNo in (select studentNo from student where age=18)
10、行子查询——返回结果是一行多列(用的少,上面的用得多)
例子:查询男生中年龄最大的学生信息
--select * from students where sex="男" and age=26
或者--select * from students where (sex,age)=("男",26)
行查询
select * from students where (sex,age)=(select sex,age from students where sex="男" orderb y age desc limit 1 )
11、表级子查询——子查询返回的结果是一个表,多行多列
例子:查询语文和数学两科的成绩
可以用表连接查询
select * from scores
inner join courses on scores.courseNo=courses.coursesNo
where courses.name in ('语文','数学')
表级子查询
select * from scores
inner join
(select * from courses where courses.name in ('语文','数学')) as c
--吧查询出来的结果当做数据源使用,必须取别名
on scores.courseNo=c.coursesNo
例子:
12、子查询中的关键字的使用
12.1、范围:in =some和=any和in是一样的
12.2、任意一个any | some
\>any(18到20)就相当于大于最大的年龄20 和>some一样的
<any(18到20)就相当于小于最小的年龄18 和<some一样的
!=any这个没有意义
12.3、all
例子:
select * from scores where studentsNo in (select studentNo from student where age between 18 and 28)
select * from scores where studentsNo=any (select studentNo from student where age between 18 and 28)
select * from scores where studentsNo=some (select studentNo from student where age between 18 and 28)
13、回顾