MySQL-多表查询-练习

文章展示了多个SQL查询实例,涉及雇员的lastname、department、job、commission、location等信息,包括通过JOIN操作获取员工与其经理的相关数据。

练习


1.写一个查询显示所有雇员的 last name、department id、anddepartment name。

SELECT
e.LAST_NAME,e.DEPARTMENT_ID,d.DEPARTMENT_NAME
FROM employees e,departments d
WHERE e.DEPARTMENT_ID = d.DEPARTMENT_ID;

在这里插入图片描述

2.创建一个在部门 80 中的所有工作岗位的唯一列表,在输出中包括部门的地点。

SELECT DISTINCT
e.JOB_ID,d.LOCATION_ID
FROM employees e,departments d
WHERE e.DEPARTMENT_ID = d.DEPARTMENT_ID
AND e.DEPARTMENT_ID = 80;

在这里插入图片描述

3.写一个查询显示所有有佣金的雇员的 last name、departmentname、location ID 和城市

SELECT
e.LAST_NAME,d.DEPARTMENT_NAME,d.LOCATION_ID,l.CITY
FROM employees e,departments d,locations l
WHERE e.DEPARTMENT_ID = d.DEPARTMENT_ID
AND d.LOCATION_ID = l.LOCATION_ID
AND e.COMMISSION_PCT is not null;

在这里插入图片描述

4.显示所有在其 last names 中有一个小写 a 的雇员的 last name 和departmentname。

select
e.LAST_NAME,d.DEPARTMENT_NAME
FROM employees e,departments d
where e.DEPARTMENT_ID = d.DEPARTMENT_ID
AND e.LAST_NAME like '%a%';

在这里插入图片描述

5.用sql99的内连接写一个查询显示那些工作在 Toronto 的所有雇员的 last name、job、department number 和 departmentname。

SELECT
e.LAST_NAME,e.JOB_ID,e.DEPARTMENT_ID,d.DEPARTMENT_NAME
WHERE l.CITY = 'Toronto';

在这里插入图片描述

6.显示雇员的 last name 和 employee number 连同他们的经理的last name 和manager number。列标签分别为 Employee、Emp#、Manager 和 Mgr#

SELECT
w.LAST_NAME empname,w.DEPARTMENT_ID
empid,m.LAST_NAME mgrname,m.EMPLOYEE_ID mgrid
FROM employees w INNER JOIN employees m
ON w.MANAGER_ID = m.EMPLOYEE_ID;

在这里插入图片描述

<think>嗯,用户这次明确要查找MySQL查询练习真题。从对话历史看,用户之前已经接触过"查询的分类""优化技巧"的概念(引用[1][2]),现在需要实操性练习。 用户可能正在准备数据库面试或技能提升,因为两次引用都涉及企业级应用场景。真题练习需求通常隐含几个深层诉求:既要覆盖基础语法(如JOIN操作),也要包含企业常见的复杂场景(如聚合筛选、性能陷阱)。 注意到引用[2]特别提到"复杂查询简单化""避免嵌套",这提示真题设计应该循序渐进。先巩固等值连接(用户已了解的分类),再过渡到需要优化的复杂查询。 真题选取需考虑三个维度: 1)技术点完整性:必须包含关联字段选择(如引用[1]强调的部门编号)、连接类型(INNER/LEFT JOIN)、聚合函数与分组 2)典型业务场景:如订单系统(用户-订单-商品)、层级关系(员工-部门-上级) 3)性能提示:在真题解析中加入引用[2]的拆分建议 特别要注意的是,用户引用[1]提到关联字段"可能无外键",所以真题应包含显式声明连接条件的题目(避免依赖外键)。真题4的员工-上级自连接就是典型案例。 最后加入优化建议,把引用[2]的索引策略转化为真题的延伸思考,这样既满足练习需求,又延续了用户之前关注的性能话题。 </think>以下是精选的MySQL查询练习真题(含解析要点),结合企业面试考点实战场景设计: --- ### **真题1:基础等值连接** **结构** `employees`(员工):employee_id, name, department_id `departments`(部门):department_id, department_name **题目** 列出所有员工姓名及其所属部门名称 ```sql SELECT e.name, d.department_name FROM employees e INNER JOIN departments d ON e.department_id = d.department_id; ``` > 📝 **考点**:等值连接(引用[1])、INNER JOIN基础用法 --- ### **真题2:非等值连接与范围查询** **结构** `products`(产品):product_id, price `discounts`(折扣):min_price, max_price, discount_rate **题目** 计算每个产品在不同价格区间的折扣价 ```sql SELECT p.product_id, p.price * (1 - d.discount_rate) AS discounted_price FROM products p JOIN discounts d ON p.price BETWEEN d.min_price AND d.max_price; ``` > 📝 **考点**:非等值连接(引用[1])、BETWEEN条件 --- ### **真题3:三关联与聚合** **结构** `orders`(订单):order_id, customer_id, order_date `order_items`(订单明细):order_id, product_id, quantity `products`(产品):product_id, product_name **题目** 统计2023年每位客户购买的产品总量(去重) ```sql SELECT o.customer_id, COUNT(DISTINCT i.product_id) AS unique_products FROM orders o JOIN order_items i ON o.order_id = i.order_id WHERE YEAR(o.order_date) = 2023 GROUP BY o.customer_id; ``` > 📝 **考点**:JOIN链式关联、分组聚合、时间函数 --- ### **真题4:自连接与层级关系** **结构** `employees`:employee_id, name, manager_id **题目** 查询所有员工及其经理姓名(若无经理显示NULL) ```sql SELECT e.name AS employee, m.name AS manager FROM employees e LEFT JOIN employees m ON e.manager_id = m.employee_id; ``` > 📝 **考点**:自连接、LEFT JOIN处理空值 --- ### **真题5:复杂条件与子查询优化** **结构** `students`:student_id, name `scores`:student_id, course, score **题目** 找出数学成绩高于90分且总成绩排名前10的学生 ```sql SELECT s.name, SUM(sc.score) AS total_score FROM students s JOIN scores sc ON s.student_id = sc.student_id WHERE sc.course = 'Math' AND sc.score > 90 GROUP BY s.student_id HAVING total_score > (SELECT AVG(total) FROM (SELECT SUM(score) AS total FROM scores GROUP BY student_id) t) ORDER BY total_score DESC LIMIT 10; ``` > ⚠️ **优化提示**(引用[2]): > 1. 避免嵌套子查询 → 改用临时或WITH语法 > 2. WHERE条件字段添加索引(如`scores.course`) --- ### **真题6:外连接与数据补齐** **结构** `users`:user_id, name `login_records`:user_id, login_date **题目** 列出所有用户及最近登录日期(从未登录者显示“未登录”) ```sql SELECT u.name, COALESCE(MAX(l.login_date), '未登录') AS last_login FROM users u LEFT JOIN login_records l ON u.user_id = l.user_id GROUP BY u.user_id; ``` > 📝 **考点**:LEFT JOIN全扫描、COALESCE空值处理 --- ### **配套优化建议** 1. **索引策略**(引用[2]) - 连接字段必建索引:`department_id`, `order_id`等 - WHERE条件字段索引:`order_date`, `course` 2. **复杂查询拆分** ```sql /* 替代真题5的嵌套子查询 */ WITH total_scores AS ( SELECT student_id, SUM(score) AS total FROM scores GROUP BY student_id ) SELECT ... /* 主查询直接引用total_scores */ ``` 3. **执行计划分析** 使用`EXPLAIN`检查是否有效利用索引,避免全扫描。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Blue刂

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值