目录

 3.7 连接查询——多表查询

3.7.1 创建多表

3.7.2 等值连接

 3.7.3 左连接

 3.7.4 右连接


 3.7 连接查询——多表查询

多表查询,查询时候不在从一个表中查询,从多个表查询

  • 当查询结果的列来源于多张表时,需要将多张表连接成一个大的数据集,再选择合话的列返回
  • 等值连接查询:查询的结果为两个表匹配到的数据,交集

                

sql server链接PostgreSQL数据库的查询语句 数据库sql连接查询_database

  • 左连接查:查询的结果为两个表匹配到的数据加左表特有的数据,对于右表中不存在的数据使用null填充

                    

sql server链接PostgreSQL数据库的查询语句 数据库sql连接查询_navicat_02

  • 右连接查询:查询的结果为两个表匹配到的数据加右表特有的数据,对于左表中不存在的数据使用null填充

                       

sql server链接PostgreSQL数据库的查询语句 数据库sql连接查询_数据库_03

3.7.1 创建多表

创建多表课程,成绩与学生表联系起来: 

drop table if exists courses;

create table courses(
	courseNo int(10) unsigned primary key auto_increment,
	name varchar(10)
);

insert into courses values
('1', '数据库'),
('2', 'qtp'),
('3', 'linux'),
('4', '系统测试'),
('5', '单元测试'),
('6', '测试过程');

drop table if exists scores;

create table scores(
	id int(10) unsigned primary key auto_increment,
	courseNo int(10),
	studentno varchar(10),
	score tinyint(4)
);

insert into scores values
('1', '1', '001', '90'),
('2', '1', '002', '75'),
('3', '2', '002', '98'),
('4', '3', '001', '86'),
('5', '3', '003', '80'),
('6', '4', '004', '79'),
('7', '5', '005', '96'),
('8', '6', '006', '80');

 

sql server链接PostgreSQL数据库的查询语句 数据库sql连接查询_database_04

 

sql server链接PostgreSQL数据库的查询语句 数据库sql连接查询_database_05

 汇总

sql server链接PostgreSQL数据库的查询语句 数据库sql连接查询_字段_06

 接下来,对需要查询的数据,怎么进行连接查询?

3.7.2 等值连接

等值连接:根据2个表根据关联的字段,取交集

  • 方式一
select * from 表1,表2 where 表1.列 = 表2.列
  • 方式二(又称内连接)
select * from 表1
inner join 表2 on 表1.列 = 表2.列

💦 知识点: 

  • 从两个或多个以上的表格进行查询,均叫连接查询或者多表查询
  • 把多个表的数据连在一起生成新的记录,这个新记录拥有多个表的所有字段,结果会把多个表的数据累加到一块,默认情况生成是临时结果,这叫连接查询

如:

sql server链接PostgreSQL数据库的查询语句 数据库sql连接查询_数据库_07

  • 连接后 需要把数据进行过滤,得到正确结果

注意:

在查询多个表时,

  1. 需要把多个表先连接起来,连接后会生成一堆数据,在这一堆数据中,有很多数据不是我们需要的,这时需要去过滤
  2. 再过滤的时候,需要找到这两个表共同的字段,如学生表中有个学号,成绩表也有,那么在过滤时以此为条件,
  3. 在连接查询中,最重要的地方:用哪个字段进行关联,怎么去过滤

 🧐例1:查询学生信息及学生的成绩

①、把多个表先连接起来

select * from students, scores

        如下,先写的表的数据显示在前,后写的表格数据连接显示在后 

sql server链接PostgreSQL数据库的查询语句 数据库sql连接查询_数据库_08

select count(*) from students, scores

发现有2表连接有112条数据 :学生表数据14条,成绩表数据 8 条 ,14 * 8 = 112条

 

sql server链接PostgreSQL数据库的查询语句 数据库sql连接查询_navicat_09

 

sql server链接PostgreSQL数据库的查询语句 数据库sql连接查询_字段_10

🔶小提示: 上述连接不正确,发现学生表与成绩表相同点学号,根据学号来连接

sql server链接PostgreSQL数据库的查询语句 数据库sql连接查询_database_11

找到过滤条件,进行过滤 

1️⃣方式一: 

--可以取别名来代替,对于对应相等的数据需要标明是哪个表格
select * from students as stu, scores as sc where stu.studentNo = sc.studentNo

sql server链接PostgreSQL数据库的查询语句 数据库sql连接查询_database_12

--显示名字和成绩
select stu.nane,sc.score from students as stu, scores as sc
 where stu.studentNo = sc.studentNo

sql server链接PostgreSQL数据库的查询语句 数据库sql连接查询_database_13

 2️⃣ 方式二:

select * from students as stu 
inner join scores as sc  on stu.studentNo = sc.studentNo

-- on在英文中代表当,正在干什么事,
-- 连接的时候先判断条件才能进行连接

sql server链接PostgreSQL数据库的查询语句 数据库sql连接查询_数据库_14

  🧐例2:查询课程信息预计课程的成绩

-- 方式一:
-- select * from scores, courses where scores.courseNo = courses.courseNo


-- 方式二:
select * from courses inner join scores on scores.courseNo = courses.courseNo

sql server链接PostgreSQL数据库的查询语句 数据库sql连接查询_数据库_15

💦知识点:

 方式一与方式二区别:

使用from多张表的时候:

       方式一会生成临时表,临时表会让学生表和成绩表交叉的连接在一起,生成一堆数据(有对的数据也有错的数据),where:在临时表中进行过滤,把错误数据过滤出来

        方式二不生成临时表,inner join on : 连接时先判断条件,只有符合条件才会连接再得到结果

最终导致:最终效果一样,方式一会生成临时表,生成的临时表放到哪?放到计算机内存中,这样子会占用内存,假设2个表各1万条数据,1万*1万条数据的临时表,这样子会耗计算机的性能,方式一耗性能。

方式二不会生成临时表,性能就会好些

写连接查询都用内连接——方式二

  🧐 例3:查询学生信息及学生的课程对应的成绩——三表查询

-- 方式一:
-- select * from students, scores, courses 
-- where students.studentNo = scores.studentNo and  scores.courseNo = courses.courseNo


-- 方式二:
select * from students
inner join scores on students.studentNo = scores.studentNo
inner join courses on scores.courseNo = courses.courseNo

sql server链接PostgreSQL数据库的查询语句 数据库sql连接查询_字段_16

--仅显示部分字段
-- 若仅显示某些字段的时候,这些字段只在某些表中有,就不用写其表名,
-- 若该字段多个表都有,就需要写表名
-- 不过一般都写表名
select students.nane,courses.name as courseName,scores.score from students
inner join scores on students.studentNo = scores.studentNo
inner join courses on scores.courseNo = courses.courseNo

 

sql server链接PostgreSQL数据库的查询语句 数据库sql连接查询_数据_17

❗ 注意:

三表连接至少2个条件,四表连接至少3个条件 ,必须要两两找到相同关联字段,两两关联

  🧐 例4: 查询王昭君的成绩,要求显示姓名、课程名、成绩 

-- 方式一:
-- select students.nane, scores.score, courses.name as courseName from students, scores,courses
-- where students.nane = '王昭君' and students.studentNo = scores.studentNo and scores.courseNo = courses.courseNo


-- 方式二:
select students.nane, scores.score, courses.name as courseName  from courses
inner join scores on scores.courseNo = courses.courseNo
inner join students on students.studentNo = scores.studentNo  
where students.nane = '王昭君'

 

sql server链接PostgreSQL数据库的查询语句 数据库sql连接查询_数据_18

   🧐 例5: 查询王昭君的数据库成绩,要求显示姓名、课程名、成绩 

-- 方式一:
-- select students.nane, scores.score, courses.name as courseName from students, scores,courses
-- where students.nane = '王昭君' and courses.name = '数据库' and students.studentNo = scores.studentNo and scores.courseNo = courses.courseNo


-- 方式二:
select students.nane, scores.score, courses.name as courseName  from courses
inner join scores on scores.courseNo = courses.courseNo
inner join students on students.studentNo = scores.studentNo  
where students.nane = '王昭君' and courses.name = '数据库'

 

sql server链接PostgreSQL数据库的查询语句 数据库sql连接查询_字段_19

  🧐 例6: 查询所有学生的数据库成绩,要求显示姓名、课程名、成绩 

-- 方式一:
-- select students.nane, scores.score, courses.name as courseName from students, scores,courses
-- where  courses.name = '数据库' and students.studentNo = scores.studentNo and scores.courseNo = courses.courseNo


-- 方式二:
select students.nane, scores.score, courses.name as courseName  from courses
inner join scores on scores.courseNo = courses.courseNo
inner join students on students.studentNo = scores.studentNo  
where courses.name = '数据库'

sql server链接PostgreSQL数据库的查询语句 数据库sql连接查询_数据_20

   🧐 例7: 查询男生中最高成绩,要求显示姓名、课程名、成绩 

-- 方式一:
select students.nane, students.sex, scores.score, courses.name as courseName from students, scores,courses
where  students.sex = '男' 
and students.studentNo = scores.studentNo 
and scores.courseNo = courses.courseNo
order by scores.score desc limit 1 



-- 方式二:
-- select students.nane, students.sex, scores.score, courses.name as courseName  from courses
-- inner join scores on scores.courseNo = courses.courseNo
-- inner join students on students.studentNo = scores.studentNo  
-- where  students.sex = '男' 
-- order by scores.score desc limit 1

sql server链接PostgreSQL数据库的查询语句 数据库sql连接查询_字段_21

 3.7.3 左连接

语法:

select * from 表1
left join 表2 on 表1.列=表2.列

通过3.7.2例1 可得:内连接取的是表与表之间的交集 

  🧐 例1:查询所有学生的成绩,包括没有成绩的学生

select *from students 
left join scores on students.studentNo = scores.studentno

sql server链接PostgreSQL数据库的查询语句 数据库sql连接查询_database_22

小技巧:

        只要使用jion这种语句,都有两个表,这两个表分为左表和右表,如例1学生表students在左表(因为将其写到前面)

    得join前面的表为左表,join后面的表为右表。

left:把左边表的数据全部显示出来,即使左边表的数据在右边找不到对应的信息也要将其显示出来,找得到连接起来,找不到以null来显示

  🧐例2:查询所有学生的成绩,包括没有成绩的学生,需要显示课程名

select *from students 
left join scores on students.studentNo = scores.studentno
left join courses on courses.courseNo = scores.courseNo

sql server链接PostgreSQL数据库的查询语句 数据库sql连接查询_navicat_23

 3.7.4 右连接

select * from 表1
right join 表2 on 表1.列 = 表2.列
添加两门课程
insert into courses values
(0, '语文'),
(0, '数学');

sql server链接PostgreSQL数据库的查询语句 数据库sql连接查询_数据库_24

 

sql server链接PostgreSQL数据库的查询语句 数据库sql连接查询_数据_25

🧐例1:查询所有课程的成绩,包括没有成绩的课程

select * from scores
right join courses on scores.courseNo = courses.courseNo

sql server链接PostgreSQL数据库的查询语句 数据库sql连接查询_navicat_26

  🔶小技巧:

  : 怎么判断选择左连接还是右连接?

ANS:

        看哪个是左表还是右表需要全部显示

        join前面是左表,join后面是右表,多个join如3个表,前面2个表的连接作为左表,

: 表的顺序?

  ANS:     表的顺序:与字段写的位置有关,也可以自定义

自定义字段显示顺序 select students.*, scores.*, courses.* from courses left join scores on scores.courseNo = courses.courseNo left join students on students.studentNo = scores.studentno

 🧐例2:查询所有课程的成绩,包括没有成绩的课程,包括学生信息

-- 方法一:
-- select * from scores
-- right join courses on scores.courseNo = courses.courseNo
-- left join students on students.studentNo = scores.studentno

-- 方法二:
select * from courses
left join scores on scores.courseNo = courses.courseNo
left join students on students.studentNo = scores.studentno

sql server链接PostgreSQL数据库的查询语句 数据库sql连接查询_database_27