Mysql教程

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” 中的一个字段.

关注微信获取最新动态