mysql/mariadb学习记录——连接查询(JOIN)
2018-06-18 01:25:36来源:未知 阅读 ()
//本文使用的数据表格
//persons表中id_p为主键
//orders表中id_o为主键,id_p为外键参考persons表中的id_p
mysql> select * from persons;select * from orders; +------+----------+-----------+----------------+----------+ | id_p | lastname | firstname | address | city | +------+----------+-----------+----------------+----------+ | 1 | Adams | John | Oxford Street | London | | 2 | Bush | George | Fifth Avenue | New York | | 3 | Carter | Thomas | Changan Street | Beijing | +------+----------+-----------+----------------+----------+ 3 rows in set (0.05 sec) +------+---------+------+ | id_o | orderNo | id_p | +------+---------+------+ | 1 | 77895 | 3 | | 2 | 44678 | 3 | | 3 | 22456 | 1 | | 4 | 24562 | 1 | | 5 | 34764 | 65 | +------+---------+------+ 5 rows in set (0.05 sec)
1.内连接 [inner] join:
内连接也叫连接,或者自然连接:
//inner可删 mysql> select lastname,firstname,orderNo from persons inner join orders on persons.id_p=orders.id_p order by lastname; +----------+-----------+---------+ | lastname | firstname | orderNo | +----------+-----------+---------+ | Adams | John | 24562 | | Adams | John | 22456 | | Carter | Thomas | 77895 | | Carter | Thomas | 44678 | +----------+-----------+---------+ //使用where达到同样的效果 mysql> select lastname,firstname,orderNo from persons,orders where persons.id_p=orders.id_p; +----------+-----------+---------+ | lastname | firstname | orderNo | +----------+-----------+---------+ | Carter | Thomas | 77895 | | Carter | Thomas | 44678 | | Adams | John | 22456 | | Adams | John | 24562 | +----------+-----------+---------+
2.左连接 left [outer] join:
先看左连接的语句与查询结果
//outer可删去 mysql> select lastname,firstname,orderNo from persons left join orders on persons.id_p=orders.id_p order by lastname; +----------+-----------+---------+ | lastname | firstname | orderNo | +----------+-----------+---------+ | Adams | John | 24562 | | Adams | John | 22456 | | Bush | George | NULL | | Carter | Thomas | 77895 | | Carter | Thomas | 44678 | +----------+-----------+---------+
通过这个结果我们可以发现lastname为Bush没有orderNo,而lastname,firstname属性是来自persons表,orderNo属性是来自orders表可见左连接的作用时把在left join 左边persons表格的所有信息都显示出来,即使是没有和left join右边的表 orders中字段相匹配的信息也显示出来,并且给orderNo的值填为NULL。
如果把left join两侧的 persons和 orders位置互换那么结果显示的就是left join 左边表orders表的所有信息,同时把未匹配到的left join右边表persons中的lastname与firstname值置为NULL,这个结果与未交换join两个表名位置的右连接的结果一致。
//将left join两侧的 persons和 orders位置互换 mysql> select lastname,firstname,orderNo from orders left join persons on persons.id_p=orders.id_p order by lastname; +----------+-----------+---------+ | lastname | firstname | orderNo | +----------+-----------+---------+ | NULL | NULL | 34764 | | Adams | John | 24562 | | Adams | John | 22456 | | Carter | Thomas | 44678 | | Carter | Thomas | 77895 | +----------+-----------+---------+
3.右连接 right [outer] join:
//outer可删去 mysql> select lastname,firstname,orderNo from persons right outer join orders on persons.id_p=orders.id_p order by lastname; +----------+-----------+---------+ | lastname | firstname | orderNo | +----------+-----------+---------+ | NULL | NULL | 34764 | | Adams | John | 22456 | | Adams | John | 24562 | | Carter | Thomas | 77895 | | Carter | Thomas | 44678 | +----------+-----------+---------+
同理与左连接,结果显示的就是right join 左边表persons表的所有信息,同时把未匹配到的right join右边表orders中的orderNo值置为NULL。
4.全连接full join(不过mysql/mariadb不支持)
全连接则是把两个表的信息全部显示出来,无论两个表的信息匹配与否,未匹配上的信息都置为NULL。
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
下一篇:Mysql精华版(命令大全)
- MySQL replace函数怎么替换字符串语句 2020-03-09
- PHP访问MySQL查询超时怎么办 2020-03-09
- mysql登录时闪退 2020-02-27
- MySQL出现1067错误号 2020-02-27
- mysql7.x如何单独安装mysql 2020-02-27
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash