数据库多表查询和外连接

多表查询

平时我们进行简单的查询通常只需要一条简单的语句就能够实现,那么当我们所需要的数据来自不同的表并且相互有各种制约关系时我们如何查询呢,除了将查询步骤分步为单表查询外,我们还可以利用多表查询实现一条sql语句实现复杂的查询。

一、等值连接

何为等值连接?顾名思义,他就是两张或多张表的部分字段值相等并联合查询。等值连接也叫做简单连接,为什么呢,我想可能是因为太简单了 ^ _ ^。

1、等值连接查询的语法规则(表:table1,table2。字段:id,name):

SELECT table1.id,table1.name,table2.name
FROM table1,table2
WHERE table1.id=table2.id

从代码可见,这真的就是最简单的连接查询了。

2、使用表别名进行多表等值连接查询
相对于上面的写法,如果表名很长并且不止一张表,那么怎末办呢,在这里我们可以给表起一个别名。
表(字段):
t_student(stu_id,teacher_number,name,age)学生表(学号,老师编号,年龄)
t_teacher(number,subject_num)老师表(教师编号,科目号)
t_subject(sub_id,sub_name)科目表(科目编号,科目名称)
下面我们将以学生表,老师表,科目表联合进行id为1的学生姓名,年龄,对应的老师所教科目字段查询:

SELECT s.name,s.age,j.sub_name
FROM t_student s,t_teacher t,t_subject j
WHERE s.teacher_number=t.number
AND t.subject_num=j.sub_id
AND s.stu_id=1

其中,我们通过学生表中的教师编号和科目编号将三张表连接,代码内s,t,j均为表的别名,方便减少代码。

最近学习英语而且今天又感冒了今天就到这里,明天更新
。。。
早上早早去买了药又赶去上班,这对我这个实习生真是莫大的打击,下午公司团建五公里下来感觉感冒好多了,卧槽无情这个编辑器为毛不能加表情,好了废话不多说,咋们继续。

上面讲了表别名,再次强调下,这个东西就是为了让我们的Sql更加清晰易读,并不是必须的,你可以不写。

二、自然连接、USING子句和ON子句

我们这里新建三张表留着后面用
学生表(学号,姓名,年龄,班级编号):
在这里插入图片描述
班级表(班级编号,班级名称):
在这里插入图片描述
成绩表(科目编号,科目名称,学生编号,学生的本科目成绩):
在这里插入图片描述

  • 自然连接

前面,我们在两个或多个表进行查询时,往往需要在WHERE子句里面写上字段相同的判断语句,并且你会发现我们所写的字段他们的字段类型都相同。那么现在有了自然连接之后,我们完全没有必要写WHERE后面的条件语句了,自然连接会根据我们所查询的表中数据类型自动匹配相同的表字段。这句话可能比较绕口,上代码你一看便知:

联合查询学生和各科成绩:

//等值连接查询
SELECT st.stu_name,su.sub_name,su.grade
FROM t_student st,t_subject su
WHERE st.stu_number=su.stu_number
//自然连接查询
SELECT st.stu_name,su.sub_name,su.grade
FROM t_student st
NATURAL JOIN t_subject su

查询结果相同:
在这里插入图片描述
相比较而言,自然连接更加简单,但是笔者建议不要使用自然连接,因为虽然它简单,但是对于多张表的复杂数据查询它就没那么智能了,肯定会出bug,我认为每一句代码和每一个字段都应该对应的清清楚楚,这样减少bug而且符合规范。

  • USING子句

同样是上面的查询条件,我们使用USING子句查询,他与自然连接的唯一不同就是它指明了公共字段:

SELECT st.stu_name,su.sub_name,su.grade
FROM t_student st JOIN t_subject su
USING(stu_number)

相对而言这个方法我个人不是很喜欢,原因未知。

  • ON子句

这是我最喜欢的一种查询语句了,为什么呢,首先它的表字段对应清楚明了,一眼便能直观的看出查询语句结构,其次即使多张表多条件连接查询也都是小菜一碟,那么具体如何呢?请往下看。

假如我要查询六三班和六四班的所有同学的语文和英语成绩怎末查?分析一下,首先我们要查名字是“六年级三班”和“六年级四班”的班级编号,接着我们要查出来这两个班级编号下的所有学生姓名和学号,最后根据学号查出科目名称为“语文”和“英语”的对应成绩,分析到这里你是不是已经晕了,没关系,看看ON子句吧:

SELECT class_name,st.stu_name,su.sub_name,su.grade
FROM t_student st 
JOIN t_class cl
ON st.class_number=cl.class_number
JOIN t_subject su
ON st.stu_number=su.stu_number
WHERE cl.class_name IN('六年级三班','六年级四班')
AND su.sub_name IN('语文','英语')

来看看结果吧:
在这里插入图片描述
怎末样,很爽有木有,当然你要想让查询的成绩不低于20分,再加一句:

SELECT class_name,st.stu_name,su.sub_name,su.grade
FROM t_student st 
JOIN t_class cl
ON st.class_number=cl.class_number
JOIN t_subject su
ON st.stu_number=su.stu_number
WHERE cl.class_name IN('六年级三班','六年级四班')
AND su.sub_name IN('语文','英语')
AND su.grade>20

结果:
在这里插入图片描述
怎样,是否十分酸爽。笔者推荐哦,但是,这也只是一般的中小型公司使用进行多表查询,在一些代码规范里,多表查询不能超过一定数量,但是理论上你联合查询多少张表都是没毛病的,只要你的数据库没毛病(捂脸?)如果觉得还可以,留下小心心鼓励我哦

  • 18
    点赞
  • 87
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值