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有关联的多表查询)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Nginx笔记-Nginx中进程结构及使
- 下一篇: Spring Boot笔记-通过反射获取