小编给大家分享一下MySQL数据查询之连接查询的案例,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

连接关系是关系数据库模型的主要特点。也是最主要的查询,主要包括内连接、外连接等。

通过连接运算符可以实现多个表查询。

在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在一个表中。当查询数据时,通过连接操作查询出存放在多个表中不同实体的信息。当两个或多个表中存在相同意义的字段时,便可以通过这些字段对不同的表进行连接查询。

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

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


(1)、内连接查询(inner join)

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

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

mysql>createtablesuppliers->(->s_idintnotnullauto_increment,->s_namechar(50)notnull,->s_citychar(50)null,->s_zipchar(10)null,->s_callchar(50)notnull,->primarykey(s_id)->);QueryOK,0rowsaffected(0.17sec)mysql>insertintosuppliers(s_id,s_name,s_city,s_zip,s_call)->values(101,'FastFruitInc.','Tianjin','300000','48075'),->(102,'LTSupplies','Chongqing','400000','44333'),->(103,'ACME','Shanghai','200000','90046'),->(104,'FNKInc.','Zhongshan','528437','11111'),->(105,'GoodSet','Taiyuan','030000','22222'),->(106,'JustEatOurs','Beijing','010','45678'),->(107,'DKInc','Zhengzhou','450000','33332');QueryOK,7rowsaffected(0.07sec)Records:7Duplicates:0Warnings:0

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

mysql>descfruits;+---------+--------------+------+-----+---------+-------+|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||+---------+--------------+------+-----+---------+-------+4rowsinset(0.06sec)mysql>descsuppliers;+--------+----------+------+-----+---------+----------------+|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||+--------+----------+------+-----+---------+----------------+5rowsinset(0.00sec)

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

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

mysql>selectsuppliers.s_id,s_name,f_name,f_price->fromfruits,suppliers->wherefruits.s_id=suppliers.s_id;+------+----------------+------------+---------+|s_id|s_name|f_name|f_price|+------+----------------+------------+---------+|104|FNKInc.|lemon|6.40||101|FastFruitInc.|apple|5.20||103|ACME|apricot|2.20||101|FastFruitInc.|blackberry|10.20||104|FNKInc.|berry|7.60||107|DKInc|xxxx|3.60||102|LTSupplies|orange|11.20||105|GoodSet|melon|8.20||101|FastFruitInc.|cherry|3.20||106|JustEatOurs|mango|15.70||105|GoodSet|xbabay|2.60||105|GoodSet|xxtt|11.60||103|ACME|coconut|9.20||102|LTSupplies|banana|10.30||102|LTSupplies|grape|5.30||107|DKInc|xbabay|3.60|+------+----------------+------------+---------+16rowsinset(0.00sec)

注意:因为fruits表和suppliers表中有相同的字段s_id,因此在比较的时候,需要完全限定表名,格式为"表名.列名",如果只给出s_id,MySQL将不知道指的是哪一个,并返回错误信息。

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

mysql>selectsuppliers.s_id,s_name,f_name,f_price->fromfruitsinnerjoinsuppliers->onfruits.s_id=suppliers.s_id;+------+----------------+------------+---------+|s_id|s_name|f_name|f_price|+------+----------------+------------+---------+|104|FNKInc.|lemon|6.40||101|FastFruitInc.|apple|5.20||103|ACME|apricot|2.20||101|FastFruitInc.|blackberry|10.20||104|FNKInc.|berry|7.60||107|DKInc|xxxx|3.60||102|LTSupplies|orange|11.20||105|GoodSet|melon|8.20||101|FastFruitInc.|cherry|3.20||106|JustEatOurs|mango|15.70||105|GoodSet|xbabay|2.60||105|GoodSet|xxtt|11.60||103|ACME|coconut|9.20||102|LTSupplies|banana|10.30||102|LTSupplies|grape|5.30||107|DKInc|xbabay|3.60|+------+----------------+------------+---------+16rowsinset(0.00sec)

使用where子句定义连接条件比较简单明了,而inner join语法是ANSI SQL 的标准规范,使用inner join连接语法能够确保不会忘记连接条件,而且,where子句在某些时候回影响查询的性能。

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

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

mysql>selectf1.f_id,f1.f_name->fromfruitsasf1,fruitsasf2->wheref1.s_id=f2.s_idandf2.f_id='a1';+------+------------+|f_id|f_name|+------+------------+|a1|apple||b1|blackberry||c0|cherry|+------+------------+3rowsinset(0.00sec)


(2)、外连接查询

外连接查询将查询多个表中相关联的行。

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

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

1.左连接left join

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

mysql>createtableorders->(->o_numintnotnullauto_increment,->o_datedatetimenotnull,->c_idintnotnull,->primarykey(o_num)->);QueryOK,0rowsaffected(0.11sec)mysql>insertintoorders(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);QueryOK,5rowsaffected(0.06sec)Records:5Duplicates:0Warnings:0

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

mysql>select*fromcustomers;+-------+----------+---------------------+---------+--------+-----------+-------------------+|c_id|c_name|c_address|c_city|c_zip|c_contact|c_email|+-------+----------+---------------------+---------+--------+-----------+-------------------+|10001|redhool|200Street|Tianjin|300000|LiMing|LMing@163.com||10002|Stars|333FromageLane|Dalian|116000|Zhangbo|Jerry@hotmail.com||10003|Netbhood|1SunnyPlace|Qingdao|266000|LuoCong|NULL||10004|JOTO|829RiversideDrive|Haikou|570000|YangShan|sam@hotmail.com|+-------+----------+---------------------+---------+--------+-----------+-------------------+4rowsinset(0.00sec)mysql>select*fromorders;+-------+---------------------+-------+|o_num|o_date|c_id|+-------+---------------------+-------+|30001|2008-09-0100:00:00|10001||30002|2008-09-1200:00:00|10003||30003|2008-09-3000:00:00|10004||30004|2008-10-0300:00:00|10005||30005|2008-10-0800:00:00|10001|+-------+---------------------+-------+5rowsinset(0.00sec)mysql>selectcustomers.c_id,orders.o_num->fromcustomersleftouterjoinorders->oncustomers.c_id=orders.c_id;+-------+-------+|c_id|o_num|+-------+-------+|10001|30001||10003|30002||10004|30003||10001|30005||10002|NULL|+-------+-------+5rowsinset(0.00sec)

2.右连接right join

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

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

mysql>selectcustomers.c_id,orders.o_num->fromcustomersrightouterjoinorders->oncustomers.c_id=orders.c_id;+-------+-------+|c_id|o_num|+-------+-------+|10001|30001||10003|30002||10004|30003||NULL|30004||10001|30005|+-------+-------+5rowsinset(0.00sec)


(3)、复合条件连接查询

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

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

mysql>selectcustomers.c_id,orders.o_num->fromcustomersinnerjoinorders->oncustomers.c_id=orders.c_idandcustomers.c_id=10001;+-------+-------+|c_id|o_num|+-------+-------+|10001|30001||10001|30005|+-------+-------+2rowsinset(0.00sec)

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

mysql>selectsuppliers.s_id,s_name,f_name,f_price->fromfruitsinnerjoinsuppliers->onfruits.s_id=suppliers.s_id->orderbyfruits.s_id;+------+----------------+------------+---------+|s_id|s_name|f_name|f_price|+------+----------------+------------+---------+|101|FastFruitInc.|apple|5.20||101|FastFruitInc.|blackberry|10.20||101|FastFruitInc.|cherry|3.20||102|LTSupplies|orange|11.20||102|LTSupplies|banana|10.30||102|LTSupplies|grape|5.30||103|ACME|apricot|2.20||103|ACME|coconut|9.20||104|FNKInc.|lemon|6.40||104|FNKInc.|berry|7.60||105|GoodSet|melon|8.20||105|GoodSet|xbabay|2.60||105|GoodSet|xxtt|11.60||106|JustEatOurs|mango|15.70||107|DKInc|xxxx|3.60||107|DKInc|xbabay|3.60|+------+----------------+------------+---------+16rowsinset(0.00sec)

以上是“MySQL数据查询之连接查询的案例”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!