推荐网站建设服务话术,做网站赚钱吗 怎么赚钱,宁波网站排名,公司网站模板 html一、先明确#xff1a;为什么必须掌握多表查询#xff1f;1.你是否能区分不同多表查询方式的差异#xff1f;
2.能否根据业务场景选择合适的查询方式#xff1f;
3.能否独立写出正确的多表查询 SQL#xff1f;#xff08;避免语法错误#xff09;二、先铺垫#xff1a;…一、先明确为什么必须掌握多表查询1.你是否能区分不同多表查询方式的差异2.能否根据业务场景选择合适的查询方式3.能否独立写出正确的多表查询 SQL避免语法错误二、先铺垫多表查询的基础前提先明确多表查询的核心表与表之间必须有 “关联关系”通常是主键 - 外键关联比如用户表user的id主键对应订单表order的user_id外键没有关联关系的多表查询会产生 “笛卡尔积”数据冗余无实际业务意义。先定义两个测试表-- 用户表主表 CREATE TABLE user ( id INT PRIMARY KEY AUTO_INCREMENT, -- 用户ID主键 username VARCHAR(50) NOT NULL, -- 用户名 age INT DEFAULT 0 -- 年龄 ); -- 订单表从表 CREATE TABLE order ( id INT PRIMARY KEY AUTO_INCREMENT, -- 订单ID主键 order_no VARCHAR(30) NOT NULL, -- 订单编号 user_id INT NOT NULL, -- 关联用户表的用户ID外键 price DECIMAL(10,2) NOT NULL, -- 订单金额 FOREIGN KEY (user_id) REFERENCES user(id) -- 外键约束 );三、核心多表查询方式拆解方式 1JOIN 连接查询JOIN是多表查询的核心方式通过关联字段将多个表 “拼接” 在一起查询核心分为内连接、外连接左外连接、右外连接、交叉连接极少用仅作了解。1.1 内连接INNER JOIN / JOIN•通俗定义只查询 “两张表中满足关联条件” 的数据不满足条件的记录会被过滤掉相当于 “取两张表的交集”。•语法SELECT 字段 FROM 表1 INNER JOIN 表2 ON 表1.关联字段 表2.关联字段 [WHERE 条件]INNER可省略直接写JOIN。-- 简洁写法省略INNER SELECT u.id AS user_id, u.username, o.id AS order_id, o.order_no, o.price FROM user u JOIN order o ON u.id o.user_id; -- 关联条件用户ID订单的用户ID考察点你是否知道ON用于指定表关联条件WHERE用于过滤查询结果避免把关联条件写在WHERE中。1.2 左外连接LEFT JOIN / LEFT OUTER JOIN•通俗定义以 “左表” 为基准查询左表的所有数据右表中满足关联条件的数据会被匹配显示不满足条件的右表字段显示NULL相当于 “左表全量数据 右表交集数据”。•语法SELECT 字段 FROM 左表 LEFT JOIN 右表 ON 关联条件 [WHERE 条件]OUTER可省略。SELECT u.id AS user_id, u.username, o.id AS order_id, o.order_no, o.price FROM user u LEFT JOIN order o ON u.id o.user_id;考察点能否区分左表和右表理解 “右表不满足条件显示 NULL” 的特性。1.3 右外连接RIGHT JOIN / RIGHT OUTER JOIN•通俗定义以 “右表” 为基准查询右表的所有数据左表中满足关联条件的数据会被匹配显示不满足条件的左表字段显示NULL相当于 “右表全量数据 左表交集数据”功能上可通过左连接互换表位置实现。•语法SELECT 字段 FROM 左表 RIGHT JOIN 右表 ON 关联条件 [WHERE 条件]OUTER可省略。SELECT u.id AS user_id, u.username, o.id AS order_id, o.order_no, o.price FROM user u RIGHT JOIN order o ON u.id o.user_id;考察点知道右连接的存在理解其与左连接的对称关系。1.4 交叉连接CROSS JOIN极少用•通俗定义无关联条件的连接会产生两张表的 “笛卡尔积”数据行数 表 1 行数 × 表 2 行数通常无实际业务意义仅在特殊场景比如生成测试数据使用。• SQL 示例-- 产生笛卡尔积慎用 SELECT u.username, o.order_no FROM user u CROSS JOIN order o;方式 2子查询嵌套查询适合简单场景•通俗定义将一个查询语句子查询 / 内层查询嵌套在另一个查询语句主查询 / 外层查询中子查询的结果作为主查询的条件或数据源分为 “关联子查询” 和 “非关联子查询”。非关联子查询子查询可独立执行结果不依赖主查询适合简单条件过滤示例查询 “购买过订单金额大于 100 元的用户” 信息SELECT id, username, age FROM user WHERE id IN ( -- 子查询获取订单金额100的所有用户ID SELECT DISTINCT user_id FROM order WHERE price 100 );关联子查询子查询依赖主查询的字段无法独立执行适合 “按主表每条记录匹配子表” 的场景示例查询 “每个用户的最新订单”按订单 ID 倒序取第一条SELECT u.id AS user_id, u.username, o.id AS order_id, o.order_no, o.price FROM user u JOIN order o ON u.id o.user_id WHERE o.id ( -- 子查询关联主表的user_id取该用户最大订单ID最新订单 SELECT MAX(id) FROM order WHERE user_id u.id );考察点能否区分关联 / 非关联子查询知道子查询的适用边界避免多层嵌套导致性能问题。方式 3联合查询UNION / UNION ALL结果集合并•通俗定义将多个SELECT查询的结果集合并成一个结果集要求所有查询的 “字段数量、字段类型、字段顺序” 一致分为UNION去重会过滤重复记录和UNION ALL不去重性能更高。•语法SELECT 字段 FROM 表1 [WHERE 条件] UNION [ALL] SELECT 字段 FROM 表2 [WHERE 条件];-- UNION去重自动过滤重复的用户记录 SELECT id, username, age FROM user WHERE age 25 UNION SELECT u.id, u.username, u.age FROM user u JOIN order o ON u.id o.user_id WHERE o.price 200; -- UNION ALL不去重性能更高适合确定无重复数据的场景 SELECT id, username, age FROM user WHERE age 25 UNION ALL SELECT u.id, u.username, u.age FROM user u JOIN order o ON u.id o.user_id WHERE o.price 200;考察点知道UNION和UNION ALL的区别明确联合查询的字段要求。查询方式核心特点适用场景性能优先级INNER JOIN取两表交集过滤无效数据关联数据必须存在的业务如已下单用户高优先使用LEFT JOIN保留左表全量数据右表补 NULL需显示主表所有数据的场景如所有用户订单高子查询嵌套查询逻辑直观简单条件过滤如根据子查询结果筛选主表中复杂场景不如 JOINUNION / UNION ALL合并结果集多查询结果合并如不同条件的同类数据中UNION ALL UNION加分项1、结合项目举例“我在实训项目中用LEFT JOIN查询所有用户及对应的订单列表用INNER JOIN查询有支付记录的用户信息”2、性能意识“复杂多表查询优先用JOIN不用多层子查询合并结果集时确定无重复数据就用UNION ALL比UNION快”3、细节把控“JOIN的关联条件写在ON里过滤条件写在WHERE里避免笛卡尔积冗余”。举一反三1、“如何查询‘没有订单记录的用户’”答案LEFT JOIN后判断订单字段为NULLSELECT u.* FROM user u LEFT JOIN order o ON u.ido.user_id WHERE o.id IS NULL2. “ON和WHERE在JOIN查询中有什么区别”答案ON是表关联条件先执行WHERE是结果过滤条件在表关联后执行LEFT JOIN中ON不过滤左表数据WHERE会过滤3. “多表查询时如何提高性能”答案给关联字段主键 / 外键建索引避免SELECT *只查需要的字段减少笛卡尔积产生。