MySQL的学习笔记(第六部分-子查询的课后练习)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 自学的MySQL学习笔记

6.7、子查询的课后练习

#1.查询和Zlotkey相同部门的员工姓名和工资
SELECT last_name,salary
FROM employees
WHERE department_id IN (
                    SELECT department_id
                    FROM employees
                    WHERE last_name = 'Zlotkey'
                    );

#2.查询工资比公司平均工资高的员工的员工号,姓名和工资。
SELECT department_id,last_name,salary
FROM employees
WHERE salary>(
            SELECT AVG(salary)
            FROM employees
            );

#3.选择工资大于所有JOB_ID = 'SA_MAN'的员工的工资的员工的last_name, job_id, salary
SELECT last_name,job_id,salary
FROM employees
WHERE salary > ALL(
                SELECT salary
                FROM employees
                WHERE job_id ='SA_MAN'
                );

#4.查询和姓名中包含字母u的员工在相同部门的员工的员工号和姓名
SELECT department_id,last_name
FROM employees
WHERE department_id IN(
                    SELECT department_id
                    FROM employees
                    WHERE last_name RLIKE 'u'
                    );

#5.查询在部门的location_id为1700的部门工作的员工的员工号
SELECT employee_id
FROM employees
WHERE department_id IN (
                    SELECT department_id
                    FROM departments
                    WHERE location_id =1700
                    ); 

#6.查询管理者是King的员工姓名和工资
SELECT last_name,salary,manager_id
FROM employees
WHERE manager_id IN (
                    SELECT employee_id
                    FROM employees
                    WHERE last_name = 'King'
                    );

#7.查询工资最低的员工信息: last_name, salary
SELECT last_name,salary
FROM employees
WHERE salary IN (
                SELECT MIN(salary)
                FROM employees
                );


#8.查询平均工资最低的部门信息
#方式一:四层嵌套
SELECT *
FROM departments
WHERE department_id =(
                      SELECT department_id
                      FROM employees
                      GROUP BY department_id
                      HAVING AVG(salary) =(
                          SELECT MIN(avg_sal)
                          FROM(
                                  SELECT AVG(salary) AS 'avg_sal'
                                  FROM employees
                                  GROUP BY department_id
                              )t_dept_avg_sal
                      )
                    );
#方式二:四层优化变为三层
SELECT *
FROM departments
WHERE department_id = (
                    SELECT department_id
                    FROM employees
                    GROUP BY department_id
                    HAVING AVG(salary) <=ALL (
                                SELECT AVG(salary)
                                FROM employees
                                GROUP BY department_id
                    )
                    );
#方式三:使用LIMIT进行优化
SELECT *
FROM departments
WHERE department_id = (
                        SELECT department_id
                        FROM employees
                        GROUP BY department_id
                        HAVING AVG(salary) = (
                                            SELECT AVG(salary) AS 'AS_SAL'
                                            FROM employees
                                            GROUP BY department_id
                                            ORDER BY AS_SAL
                                            LIMIT 1
                                             )
                        );

#方式四:在FROM中声明子查询,再次进行优化:
SELECT D.*
FROM departments D,(
                    SELECT department_id,AVG(salary) AS avg_sal
                    FROM employees
                    GROUP BY department_id
                    ORDER BY avg_sal
                    LIMIT 1
                    )d_DEP_avg_sal
WHERE D.department_id = d_DEP_avg_sal.department_id;
#由此得出结论:根据实际场景去调整,再次优化,当然这个方法不算严谨,仅扩展思路

#9.查询平均工资最低的部门信息和该部门的平均工资(相关子查询)
SELECT D.*,(SELECT AVG(salary)FROM employees WHERE D.department_id = employees.department_id)
FROM departments D
WHERE department_id = (
    SELECT department_id
    FROM employees
    GROUP BY department_id
    HAVING AVG(salary) =(
        SELECT MIN(AVG_SAL)
        FROM(
                SELECT AVG(salary) AS 'AVG_SAL'
                FROM employees
                GROUP BY department_id
            )T_TEP_AVG_SAL
    )
    );

#10.查询平均工资最高的 job 信息
SELECT *
FROM jobs
WHERE job_id = (
                SELECT job_id
                FROM employees
                GROUP BY job_id
                HAVING AVG(salary) >=ALL (
                    SELECT AVG(salary) AS 'AVG_SAL'
                    FROM employees
                    GROUP BY job_id
                    )
                );

#11.查询部门平均工资高于公司平均工资的部门有哪些?
SELECT department_id
FROM employees
WHERE department_id IS NOT NULL
GROUP BY department_id
HAVING AVG(salary) >(
                    SELECT AVG(salary)
                    FROM employees
                    );

#12.查询出公司中所有 manager 的详细信息
#方式一:使用自连接
SELECT DISTINCT G.last_name,G.employee_id,G.last_name,G.employee_id
FROM employees E JOIN employees G
ON E.manager_id = G.employee_id;

#方式二:使用子查询
SELECT *
FROM employees
WHERE employee_id IN(
                    SELECT DISTINCT manager_id
                    FROM employees
                    );
#13.各个部门中 最高工资中最低的那个部门的 最低工资是多少?
SELECT MIN(salary)
FROM employees
WHERE department_id = (
                        SELECT department_id
                        FROM employees
                        GROUP BY department_id
                        HAVING MAX(salary) = (
                                            SELECT MIN(MAX_SAL)
                                            FROM(
                                                SELECT MAX(salary) AS 'MAX_SAL'
                                                FROM employees
                                                GROUP BY department_id
                                                 )T_TMP_MAX_SAL
                                              )
                        );  
#14.查询平均工资最高的部门的 manager 的详细信息: last_name, department_id, email, salary
SELECT *
FROM employees
WHERE employee_id IN(
    SELECT manager_id
    FROM employees
    WHERE department_id =(
        SELECT department_id
        FROM employees
        GROUP BY department_id
        HAVING AVG(salary) = (
            SELECT MAX(DA)
            FROM(
                    SELECT AVG(salary) AS 'DA'
                    FROM employees
                    GROUP BY department_id
                )FAC
        )
    )
    );
#15. 查询部门的部门号,其中不包括job_id是"ST_CLERK"的部门号
SELECT DISTINCT department_id
FROM employees
WHERE department_id NOT IN(
    SELECT department_id
    FROM employees
    WHERE job_id = 'ST_CLERK'
    );

#16. 选择所有没有管理者的员工的last_name
SELECT last_name
FROM employees
WHERE manager_id IS NULL;

#17.查询员工号、姓名、雇用时间、工资,其中员工的管理者为 'De Haan'
SELECT employee_id,last_name,hire_date,salary
FROM employees
WHERE manager_id IN (
                    SELECT employee_id
                    FROM employees
                    WHERE last_name = 'De Haan'
                    );

#18.查询各部门中工资比本部门平均工资高的员工的员工号, 姓名和工资(相关子查询)
SELECT last_name,department_id,salary
FROM employees E1
WHERE salary> (
    SELECT AVG(salary)
    FROM employees E2
    WHERE E2.department_id = E1.department_id
    );

#19.查询每个部门下的部门人数大于 5 的部门名称(相关子查询)
SELECT department_name
FROM departments D
WHERE 5 < (
            SELECT COUNT(*)
            FROM employees E
            WHERE D.department_id = E.department_id
            );
#20.查询每个国家下的部门个数大于 2 的国家编号(相关子查询)
SELECT country_id
FROM locations L
WHERE 2<(
            SELECT COUNT(*)
            FROM departments D
            WHERE L.location_id = D.location_id
            );

7、增删改的基本语法

7.1、增Insert

(特殊的如果id自动递增的话,就不需要插入id)
基本语法 INSERR INTO 表名
(列1,列2,列3,列4,...)  
values(值,值,值)
例子INSERT INTO
student(name,sex,age) 
values('张三',18,'男');

7.2、删delete

基本语法 :DELETE FROM 表名 WHERE 列 = 值
例子:
DELETE FROM student
WHERE id = 1;
DELETE from 表名 一行行删除整张表
TRUNCATE table 表名 就是清空表

7.3、改update

基本语法  UPDATE 表名 SET 列=值,列=值,.... WHERE...
列子  UPDATE student 
SET name = '张三'
where id=1;
相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
3月前
|
存储 SQL 关系型数据库
Mysql学习笔记(二):数据库命令行代码总结
这篇文章是关于MySQL数据库命令行操作的总结,包括登录、退出、查看时间与版本、数据库和数据表的基本操作(如创建、删除、查看)、数据的增删改查等。它还涉及了如何通过SQL语句进行条件查询、模糊查询、范围查询和限制查询,以及如何进行表结构的修改。这些内容对于初学者来说非常实用,是学习MySQL数据库管理的基础。
150 6
|
10天前
|
存储 关系型数据库 MySQL
10个案例告诉你mysql不使用子查询的原因
大家好,我是V哥。上周与朋友讨论数据库子查询问题,深受启发。为此,我整理了10个案例,详细说明如何通过优化子查询提升MySQL性能。主要问题包括性能瓶颈、索引失效、查询优化器复杂度及数据传输开销等。解决方案涵盖使用EXISTS、JOIN、IN操作符、窗口函数、临时表及索引优化等。希望通过这些案例,帮助大家在实际开发中选择更高效的查询方式,提升系统性能。关注V哥,一起探讨技术,欢迎点赞支持!
|
5月前
|
SQL 关系型数据库 MySQL
在 MySQL 中使用子查询
【8月更文挑战第12天】
264 0
在 MySQL 中使用子查询
|
3月前
|
SQL 关系型数据库 MySQL
Mysql学习笔记(三):fetchone(), fetchmany(), fetchall()详细总结
MySQL中用于数据检索的`fetchone()`, `fetchmany()`, `fetchall()`函数的功能、SQL语句示例和应用场景。
95 3
Mysql学习笔记(三):fetchone(), fetchmany(), fetchall()详细总结
|
3月前
|
SQL Ubuntu 关系型数据库
Mysql学习笔记(一):数据库详细介绍以及Navicat简单使用
本文为MySQL学习笔记,介绍了数据库的基本概念,包括行、列、主键等,并解释了C/S和B/S架构以及SQL语言的分类。接着,指导如何在Windows和Ubuntu系统上安装MySQL,并提供了启动、停止和重启服务的命令。文章还涵盖了Navicat的使用,包括安装、登录和新建表格等步骤。最后,介绍了MySQL中的数据类型和字段约束,如主键、外键、非空和唯一等。
81 3
Mysql学习笔记(一):数据库详细介绍以及Navicat简单使用
|
3月前
|
关系型数据库 MySQL 数据库
Mysql学习笔记(四):Python与Mysql交互--实现增删改查
如何使用Python与MySQL数据库进行交互,实现增删改查等基本操作的教程。
76 1
|
4月前
|
SQL 缓存 关系型数据库
MySQL高级篇——关联查询和子查询优化
左外连接:优先右表创建索引,连接字段类型要一致、内连接:驱动表由数据量和索引决定、 join语句原理、子查询优化:拆开查询或优化成连接查询
|
5月前
|
SQL druid Java
Java数据库部分(MySQL+JDBC)(二、JDBC超详细学习笔记)(下)
Java数据库部分(MySQL+JDBC)(二、JDBC超详细学习笔记)
67 3
Java数据库部分(MySQL+JDBC)(二、JDBC超详细学习笔记)(下)
|
5月前
|
SQL 关系型数据库 MySQL
MySQL学习笔记
这篇文章是一份关于MySQL数据库操作的学习笔记,涵盖了数据库的终端操作、数据类型、建表约束、事务处理以及SQL的连接查询等基础知识点。
|
10天前
|
存储 Oracle 关系型数据库
数据库传奇:MySQL创世之父的两千金My、Maria
《数据库传奇:MySQL创世之父的两千金My、Maria》介绍了MySQL的发展历程及其分支MariaDB。MySQL由Michael Widenius等人于1994年创建,现归Oracle所有,广泛应用于阿里巴巴、腾讯等企业。2009年,Widenius因担心Oracle收购影响MySQL的开源性,创建了MariaDB,提供额外功能和改进。维基百科、Google等已逐步替换为MariaDB,以确保更好的性能和社区支持。掌握MariaDB作为备用方案,对未来发展至关重要。
38 3