MySql 复合查询

1.基本查询回顾

第一题
查询工资高于500或岗位为MANAGER的雇员,同时还要满足他们的姓名首字母为大写的J

第二题
按照部门号升序而雇员的工资降序排序
第三题
使用年薪进行降序排序

年薪=12*工资+年终奖

第四题
显示工资最高的员工的名字和工作岗位
第五题
显示工资高于平均工资的员工信息

第六题
显示每个部门的平均工资和最高工资

第七题
显示平均工资低于2000的部门号和它的平均工资

第八题
显示每种岗位的雇员总数,平均工资

2 多表查询

第一题
我们只要emp表中的deptno = dept表中的deptno字段的记录

第二题
显示部门号为10的部门名,员工名和工资

3.自连接

自连接是指在同一张表连接查询
自连接要取别名才能实现 无法直接实现

4.子查询

子查询是指嵌入在其他sql语句中的select语句,也叫嵌套查询
第一题       

                                                                                                                                       

显示SMITH同一部门的员工

第二题

查询和10号部门的工作岗位相同的雇员的名字,岗位,工资,部门号,但是不包含10

己的

这个代码报错的原因是

报错 ERROR 1242 (21000): Subquery returns more than 1 row 表示子查询返回了多行结果,而外层查询用 = 进行单值匹配,逻辑冲突。 解决方法:若需匹配子查询中任意一个职位,将 = 改为 IN ,语句修改为:

=:是一个比较运算符,用于判断某个值是否等于另一个值,要求精确匹配。它只能与单个值进行比较 ,当等号右边是子查询时,子查询必须只返回一行数据,否则会报错。

IN:用于判断某个值是否在一个指定的列表或者子查询结果集中,列表或子查询结果可以包含多个值。它可以处理多个可能的匹配情况,只要满足列表中的任意一个值,条件即为真。

其次在 SQL 中,AND 的优先级高于 IN 。

第三题
显示工资比部门30的所有员工的工资高的员工的姓名、工资和部门号

all关键字

与 SELECT 结合:表示返回所有符合条件的记录,默认情况下 SELECT 即隐含 ALL 行为(与 SELECT DISTINCT 相对,DISTINCT 会去除重复记录,而 ALL 会保留所有记录,包括重复项)。

与比较运算符结合:在子查询中,ALL 用于指定条件需满足子查询返回的所有值。例如 WHERE 列名 > ALL(子查询) 表示该列的值要大于子查询结果中的所有值。

第四题
显示工资比部门30的任意员工的工资高的员工的姓名、工资和部门号(包含自己部门
的员工)

ANY 的作用是判断 “表达式” 与子查询返回的任意一个值是否满足指定的比较条件。如果存在至少一个值满足条件,则整个表达式返回 TRUE;否则返回 FALSE。

第五题

查询和SMITH的部门和岗位完全相同的所有雇员,不含SMITH本人

这是因为 MySQL 中 “行构造器”(Row Constructor)的比较是严格按顺序、按列匹配的,字段顺序不同会导致匹配逻辑完全变化,具体分析如下:

第六题
显示每个高于自己部门平均工资的员工的姓名、部门、工资、平均工资
第七题
查找每个部门工资最高的人的姓名、工资、部门、最高工资

5.合并查询

在实际应用中,为了合并多个select的执行结果,可以使用集合操作符 unionunion all
第一题

将工资大于2500或职位是MANAGER的人找出来

第二题
将工资大于25000或职位是MANAGER的人找出来
### 关于 MySQL 复合查询的教程 复合查询是指通过 `UNION` 或子查询等方式组合多个 SQL 查询的结果集。以下是有关如何构建和执行 MySQL 中复杂查询的一些指导: #### 使用 UNION 进行复合查询 可以通过 `UNION` 和 `UNION ALL` 来合并两个或更多 `SELECT` 语句的结果集。注意,`UNION` 默认会去除重复项,而 `UNION ALL` 则保留所有记录。 ```sql -- 示例:使用 UNION 合并两个查询结果 SELECT tutorial_id, tutorial_title FROM tutorials_tbl WHERE tutorial_author = 'Abdul S' UNION SELECT tutorial_id, tutorial_title FROM tutorials_tbl WHERE tutorial_author = 'John Poul'; ``` 此示例展示了如何从同一表的不同条件中提取数据并将它们合并成单个结果集[^1]。 #### 子查询的应用 子查询是在另一个 SQL 语句内部嵌套的一个查询。它可以用于过滤、计算或其他操作。 ```sql -- 示例:基于子查询筛选数据 SELECT * FROM tutorials_tbl WHERE tutorial_id IN ( SELECT tutorial_id FROM tutorials_tbl WHERE submission_date >= '2007-05-01'); ``` 在此例子中,外部查询依赖于内部查询返回的一组 ID 值来进一步缩小范围[^1]。 #### JOIN 的高级应用 当涉及跨多张表格的数据关联时,可以利用各种类型的联接(JOIN),如 INNER JOIN、LEFT JOIN 等实现更加复杂的逻辑处理。 ```sql -- 示例:INNER JOIN 实现两表间匹配字段联合检索 SELECT t.tutorial_id, u.user_name FROM tutorials_tbl AS t INNER JOIN users_tbl AS u ON t.author_id = u.id; ``` 这里假设存在一张名为 `users_tbl` 的用户信息表,并且每篇教程都有对应的作者ID (`author_id`) 可以用来建立联系关系[^3]。 #### 性能优化建议 对于大规模数据上的复杂查询,应当考虑索引设计以及避免不必要的全表扫描等问题。此外,在实际项目开发过程中还可以借助缓存机制或者分页技术提升响应速度[^2]。 ### 提供的相关资源链接 虽然当前文档未具体提及某些在线学习资料地址,但是可以根据以上介绍自行搜索关键词比如 “advanced mysql queries examples pdf”,“mysql complex join operations step by step guide” 获取更多信息源[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值