数据库多表查询(内连接和外连接特点比较,子查询示例)

数据库多表查询(内连接和外连接特点)

说明:这里表仅仅为了展示效果,因此设计会有一些不合理的地方。

第一步:资源准备:

DROP DATABASE IF EXISTS demo;
CREATE DATABASE IF NOT EXISTS demo CHARACTER SET utf8;
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
  `id` INT(11) NOT NULL AUTO_INCREMENT,
  `username` VARCHAR(32) NOT NULL COMMENT '用户名称',
  `birthday` DATETIME DEFAULT NULL COMMENT '生日',
  `sex` CHAR(1) DEFAULT NULL COMMENT '性别',
  `address` VARCHAR(256) DEFAULT NULL COMMENT '地址',
  age INT,
  PRIMARY KEY  (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;
ALTER TABLE USER CHARACTER SET utf8;
INSERT  INTO `user`(`id`,`username`,`birthday`,`sex`,`address`,age) VALUES (41,'老王','2018-02-27 17:47:08',NULL,'北京',22),
(42,'小二王','2018-03-02 15:09:37','女','北京金燕龙',22),(43,'小二王','2018-03-04 11:34:34','女','北京金燕龙',22),
(45,'张三','2018-03-04 12:04:06',NULL,'北京金燕龙',NULL),(46,'老王','2018-03-07 17:37:26',NULL,'北京',22),
(48,'小马宝莉','2018-03-08 11:44:00','女','北京修正',NULL);
DROP TABLE IF EXISTS `account`;
CREATE TABLE `account` (
  `ID` INT(11) NOT NULL COMMENT '编号',
  `UID` INT(11) DEFAULT NULL COMMENT '用户编号',
  `MONEY` DOUBLE DEFAULT NULL COMMENT '金额',
  PRIMARY KEY  (`ID`),
  KEY `FK_Reference_8` (`UID`),
  CONSTRAINT `FK_Reference_8` FOREIGN KEY (`UID`) REFERENCES `user` (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;
INSERT  INTO `account`(`ID`,`UID`,`MONEY`) VALUES (1,46,NULL),(2,45,22),(3,46,2000);
SELECT * FROM USER;
SELECT * FROM account;
SELECT * FROM account,USER;

在这里插入图片描述
在这里插入图片描述

二、内连接查询 (显示内连接、隐式内连接)

语法:

a.隐式内连接:
SELECT 字段名 FROM 左表, 右表 WHERE 条件

b.显式内连接:
SELECT 字段名 FROM 左表 JOIN 右表 ON 条件

特点:内连接查询到的信息行数只和条件相关;
会忽略值为null的行,下面我们来验证一下

  1. 下面两种内连接演示了查询的信息行数最主要和判断条件相关。我们无论怎么改变表的前后位置或者条件的前后位置,对结果都没有影响。
-- 隐式内连接查询
SELECT * FROM account,USER WHERE user.`id`=account.`UID`;
SELECT * FROM account,USER WHERE account.`UID`=user.`id`;
SELECT * FROM USER,account WHERE user.`id`=account.`UID`;
SELECT * FROM USER,account WHERE account.`UID`=user.`id`;
-- 显示内连接查询
SELECT * FROM account JOIN USER ON user.`id`=account.`UID`;
SELECT * FROM account JOIN USER ON account.`UID`=user.`id`;
SELECT * FROM USER JOIN account ON user.`id`=account.`UID`;
SELECT * FROM USER JOIN account ON account.`UID`=user.`id`;

在这里插入图片描述

在这里插入图片描述结果:全部查询结果都是一样的,说明内连接和表的前后位置,条件字段的位置是无关的。

  1. 以下演示了内连接查询会忽略掉值为null的数据,因为money字段和age字段中都有null的字段,虽然null==null,但是会被内连接忽略。
SELECT * FROM USER JOIN account ON user.age=account.`MONEY`;

在这里插入图片描述
结果:可以看到,在sex字段中值为null的都被自动过滤了,由于条件的改变,查询到的条数也是变多了。

三、外连接查询

语法: a.左外连接
select 字段列表 from 表1 left [outer] join 表2 on条件;
意义:查询的是左表中所有的数据以及和另外一张表的交集部分。
b.右外连接
select 字段列表 from 表1 right [outer] join 表2 on条件;
意义:同左表查询。

特点:不会忽略null字段的查询,查询到的行数只和表的前后位置相关,这里只演示左表查询。

  1. 以下是说明外连接查询显示的数据行数和表的前后位置是有关系的,不管条件的位置怎么切换,但是只要表的前后位置对调,就会查询出来不同行数的数据
-- 左外连接(这里演示)、右外连接查询同理
SELECT * FROM account LEFT JOIN USER ON user.`id`=account.`UID`;
SELECT * FROM account LEFT JOIN USER ON account.`UID`=user.`id`;

在这里插入图片描述

SELECT * FROM USER LEFT JOIN account ON user.`id`=account.`UID`;
SELECT * FROM USER LEFT JOIN account ON account.`UID`=user.`id`

在这里插入图片描述2. 以下是证明外连接不会忽略null字段,可以和上面内连接进行比较,就可以得到结论

SELECT * FROM USER RIGHT JOIN account ON user.age=account.`MONEY`;

在这里插入图片描述

四、多表子查询

特点:可以分为三种情况,因为查询情况比较复杂,这里仅仅做简单的演示
其实质就是多张表的中的信息筛选之后最后在综合进行比较。

-- 单行单列
SELECT username FROM USER WHERE user.`id`=(SELECT MAX(uid) FROM account);

在这里插入图片描述

-- 多行单列
SELECT username FROM USER,(SELECT * FROM account) tab WHERE user.`id`=tab.uid;

在这里插入图片描述

-- 多行多列
SELECT * FROM USER,(SELECT * FROM account) tab WHERE user.`id`=tab.uid;

在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章