• 连接关系是关系数据库模型的主要特点。也是最主要的查询,主要包括内连接、外连接等。
  • 通过连接运算符可以实现多个表查询。
  • 在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在一个表中。当查询数据时,通过连接操作查询出存放在多个表中不同实体的信息。当两个或多个表中存在相同意义的字段时,便可以通过这些字段对不同的表进行连接查询。

下面介绍多表之间的三种连接方式:

(1)内连接查询
(2)外连接查询
(3)复合条件连接查询


(1)内连接查询(inner join)
  • 内连接使用比较运算符进行表间某(某些)列数据的比较操作,并列出这些表中与连接条件向匹配的数据行,组成新纪录,也就是说,在内连接查询中,只有满足条件的记录才能出现在结果关系中。

下面创建数据表suppliers进行演示:

mysql> create table suppliers-> (-> s_id int not null auto_increment,-> s_name char(50) not null,-> s_city char(50) null,-> s_zip char(10) null,-> s_call char(50) not null,-> primary key(s_id)-> );
Query OK, 0 rows affected (0.17 sec)mysql> insert into suppliers(s_id,s_name,s_city,s_zip,s_call)-> values(101,'FastFruit Inc.','Tianjin','300000','48075'),-> (102,'LT Supplies','Chongqing','400000','44333'),-> (103,'ACME','Shanghai','200000','90046'),-> (104,'FNK Inc.','Zhongshan','528437','11111'),-> (105,'Good Set','Taiyuan','030000','22222'),-> (106,'Just Eat Ours','Beijing','010','45678'),-> (107,'DK Inc','Zhengzhou','450000','33332');
Query OK, 7 rows affected (0.07 sec)
Records: 7  Duplicates: 0  Warnings: 0

【例1】在fruits表和suppliers表之间使用内连接查询。

mysql> desc fruits;
+---------+--------------+------+-----+---------+-------+
| Field   | Type         | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+-------+
| f_id    | char(10)     | NO   | PRI | NULL    |       |
| s_id    | int(11)      | NO   |     | NULL    |       |
| f_name  | char(255)    | NO   |     | NULL    |       |
| f_price | decimal(8,2) | NO   |     | NULL    |       |
+---------+--------------+------+-----+---------+-------+
4 rows in set (0.06 sec)mysql> desc suppliers;
+--------+----------+------+-----+---------+----------------+
| Field  | Type     | Null | Key | Default | Extra          |
+--------+----------+------+-----+---------+----------------+
| s_id   | int(11)  | NO   | PRI | NULL    | auto_increment |
| s_name | char(50) | NO   |     | NULL    |                |
| s_city | char(50) | YES  |     | NULL    |                |
| s_zip  | char(10) | YES  |     | NULL    |                |
| s_call | char(50) | NO   |     | NULL    |                |
+--------+----------+------+-----+---------+----------------+
5 rows in set (0.00 sec)

可以看到fruits和suppliers表中都有相同数据类型的字段s_id,两个表通过s_id字段建立联系。

接下来从fruits表中查询f_name、f_price字段,从suppliers表中查询s_id、s_name,SQL语句如下:

mysql> select suppliers.s_id,s_name,f_name,f_price-> from fruits,suppliers-> where fruits.s_id=suppliers.s_id;
+------+----------------+------------+---------+
| s_id | s_name         | f_name     | f_price |
+------+----------------+------------+---------+
|  104 | FNK Inc.       | lemon      |    6.40 |
|  101 | FastFruit Inc. | apple      |    5.20 |
|  103 | ACME           | apricot    |    2.20 |
|  101 | FastFruit Inc. | blackberry |   10.20 |
|  104 | FNK Inc.       | berry      |    7.60 |
|  107 | DK Inc         | xxxx       |    3.60 |
|  102 | LT Supplies    | orange     |   11.20 |
|  105 | Good Set       | melon      |    8.20 |
|  101 | FastFruit Inc. | cherry     |    3.20 |
|  106 | Just Eat Ours  | mango      |   15.70 |
|  105 | Good Set       | xbabay     |    2.60 |
|  105 | Good Set       | xxtt       |   11.60 |
|  103 | ACME           | coconut    |    9.20 |
|  102 | LT Supplies    | banana     |   10.30 |
|  102 | LT Supplies    | grape      |    5.30 |
|  107 | DK Inc         | xbabay     |    3.60 |
+------+----------------+------------+---------+
16 rows in set (0.00 sec)
  • 注意:因为fruits表和suppliers表中有相同的字段s_id,因此在比较的时候,需要完全限定表名,格式为"表名.列名",如果只给出s_id,MySQL将不知道指的是哪一个,并返回错误信息。

【例2】在fruits表和suppliers表之间,使用inner join语法进行内连接查询,SQL语句如下:

mysql> select suppliers.s_id,s_name,f_name,f_price-> from fruits inner join suppliers-> on fruits.s_id = suppliers.s_id;
+------+----------------+------------+---------+
| s_id | s_name         | f_name     | f_price |
+------+----------------+------------+---------+
|  104 | FNK Inc.       | lemon      |    6.40 |
|  101 | FastFruit Inc. | apple      |    5.20 |
|  103 | ACME           | apricot    |    2.20 |
|  101 | FastFruit Inc. | blackberry |   10.20 |
|  104 | FNK Inc.       | berry      |    7.60 |
|  107 | DK Inc         | xxxx       |    3.60 |
|  102 | LT Supplies    | orange     |   11.20 |
|  105 | Good Set       | melon      |    8.20 |
|  101 | FastFruit Inc. | cherry     |    3.20 |
|  106 | Just Eat Ours  | mango      |   15.70 |
|  105 | Good Set       | xbabay     |    2.60 |
|  105 | Good Set       | xxtt       |   11.60 |
|  103 | ACME           | coconut    |    9.20 |
|  102 | LT Supplies    | banana     |   10.30 |
|  102 | LT Supplies    | grape      |    5.30 |
|  107 | DK Inc         | xbabay     |    3.60 |
+------+----------------+------------+---------+
16 rows in set (0.00 sec)
  • 使用where子句定义连接条件比较简单明了,而inner join语法是ANSI SQL 的标准规范,使用inner join连接语法能够确保不会忘记连接条件,而且,where子句在某些时候回影响查询的性能。

如果在一个连接查询中涉及的两个表都是同一个表,name这种查询称为自连接查询。自连接是一种特殊的内连接,是指相互连接的表在物理上为同一张表,但可以在逻辑上分为两张表。

【例3】查询供应f_id='a1'的水果供应商提供的水果种类,SQL语句如下:

mysql> select f1.f_id,f1.f_name-> from fruits as f1,fruits as f2-> where f1.s_id =f2.s_id and f2.f_id ='a1';
+------+------------+
| f_id | f_name     |
+------+------------+
| a1   | apple      |
| b1   | blackberry |
| c0   | cherry     |
+------+------------+
3 rows in set (0.00 sec)

(2)外连接查询
  • 外连接查询将查询多个表中相关联的行。
  • 内连接时,返回查询结果集合中的仅是符合查询条件和连接条件的行。但有时候需要包含没有关联的行中数据,即返回查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外连接或左连接)、右表(右外连接或右连接)或两个边接表(全外连接)中的所有数据行。外连接分为左外连接或左连接和右外连接或右连接:

①左连接:返回包括左表中的所有记录和右表中连接字段相等的记录。
②右连接:返回包括右表中的记录和左表中连接字段相等的记录。

1.左连接left join

首先创建表orders,SQL语句如下;

mysql> create table orders-> (-> o_num int not null auto_increment,-> o_date datetime not null,-> c_id int not null,-> primary key (o_num)-> );
Query OK, 0 rows affected (0.11 sec)mysql> insert into orders(o_num,o_date,c_id)-> values(30001,'2008-09-01',10001),-> (30002,'2008-09-12',10003),-> (30003,'2008-09-30',10004),-> (30004,'2008-10-03',10005),-> (30005,'2008-10-08',10001);
Query OK, 5 rows affected (0.06 sec)
Records: 5  Duplicates: 0  Warnings: 0

【例】在customers表和orders表中,查询所有客户,包括没有订单的客户,SQL语句如下:


mysql> select * from customers;
+-------+----------+---------------------+---------+--------+-----------+-------------------+
| c_id  | c_name   | c_address           | c_city  | c_zip  | c_contact | c_email           |
+-------+----------+---------------------+---------+--------+-----------+-------------------+
| 10001 | redhool  | 200 Street          | Tianjin | 300000 | LiMing    | LMing@163.com     |
| 10002 | Stars    | 333 Fromage Lane    | Dalian  | 116000 | Zhangbo   | Jerry@hotmail.com |
| 10003 | Netbhood | 1 Sunny Place       | Qingdao | 266000 | LuoCong   | NULL              |
| 10004 | JOTO     | 829 Riverside Drive | Haikou  | 570000 | YangShan  | sam@hotmail.com   |
+-------+----------+---------------------+---------+--------+-----------+-------------------+
4 rows in set (0.00 sec)mysql> select * from orders;
+-------+---------------------+-------+
| o_num | o_date              | c_id  |
+-------+---------------------+-------+
| 30001 | 2008-09-01 00:00:00 | 10001 |
| 30002 | 2008-09-12 00:00:00 | 10003 |
| 30003 | 2008-09-30 00:00:00 | 10004 |
| 30004 | 2008-10-03 00:00:00 | 10005 |
| 30005 | 2008-10-08 00:00:00 | 10001 |
+-------+---------------------+-------+
5 rows in set (0.00 sec)mysql>  select customers.c_id , orders.o_num-> from customers left outer join orders-> on customers.c_id = orders.c_id;
+-------+-------+
| c_id  | o_num |
+-------+-------+
| 10001 | 30001 |
| 10003 | 30002 |
| 10004 | 30003 |
| 10001 | 30005 |
| 10002 |  NULL |
+-------+-------+
5 rows in set (0.00 sec)

2.右连接right join

  • 右连接是左连接的反向连接,将返回右表的所有行。如果右表的某行在左表中没有匹配行,左表将返回空值。

【例】在customers表和orders表中,查询所有订单,包括没有客户的订单,SQL语句如下:

mysql> select customers.c_id, orders.o_num-> from customers right outer join orders-> on customers.c_id = orders.c_id;
+-------+-------+
| c_id  | o_num |
+-------+-------+
| 10001 | 30001 |
| 10003 | 30002 |
| 10004 | 30003 |
|  NULL | 30004 |
| 10001 | 30005 |
+-------+-------+
5 rows in set (0.00 sec)

(3)复合条件连接查询
  • 复合条件连接查询是在连接查询的过程中,通过添加过滤条件,限制查询结果,使查询的结果更加准确。

【例1】在customers表和orders表中,使用inner join语法查询customers表汇总ID为10001的客户的订单信息,SQL语句如下:

mysql> select customers.c_id,orders.o_num-> from customers inner join orders-> on customers.c_id = orders.c_id and customers.c_id = 10001;
+-------+-------+
| c_id  | o_num |
+-------+-------+
| 10001 | 30001 |
| 10001 | 30005 |
+-------+-------+
2 rows in set (0.00 sec)

【例2】在fruits表和suppliers表之间,使用inner join语法进行内连接查询,并对查询结果排序,SQL语句如下:

mysql> select suppliers.s_id,s_name,f_name,f_price-> from fruits inner join suppliers-> on fruits.s_id = suppliers.s_id-> order by fruits.s_id;
+------+----------------+------------+---------+
| s_id | s_name         | f_name     | f_price |
+------+----------------+------------+---------+
|  101 | FastFruit Inc. | apple      |    5.20 |
|  101 | FastFruit Inc. | blackberry |   10.20 |
|  101 | FastFruit Inc. | cherry     |    3.20 |
|  102 | LT Supplies    | orange     |   11.20 |
|  102 | LT Supplies    | banana     |   10.30 |
|  102 | LT Supplies    | grape      |    5.30 |
|  103 | ACME           | apricot    |    2.20 |
|  103 | ACME           | coconut    |    9.20 |
|  104 | FNK Inc.       | lemon      |    6.40 |
|  104 | FNK Inc.       | berry      |    7.60 |
|  105 | Good Set       | melon      |    8.20 |
|  105 | Good Set       | xbabay     |    2.60 |
|  105 | Good Set       | xxtt       |   11.60 |
|  106 | Just Eat Ours  | mango      |   15.70 |
|  107 | DK Inc         | xxxx       |    3.60 |
|  107 | DK Inc         | xbabay     |    3.60 |
+------+----------------+------------+---------+
16 rows in set (0.00 sec)

MySQL数据查询---连接查询相关推荐

  1. MySQL数据库内连接查询inner join...on

    1. 连接查询介绍 连接查询可以实现多个表的查询,当查询的字段数据来自不同的表就可以使用连接查询来完成. 连接查询可以分为: 内连接查询 左连接查询 右连接查询 自连接查询 2. 内连接查询 查询两个 ...

  2. php mysql 查询数据出现连接重置_php使用mysql和mysqli连接查询数据

    mysqli: $code = $_POST['code']; $status = ""; $success = ""; $scookies = "& ...

  3. 明了的 —— Mysql 多表连接查询

    Mysql 多表连接查询 每博一文案 看过这样一句话,我一直在寻找一个人能,在寒冷的日子里 牵起一双温暖的手,踏实向前走,但若是找了很久都没有寻到, 我便不再相信这个世界有这样一个人的存在, 当一个人 ...

  4. MYSQL中的连接查询

    通过对DQL的学习,我们可以很轻松的从⼀张数据表中查询出需要的数据:在企业的应 ⽤开发中,我们经常需要从多张表中查询数据(例如:我们查询学⽣信息的时候需要同 时查询学⽣的班级信息),可以通过连接查询从 ...

  5. delete from删除几张表关联和mysql几种连接查询总结

    delete from删除几张表关联和mysql几种连接查询总结 一.delete from删除几张表关联 ① 在多表连接时删除数据(错误删除示例): delete from sys_role_men ...

  6. MySQL多表连接查询

    MySQL多表连接查询 1 什么是多表连接查询 2 表和表之间的关系 2.1 并 2.2 笛卡尔积 2.3 连接查询 3 查询操作 3.1 内连接查询 3.2 外连接查询(OUTER JOIN) 3. ...

  7. MySQL数据操作与查询笔记 • 【目录】

    持续更新中- 我的大学笔记>>> 章节 内容 第1章 MySQL数据操作与查询笔记 • [第1章 MySQL数据库基础] 第2章 MySQL数据操作与查询笔记 • [第2章 表结构管 ...

  8. 实验5 数据查询--连接查询

    实验5 数据查询--连接查询 一.实验目的 1.熟悉等值联接查询的方法. 2.熟悉非等值联接查询的方法. 3.熟悉自身联接查询的方法. 4.熟悉外联接查询的方法. 5.熟悉复合条件联接的方法. 二.实 ...

  9. MySQL数据通过SQL查询指定数据表的字段名及字段备注

    MySQL数据通过SQL查询指定数据表的字段名及字段备注 SELECT COLUMN_NAME,COLUMN_COMMENT FROM INFORMATION_SCHEMA.Columns WHERE ...

  10. MySQL多表连接查询——等值连接、非等值连接和自连接

    MySQL多表连接查询 1. 含义: 又称多表查询,当查询的字段来自于多个表时,就会用到连接查询 笛卡尔乘积现象: 表1 有m行,                               表2 有 ...

最新文章

  1. 【shell】shell编程(一)-入门
  2. Java 集合系列11: Hashtable深入解析(1)
  3. MyEclipse 报 String cannot be resolved to a type
  4. chrome 版本 29.0.1547.76 m 解决打开新标签页后的恶心页面的问题
  5. 网上订单管理-新增、修改
  6. python3+ selenium3开发环境搭建-手把手教你安装python(详细)
  7. 2层弹出页面刷新中间层
  8. Qemu(纯软实现)架构+KVM(基于kernel模拟硬件)原理(一)
  9. 1命名规则 sentinel_Sentinel 实战-限流篇
  10. 电商API,获得淘宝商品类目
  11. 海洋cms简洁免费下载视频网站正版原创自适应挖片模板
  12. lockdir 密码破解
  13. 如何用Python解析JSON数据
  14. 9860计算机测量程序,卡西欧9860测量放样程序-绘星
  15. 用python实现人脸识别毕设_用Python实现一个简单的人脸识别,原来我和这个明星如此相似...
  16. win10自带计算器怎么设置中文
  17. 退出计算机控制如何恢复,在您退出大势至U盘禁用软件、电脑U口屏蔽软件之后如何取消U盘写保护功能、恢复向U盘复制文件的功能?...
  18. 2020北航计算机夏令营
  19. 微信小程序AR扫描识别图(支持多图片)加载3D模型及其动画
  20. 使用kdevelop出现问题及解决

热门文章

  1. 计算机打印机无法共享怎么设置密码,打印机共享设置密码【调解思路】
  2. 【论文】针对图片过大问题,在不降低图片dpi的情况下缩小图片大小
  3. 智能垃圾桶语音芯片应用设计方案介绍,WT588F02B-8S
  4. python-docx文档高亮显示
  5. 巧用google实现快速搜索
  6. 电脑查看Windows的具体过期日期
  7. 浅谈晏殊几何学知识图谱技术
  8. Unity 百度语音识别
  9. 034:vue+openlayers上传KMZ文件并在map上解析(代码示例)
  10. matlab能否独立做程序,如何将MATLAB程序编译成独立可执行的程序