MySQL筆記-左連線的使用(left join有關聯的多表查詢)

IT1995發表於2019-05-20

目錄

 

 

背景

使用的景場

程式碼及演示


 

背景

最近時不時都要去弄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 */;


 

相關文章