软件测试-数据库03

113 阅读4分钟

1、三个表连接——多表连接,多表连接必须两两

例子:查询学生的信息,及学生的课程以及对应的学生成绩

1.1select * 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之前的表就是左边的表,也就是左表;(也就是把左边的表全部显示出来,右边没有的数据为nulljoin后边的表称为右表。(也就是把右边的表全部显示出来,左边没有的数据为nullselect * from1
left join2 on1.列=表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语句中有多个select8.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=anyin是一样的

12.2、任意一个any | some

\>any(1820)就相当于大于最大的年龄20>some一样的

<any(1820)就相当于小于最小的年龄18<some一样的

!=any这个没有意义

12.3all

例子:

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、回顾