【数据库】多表查询和外链接
一、等值连接
何为等值连接?顾名思义,他就是两张或多张表的部分字段值相等并联合查询。等值连接也叫做简单连接,为什么呢,我想可能是因为太简单了 ^ _ ^。
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均为表的别名,方便减少代码。
二、自然连接、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子句吧:
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