10.4 连接查询
连接査询是将两个或两个以上的表按某个条件连接起来,从中选取需要的数据。连接查询是同时查询两个或两个以上的表时使用的。当不同的表中存在表示相同意义的字段时, 可以通过该字段来连接这几个表。例如,学生表中有course_id字段来表示所学课程的课程号,课程表中有num字段来表示课程号。那么,可以通过学生表中的course_id字段与课程表中的num字段来进行连接査询。连接查询包括内连接查询和外连接查询。本小节将详 细讲解内连接查询和外连接査询。同时,还会讲解多个条件结合在一起进行复合连接查询。
10.4.1内连接查询
内连接查询是一种最常用的连接查询。内连接査询可以査询两个或两个以上的表。为了读者更好的理解,暂时只讲解两个表的连接查询。当两个表中存在表示相同意义的字段时,可以通过该字段来连接这两个表;当该字段的值相等时,就查询出该记录。
说明:两个表中表示相同意义的字段可以是指父表的主键和子表的外键。例如,student 表中id字段表示学生的学号,并且id字段是student表的主键。grade表的stu_id字段也表示学生的学号。而且,stu_id字段是grade表的外键。stu_id字段依赖于student表的id字段。那么,这两个字段有相同的意义。
【示例10-51】下面使用内连接査询的方式査询employee表和department。在执行内连接查询之前,先分别查看employee表和department表中的记录,以便进行比较。查询结果如下:
mysql> select * from employee; +-----+------+------+-----+-----+--------------+ | num | d_id | name | age | sex | homeaddr | +-----+------+------+-----+-----+--------------+ | 1 | 1001 | 张三 | 26 | 男 | 北京市海淀区 | | 2 | 1002 | 李四 | 24 | 女 | 北京市昌平区 | | 3 | 1003 | 王五 | 25 | 男 | 湖南省长沙市 | | 4 | 1004 | Aric | 15 | 男 | England | +-----+------+------+-----+-----+--------------+ 4 rows in set (0.00 sec)
mysql> select * from department; +------+--------+--------------+---------------+ | d_id | d_name | function | address | +------+--------+--------------+---------------+ | 1001 | 科研部 | 新产品研发 | 3号楼5层 | | 1002 | 生产部 | 主管生产 | 5号楼1层 | | 1003 | 销售部 | 负责产品销售 | 1号楼销售大厅 | +------+--------+--------------+---------------+ 3 rows in set (0.00 sec)
查询结果显示,employee表和department表的d_id字段都是表示部门号。通过d_id 字段可以将employee表和department表进行内连接查询。从employee表中查询出num、name、d_id、age和sex这几个字段。从department表中查询出d_name和function这两个字段。内连接查询的SELECT语句如下:
SELECT num,name,employee.d_id,age,sex,d_name,function FROM employee, department WHERE employee.d_id=department.d_id;
SQL语句执行如下:
mysql> SELECT num,name,employee.d_id,age,sex,d_name,function FROM employee, department WHERE employee.d_id=department.d id; +-----+------+------+-----+-----+--------+--------------+ | num | name | d_id | age | sex | d_name | function | +-----+------+------+-----+-----+--------+--------------+ | 1 | 张三 | 1001 | 26 | 男 | 科研部 | 新产品研发 | | 2 | 李四 | 1002 | 24 | 女 | 生产部 | 主管生产 | | 3 | 王五 | 1003 | 25 | 男 | 销售部 | 负责产品销售 | +-----+------+------+-----+-----+--------+--------------+ 3 rows in set (0.01 sec)
查询结果共显示了3条记录。这3条记录的数据是从employee表和department表中取出来的。这3条记录的d_id字段的取值分别为1001和1002。employee表中d_id字段取值为1004的记录没有被查询,因为department表中没有d_id等于1004的记录。而department表中d_id字段取值为1003的记录没有被查询,因为employee表中没有d_id等于1003的记录。通过本例可以看出,只有表中有意义相同的字段时才能进行连接。而且,内连接查询只查询出指定字段取值相同的记录。
10.4.2外连接查询
外连接查询可以查询两个或两个以上的表。外连接查询也需要通过指定字段来进行连接。当该字段取值相等时,可以查询出该记录。而且,该字段取值不相等的记录也可以查询出来。外连接查询包括左连接查询和右连接查询。其基本语法如下:
SELECT属性名列表 FROM 表名1 LEFT | RIGHT JOIN 表名2 ON表名1.属性名1=表名2.属性名2 ;
其中,“属性名列表”参数表示要查询的字段的名称,这些字段可以来自不同的表; “表名1”和“表名2”参数表示将这两个表进行外连接;LEFT参数表示进行左连接查询; RIGHT参数表示进行右连接查询;ON后面接的就是连接条件;“属性名1”参数是“表 名1”中的一个字段,用“_”符号来表示字段属于哪个表;“属性名2”参数是“表名2” 中的一个字段.