MySQL_5 有丶牛逼的查询语句

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
云数据库 RDS MySQL,高可用系列 2核4GB
简介: MySQL 第五节 有点NB的查询语句 内容分享。

目录

一、分组查询

       1.基本语法 :

       2.代码演示 :

二、分页查询

       1.基本语法 :

       2.代码演示 :

三、多表查询

       1.定义 :

       2.语法 :

       3.演示 :

四、嵌套查询

       1.定义 :

       2.单行子查询 :

               1° 特点

               2° 演示

       3.多行子查询 :

               1° 特点

               2° 演示

       4.临时表 :

               1° 定义

               2° 演示

       5.多列子查询 :

               1° 定义

               2° 演示

五、合并查询

       1.概述 :

       2.演示 :


一、分组查询

       1.基本语法 :

       SELECT column_1, column_2...column_n

               FROM table_name

               GROUP BY column_1,column_2...

               HAVING...;

       注意事项——

       GROUP BY 用于对查询得到的结果进行分组统计,其本质就是以指定的列为标准,对行(记录)进行分类和合并;

      HAVING的作用相当于WHERE,用于限制分组的显示结果,但分组查询时不用WHERE

       2.代码演示 :

               先来建三张表,分别是employee员工表department部门表salary工资表

              创建员工表的代码如下 :

CREATETABLE IF NOT EXISTS `employee`(  `eno` MEDIUMINTUNSIGNEDNOTNULL DEFAULT 0,  `ename` VARCHAR(20)NOTNULL DEFAULT '',  `ecareer` VARCHAR(20)NOTNULL DEFAULT '',  `mgr` MEDIUMINTUNSIGNED,  `hiredate` DATENOTNULL,  `esalary` DECIMAL(8,2),  `ebonus` DECIMAL(8,2),  `deptno` MEDIUMINTUNSIGNEDNOTNULL DEFAULT 0) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin ENGINE INNODB;INSERTINTO `employee`
VALUES(5000,'Cyan','Full_Stack',2000,'2002-1-1',9000,NULL,'20'),(5001,'Five','Back_End',2000,'2002-1-1',9000,10000,'20'),(5534,'Raina','Sale',2766,'2003-3-1',5000,5000,'30'),(5537,'Ice','Back_End',2000,'2003-6-12',9000,10000,'20'),(5600,'Kyrie','Fore_End',2000,'2004-9-1',9500,20000,'20'),(5611,'James','Sale',2766,'2004-9-13',5500,10000,'30'),(5612,'Bob','Sale',2766,'2004-9-15',5500,10000,'30'),(5700,'Alice','Manage',1088,'2004-10-1',20000,30000,'10'),(6111,'Fiven','Manage',1088,'2006-1-11',20000,30000,'10'),(6113,'Cyana','Fore_End',2000,'2006-1-11',11000,20000,'20'),(6150,'Peter','Accounting',1760,'2006-3-1',6000,20000,'40'),(6300,'White','Accounting',1760,'2009-6-6',7000,20000,'40'),(6381,'Frank','Manage',1900,'2010-1-3',25000,50000,'10');SELECT*FROM `employee`;

image.gif

               员工表效果如下 :

image.png

image.gif编辑

              创建部门表的代码如下 :  

CREATETABLE IF NOT EXISTS `department`(  `dno` MEDIUMINTUNSIGNEDNOTNULL DEFAULT 0,  `dname` VARCHAR(20)NOTNULL DEFAULT '',  `dloc` VARCHAR(20)NOTNULL DEFAULT '') CHARACTER SET utf8mb3 COLLATE utf8mb3_bin ENGINE INNODB;INSERTINTO `department`
VALUES(10,'ADMINISTRATION','HONGKONG'),/*管理部门 */(20,'R&D','SUZHOU'),/*研发部门 */(30,'SALES','BEIJING'),/*销售部门 */(40,'FINANCE','NANJING');/*财务部门 */SELECT*FROM `department`;

image.gif

               部门表效果如下 :

image.png

image.gif编辑

              创建工资表的代码如下 :  

CREATETABLE IF NOT EXISTS `salary`(  `grade` MEDIUMINTUNSIGNEDNOTNULL DEFAULT 0,  `lowsal` DECIMAL(20,2)NOTNULL,  `higsal` DECIMAL(20,2)NOTNULL) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin ENGINE INNODB;INSERTINTO `salary`
VALUES(1,4500,6500),(2,6500,8500),(3,8500,15000),(4,15000,25000),(5,25000,99999);SELECT*FROM `salary`;

image.gif

               工资表效果如下 :

image.png

image.gif编辑

               现要求——

               ①查询员工表中每个部门的平均工资和最高工资;

               代码如下 :  

SELECT AVG(`esalary`), MAX(`esalary`), `deptno`
FROM `employee`
GROUPBY `deptno`
ORDERBY `deptno`;

image.gif

               查询效果 :

image.png

image.gif编辑

               ②查询员工表中每个部门每个岗位(工作) 的平均工资和最高工资;

               代码如下 :

SELECT AVG(`esalary`), MAX(`esalary`), `deptno`, `ecareer`
FROM `employee`
GROUPBY `deptno`, `ecareer`
ORDERBY `deptno`;

image.gif

               查询结果 :

image.png

image.gif编辑

               ③查询平均工资低于15000的部门号及其平均工资;

               代码如下 :

# 使用别名可以提高查询的效率
SELECT AVG(`esalary`)AS `avg_sal`, `deptno`
FROM `employee`
GROUPBY `deptno`
HAVING `avg_sal` <15000ORDERBY `deptno`;

image.gif

              查询效果 :

image.png

image.gif编辑


二、分页查询

      1.基本语法 :

       SELECT ...

               LIMIT start, rows;

       注意事项——

        LIMIT语句表示从(start + 1)行开始取,共取出rows行记录;其中,start从0开始计算

       start = 每页显示的行数 * (当前页码 - 1),但start必须是一个提前算出来的确切的结果,不可以是一个表达式,否则报错
           rows = 每页显示的行数 (记录数)

      SELECT语句正常格式,LIMIT语句位于SELECT语句的末尾

      2.代码演示 :

               仍对employee, salary, department这三张表来进行操作,其中employee表如下 :

image.png

image.gif编辑

               现要求——

               查询出雇员编号大于5500的所有雇员的编号,姓名,和工资;并按照每页4条记录来分页展示

# 第一页
SELECT `eno`, `ename`, `esalary` FROM `employee`
WHERE `eno` >5500LIMIT0,4;# 第二页     
SELECT `eno`, `ename`, `esalary` FROM `employee`
WHERE `eno` >5500LIMIT4,4;# 第三页
SELECT `eno`, `ename`, `esalary` FROM `employee`
WHERE `eno` >5500LIMIT8,4;

image.gif

               第一页 :

image.png

image.gif编辑

               第二页 :

image.png

image.gif编辑

               第三页 : (共查到11条编号大于5500的记录,每页四条记录,因此第三页只剩3条)

image.png

image.gif编辑


三、多表查询

       1.定义 :

       多表查询是指基于两个或两个以上的表的查询。在实际应用中,单表的查询往往无法满足需求,便考虑使用多表查询。

       2.语法 :

      若直接SELECT * FROM table_1, table_2...;默认会对查询的多表进行笛卡尔积——即前一张表的每一条记录,都要和后一张表的每一条记录进行组合;一共返回的记录数 = 第一张表的记录数 * 第二张表的记录数 * ... * 第n张表的记录数。因此,多表查询的关键就是写出正确的过滤条件语句。

       利用WHERE条件语句,可以过滤掉无意义的记录,需要用到“表名.字段名”的格式,eg : employee.deptno = department.dno;  PS :多表查询中的条件不能少于表的个数 - 1,否则会出现笛卡尔积

        若要指定查询的字段,要在查询时进行声明"SELECT column_1, column_2...",但要注意,若两个表中有相同的字段名,必须通过"表名.字段名"的格式来声明要查询的字段是哪个表中的,否则报错

       3.演示 :

               演示Ⅰ—— 不采取过滤条件,直接查询多表

               查询employee, department这两张表,如下 :

SELECT*FROM `employee`, `department`;

image.gif

image.gif编辑

               图片并没显示完全,可以通过COUNT(*) 函数来统计表中共有多少条记录,如下 :

SELECTCOUNT(*)FROM `employee`, `department`;

image.gif

image.png

image.gif编辑

               演示Ⅱ—— 采取过滤条件,剔除无效数据

               增加过滤条件,要求两个表的部门号要相等,如下 :

SELECT*FROM `employee`, `department`
WHERE `employee`.deptno= `department`.dno;

image.gif

image.png

image.gif编辑

               演示Ⅲ—— 限定查询的列,精简查询结果

               要求查询所有员工的员工号,员工姓名,员工的工资,员工的部门号以及对应部门的名称,如下 :

SELECT eno,ename,esalary,`employee`.deptno,`department`.dnameFROM `employee`, `department`
WHERE `employee`.deptno= `department`.dnoORDERBY `deptno`;

image.gif

image.png

image.gif编辑

               练习 —— 三张表的查询,要求剔除无效数据,指定查询字段

               请查询出工资高于8000的员工的员工姓名,员工部门号及对应的部门名称,员工工资及对应的工资水平等级;并要求按照工资排序。如下 :

SELECT `ename`,`employee`.`deptno`,`department`.`dname`,`esalary`,`salary`.gradeFROM `employee`, `department`, `salary`
WHERE `employee`.`deptno` = `department`.`dno` 
AND `employee`.`esalary` BETWEEN `salary`.`lowsal` AND `salary`.`higsal`
AND `employee`.`esalary` >8000ORDERBY `employee`.`esalary` ASC;

image.gif

image.png

image.gif编辑


四、嵌套查询

       1.定义 :

       嵌套查询是指嵌入在其他SQL中SELECT语句,也称为子查询。根据查询返回的结果,又可分为单行子查询和多行子查询。

       2.单行子查询 :

               1° 特点

       单行子查询是指只返回一行数据(一条记录)的子查询语句。

               2° 演示

               仍以employee表来操作,如下 :

image.png

image.gif编辑

               现要求——

               ①查询与Cyan同一个部门的所有员工

SELECT*FROM `employee` 
WHERE `deptno` =(SELECT `deptno` 
FROM `employee` 
WHERE `ename` ='Cyan');

image.gif

image.png

image.gif编辑

       3.多行子查询 :

               1° 特点

       多行子查询是指返回多行数据(多条记录)的子查询语句,需要使用IN,ALL或ANY关键字

       其中——

       IN表示条件为在子查询查询到的范围内

       ALL表示条件为必须大于或小于(自己决定)子查询查询到的全部结果

       ANY表示条件为存在大于或小于子查询查询到的全部结果中的一个即可

               2° 演示

               演示Ⅰ——IN关键字的使用

               要求查询工作岗位属于20部门范畴的员工的姓名,工作岗位,以及工作部门的名称。

SELECT `ename`,`ecareer`,`dname`,`esalary`
FROM `employee`, `department`
WHERE `employee`.`deptno` = `department`.`dno`
AND `employee`.`ecareer` IN(SELECTDISTINCT `ecareer` 
FROM `employee`
WHERE `deptno` =20);

image.gif

image.png

image.gif编辑

               演示Ⅱ——ALL和ANY关键字的使用

               要求查询工资大于30部门所有员工的工资,并且小于20部门任一员工的工资的所有员工。如下 :

SELECT*FROM `employee`
WHERE `esalary` > ALL(SELECT `esalary`
FROM `employee` 
WHERE `deptno` =30)AND `esalary` < ANY(SELECT `esalary`
FROM `employee`
WHERE `deptno` =20);

image.gif

image.png

image.gif编辑

       4.临时表 :

               1° 定义

       MySQL中,常常会将某个查询语句的结果作为一张临时表,来与其他表进行连接操作,以更轻松地完成查询需求。

      格式如下 :

       SELECT column_n...

               FROM (

                       SELECT... # 子查询语句

               ) 临时表表名, 其他表表名

               WHERE...;

               2° 演示

               要求查询出员工表中各个部门工资最高的员工。(即最终要求查出的所有字段都必须是员工表中已经存在的

/*     1.先利用嵌套查询得知每个部门中最高工资具体是多少,作为临时表;    2.然后利用多表查询,只要临时表中每条记录的部门号和员工表中的某位    员工的部门号相同,并且该条记录的最高工资和某位员工的工资相等,    就可以找到该员工。相应地,就可以找到各个部分中工资最高的员工。*/SELECT `eno`,`ename`,`esalary`, employee.`deptno`
FROM(SELECT MAX(`esalary`)AS max_sal, `deptno`
FROM `employee`
GROUPBY `deptno`
ORDERBY `deptno` ASC) temp, `employee`
WHERE temp.`deptno` = `employee`.deptnoAND temp.max_sal= `employee`.esalaryORDERBY employee.`deptno` ASC;

image.gif

image.png

image.gif编辑

       5.多列子查询 :

               1° 定义

       多列子查询指返回多个字段的数据的子查询语句

       注意:

       多列子查询在定义上不同于单行子查询和多行子查询,因为多列子查询并不要求返回结果的行数(记录数),而是返回结果的列数(字段数),因此,多列子查询的返回结果既可以是单行的也可以是多行的;并且,嵌套查询的最终目的是服务于主查询语句,因此,多列子查询最终的目的就是对主查询语句中的多个字段进行限制

      格式如下 :

       SELECT * / column_n...

               FROM table_name

               WHERE (column_1,column_2...) = (

                       SELECT... # 子查询语句

               );

               2° 演示

               仍然操作员工表,如下 :

image.png

image.gif编辑

               要求查询与James同一部门且同一岗位的员工,并且查询结果中排除James自己。

SELECT*FROM `employee`
WHERE(`ecareer`, `deptno`)=(SELECT `ecareer`, `deptno`
FROM `employee`
WHERE `ename` ='James')AND `ename` !='James';

image.gif

image.png

image.gif编辑


五、合并查询

       1.概述 :

       某些情况下,需要合并多个SELECT语句的结果。这时可以用到UNION和UNION ALL。

       注意事项——

       UNION ALL可以对多个SELECT语句的结果取并集,并且不会去重;

       UNION的作用与UNION ALL 相同,但UNION会对查询到的记录进行去重操作

       2.演示 :

               仍然操作员工表,如下 :

image.png

image.gif编辑

               现要求,分别统计——

               ①员工姓名不小于五个字符长度的所有员工;

               ②员工工资高于10000的所有员工;

               ③员工编号不小于6000的所有员工;

               要求对统计得到的结果分别使用不去重合并去重合并进行整理

               代码如下 :

SELECT*FROM `employee` WHERE LENGTH(`ename`)>= LENGTH('.....')UNION ALL
SELECT*FROM `employee` WHERE `esalary` >10000UNION ALL
SELECT*FROM `employee` WHERE `eno` >=6000;SELECT*FROM `employee` WHERE LENGTH(`ename`)>= LENGTH('.....')UNIONSELECT*FROM `employee` WHERE `esalary` >10000UNIONSELECT*FROM `employee` WHERE `eno` >=6000;

image.gif

               查询结果 :

image.png

image.gif编辑

image.png

image.gif编辑

       System.out.println("END---------------------------------------------------------------------------");

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
目录
相关文章
|
1月前
|
SQL 缓存 监控
MySQL缓存机制:查询缓存与缓冲池优化
MySQL缓存机制是提升数据库性能的关键。本文深入解析了MySQL的缓存体系,包括已弃用的查询缓存和核心的InnoDB缓冲池,帮助理解缓存优化原理。通过合理配置,可显著提升数据库性能,甚至达到10倍以上的效果。
|
1月前
|
SQL 存储 关系型数据库
MySQL体系结构详解:一条SQL查询的旅程
本文深入解析MySQL内部架构,从SQL查询的执行流程到性能优化技巧,涵盖连接建立、查询处理、执行阶段及存储引擎工作机制,帮助开发者理解MySQL运行原理并提升数据库性能。
|
3月前
|
SQL 人工智能 关系型数据库
如何实现MySQL百万级数据的查询?
本文探讨了在MySQL中对百万级数据进行排序分页查询的优化策略。面对五百万条数据,传统的浅分页和深分页查询效率较低,尤其深分页因偏移量大导致性能显著下降。通过为排序字段添加索引、使用联合索引、手动回表等方法,有效提升了查询速度。最终建议根据业务需求选择合适方案:浅分页可加单列索引,深分页推荐联合索引或子查询优化,同时结合前端传递最后一条数据ID的方式实现高效翻页。
208 0
|
1月前
|
SQL 关系型数据库 MySQL
MySQL的查询操作语法要点
储存过程(Stored Procedures) 和 函数(Functions) : 储存过程和函数允许用户编写 SQL 脚本执行复杂任务.
171 14
|
1月前
|
SQL 关系型数据库 MySQL
MySQL的查询操作语法要点
以上概述了MySQL 中常见且重要 的几种 SQL 查询及其相关概念 这些知识点对任何希望有效利用 MySQL 进行数据库管理工作者都至关重要
80 15
|
1月前
|
SQL 监控 关系型数据库
SQL优化技巧:让MySQL查询快人一步
本文深入解析了MySQL查询优化的核心技巧,涵盖索引设计、查询重写、分页优化、批量操作、数据类型优化及性能监控等方面,帮助开发者显著提升数据库性能,解决慢查询问题,适用于高并发与大数据场景。
|
1月前
|
SQL 关系型数据库 MySQL
MySQL入门指南:从安装到第一个查询
本文为MySQL数据库入门指南,内容涵盖从安装配置到基础操作与SQL语法的详细教程。文章首先介绍在Windows、macOS和Linux系统中安装MySQL的步骤,并指导进行初始配置和安全设置。随后讲解数据库和表的创建与管理,包括表结构设计、字段定义和约束设置。接着系统介绍SQL语句的基本操作,如插入、查询、更新和删除数据。此外,文章还涉及高级查询技巧,包括多表连接、聚合函数和子查询的应用。通过实战案例,帮助读者掌握复杂查询与数据修改。最后附有常见问题解答和实用技巧,如数据导入导出和常用函数使用。适合初学者快速入门MySQL数据库,助力数据库技能提升。
|
2月前
|
存储 关系型数据库 MySQL
使用命令行cmd查询MySQL表结构信息技巧分享。
掌握了这些命令和技巧,您就能快速并有效地从命令行中查询MySQL表的结构信息,进而支持数据库维护、架构审查和优化等工作。
295 9
|
1月前
|
SQL 监控 关系型数据库
MySQL高级查询技巧:子查询、联接与集合操作
本文深入解析了MySQL高级查询的核心技术,包括子查询、联接和集合操作,通过实际业务场景展示了其语法、性能差异和适用场景,并提供大量可复用的代码示例,助你从SQL新手进阶为数据操作高手。
|
11月前
|
缓存 关系型数据库 MySQL
MySQL索引策略与查询性能调优实战
在实际应用中,需要根据具体的业务需求和查询模式,综合运用索引策略和查询性能调优方法,不断地测试和优化,以提高MySQL数据库的查询性能。
583 66

推荐镜像

更多