php多表查询-MySQL多表查询

2023-08-29 0 6,634 百度已收录

养成一起写作的习惯! 这是我参加“掘金每日新计划四月更新挑战赛”的第9天,点击查看活动详情。

写在上面

多表查询的流程:先估计多个表的笛卡尔积,然后根据一些条件过滤笛卡尔积中的记录

注意:查询多个表时,使用两个表中关联的数组作为条件

1. 数据规划✨

-- 创建人物身份表
CREATE TABLE identity(
id INT PRIMARY KEY AUTO_INCREMENT,# 主键
 name varchar(20)                 # 身份名称
);
-- 添加部门表数据
INSERT INTO identity (name) VALUES('海贼'),('海军'),('革命军'),('天龙人');
-- 创建op人物表
CREATE TABLE op (
	id INT PRIMARY KEY AUTO_INCREMENT,# 主键
	name VARCHAR(20),                # 姓名
	gender enum('男','女','人妖'),# 性别
	fruit VARCHAR(30), # 果实能力
    reward BIGINT, # 悬赏金,单位:贝利
	ity_id INT,  # 外键
	FOREIGN KEY (ity_id) REFERENCES identity (id) # op表关联identity表
);
-- 添加人物数据
INSERT INTO op (name,gender,fruit,reward,ity_id) VALUES ('路飞',1,'人人果实-幻兽种-尼卡形态',1500000000,1);
INSERT INTO op (name,gender,fruit,reward,ity_id) VALUES ('索隆',1,null,320000000,1);
INSERT INTO op (name,gender,fruit,reward,ity_id) VALUES ('黄猿',1,'闪闪果实',null,2);
INSERT INTO op (name,gender,fruit,reward,ity_id) VALUES ('亚尔丽塔',2,'滑滑果实',5000000,1);
INSERT INTO op (name,gender,fruit,reward,ity_id) VALUES ('伊万科夫',3,'荷尔蒙果实',null,3);
INSERT INTO op (name,gender,fruit,reward,ity_id) VALUES ('萨博',1,'烧烧果实',602000000,3);
INSERT INTO op (name,gender,fruit,reward,ity_id) VALUES ('小冯',3,'模仿果实',32000000,1);
INSERT INTO op (name,gender,fruit,reward,ity_id) VALUES ('艾斯',1,'烧烧果实',550000000,1);
INSERT INTO op (name,gender,fruit,reward,ity_id) VALUES ('达斯琪',2,null,null,2);
INSERT INTO op (name,gender,fruit,reward,ity_id) VALUES ('小萨蒂',2,null,null,2);
INSERT INTO op (name,gender,fruit,reward,ity_id) VALUES ('战国',1,'人人果实-幻兽种-大佛形态',null,2);
INSERT INTO op (name,gender,fruit,reward,ity_id) VALUES ('熊',1,'肉球果实',296000000,3);
INSERT INTO op (name,gender,fruit,reward,ity_id) VALUES ('红发',1,'面子果实',4028900000,1);
INSERT INTO op (name,gender,fruit,reward,ity_id) VALUES ('罗宾',2,'花花果实',130000000,1);
INSERT INTO op (name,gender,fruit,reward,ity_id) VALUES ('Joker',1,'线线果实',340000000,null);

2.笛卡尔积现象

笛卡尔积的本质:排列组合

1️⃣笛卡尔积

笛卡尔积公式:A表数据条数*B表数据条数=笛卡尔积

-- 需求:查询所有的人物和他们的身份
SELECT * FROM op,identity; # 这样查询会显示15*4=60种记录

2️⃣如何消除笛卡尔积现象的影响‍

/* 设置过滤条件 */ 
-- op表的ity_id等于identity表的id的数据才是有用的
SELECT * FROM op,identity WHERE op.ity_id=identity.id;
-- 多表查询的时候我们习惯用别名,L代表左表,R代表右表
SELECT * FROM op AS L,identity AS R WHERE L.ity_id=R.id;

3.内连接查询

连接查询只显示符合条件的数据,内连接有两种形式:隐式内连接和显式外连接

1️⃣ 隐式内连接

/* 语法 */
SELECT 字段名 FROM 左表, 右表 WHERE 条件
/* 示例 */
-- 查询所有的人物和他们的身份
SELECT * FROM op,identity WHERE op.ity_id=identity.id;

2️⃣ 显示内部连接

/* 语法 */
SELECT 字段名 FROM 左表 [INNER] JOIN 右表 ON 条件
/* 示例 */
-- 需求:查询小冯的果实能力及身份
# 1.确定查询哪些表
SELECT * FROM op AS L INNER JOIN identity AS R;
# 2.确定表连接条件
SELECT * FROM op AS L INNER JOIN identity AS R ON L.ity_id=R.id;
# 3.确定查询条件
SELECT * FROM op AS L INNER JOIN identity AS R ON L.ity_id=R.id WHERE L.name='小冯';
# 4.确定查询字段
SELECT L.name,L.fruit,R.name FROM op AS L INNER JOIN identity AS R ON L.ity_id=R.id WHERE L.name='小冯';
# 5.仅供参考的标准写法,分行写方便添加注释
SELECT 
	L.name AS 姓名 ,    -- 查询字段:人物姓名
	L.fruit AS 果实 ,   -- 查询字段:人物果实能力
	R.name AS 身份      -- 查询字段:人物身份
FROM 
	op AS L            -- 查询左表:op 
INNER JOIN 
	identity AS R      -- 查询右表:identity
ON 
	L.ity_id=R.id      -- 连接条件:op表的ity_id与identity表的id相同
WHERE 
	L.name='小冯';     -- 查询条件:姓名为小冯的人物

SELECT 
	L.name AS 姓名 ,    -- 查询字段:人物姓名
	L.fruit AS 果实 ,   -- 查询字段:人物果实能力
	R.name AS 身份      -- 查询字段:人物身份
FROM 
	op AS L,           -- 查询左表:op  
	identity AS R      -- 查询右表:identity
WHERE 
	L.ity_id=R.id      -- 连接条件:op表的ity_id与identity表的id相同
AND 
	L.name='小冯';     -- 查询条件:姓名为小冯的人物

3️⃣总结内连接查询步骤

确定要查询的表

确定表连接条件

确定查询条件

确定查询数组

4.外连接查询

分为左外连接和右外连接查询

1️⃣左外连接

/* 语法 */
SELECT 字段名 FROM 左表 LEFT [OUTER] JOIN 右表 ON 条件
/* 示例 */
-- 使用内连接查询
SELECT * FROM op AS L INNER JOIN identity AS R ON L.ity_id=R.id;
-- 使用左外连接查询
SELECT * FROM op AS L LEFT JOIN identity AS R ON L.ity_id=R.id;

2️⃣ 右外连接

/* 语法 */
SELECT 字段名 FROM 左表 RIGHT [OUTER ]JOIN 右表 ON 条件
/* 示例 */
-- 使用内连接查询
SELECT * FROM op AS L INNER JOIN identity AS R ON L.ity_id=R.id;
-- 使用右外连接查询
SELECT * FROM op AS L RIGHT JOIN identity AS R ON L.ity_id=R.id;

3️⃣ 外连接总结 左外连接和右外连接似乎是同一个道理php多表查询,通常使用较多的是左外连接 外连接可以理解为:在内连接的基础上保证左表(或右表)中的所有数据表)显示,右表(或左表)不满足条件则显示null 5.子查询

也称为嵌套查询,一个查询的结果可以用作另一个查询的条件或表名

1️⃣单行单列

/* 语法 */
SELECT 查询字段 FROM 表 WHERE 字段=(子查询);
/* 示例 */
# 需求:查询悬赏金最高的那个男人的全部信息
-- 1.在op表查询最高悬赏金是多少
SELECT MAX(reward) FROM op;
-- 2.根据最高悬赏金到op表查询到对应的人物信息
SELECT * FROM op WHERE reward = (SELECT MAX(reward) FROM op);

2️⃣多行单列

/* 语法 */
SELECT 查询字段 FROM 表 WHERE 字段 IN (子查询);
/* 示例 */
# 需求:查询有哪些人是海贼和海军
-- 先查询海贼与海军的 id
SELECT id FROM identity WHERE name in('海贼','海军');
-- 再查询在这 id 中有哪些人物
SELECT * FROM op WHERE ity_id in (SELECT id FROM identity WHERE name in('海贼','海军'));

3️⃣多行多列

/* 语法 */
SELECT 查询字段 FROM (子查询) AS 虚拟表别名 WHERE 条件;
/* 示例 */
# 需求:查询赏金小于平均值的人物所有信息,包括基本信息和所属所属身份
-- 1.在op表找到赏金小于平均值的人物基本信息
SELECT * FROM op WHERE reward<(SELECT AVG(reward) FROM op);
-- 2.查询idendity表信息,与虚拟表的信息组合,设置过滤条件
SELECT * FROM (SELECT * FROM op WHERE reward<(SELECT AVG(reward) FROM op)) AS L,identity AS R WHERE L.ity_id=R.id;

4️⃣子查询总结只要子查询的结果是单列,就会作为WHERE旁边的条件。 只要子查询的结果是多列,就会作为FROM旁边的虚表进行二次查询php多表查询,写在前面

谢谢您的观看✨

有哪些不足之处,欢迎指出

鹈鹕的运营朋友们一试辛苦了

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

悟空资源网 php php多表查询-MySQL多表查询 https://www.wkzy.net/game/177765.html

常见问题

相关文章

官方客服团队

为您解决烦忧 - 24小时在线 专业服务