MySQL筆記-左連線的使用(left join有關聯的多表查詢)
目錄
背景
最近時不時都要去弄MySQL資料庫,不僅僅工作要用到,接的私活裡面,也有很多時候要使用MySQL資料庫。
在此記錄下這個left join的功能,因為十分有用。
使用的景場
在資料庫裡面,因為某些表存在外來鍵的關聯,比如一個人住了某個房子,這個房子裡面還有很多資訊,這個時候。
如果要查詢,某個這個人的資訊,以及他所居住的房子的資訊,以一列來顯示,那麼使用left join將會是一個很好的查詢方式;
程式碼及演示
如下的資料庫結構,程式碼將在本文的末尾給出:
這裡面每一個表都有一個id,是主鍵。
其中borrow表如下:
他的studentID是外來鍵,內容為student的主鍵
他的bookID是外來鍵,內容為books的主鍵
下面來看下role和student中的內容:
這裡為什麼要把stauts管理role的外來鍵呢?如果role要進行增加,並且還有其他表要使用,那麼這種方式,只需增加或修改role表,其他的表將不會收到什麼影響;
如果現在有這樣的功能,查詢所有的學生,並且把他們的職位也顯示上去,如果是這樣的SQL將會有個問題:
SELECT student.id, student.name, student.sex, role.name FROM student, role
從中可以看到,student表中所有資料,和role表中的所有資料對應了,造成了出現了7*4=28個結果;
這樣是不對的,應該使用左連結,顧名思義,使用左連結就可以把status換成指定職位,SQL如下:
SELECT student.id, student.name, student.sex, role.name FROM student LEFT JOIN role ON role.id=student.status
這種才是想要的結果;
比如現在再來個例子,這裡有個借書表,內容如下:
其中studentID為student的主鍵,bookID為books的主鍵。
其中books內容如下:
這裡在剛剛sql語句的基礎上,提出一個新的需求,顯示出學生的資訊和職位,以及接過書的資訊
SQL如下:
SELECT student.id, student.name, student.sex, role.name, borrow.id FROM student LEFT JOIN role ON role.id=student.status LEFT JOIN borrow ON borrow.studentID=student.id
執行截圖如下:
這裡因為books和student是通過borrow錶連結的,並不是直接左相連。所以並不能直接用左連結!
可能也和自己的水平有關;
【注意,此處可以使用左連結進行查詢,本人已經弄出來了,在另外一篇博文中有說明:2019-05-20 14:01:41】
如果要查詢小紅借的書的資訊;
SELECT student.id, student.name, student.sex, role.name, borrow.id FROM student LEFT JOIN role ON role.id=student.status LEFT JOIN borrow ON borrow.studentID=student.id WHERE student.id=3;
執行截圖如下:
SQL程式碼如下:
/*
SQLyog Ultimate v11.24 (32 bit)
MySQL - 5.5.47 : Database - leftjointest
*********************************************************************
*/
/*!40101 SET NAMES utf8 */;
/*!40101 SET SQL_MODE=''*/;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
CREATE DATABASE /*!32312 IF NOT EXISTS*/`leftjointest` /*!40100 DEFAULT CHARACTER SET gbk */;
USE `leftjointest`;
/*Table structure for table `books` */
DROP TABLE IF EXISTS `books`;
CREATE TABLE `books` (
`id` int(11) NOT NULL,
`bookName` varchar(50) NOT NULL,
`author` varchar(50) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk;
/*Data for the table `books` */
insert into `books`(`id`,`bookName`,`author`) values (0,'十萬個為什麼','嘉良傳媒'),(1,'淘氣包馬小跳漫畫版','楊紅櫻'),(2,'丁丁歷險記','本書編寫組'),(3,'不可思議的事件簿6','雷歐幻像'),(4,'神奇校車橋樑書版','喬安娜·柯爾');
/*Table structure for table `borrow` */
DROP TABLE IF EXISTS `borrow`;
CREATE TABLE `borrow` (
`id` int(11) NOT NULL,
`studentID` int(11) NOT NULL,
`bookID` int(11) NOT NULL,
PRIMARY KEY (`id`),
KEY `studentID` (`studentID`),
KEY `bookID` (`bookID`),
CONSTRAINT `borrow_ibfk_1` FOREIGN KEY (`studentID`) REFERENCES `student` (`id`),
CONSTRAINT `borrow_ibfk_2` FOREIGN KEY (`bookID`) REFERENCES `books` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk;
/*Data for the table `borrow` */
insert into `borrow`(`id`,`studentID`,`bookID`) values (0,3,0),(1,3,1),(2,3,4),(3,1,4),(4,1,2);
/*Table structure for table `role` */
DROP TABLE IF EXISTS `role`;
CREATE TABLE `role` (
`id` int(11) NOT NULL,
`name` varchar(50) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk;
/*Data for the table `role` */
insert into `role`(`id`,`name`) values (1,'普通學生'),(2,'三好學生'),(3,'扛把子'),(4,'總扛把子');
/*Table structure for table `student` */
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL,
`sex` varchar(8) NOT NULL,
`status` int(11) NOT NULL,
PRIMARY KEY (`id`),
KEY `status` (`status`),
CONSTRAINT `student_ibfk_1` FOREIGN KEY (`status`) REFERENCES `role` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=gbk;
/*Data for the table `student` */
insert into `student`(`id`,`name`,`sex`,`status`) values (1,'小明','男',1),(3,'小紅','女',2),(4,'小黃','男',1),(5,'小剛','男',3),(6,'小丁','男',1),(7,'小紫','女',1),(8,'大剛','男',4);
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
相關文章
- MYSQL 怎麼 LEFT JOIN 多表聯查MySql
- LEFT JOIN 和JOIN 多表連線
- MySql的join(連線)查詢 (三表 left join 寫法)MySql
- mysql INNER JOIN、LEFT JOIN、RIGHT JOIN;內連線(等值連線)、左連線、右連線MySql
- mysql常用連線查詢join,left,right,crossMySqlROS
- 連線查詢簡析 join 、 left join 、 right join
- sql 連線查詢例項(left join)三表連線查詢SQL
- mysql中的多表關聯查詢MySql
- MySQL多表關聯查詢MySql
- 三表關聯查詢-多次LEFT JOIN...ON
- sql語句左連結left join--3張表關聯SQL
- MYSQL學習筆記23: 多表查詢(自連線內連線+左右外連線)MySql筆記
- mysql新建表和多表查詢,關鍵字joinMySql
- 記錄一下使用左關聯的一次查詢(可樂的筆記)筆記
- MYSQL學習筆記24: 多表查詢(聯合查詢,Union, Union All)MySql筆記
- MYSQL count標量子查詢改left joinMySql
- thinkphp中的多表關聯查詢PHP
- MySQL筆記3——內連線/外連線、多表連線MySql筆記
- JPA多表關聯查詢
- MYSQL學習筆記26: 多表查詢|子查詢MySql筆記
- oracle update left join查詢Oracle
- MySQL學習筆記之多表連線MySql筆記
- 【janes】多表查詢 外連線
- Hibernate連線查詢join
- MySQL join連表查詢示例MySql
- MYSQL學習筆記25: 多表查詢(子查詢)[標量子查詢,列子查詢]MySql筆記
- Sql Server系列:多表連線查詢SQLServer
- SQL複雜查詢多表連線SQL
- 如何做多表關聯查詢
- 使用mybatis example 和 java 8的特性來實現多表關聯且帶有查詢條件的查詢MyBatisJava
- SQL三表左關聯查詢SQL
- oracle left outer join(左聯接)顯示全部的課堂收藏資訊Oracle
- SQL中聯表查詢操作(LEFT JOIN, RIGHT JOIN, INNER JOIN)SQL
- mysql + left joinMySql
- 【MySQL】多表查詢MySql
- MySQL 多表查詢MySql
- mysql多表查詢MySql
- ThinkPHP5.0 使用 model 關聯查詢筆記PHP筆記