MySQL_5 有丶牛逼的查询语句

news2024/9/21 18:58:02

目录

一、分组查询

        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工资表
                创建员工表的代码如下 : 

CREATE TABLE IF NOT EXISTS `employee`(
	`eno` MEDIUMINT UNSIGNED NOT NULL DEFAULT 0,
	`ename` VARCHAR(20) NOT NULL DEFAULT '',
	`ecareer` VARCHAR(20) NOT NULL DEFAULT '',
	`mgr` MEDIUMINT UNSIGNED,
	`hiredate` DATE NOT NULL,
	`esalary` DECIMAL(8,2),
	`ebonus` DECIMAL(8,2),
	`deptno` MEDIUMINT UNSIGNED NOT NULL DEFAULT 0
) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin ENGINE INNODB;

INSERT INTO `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`;

                员工表效果如下 : 

                创建部门表的代码如下 :  

CREATE TABLE IF NOT EXISTS `department`(
	`dno` MEDIUMINT UNSIGNED NOT NULL DEFAULT 0,
	`dname` VARCHAR(20) NOT NULL DEFAULT '',
	`dloc` VARCHAR(20) NOT NULL DEFAULT ''
) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin ENGINE INNODB;

INSERT INTO `department`
			VALUES(10, 'ADMINISTRATION', 'HONGKONG'),	/*管理部门 */
                  (20, 'R&D', 'SUZHOU'),			    /*研发部门 */
			      (30, 'SALES', 'BEIJING'),		        /*销售部门 */
			      (40, 'FINANCE', 'NANJING');		    /*财务部门 */
						
SELECT * FROM `department`;

                部门表效果如下 : 

                创建工资表的代码如下 :   

CREATE TABLE IF NOT EXISTS `salary`(
	`grade` MEDIUMINT UNSIGNED NOT NULL DEFAULT 0,
	`lowsal` DECIMAL(20,2) NOT NULL,
	`higsal` DECIMAL(20,2) NOT NULL
) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin ENGINE INNODB;

INSERT INTO `salary`
			VALUES(1, 4500, 6500),
				  (2, 6500, 8500),
				  (3, 8500, 15000),
				  (4, 15000, 25000),
				  (5, 25000, 99999);
						
SELECT * FROM `salary`;
	

                工资表效果如下 : 

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

                代码如下 :  

SELECT AVG(`esalary`), MAX(`esalary`), `deptno`
			FROM `employee`
			GROUP BY `deptno`
			ORDER BY `deptno`;

                查询效果 : 

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

                代码如下 : 

SELECT AVG(`esalary`), MAX(`esalary`), `deptno`, `ecareer`
			FROM `employee`
			GROUP BY `deptno`, `ecareer`
			ORDER BY `deptno`; 

                查询结果 : 

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

                代码如下 : 

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

                查询效果 : 


二、分页查询

        1.基本语法 : 

        SELECT ...

                LIMIT start, rows;

        注意事项——

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

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

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

        2.代码演示 : 

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

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

# 第一页
SELECT `eno`, `ename`, `esalary` FROM `employee`
			WHERE `eno` > 5500
			LIMIT 0, 4;
# 第二页			
SELECT `eno`, `ename`, `esalary` FROM `employee`
			WHERE `eno` > 5500
			LIMIT 4, 4;
# 第三页
SELECT `eno`, `ename`, `esalary` FROM `employee`
			WHERE `eno` > 5500
			LIMIT 8, 4;

                第一页 : 

                第二页 : 

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


三、多表查询

        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`;

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

SELECT COUNT(*) FROM `employee`, `department`;

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

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

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

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

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

SELECT eno,ename,esalary,`employee`.deptno,`department`.dname
			FROM `employee`, `department`
			WHERE `employee`.deptno = `department`.dno
			ORDER BY `deptno`;

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

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

SELECT `ename`,`employee`.`deptno`,`department`.`dname`,`esalary`,`salary`.grade
        FROM `employee`, `department`, `salary`
        WHERE `employee`.`deptno` = `department`.`dno` 
                AND `employee`.`esalary` BETWEEN `salary`.`lowsal` AND `salary`.`higsal`
                AND `employee`.`esalary` > 8000
        ORDER BY `employee`.`esalary` ASC;


四、嵌套查询

        1.定义 : 

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

        2.单行子查询 : 

                1° 特点

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

                2° 演示

                仍以employee表来操作,如下 : 

                现要求——
                ①查询与Cyan同一个部门的所有员工

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

        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 (
						SELECT DISTINCT `ecareer` 
						FROM `employee`
						WHERE `deptno` = 20
				);
	

                演示Ⅱ——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
		);

        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`
				GROUP BY `deptno`
				ORDER BY `deptno` ASC
		) temp, `employee`
		WHERE temp.`deptno` = `employee`.deptno
				AND temp.max_sal = `employee`.esalary
		ORDER BY employee.`deptno` ASC;

        5.多列子查询 : 

                1° 定义

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

        注意:

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

        格式如下 : 

        SELECT * / column_n...

                FROM table_name

                WHERE (column_1,column_2...) = (

                        SELECT... # 子查询语句

                );

                2° 演示

                仍然操作员工表,如下 : 

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

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


五、合并查询

        1.概述 : 

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

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

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

        2.演示 : 

                仍然操作员工表,如下 : 

                现要求,分别统计——
                ①员工姓名不小于五个字符长度的所有员工;
                ②员工工资高于10000的所有员工;
                ③员工编号不小于6000的所有员工;
                要求对统计得到的结果分别使用不去重合并去重合并进行整理
                代码如下 : 

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

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

                查询结果 : 

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/564237.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Emacs之实时渲染markdown(九十五)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

Web安全常见攻击

前言 本篇主要简单介绍在 Web 领域几种常见的攻击手段。 1. Cross Site Script&#xff08;XSS跨站脚本攻击) 首先插播一句&#xff0c;为毛叫 XSS&#xff0c;缩写明显是 CSS 啊&#xff1f;没错&#xff0c;为了防止与我们熟悉的 CSS&#xff08;Cascading Style Sheets&am…

类ChatGPT的各种语言大模型LLM开源Github模型集合​

作为开发人员&#xff0c;面对堪称科技奇点爆发的ChatGPT&#xff0c;我们如何应对。当然是努力跟进&#xff0c;虽然ChatGPT不开源&#xff0c;但是有诸多不输ChatGPT的各类语言大模型LLM有分享。我们筛选出其中影响力较大的各个开源Github仓库&#xff0c;收录到 类ChatGPT的…

由浅入深Dubbo网络通信协议大全

目录 1 网络通信协议1.1 dubbo协议1.2 rmi协议1.3 hessian协议1.4 http协议1.5 webservice协议1.6 thrift协议1.7 rest协议1.8 grpc协议1.9 memcached协议1.10 redis协议 2 序列化实现剖析 1 网络通信协议 在之前的内容中&#xff0c;我们讲解了消费者端服务发现与提供者端服务…

局部最小值问题

局部最小值问题 自写&#xff1a; // arr 相邻的数不相等&#xff01; 返回一个局部最小的下标public static int oneMinIndex(int[] arr) {if(arr null || arr.length 0) {return -1;}if(arr.length 1) {return 0;}int L 0;int R arr.length - 1;if(arr[L] < arr[L 1…

C++判断大端小端

C判断大端小端 1. 基础知识 大端小端其实表示的是数据在存储器中的存放顺序。 大端模式&#xff1a;数据的高字节存放在内存的低地址中&#xff0c;而低字节则存放在高地址中。地址由小到大增加&#xff0c;数据则从高位向低位存放&#xff0c;这种存放方式符合人类的正常思维…

Hadoop/HbBase/Hive/HDFS/MapReduce都是什么?

目录 一图胜万言&#xff01;&#xff01; 解释说明 1. hadoop 2. hive 3. hbase 总结 一图胜万言&#xff01;&#xff01; 解释说明 1. hadoop 它是一个分布式计算分布式文件系统&#xff0c;前者其实就是 MapReduce&#xff0c;后者是 HDFS 。后者可以独立运行&…

特瑞仕|关于无线射频

无线射频&#xff08;Radio Frequency, RF&#xff09;是指在一定频率范围内&#xff0c;通过无线电波进行通信和传输信息的技术。随着移动通信、物联网、智能家居等领域的不断发展&#xff0c;无线射频技术已经成为现代社会中不可或缺的一部分。本文将从以下几个方面对无线射频…

打印机无法扫描的原因及解决方法

在家庭和办公环境中&#xff0c;打印机已成为不可或缺的设备。它不仅可以打印文件&#xff0c;还可以扫描文档并将它们转换为数字数据。但有时&#xff0c;打印机可能无法扫描文档或图片。以下是可能导致这些问题的原因和解决方法。 出现打印机无法扫描的原因&#xff1a; 1.…

web基础和http协议

文章目录 一、web基础1.1dns的概念1.2网页的概念1.3HTML的概念1.4静态网页1.5动态网络 二、HTTP协议2.1什么是HTTP协议2.2HTTP的版本协议2.3HTTP的请求方法2.4HTTP的状态码2.5HTTP 请求流程分析 一、web基础 1.1dns的概念 dns用作域名解析&#xff0c;有正向解析和反向解析两…

protobuf全局环境搭建

一、安装npm 1.测试是否安装npm 如果未出现npm 不是内部或外部命令&#xff0c;则先安装npm npm是NodeJs的包管理器&#xff08;Node Package Manager&#xff09; 所以我们要安装npm&#xff0c;其实就是安装NodeJs&#xff0c;进入NodeJs官网 下载完成之后&#xff0c;安装…

7.性能测试

目录 一、常见的性能问题 二、为啥要进行性能测试&#xff1f; 三、确定性能测试的需求&#xff08;性能指标&#xff0c;量化&#xff09; 1.关键性能指标分析 2.关键业务的分析 四、不同维度衡量系统的性能 1.研发人员 2.系统运维人员 3.用户 4.性能测试人员 五、性…

力扣 695. 岛屿的最大面积

一、题目描述 给你一个大小为 m x n 的二进制矩阵 grid。 岛屿是由一些相邻的 1&#xff08;代表土地&#xff09;构成的组合&#xff0c;这里的相邻要求两个 1 必须在水平或者竖直的四个方向上相邻。你可以假设 grid 的四个边缘都被 0&#xff08;代表水&#xff09;包围着。…

论文分享 A ConvNet for the 2020s

摘要 视觉识别的“咆哮的 20 年代”始于 Vision Transformers (ViTs) 的引入&#xff0c;它迅速取代了 ConvNets&#xff0c;成为最先进的图像分类模型。另一方面&#xff0c;vanilla ViT 在应用于对象检测和语义分割等一般计算机视觉任务时面临困难。正是层次化的 Transforme…

SpringBoot 3.1现已推出,惊艳新特性带来前所未有的开发体验

一、介绍 1.1 新特性概述 经过半年的沉淀 Spring Boot 3.1于2023年5月18日正式发布了&#xff0c;带来了许多令人兴奋的新特性和改进。本篇博客将详细介绍Spring Boot 3.1的新特性、升级说明以及核心功能的改进。 同时&#xff0c;2.6.x 版本线已经停止维护了&#xff0c;最新…

02SpringCloud Nacos注册中心和配置中心与Sentinel服务熔断和流控

Nacos注册中心和配置中心 Nacos 是 Alibaba 开发的用于微服务管理的平台&#xff0c;核心功能&#xff1a;服务注册与发现和集中配置管理。 Nacos 作为服务注册发现组件&#xff0c;可以替换Spring Cloud 应用中传统的服务注册于发现组件&#xff0c;如&#xff1a;Eureka、C…

XML和JSON格式转换成txt

XML如下这种&#xff1a; 转换代码 import os import xml.etree.ElementTree as ET# xml文件存放目录(修改成自己的文件名) input_dir rC:\121\Annotations# 输出txt文件目录&#xff08;自己创建的文件夹&#xff09; out_dir rC:\121\txtclass_list []# 获取目录所有xml文…

pix2pixHD代码---数据集处理

在train文件中&#xff1a;其中dataset是dataloader的方法&#xff0c;而dataloader等于CreateDataLoader。 所以我们跳到CreateDataLoader&#xff1a; 在CreateDataLoader中返回的是dataset_loader&#xff0c;是来自于CustomDatasetDataLoader。切调用了initialize。因为C…

零次学习(Zero-Shot Learning)

零次学习&#xff08;Zero-Shot Learning&#xff09; 零样本学习zero-shot learning&#xff0c;是最具挑战的机器识别方法之一。2009年&#xff0c;Lampert 等人提出了Animals with Attributes数据集和经典的基于属性学习的算法&#xff0c;开始让这一算法引起广泛关注。 零…

qt quick(qml)通过arcgis导入自定义格式地图(Windows 版本)

参考ArcGIS Maps SDK for Qt 参考Display a map 安装 预先安装的软件 安装ArcGIS SDK 点击ArcGIS Maps SDK for Qt 注册账号 要注册成developer版本用户的&#xff0c;不然之后可能没办法生成API 下载 下载之后安装&#xff0c;一路next就可以了 在QT中创建ArcGIS项目…