今天看啥  ›  专栏  ›  阮菜鸡

数据库学习之MySQL (十三)——多表查询 SQL92 SQL99 连接种类划分

阮菜鸡  · CSDN  ·  · 2020-02-02 12:16

MySQL学习专栏 正在持续更新中:)

多表问题

前面1~12节我们学习了单个表的 理解 ,以及各种查询的语句,
但是,实际应用中很可能是多表,
就比如我想做一个新型肺炎疫情的数据表,包含每个省确诊人数,死亡人数等栏目(列 属性)。那么每个省都需要一个表,等我需要后端调数据库的时候,总得把表联动,一起查询一波(比我想知道所有省加起来的总和以得到全国的数据 可以少爬一个网站)
总之就是,多表查询是实际运用中必不可少的。
我们先保存下面代码,然后在SQLyog执行一波:

/*
SQLyog Ultimate v10.00 Beta1
MySQL - 5.7.18-log : Database - data2
*********************************************************************
*/


/*!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*/`data2` /*!40100 DEFAULT CHARACTER SET utf8 */;

USE `data2`;

/*Table structure for table `admin` */

DROP TABLE IF EXISTS `admin`;

CREATE TABLE `admin` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(10) NOT NULL,
  `password` varchar(10) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

/*Data for the table `admin` */

insert  into `admin`(`id`,`username`,`password`) values (1,'john','8888'),(2,'lyt','6666');

/*Table structure for table `beauty` */

DROP TABLE IF EXISTS `beauty`;

CREATE TABLE `beauty` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL,
  `sex` char(1) DEFAULT '女',
  `borndate` datetime DEFAULT '1987-01-01 00:00:00',
  `phone` varchar(11) NOT NULL,
  `photo` blob,
  `boyfriend_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8;

/*Data for the table `beauty` */

insert  into `beauty`(`id`,`name`,`sex`,`borndate`,`phone`,`photo`,`boyfriend_id`) values (1,'柳岩','女','1988-02-03 00:00:00','18209876577',NULL,8),(2,'苍老师','女','1987-12-30 00:00:00','18219876577',NULL,9),(3,'Angelababy','女','1989-02-03 00:00:00','18209876567',NULL,3),(4,'热巴','女','1993-02-03 00:00:00','18209876579',NULL,2),(5,'周冬雨','女','1992-02-03 00:00:00','18209179577',NULL,9),(6,'周芷若','女','1988-02-03 00:00:00','18209876577',NULL,1),(7,'岳灵珊','女','1987-12-30 00:00:00','18219876577',NULL,9),(8,'小昭','女','1989-02-03 00:00:00','18209876567',NULL,1),(9,'双儿','女','1993-02-03 00:00:00','18209876579',NULL,9),(10,'王语嫣','女','1992-02-03 00:00:00','18209179577',NULL,4),(11,'夏雪','女','1993-02-03 00:00:00','18209876579',NULL,9),(12,'赵敏','女','1992-02-03 00:00:00','18209179577',NULL,1);

/*Table structure for table `boys` */

DROP TABLE IF EXISTS `boys`;

CREATE TABLE `boys` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `boyName` varchar(20) DEFAULT NULL,
  `userCP` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

/*Data for the table `boys` */

insert  into `boys`(`id`,`boyName`,`userCP`) values (1,'张无忌',100),(2,'鹿晗',800),(3,'黄晓明',50),(4,'段誉',300);

/*!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 */;

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73

执行完SQL语句,我们拥有了data2这个数据库

案例

现在
我们有个问题:下面这两张表,让id相同的男神和女神在一起(一行排列)该怎么办?不限定显示的栏目(列 属性)
在这里插入图片描述
在这里插入图片描述
很明显正确答案应该是只有4行,柳岩 - 张无忌 苍老师 - 鹿晗 这样的etc
我们该怎么实现?
一开始想 SQL应该会很智能:我这么写:

SELECT * FROM `beauty`,`boys` 
  • 1

应该会正确匹配吧?

笛卡尔乘积

然后结果是:
在这里插入图片描述

发现出来了48行,也就是女神的12行 * 男神的 4行 = 48行
这就是著名的 笛卡尔乘积现象(Cartesian product)
那怎么处理呢?

添加 连接条件

废话不说 看代码:

USE data2;
SELECT `name`,`boyname` FROM `beauty`,`boys`
WHERE beauty.`id` = boys.`id`;
  • 1
  • 2
  • 3

在这里插入图片描述
注意两个问题:
1 利用WHERE 添加连接条件
2 同名不同表的属性用点符号访问表对象区分
这里的语法非常契合对象语法,
把表做对象类,
列做属性,
行做类实例,
我们就是对每个实例进行操作,
判断方式就是通过每个类的属性(连接条件)

所以现在来自由发挥一下 比如 将女神的boyfriend_id 与男神的id进行匹配:
在这里插入图片描述

USE data2;
SELECT `name`,`boyname` FROM `beauty`,`boys`
WHERE beauty.`boyfriend_id` = boys.`id`;
  • 1
  • 2
  • 3

其实就更改了 连接条件

连接的种类划分 SQL92 99标准

我们刚刚做的都是简单的条件 那么有更加复杂的呢?这时我们先剧透分类一波,算是纲举目张:
总共分为三类:内连接,外连接以及交叉连接
内连接就是我们刚刚用的,包含等值、非等值以及自连接
外连接包含左连接 右连接 和 全连接
交叉连接没有子项。

这些都是基于SQL的标准的,有老的1992年颁布的92标准和1999颁布的的99标准,由于99是基于92的,大体差不多,我们作为了解 学一下92标准,之后重点学习99标准。
92对MySQL支持仅限于自连接 具体语法将在下一节全部介绍完毕。

那么,接下来下一节,我们来进行92标准的 内连接的学习,包含 等值连接 非等值连接 自连接
数据库学习之MySQL (十四)—— 92标准的 非等值连接 自连接




原文地址:访问原文地址
快照地址: 访问文章快照