數據庫多表查詢(內連接和外連接特點比較,子查詢示例)

數據庫多表查詢(內連接和外連接特點)

說明:這裏表僅僅爲了展示效果,因此設計會有一些不合理的地方。

第一步:資源準備:

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;

在這裏插入圖片描述

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