MySQL数据查询---连接查询
- 连接关系是关系数据库模型的主要特点。也是最主要的查询,主要包括内连接、外连接等。
- 通过连接运算符可以实现多个表查询。
- 在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在一个表中。当查询数据时,通过连接操作查询出存放在多个表中不同实体的信息。当两个或多个表中存在相同意义的字段时,便可以通过这些字段对不同的表进行连接查询。
下面介绍多表之间的三种连接方式:
(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数据查询---连接查询相关推荐
- MySQL数据库内连接查询inner join...on
1. 连接查询介绍 连接查询可以实现多个表的查询,当查询的字段数据来自不同的表就可以使用连接查询来完成. 连接查询可以分为: 内连接查询 左连接查询 右连接查询 自连接查询 2. 内连接查询 查询两个 ...
- php mysql 查询数据出现连接重置_php使用mysql和mysqli连接查询数据
mysqli: $code = $_POST['code']; $status = ""; $success = ""; $scookies = "& ...
- 明了的 —— Mysql 多表连接查询
Mysql 多表连接查询 每博一文案 看过这样一句话,我一直在寻找一个人能,在寒冷的日子里 牵起一双温暖的手,踏实向前走,但若是找了很久都没有寻到, 我便不再相信这个世界有这样一个人的存在, 当一个人 ...
- MYSQL中的连接查询
通过对DQL的学习,我们可以很轻松的从⼀张数据表中查询出需要的数据:在企业的应 ⽤开发中,我们经常需要从多张表中查询数据(例如:我们查询学⽣信息的时候需要同 时查询学⽣的班级信息),可以通过连接查询从 ...
- delete from删除几张表关联和mysql几种连接查询总结
delete from删除几张表关联和mysql几种连接查询总结 一.delete from删除几张表关联 ① 在多表连接时删除数据(错误删除示例): delete from sys_role_men ...
- MySQL多表连接查询
MySQL多表连接查询 1 什么是多表连接查询 2 表和表之间的关系 2.1 并 2.2 笛卡尔积 2.3 连接查询 3 查询操作 3.1 内连接查询 3.2 外连接查询(OUTER JOIN) 3. ...
- MySQL数据操作与查询笔记 • 【目录】
持续更新中- 我的大学笔记>>> 章节 内容 第1章 MySQL数据操作与查询笔记 • [第1章 MySQL数据库基础] 第2章 MySQL数据操作与查询笔记 • [第2章 表结构管 ...
- 实验5 数据查询--连接查询
实验5 数据查询--连接查询 一.实验目的 1.熟悉等值联接查询的方法. 2.熟悉非等值联接查询的方法. 3.熟悉自身联接查询的方法. 4.熟悉外联接查询的方法. 5.熟悉复合条件联接的方法. 二.实 ...
- MySQL数据通过SQL查询指定数据表的字段名及字段备注
MySQL数据通过SQL查询指定数据表的字段名及字段备注 SELECT COLUMN_NAME,COLUMN_COMMENT FROM INFORMATION_SCHEMA.Columns WHERE ...
- MySQL多表连接查询——等值连接、非等值连接和自连接
MySQL多表连接查询 1. 含义: 又称多表查询,当查询的字段来自于多个表时,就会用到连接查询 笛卡尔乘积现象: 表1 有m行, 表2 有 ...
最新文章
- 【shell】shell编程(一)-入门
- Java 集合系列11: Hashtable深入解析(1)
- MyEclipse 报 String cannot be resolved to a type
- chrome 版本 29.0.1547.76 m 解决打开新标签页后的恶心页面的问题
- 网上订单管理-新增、修改
- python3+ selenium3开发环境搭建-手把手教你安装python(详细)
- 2层弹出页面刷新中间层
- Qemu(纯软实现)架构+KVM(基于kernel模拟硬件)原理(一)
- 1命名规则 sentinel_Sentinel 实战-限流篇
- 电商API,获得淘宝商品类目
- 海洋cms简洁免费下载视频网站正版原创自适应挖片模板
- lockdir 密码破解
- 如何用Python解析JSON数据
- 9860计算机测量程序,卡西欧9860测量放样程序-绘星
- 用python实现人脸识别毕设_用Python实现一个简单的人脸识别,原来我和这个明星如此相似...
- win10自带计算器怎么设置中文
- 退出计算机控制如何恢复,在您退出大势至U盘禁用软件、电脑U口屏蔽软件之后如何取消U盘写保护功能、恢复向U盘复制文件的功能?...
- 2020北航计算机夏令营
- 微信小程序AR扫描识别图(支持多图片)加载3D模型及其动画
- 使用kdevelop出现问题及解决