一、等值连接

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

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子句

我们这里新建三张表留着后面用

学生表(学号,姓名,年龄,班级编号):

mysql 连表查询 b不存在的数据 数据库连表查_mysql 连表查询 b不存在的数据


班级表(班级编号,班级名称):

mysql 连表查询 b不存在的数据 数据库连表查_字段_02


成绩表(科目编号,科目名称,学生编号,学生的本科目成绩):

mysql 连表查询 b不存在的数据 数据库连表查_等值连接_03

  • 自然连接

前面,我们在两个或多个表进行查询时,往往需要在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

查询结果相同:

mysql 连表查询 b不存在的数据 数据库连表查_连接查询_04


相比较而言,自然连接更加简单,但是笔者建议不要使用自然连接,因为虽然它简单,但是对于多张表的复杂数据查询它就没那么智能了,肯定会出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('语文','英语')

来看看结果吧:

mysql 连表查询 b不存在的数据 数据库连表查_等值连接_05

怎末样,很爽有木有,当然你要想让查询的成绩不低于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