【MySQL】多表连接查询
个人主页:Guiat
归属专栏:MySQL
文章目录
- 1. 多表连接查询概述
- 1.1 连接查询的作用
- 1.2 MySQL支持的连接类型
- 2. 内连接 (INNER JOIN)
- 2.1 内连接的特点
- 2.2 内连接语法
- 2.3 内连接实例
- 2.4 多表内连接
- 3. 左外连接 (LEFT JOIN)
- 3.1 左外连接的特点
- 3.2 左外连接语法
- 3.3 左外连接实例
- 3.4 多表左外连接
- 4. 右外连接 (RIGHT JOIN)
- 4.1 右外连接的特点
- 4.2 右外连接语法
- 4.3 右外连接实例
- 4.4 多表右外连接
- 5. 全外连接 (FULL JOIN)
- 5.1 全外连接的特点
- 5.2 模拟全外连接语法
- 5.3 模拟全外连接实例
- 5.4 多表模拟全外连接
- 6. 交叉连接 (CROSS JOIN)
- 6.1 交叉连接的特点
- 6.2 交叉连接语法
- 6.3 交叉连接实例
- 6.4 交叉连接应用场景
- 7. 自连接 (Self Join)
- 7.1 自连接的特点
- 7.2 自连接语法
- 7.3 自连接实例
- 7.4 层次结构查询
- 8. 高级连接技术
- 8.1 USING 子句
- 8.2 NATURAL JOIN
- 8.3 连接条件与过滤条件
- 8.4 子查询与连接
- 8.5 STRAIGHT_JOIN
- 9. 连接优化技术
- 9.1 使用EXPLAIN分析连接查询
- 9.2 索引优化
- 9.3 查询重写技术
- 9.4 分页优化
- 10. 实际应用案例
- 10.1 销售报表查询
- 10.2 库存管理查询
正文
1. 多表连接查询概述
多表连接查询是关系型数据库中最重要的特性之一,它允许我们从多个相关表中检索数据,将它们按照指定的关系组合在一起显示。MySQL支持多种连接类型,使开发者能够灵活地进行数据检索和分析。
1.1 连接查询的作用
- 整合分散在不同表中的相关数据
- 减少数据冗余,提高存储效率
- 支持复杂的业务逻辑和数据分析
- 实现数据的完整性和一致性
1.2 MySQL支持的连接类型
MySQL支持以下几种主要的表连接类型:
2. 内连接 (INNER JOIN)
2.1 内连接的特点
- 只返回两个表中匹配的记录
- 不包含任何不匹配的记录
- 是最常用的连接类型
- 可以使用关键字
INNER JOIN
或简写为JOIN
2.2 内连接语法
SELECT columns
FROM table1
INNER JOIN table2 ON table1.column = table2.column;-- 或使用简写形式
SELECT columns
FROM table1
JOIN table2 ON table1.column = table2.column;
2.3 内连接实例
-- 创建示例表
CREATE TABLE customers (customer_id INT PRIMARY KEY,customer_name VARCHAR(100) NOT NULL,email VARCHAR(100),phone VARCHAR(20)
);CREATE TABLE orders (order_id INT PRIMARY KEY,customer_id INT,order_date DATE NOT NULL,total_amount DECIMAL(10, 2) NOT NULL,FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
);-- 基本内连接查询
SELECT c.customer_id, c.customer_name, o.order_id, o.order_date, o.total_amount
FROM customers c
INNER JOIN orders o ON c.customer_id = o.customer_id;-- 多条件内连接
SELECT c.customer_name, o.order_id, o.order_date
FROM customers c
JOIN orders o ON c.customer_id = o.customer_id AND o.total_amount > 1000;-- 使用WHERE子句进一步过滤
SELECT c.customer_name, o.order_id, o.order_date
FROM customers c
JOIN orders o ON c.customer_id = o.customer_id
WHERE o.order_date >= '2023-01-01' AND c.customer_name LIKE 'A%';
2.4 多表内连接
-- 创建额外示例表
CREATE TABLE order_items (item_id INT PRIMARY KEY,order_id INT,product_id INT,quantity INT NOT NULL,unit_price DECIMAL(10, 2) NOT NULL,FOREIGN KEY (order_id) REFERENCES orders(order_id)
);CREATE TABLE products (product_id INT PRIMARY KEY,product_name VARCHAR(100) NOT NULL,category VARCHAR(50),description TEXT
);-- 三表内连接
SELECT c.customer_name, o.order_id, o.order_date, p.product_name, oi.quantity, oi.unit_price, (oi.quantity * oi.unit_price) AS line_total
FROM customers c
JOIN orders o ON c.customer_id = o.customer_id
JOIN order_items oi ON o.order_id = oi.order_id
JOIN products p ON oi.product_id = p.product_id
ORDER BY o.order_date, o.order_id;-- 四表及以上连接
SELECT c.customer_name, o.order_id, p.product_name, oi.quantity, s.company_name AS supplier
FROM customers c
JOIN orders o ON c.customer_id = o.customer_id
JOIN order_items oi ON o.order_id = oi.order_id
JOIN products p ON oi.product_id = p.product_id
JOIN suppliers s ON p.supplier_id = s.supplier_id
WHERE o.order_date BETWEEN '2023-01-01' AND '2023-12-31';
3. 左外连接 (LEFT JOIN)
3.1 左外连接的特点
- 返回左表中的所有记录,无论是否匹配
- 如果右表中没有匹配项,则显示为NULL
- 用于查找主表中的所有记录及其关联信息
- 也称为LEFT OUTER JOIN
3.2 左外连接语法
SELECT columns
FROM table1
LEFT JOIN table2 ON table1.column = table2.column;-- 完整形式
SELECT columns
FROM table1
LEFT OUTER JOIN table2 ON table1.column = table2.column;
3.3 左外连接实例
-- 基本左连接:查找所有客户及其订单(包括没有订单的客户)
SELECT c.customer_id, c.customer_name, o.order_id, o.order_date
FROM customers c
LEFT JOIN orders o ON c.customer_id = o.customer_id
ORDER BY c.customer_id;-- 查找没有订单的客户
SELECT c.customer_id, c.customer_name, c.email
FROM customers c
LEFT JOIN orders o ON c.customer_id = o.customer_id
WHERE o.order_id IS NULL;-- 带聚合函数的左连接
SELECT c.customer_id, c.customer_name, COUNT(o.order_id) AS order_count,IFNULL(SUM(o.total_amount), 0) AS total_spent
FROM customers c
LEFT JOIN orders o ON c.customer_id = o.customer_id
GROUP BY c.customer_id, c.customer_name
ORDER BY total_spent DESC;
3.4 多表左外连接
-- 多表左外连接示例
SELECT c.customer_name, o.order_id, o.order_date, p.product_name, oi.quantity
FROM customers c
LEFT JOIN orders o ON c.customer_id = o.customer_id
LEFT JOIN order_items oi ON o.order_id = oi.order_id
LEFT JOIN products p ON oi.product_id = p.product_id
ORDER BY c.customer_name, o.order_date;-- 查找特定分类下的产品以及相关订单信息(包括未售出的产品)
SELECT p.product_id, p.product_name, p.category,o.order_id, c.customer_name, oi.quantity
FROM products p
LEFT JOIN order_items oi ON p.product_id = oi.product_id
LEFT JOIN orders o ON oi.order_id = o.order_id
LEFT JOIN customers c ON o.customer_id = c.customer_id
WHERE p.category = 'Electronics'
ORDER BY p.product_name;
4. 右外连接 (RIGHT JOIN)
4.1 右外连接的特点
- 返回右表中的所有记录,无论是否匹配
- 如果左表中没有匹配项,则显示为NULL
- 功能上与左连接类似,只是表的方向相反
- 也称为RIGHT OUTER JOIN
4.2 右外连接语法
SELECT columns
FROM table1
RIGHT JOIN table2 ON table1.column = table2.column;-- 完整形式
SELECT columns
FROM table1
RIGHT OUTER JOIN table2 ON table1.column = table2.column;
4.3 右外连接实例
-- 基本右连接:查找所有订单及其客户信息(包括没有客户信息的订单)
SELECT o.order_id, o.order_date, o.total_amount, c.customer_id, c.customer_name
FROM customers c
RIGHT JOIN orders o ON c.customer_id = o.customer_id
ORDER BY o.order_id;-- 查找没有客户信息的订单(例如已删除的客户)
SELECT o.order_id, o.order_date, o.total_amount
FROM customers c
RIGHT JOIN orders o ON c.customer_id = o.customer_id
WHERE c.customer_id IS NULL;-- 注意:右连接通常可以转换为左连接
-- 下面两个查询是等价的
SELECT c.customer_name, o.order_id, o.order_date
FROM customers c
RIGHT JOIN orders o ON c.customer_id = o.customer_id;SELECT c.customer_name, o.order_id, o.order_date
FROM orders o
LEFT JOIN customers c ON o.customer_id = c.customer_id;
4.4 多表右外连接
-- 多表右外连接示例
SELECT p.product_name, oi.quantity, o.order_id, c.customer_name
FROM customers c
RIGHT JOIN orders o ON c.customer_id = o.customer_id
RIGHT JOIN order_items oi ON o.order_id = oi.order_id
RIGHT JOIN products p ON oi.product_id = p.product_id
ORDER BY p.product_name;-- 查找所有产品及其订单情况(包括未被订购的产品)
SELECT p.product_id, p.product_name, p.category,oi.order_id, oi.quantity, o.order_date
FROM order_items oi
RIGHT JOIN products p ON oi.product_id = p.product_id
LEFT JOIN orders o ON oi.order_id = o.order_id
ORDER BY p.product_id;
5. 全外连接 (FULL JOIN)
5.1 全外连接的特点
- 返回左表和右表中的所有记录
- 如果任一表中没有匹配项,则显示为NULL
- MySQL不直接支持FULL JOIN语法
- 可以通过UNION组合LEFT JOIN和RIGHT JOIN模拟
5.2 模拟全外连接语法
-- MySQL中模拟全外连接
SELECT columns
FROM table1
LEFT JOIN table2 ON table1.column = table2.column
UNION
SELECT columns
FROM table1
RIGHT JOIN table2 ON table1.column = table2.column
WHERE table1.column IS NULL;
5.3 模拟全外连接实例
-- 模拟全外连接:查找所有客户和订单(包括没有订单的客户和没有客户信息的订单)
SELECT c.customer_id, c.customer_name, o.order_id, o.order_date
FROM customers c
LEFT JOIN orders o ON c.customer_id = o.customer_id
UNION
SELECT c.customer_id, c.customer_name, o.order_id, o.order_date
FROM customers c
RIGHT JOIN orders o ON c.customer_id = o.customer_id
WHERE c.customer_id IS NULL;-- 查找不匹配的记录(只存在于一个表中的记录)
SELECT c.customer_id, c.customer_name, o.order_id, o.order_date
FROM customers c
LEFT JOIN orders o ON c.customer_id = o.customer_id
WHERE o.order_id IS NULL
UNION
SELECT c.customer_id, c.customer_name, o.order_id, o.order_date
FROM customers c
RIGHT JOIN orders o ON c.customer_id = o.customer_id
WHERE c.customer_id IS NULL;
5.4 多表模拟全外连接
-- 多表模拟全外连接示例(产品和订单)
SELECT p.product_id, p.product_name, oi.order_id, oi.quantity
FROM products p
LEFT JOIN order_items oi ON p.product_id = oi.product_id
UNION
SELECT p.product_id, p.product_name, oi.order_id, oi.quantity
FROM products p
RIGHT JOIN order_items oi ON p.product_id = oi.product_id
WHERE p.product_id IS NULL;
6. 交叉连接 (CROSS JOIN)
6.1 交叉连接的特点
- 返回两个表的笛卡尔积(所有可能的组合)
- 每一行都与另一个表的每一行组合
- 结果集行数 = 第一个表行数 × 第二个表行数
- 通常需要加条件限制,否则结果集可能非常大
6.2 交叉连接语法
-- 使用CROSS JOIN关键字
SELECT columns
FROM table1
CROSS JOIN table2;-- 使用逗号分隔表(隐式交叉连接)
SELECT columns
FROM table1, table2;
6.3 交叉连接实例
-- 基本交叉连接:生成所有产品与类别的组合
CREATE TABLE categories (category_id INT PRIMARY KEY,category_name VARCHAR(50) NOT NULL
);-- 显式交叉连接
SELECT p.product_id, p.product_name, c.category_id, c.category_name
FROM products p
CROSS JOIN categories c;-- 隐式交叉连接(不推荐,因为容易与内连接混淆)
SELECT p.product_id, p.product_name, c.category_id, c.category_name
FROM products p, categories c;-- 有条件的交叉连接
SELECT p.product_id, p.product_name, c.category_name
FROM products p
CROSS JOIN categories c
WHERE p.product_id < 100 AND c.category_id IN (1, 2, 3);
6.4 交叉连接应用场景
-- 生成日期范围内的所有日期
CREATE TABLE numbers (n INT PRIMARY KEY);
INSERT INTO numbers VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8), (9);SELECT DATE_ADD('2023-01-01', INTERVAL (n1.n + n10.n*10 + n100.n*100) DAY) AS date
FROM numbers n1
CROSS JOIN numbers n10
CROSS JOIN numbers n100
WHERE DATE_ADD('2023-01-01', INTERVAL (n1.n + n10.n*10 + n100.n*100) DAY) <= '2023-12-31'
ORDER BY date;-- 创建价格矩阵
SELECT p1.product_name AS product, p2.product_name AS compared_with,p1.price AS price, p2.price AS compared_price,ROUND((p1.price - p2.price), 2) AS price_difference
FROM products p1
CROSS JOIN products p2
WHERE p1.product_id <> p2.product_id
ORDER BY p1.product_name, price_difference DESC;
7. 自连接 (Self Join)
7.1 自连接的特点
- 表与自身进行连接
- 在同一个表中查找相关记录
- 通常用于处理层次结构或递归关系
- 需要为表指定不同的别名
7.2 自连接语法
-- 自连接基本语法
SELECT a.column, b.column
FROM table a
JOIN table b ON a.column = b.another_column;
7.3 自连接实例
-- 创建示例员工表(含管理者关系)
CREATE TABLE employees (employee_id INT PRIMARY KEY,employee_name VARCHAR(100) NOT NULL,manager_id INT,department VARCHAR(50),salary DECIMAL(10, 2),FOREIGN KEY (manager_id) REFERENCES employees(employee_id)
);-- 查找每个员工及其直接经理
SELECT e.employee_id, e.employee_name, e.department,m.employee_id AS manager_id, m.employee_name AS manager_name
FROM employees e
LEFT JOIN employees m ON e.manager_id = m.employee_id
ORDER BY e.department, e.employee_id;-- 查找同一部门的员工
SELECT e1.employee_name AS employee1, e2.employee_name AS employee2,e1.department
FROM employees e1
JOIN employees e2 ON e1.department = e2.department
WHERE e1.employee_id < e2.employee_id -- 避免重复组合
ORDER BY e1.department, e1.employee_name;-- 查找薪资比经理高的员工
SELECT e.employee_name AS employee, e.salary AS employee_salary,m.employee_name AS manager, m.salary AS manager_salary
FROM employees e
JOIN employees m ON e.manager_id = m.employee_id
WHERE e.salary > m.salary;
7.4 层次结构查询
-- 创建示例类别表(树形结构)
CREATE TABLE categories (category_id INT PRIMARY KEY,category_name VARCHAR(50) NOT NULL,parent_id INT,FOREIGN KEY (parent_id) REFERENCES categories(category_id)
);-- 查找直接子类别
SELECT p.category_id AS parent_id, p.category_name AS parent_category,c.category_id AS child_id, c.category_name AS child_category
FROM categories p
LEFT JOIN categories c ON p.category_id = c.parent_id
ORDER BY p.category_name, c.category_name;-- 使用递归CTE查询完整层次结构(MySQL 8.0+)
WITH RECURSIVE category_tree AS (-- 起始点:顶级类别SELECT category_id, category_name, parent_id, 0 AS level,category_name AS pathFROM categoriesWHERE parent_id IS NULLUNION ALL-- 递归部分:查找子类别SELECT c.category_id, c.category_name, c.parent_id, ct.level + 1,CONCAT(ct.path, ' > ', c.category_name)FROM categories cJOIN category_tree ct ON c.parent_id = ct.category_id
)
SELECT level, category_id, category_name, path
FROM category_tree
ORDER BY path;
8. 高级连接技术
8.1 USING 子句
当连接列具有相同的名称时,可以使用USING子句简化JOIN语法:
-- 使用ON子句的连接
SELECT c.customer_id, c.customer_name, o.order_date
FROM customers c
JOIN orders o ON c.customer_id = o.customer_id;-- 使用USING子句的连接(更简洁)
SELECT customer_id, c.customer_name, o.order_date
FROM customers c
JOIN orders o USING (customer_id);-- USING子句处理多个相同列名
SELECT order_id, product_id, c.customer_name, p.product_name
FROM orders o
JOIN order_items oi USING (order_id)
JOIN customers c USING (customer_id)
JOIN products p USING (product_id);
8.2 NATURAL JOIN
NATURAL JOIN自动基于两个表中所有同名列进行连接:
-- 自然连接示例
SELECT customer_id, customer_name, order_id, order_date
FROM customers
NATURAL JOIN orders;-- 注意:自然连接可能导致意外结果,谨慎使用
-- 如果表有多个同名列,所有这些列都会被用于连接条件
8.3 连接条件与过滤条件
理解JOIN条件和WHERE条件的区别:
-- JOIN条件决定哪些行被连接
SELECT c.customer_name, o.order_id
FROM customers c
LEFT JOIN orders o ON c.customer_id = o.customer_id AND o.total_amount > 1000;-- WHERE条件在连接后过滤结果
SELECT c.customer_name, o.order_id
FROM customers c
LEFT JOIN orders o ON c.customer_id = o.customer_id
WHERE o.total_amount > 1000;-- 这两个查询的结果不同:
-- 第一个查询会保留所有客户,即使他们没有订单或订单金额不超过1000
-- 第二个查询只保留有订单且订单金额超过1000的客户
8.4 子查询与连接
在某些情况下,子查询可以替代连接:
-- 使用连接查询高价值客户的最近订单
SELECT c.customer_name, o.order_id, o.order_date, o.total_amount
FROM customers c
JOIN orders o ON c.customer_id = o.customer_id
WHERE c.customer_id IN (SELECT customer_idFROM ordersGROUP BY customer_idHAVING SUM(total_amount) > 10000
)
AND o.order_date >= DATE_SUB(CURRENT_DATE, INTERVAL 30 DAY);-- 使用相关子查询查找每个客户的最近订单
SELECT c.customer_id, c.customer_name, (SELECT order_id FROM orders WHERE customer_id = c.customer_id ORDER BY order_date DESC LIMIT 1) AS latest_order_id,(SELECT order_date FROM orders WHERE customer_id = c.customer_id ORDER BY order_date DESC LIMIT 1) AS latest_order_date
FROM customers c;
8.5 STRAIGHT_JOIN
在特定情况下,可以使用STRAIGHT_JOIN提示优化器使用指定的表连接顺序:
-- 强制连接顺序
SELECT c.customer_name, o.order_id, oi.product_id
FROM customers STRAIGHT_JOIN orders o ON c.customer_id = o.customer_id
STRAIGHT_JOIN order_items oi ON o.order_id = oi.order_id;
9. 连接优化技术
9.1 使用EXPLAIN分析连接查询
-- 使用EXPLAIN分析查询执行计划
EXPLAIN SELECT c.customer_name, o.order_id, p.product_name, oi.quantity
FROM customers c
JOIN orders o ON c.customer_id = o.customer_id
JOIN order_items oi ON o.order_id = oi.order_id
JOIN products p ON oi.product_id = p.product_id
WHERE c.customer_name LIKE 'A%' AND o.order_date > '2023-01-01';
9.2 索引优化
为连接列创建适当的索引可以显著提高JOIN性能:
-- 为连接列创建索引
CREATE INDEX idx_orders_customer_id ON orders(customer_id);
CREATE INDEX idx_order_items_order_id ON order_items(order_id);
CREATE INDEX idx_order_items_product_id ON order_items(product_id);-- 创建复合索引以优化特定查询
CREATE INDEX idx_orders_customer_date ON orders(customer_id, order_date);
9.3 查询重写技术
-- 拆分复杂连接为更简单的查询
-- 原复杂查询
SELECT c.customer_name, COUNT(DISTINCT o.order_id) AS order_count,SUM(oi.quantity * p.price) AS total_value
FROM customers c
JOIN orders o ON c.customer_id = o.customer_id
JOIN order_items oi ON o.order_id = oi.order_id
JOIN products p ON oi.product_id = p.product_id
WHERE o.order_date BETWEEN '2023-01-01' AND '2023-12-31'
GROUP BY c.customer_id;-- 拆分为更简单的查询
-- 首先计算每个订单的价值
CREATE TEMPORARY TABLE order_values AS
SELECT o.order_id, o.customer_id, SUM(oi.quantity * p.price) AS order_value
FROM orders o
JOIN order_items oi ON o.order_id = oi.order_id
JOIN products p ON oi.product_id = p.product_id
WHERE o.order_date BETWEEN '2023-01-01' AND '2023-12-31'
GROUP BY o.order_id, o.customer_id;-- 然后汇总客户数据
SELECT c.customer_name, COUNT(ov.order_id) AS order_count,SUM(ov.order_value) AS total_value
FROM customers c
JOIN order_values ov ON c.customer_id = ov.customer_id
GROUP BY c.customer_id;
9.4 分页优化
大结果集的分页查询可以通过优化连接顺序提高效率:
-- 普通分页查询(可能较慢)
SELECT c.customer_name, o.order_id, o.order_date
FROM customers c
JOIN orders o ON c.customer_id = o.customer_id
ORDER BY o.order_date DESC
LIMIT 1000, 50;-- 优化的分页查询
SELECT c.customer_name, o.order_id, o.order_date
FROM orders o
JOIN customers c ON o.customer_id = c.customer_id
ORDER BY o.order_date DESC
LIMIT 1000, 50;-- 进一步优化(先获取ID,再获取完整数据)
SELECT c.customer_name, o.order_id, o.order_date
FROM orders o
JOIN customers c ON o.customer_id = c.customer_id
WHERE o.order_id IN (SELECT order_idFROM ordersORDER BY order_date DESCLIMIT 1000, 50
);
10. 实际应用案例
10.1 销售报表查询
-- 按月份、产品类别和销售区域的销售报表
SELECT DATE_FORMAT(o.order_date, '%Y-%m') AS month,p.category,c.region,COUNT(DISTINCT o.order_id) AS order_count,COUNT(DISTINCT o.customer_id) AS customer_count,SUM(oi.quantity) AS total_quantity,SUM(oi.quantity * oi.unit_price) AS total_sales,AVG(oi.quantity * oi.unit_price) AS avg_order_value
FROM orders o
JOIN customers c ON o.customer_id = c.customer_id
JOIN order_items oi ON o.order_id = oi.order_id
JOIN products p ON oi.product_id = p.product_id
WHERE o.order_date BETWEEN '2023-01-01' AND '2023-12-31'AND o.status != 'Cancelled'
GROUP BY DATE_FORMAT(o.order_date, '%Y-%m'), p.category, c.region
ORDER BY month, p.category, total_sales DESC;
10.2 库存管理查询
-- 库存周转分析
SELECT p.product_id,p.product_name,p.category,p.current_stock,IFNULL(SUM(oi.quantity), 0) AS total_sold,CASEWHEN p.current_stock > 0 AND SUM(oi.quantity) IS NOT NULL THEN ROUND(SUM(oi.quantity) / p.current_stock, 2)ELSE 0END AS turnover_ratio
FROM products p
LEFT JOIN order_items oi ON p.product_id = oi.product_id
LEFT JOIN orders o ON oi.order_id = o.order_id AND o.order_date >= DATE_SUB(CURRENT_DATE, INTERVAL 90 DAY)
GROUP BY p.product_id, p.product_name, p.category, p.current_stock
ORDER BY turnover_ratio DESC;-- 需要补货的产品
SELECT p.product_id,p.product_name,p.current_stock,p.reorder_level,s.supplier_name,s.contact_person,s.phone
FROM products p
JOIN suppliers s ON p.supplier_id = s.supplier_id
LEFT JOIN (SELECT product_id, SUM(quantity) AS ordered_qtyFROM purchase_orders poJOIN purchase_order_items poi ON po.po_id = poi.po_idWHERE po.status = 'Pending'GROUP BY product_id
) pending ON p.product_id = pending.product_id
WHERE p.current_stock - IFNULL(pending.ordered_qty, 0) <= p.reorder_level
ORDER BY (p.current_stock - p.reorder_level);
结语
感谢您的阅读!期待您的一键三连!欢迎指正!
相关文章:
【MySQL】多表连接查询
个人主页:Guiat 归属专栏:MySQL 文章目录 1. 多表连接查询概述1.1 连接查询的作用1.2 MySQL支持的连接类型 2. 内连接 (INNER JOIN)2.1 内连接的特点2.2 内连接语法2.3 内连接实例2.4 多表内连接 3. 左外连接 (LEFT JOIN)3.1 左外连接的特点3.2 左外连接…...
【AI论文】用于评估和改进大型语言模型中指令跟踪的多维约束框架
摘要:接下来的指令评估了大型语言模型(LLMs)生成符合用户定义约束的输出的能力。 然而,现有的基准测试通常依赖于模板化的约束提示,缺乏现实使用的多样性,并限制了细粒度的性能评估。 为了填补这一空白&…...
应用BERT-GCN跨模态情绪分析:贸易缓和与金价波动的AI归因
本文运用AI量化分析框架,结合市场情绪因子、宏观经济指标及技术面信号,对黄金与美元指数的联动关系进行解析,揭示本轮贵金属回调的深层驱动因素。 周三,现货黄金价格单日跌幅达2.1%,盘中触及3167.94美元/盎司关键价位&…...
低成本高效图像生成:GPUGeek和ComfyUI的强强联合
一、时代背景 在如今的数字化时代,图像生成技术正不断发展和演变,尤其是在人工智能领域。无论是游戏开发、虚拟现实,还是设计创意,图像生成已成为许多应用的核心技术之一。然而,随着图像质量需求的提升,生成…...
React 第四十二节 Router 中useLoaderData的用途详解
一、前言 useLoaderData,用于在组件中获取路由预加载的数据。它通常与路由配置中的 loader 函数配合使用,用于在页面渲染前异步获取数据(如 API 请求),并将数据直接注入组件,从而简化数据流管理。 二、us…...
【NLP 74、最强提示词工程 Prompt Engineering 从理论到实战案例】
一定要拼尽全力,才能看起来毫不费劲 —— 25.5.15 一、提示词工程 1.提示词工程介绍 Ⅰ、什么是提示词 所谓的提示词其实就是一个提供给模型的文本片段,用于指导模型生成特定的输出或回答。提示词的目的是为模型提供一个任务的上下文,以便模…...
GPUGeek云平台实战:DeepSeek-R1-70B大语言模型一站式部署
随着人工智能技术的迅猛发展,特别是在自然语言处理领域,大型语言模型如DeepSeek-R1-70B的出现,推动了各行各业的变革。为了应对这些庞大模型的计算需求,云计算平台的普及成为了关键,特别是基于GPU加速的云平台…...
【抽丝剥茧知识讲解】引入mybtis-plus后,mapper实现方式
目录 前言一、传统 Mapper 接口方式二、继承 BaseMapper 的方式三、自定义通用 Mapper 的方式四、使用 MyBatis-Plus 的 ActiveRecord 模式五、使用 MyBatis-Plus 的 IService 接口六、使用建议 前言 mapper文件,作为Mybatis框架中定义SQL语句和映射关系的配置文件&…...
AI浪潮:开启科技新纪元
AI 的多面应用 AI 的影响力早已突破实验室的围墙,在众多领域落地生根,成为推动行业变革的重要力量。 在医疗领域,AI 宛如一位不知疲倦的助手,助力医生提升诊疗效率与准确性。通过对海量医学影像的深度学习,AI 能够快…...
制造业工厂的三大核心系统:ERP+PLM+MES
对于一家制造业工厂来说,要实现数字化转型,哪几个系统最重要?答案是:ERP,PLM和MES这三个核心系统最为重要!本文就为你快速地概览地介绍一下这三个系统 以及 它们之间的关联关系。 ERP:企业资源计划 ERP的全称是Enterprise Resource Planning,即企业资源计划系统。 它…...
驱动-定时-秒-字符设备
文章目录 目的相关资料参考实验驱动程序-timer_dev.c编译文件-Makefile测试程序-timer.c分析 加载驱动-运行测试程序总结 目的 通过定时器timer_list、字符设备、规避竞争关系-原子操作,综合运用 实现一个程序,加深之前知识的理解。 实现字符设备驱动框…...
(面试)Handler消息处理机制原理
Handler是用于实现线程间通信和任务调度的一种机(Handler、 Looper、MessageQueue、 Message)。Handler 允许线程间发送Message或Runnable对象进行通信。在Android中UI修改只能通过UI Thread,子线程不能更新UI。如果子线程想更新UI࿰…...
WebRTC 通话原理:从协商到通信
在实时音视频通信领域,WebRTC(Web Real-Time Communication)凭借其开源、无需插件且能在浏览器中直接实现高质量通信的特性,成为开发者的热门选择。本文将深入解析 WebRTC 通话原理,涵盖媒体协商、网络协商、网络穿越&…...
InforSuite AS 可以发布django和vue项目是否可行
InforSuite AS 是浪潮推出的企业级中间件平台,主要用于应用集成、流程管理、数据交换等场景,其核心功能更偏向于 Java EE 应用的部署和管理(如支持 WAR/EAR 包)。关于能否直接发布 Django(Python 框架)和 V…...
【中级软件设计师】网络攻击(附软考真题)
【中级软件设计师】网络攻击(附软考真题) 目录 【中级软件设计师】网络攻击(附软考真题)一、历年真题二、考点:网络攻击1、拒绝服务攻击(DoS攻击)2、重放攻击3、特洛伊木马4、网络监听5、SQL注入…...
CSS图片垂直居中问题解决方案
在 CSS 中,使用 vertical-align: middle 导致图片略微向下偏移的现象,本质上是由于 行内元素的基线对齐规则 和 父容器上下文环境 共同作用的结果。以下是具体原因和解决方案: 原因详解 1. vertical-align: middle 的真实含义 该属性 不会让…...
P1601 A+B Problem(高精)
题目描述 高精度加法,相当于 ab problem,不用考虑负数。 输入格式 分两行输入。a,b≤10500。 输出格式 输出只有一行,代表 ab 的值。 输入输出样例 输入 1 1 输出 2 输入 1001 9099 输出 10100 说明/提示 20% 的测试数据…...
鸿蒙OSUniApp实现个性化的搜索框与搜索历史记录#三方框架 #Uniapp
使用UniApp实现个性化的搜索框与搜索历史记录 在移动端应用开发中,搜索功能几乎是标配,而一个好的搜索体验不仅仅是功能的实现,更是用户留存的关键。本文将分享如何在UniApp框架下打造一个既美观又实用的搜索框,并实现搜索历史记录…...
鸿蒙OSUniApp 制作自定义弹窗与模态框组件#三方框架 #Uniapp
UniApp 制作自定义弹窗与模态框组件 前言 在移动应用开发中,弹窗和模态框是用户交互的重要组成部分,它们用于显示提示信息、收集用户输入或确认用户操作。尽管 UniApp 提供了基础的交互组件如 uni.showModal() 和 uni.showToast(),但这些原…...
web第一次课后作业--运行一个java web项目
一、创建java web项目 1.新建java EE --> 模版:Web应用程序 2.选择版本:Java EE 8 3. 配置tomcat 二、页面效果 默认页面 跳转页面 三、代码 3.1 默认页面 <% page contentType"text/html; charsetUTF-8" pageEncoding"UTF-8…...
工业互联网
工业互联网全景解析 工业互联网是工业数字化、网络化、智能化转型升级的重要抓手,是实现中国制造 2025 战略目标的重要路径,对于推动我国实体经济高质量、可持续发展,建设制造强国、网络强国,意义重大。2017 年,我国提…...
论QT6多线程技术
前言 以前我多线程使用传统的继承qthread重写run()或者继承qrunable类把对象丢到线程池解决。经过昨天的面试让我了解到新的技术,我之前看到过只不过没有详细的去了解movetotread技术,这个技术是qt5推出的,qt6还在延续使用 代码结构 以下是…...
TensorFlow深度学习实战(16)——注意力机制详解
TensorFlow深度学习实战(16)——注意力机制详解 0. 前言1. 引入注意力机制2. 注意力机制2.1 注意力机制原理2.2 注意力机制分类 3. 添加注意机制的 Seq2Seq 模型3.1 数据处理3.2 模型构建与训练3.3 模型性能评估 小结系列链接 0. 前言 在传统的神经网络…...
架空防静电地板材质全解析:选对材质,守护精密空间的“安全卫士”
在现代科技驱动的社会中,无论是数据中心、实验室、手术室,还是高端电子厂房,静电都是精密设备的“隐形杀手”。而架空防静电地板作为这些场所的“安全卫士”,其材质选择直接决定了防静电性能、承重能力及使用寿命。今天࿰…...
Linux系统中部署java服务(docker)
1、不使用docker ✅ 1. 检查并安装 Java 环境 检查 Java 是否已安装: java -version✅ 2. 上传 Java 项目 JAR 文件 可以创建一个server文件夹,然后上传目录 查看当前目录 然后创建目录上传jar包 ✅ 3. 启动 Java 服务 java -jar hywl-server.jar…...
PyGame游戏开发(入门知识+组件拆分+历史存档/回放+人机策略)
前言: 本章实现游戏组件的复用解耦,以及使用配置文件替代原有硬编码形式,进而只需要改动配置文件即可实现整个游戏的难度和地图变化,同时增加历史记录功能,在配置文件开启后即可保存每一局的记录为json形式作为后续强化…...
【上位机——WPF】Window标签常用属性
常用属性 常用属性程序退出 常用属性都是写在Window标签中的 <Window x:Class"WpfDemo1.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d"…...
K8S Gateway AB测试、蓝绿发布、金丝雀(灰度)发布
假设有如下三个节点的 K8S 集群: k8s31master 是控制节点 k8s31node1、k8s31node2 是工作节点 容器运行时是 containerd 一、场景分析 阅读本文,默认您已经安装了 K8S Gateway。 关于 AB 测试、金丝雀发布,可以看这篇文章。 二、实验准…...
人大金仓数据库 与django结合
要在Django项目中连接人大金仓数据库(Kingbase),你需要使用一个适合的数据库适配器。人大金仓数据库是基于PostgreSQL的,因此你可以使用psycopg2库来与Django连接。但是,由于人大金仓数据库有其特定的功能和配置&#…...
RK3588 桌面系统配置WiFi和蓝牙配置
桌面右上角点击,打开选项,找到WiFi的选择网络或者WiFi设置 在弹出的窗口中选择需要连接的WiFi,然后右下角选择连接,然后输入WiFi密码即可连接。 25.4. 命令行连接wifi路由器 命令行配置wifi的方法有很多,下面介绍几种…...
TLV格式
TLV格式(Tag-Length-Value)是一种常用的数据序列化格式,主要用于数据包或消息的有效载荷编码。TLV格式将数据划分为三个主要部分:Tag(标签)、Length(长度)和Value(值…...
2024年9月电子学会等级考试五级第三题——整数分解
题目 3、整数分解 正整数 N 的 K-P 分解是指将 N 写成 K 个正整数的 P 次方的和。本题就请你对任意给定的正整数 N、K、P,写出 N 的 K-P 分解。 时间限制:8000 内存限制:262144 输入 输入在一行给出 3 个正整数 N (≤ 400)、K (≤ N)、P (1 …...
软考 系统架构设计师系列知识点之杂项集萃(60)
接前一篇文章:软考 系统架构设计师系列知识点之杂项集萃(59) 第97题 在面向对象设计中,()可以实现界面控制、外部接口和环境隔离。()作为完成用例业务的责任承担者,协调…...
使用Python开发经典俄罗斯方块游戏
使用Python开发经典俄罗斯方块游戏 在这篇教程中,我们将学习如何使用Python和Pygame库开发一个经典的俄罗斯方块游戏。这个项目将帮助你理解游戏开发的基本概念,包括图形界面、用户输入处理、碰撞检测等重要内容。 项目概述 我们将实现以下功能&…...
C++:字符数组与字符串指针变量的大小
#include<iostream> #include<cstring> int main(int argc, char const *argv[]) {// 字符数组char str[128] "hello world";std::cout<<sizeof(str)<<std::endl;std::cout<<strlen(str)<<std::endl;// 字符串指针变量char *st…...
stm32使用freertos时延时时间间隔不对,可能是晶振频率没设置
freertos 获取频率的接口 在 FreeRTOSConfig.h 文件中声明一个函数作为freertos的接口 /// /// brief 获取 SysTick 的频率 /// /// note arm cortex-m 系列 CPU 有一个 systick ,里面有一个 CTRL 寄存器,其中的 bit2 /// 可以用来控制 systick 的时钟…...
51c~C语言~合集5
我自己的原文哦~ https://blog.51cto.com/whaosoft/13913911 一、大厂C语言编程10大规范 1 代码总体原则 1、清晰第一 清晰性是易于维护、易于重构的程序必需具备的特征。代码首先是给人读的,好的代码应当可以像文章一样发声朗诵出来。 目前软件维护期成本…...
前端流行框架Vue3教程:17. _组件数据传递
_组件数据传递 我们之前讲解过了组件之间的数据传递,props 和自定义事件 两种方式 props:父传子 自定义事件:子传父 除了上述的方案,props也可以实现子传父 一、项目结构 src/ └── components/├── ComponentsA.vue # 父…...
Stack overflow
本文来源 :腾讯元宝 Stack Overflow - Where Developers Learn, Share, & Build Careers 开发者学习,分享 通过学习、工作和经验积累等方式,逐步建立和发展自己的职业生涯。 Find answers to your technical questions and help othe…...
SpringBoot 3.4.5版本导入Lomobok依赖后无法生效的问题
问题背景 最近,随着DeepSeek的爆火,小编也编写了一个前后端分离的“知库随考”系统,由于Spring AI官方提示想要使用Spring AI的话要求Spring Boot的版本在“3.4.x”以上,所以我在创建SpringBoot项目的时候选择了了Server URL:http…...
FPGA: UltraScale+ bitslip实现(ISERDESE3)
收获 一晃五年~ 五年前那个夏夜,我对着泛蓝的屏幕敲下《给十年后的自己》,在2020年的疫情迷雾中编织着对未来的想象。此刻回望,第四届集创赛的参赛编号仍清晰如昨,而那个在家熬夜焊电路板的"不眠者",现在…...
Electron详解:原理与不足
Electron是一个集成项目,它通过定制Chromium和Node.js,并将它们集成在内部来实现其功能。具体来说,Electron做了以下几个重要的工作: 定制Chromium:并将定制版本的Chromium集成在Electron内部。定制Node.js࿱…...
Spring Boot多数据源配置的陷阱与终极解决方案
引言 在微服务架构和复杂业务场景中,一个Spring Boot应用连接多个数据库的需求日益普遍。许多开发者尝试通过简单复制单数据源配置来实现多数据源,结果却遭遇了Bean冲突、事务失效、连接泄漏等隐蔽问题。本文将深入剖析Spring Boot自动配置的底层逻辑&a…...
android display 笔记(十四)VAU 和GSP 分别代表什么
VAU 和 GSP 的解释 GSP (Graphics/GPU Subsystem Processor) 含义: 图形处理子系统,通常指 SoC(系统级芯片)中负责 2D/3D 图形渲染、显示合成、图像后处理(如缩放、旋转、色彩管理) 的硬件模块。 在部分芯…...
tomcat 400 The valid characters are defined in RFC 7230 and RFC 3986
在遇到 Tomcat 因 URL 非法字符返回 400 Bad Request 时,选择在 Nginx 还是 Tomcat 中配置错误处理,需根据实际场景和需求权衡。以下是两种方案的详细对比及配置方法: 一、选择建议 方案适用场景优点缺点Nginx 配置- 需要统一处理所有后端服务(如多个 Tomcat 实例)的 400 …...
nginx负载均衡及keepalive高可用
实验前期准备: 5台虚拟机:4台当做服务器,1台当做客户机(当然,也可以使用主机的浏览器),4台服务器中,2台服务器当做后端真实访问服务器;另外2台服务器当做负载均衡服务器…...
漏洞修复:tomcat 升级版本 spring-boot-starter-tomcat 的依赖项
在Spring Boot项目中修复Tomcat漏洞(如CVE-2024-21733)时,通常需要升级内嵌Tomcat版本。以下是具体操作步骤和注意事项: 一、确认当前Tomcat版本 通过启动日志查看 启动项目时,控制台日志中会显示类似 Starting Servlet engine: [Apache Tomcat/9.0.43] 的信息,直接查看版…...
二、IGMP
目录 1. IGMPv1 1.1 IGMPv1 报⽂类型 1.2 IGMPv1 工作机制 1.3 成员加入 1.4 离组机制 2. IGMPv2 2.1 IGMPv2 报文 2.3 查询器选举 & 维护 2.4 成员加入 2.4 离组机制 3. IGMPv3 3.1 IGMPv3 vs. IGMPv2 3.2 IGMPv3 报文 3.3 IGMPv3 工作机制 4. IGMP Proxy …...
Redis--基础知识点--27--redis缓存分类树
在 Redis 中存储分类树,通常需要选择合适的数据结构来表现层级关系。以下是使用 字符串(String) 和 哈希(Hash) 两种常见方案的举例说明,结合电商分类场景(如 电子产品 > 手机 > 智能手机…...
【2025最新】VSCode Cline插件配置教程:免费使用Claude 3.7提升编程效率
2025年最新VSCode Cline插件安装配置教程,详解多种免费使用Claude 3.7的方法,集成DeepSeek-R1与5大实用功能,专业编程效率提升指南。 Cline是VSCode中功能最强大的AI编程助手插件之一,它能与Claude、OpenAI等多种大模型无缝集…...