Mysql高级查询语句

news2024/12/27 9:34:38

数据库是用来存储数据,更新,查询数据的工具,而查询数据是一个数据库最为核心的功能,数据库是用来承载信息,而信息是用来分析和查看的。所以掌握更为精细化的查询方式是很有必要的。本文将围绕数据的高级查询语句展开。 

为了下面查询语句的运用,事先准备了两张表,后续也会根据查询功能的运用会对表进行一些变动,或创建新表

一、创建表 

CREATE TABLE miss (
  id int(4) ,
  name char(4),
  height double 
) ;
 
 
CREATE TABLE miss2 (
  name char(4),
  hobby char(10), 
  date char(10)
) ;

 二、高级查询的方式

1.指定指字段进行查看

select 字段1,字段2 from 表名;

 2.对字段进行去重查看 

 SELECT DISTINCT "字段" FROM "表名";

 3.where条件查询

 SELECT "字段" FROM 表名" WHERE "条件";

 4.and 和 or 进行逻辑关系的增加

 SELECT "字段" FROM "表名" WHERE "条件1"  AND "条件2";

 SELECT "字段" FROM "表名" WHERE "条件1"  OR "条件2";

 5.查询取值列表中的数据

 SELECT "字段" FROM "表名" WHERE "字段" IN ('值1', '值2', ...);   #in,遍历一个取值列表

 6.between的引用

 SELECT "字段" FROM "表名" WHERE "字段" BETWEEN '值1' AND '值2';

7. like的查询 方式

 like查询通常会与通配符配合使用

%:百分号表示零个、一一个或多个字符

 _:划线表示单个字符

select * from miss where hobby like '%ing';
select * from miss2 where name like '胡_';

 select * from miss where name like '_击';
 
select * from miss2 where hobby like '%ni%';

8.排序方式进行查询 

order by,按关键字排序

注意:

  • 一般对数值字段进行排序。
  • 如果对字符类型的字段进行排序,则会按首字母排序。
 SELECT "字段" FROM "表名" [WHERE "条件"] ORDER BY "字段" [ASC|DESC] ;
 #ASC是按照升序进行排序的,是默认的排序方式。
 #DESC是按降序方式进行排序。
  select * from miss  order by height;
  select * from miss  order by height asc;
  select * from miss  order by height desc;

 三、运用函数查询

1.数据库中常用数学的函数

数学函数作用
abs(x)返回x的绝对值
rand()返回0到1的随机数
mod(x, y)返回x除以y以后的余数
power(x, y)返回x的y次方
round(x)返回离x最近的整数
round(x, y)保留x的y位小数四舍五入后的值
sqrt(x)返回x的平方根
truncate(x, y)返回数字x截断为y位小数的值 #不四舍五入
ceil(x)返回大于或等于x的最小整数
floor(x)返回小于或等于x的最大整数
greatest(x1,x2,...)返回集合中最大的值
least(x1,x2,...)返回集合中最小的值
SELECT abs(-1),rand(), mod(5,3) ,power(2,3);

 SELECT truncate(1.89,2);
SELECT truncate(1.89,1);

select ceil(1.76);
select floor(1.76);

select greatest(1,2,3,55,12,55,61);
select least(1,2,3,55,12,55,61);

 2.聚合函数

聚合函数含义
avg()返回指定列的平均值
count()返回指定列中非 NULL 值的个数
min()返回指定列的最小值
max()返回指定列的最大值
sum(字段)返回指定列的所有值之和
select avg(height) from miss;

 

select count(name) from miss;
select count(*) from miss;

select max(height) from miss;
select min(height) from miss;
select sum(height) from miss;

 3.字符串函数

 1)去除字符

 SELECT TRIM ([ [位置] [要移除的字符串] FROM ] 字符串);
 ​
 #[位置]:值可以为 LEADING (起头), TRAILING (结尾), BOTH (起头及结尾)。 
 #[要移除的字符串]:从字串的起头、结尾,或起头及结尾移除的字符串。缺省时为空格。
select trim(leading 'r' from 'running' );
select trim(trailing 'g' from 'running' );
select trim(both 'l' from 'lol' );

 2)截取 substr

substr(x,y)    #截取x字符串 从第y个开始,截取到末尾
 
substr(x,y,z)  #截取x字符串 从第y个开始截取 ,截取长度为z
select substr(hobby,2) from miss2;
select substr(hobby,3) from miss2;

 select substr(hobby,2,5) from miss2;
 select substr(hobby,4,6) from miss2;

 3) 字段拼接

concat(x,y)

select concat(name,height) from miss;

 使用 || 符号

 #将info表中,name字段值和height字段值拼接在一起。
 select name || height from miss;

 将miss表中,name字段值和height字段值拼接在一起,且中间加空格。
 select name || ' ' || height from miss;

 4) 返回字符长度 length

 select length(hobby) from miss2;

5) 替换 replace

select replace(name,'反','攻') from miss2;

 

 四、高级查询语句

1.GROUP BY(用于分组和汇总)

对GROUPBY后面的字段的查询结果进行汇总分组,通常是结合聚合函数一起使用的

  • "GROUP BY"有一个原则,凡是在"GROUP BY"后面出现的字段,必须在SELECT 后面出现;
  • 凡是在SELECT 后面出现的、且未在聚合函数中出现的字段,必须出现在"GROUP BY"后面。

 1)汇总统计

select name, count(name) from miss group by name;

 2)汇总并对其指定字段(数字类)进行累加

select name,sum(saving) from miss3 group by name;

 3)汇总并对其指定字段(数字类)进行累加,再进行降序

select name,sum(saving) from miss3 group by name order by sum(saving) desc;

 2.HAVING 过滤

  • 用来过滤由"GROUP BY"语句返回的记录集,通常与"GROUP BY"语句联合使用。

  • HAVING语句的存在弥补了WHERE 关键字不能与聚合函数联合使用的不足。

  • where只能对原表中的字段进行筛选,不能对group by后的结果进行筛选。

 SELECT 字段1,SUM(字段2) FROM "表格名" GROUP BY 字段1 HAVING(函数条件) ;
select name,sum(saving) from miss3 group by name having sum(saving)>3500;

 3. 别名设置查询

语法格式: 

 SELECT 字段1,字段2 AS 字段2的别名 from 表名;   #AS可以省略不写

1) 字段别名

select name,sum(saving) as total_saving  from miss3  group by name having sum(saving)>3000;
select name,sum(saving) as total_saving  from miss3  group by name having total_saving>3000;

 2) 表别名

SELECT 表格别名.字段1 [AS] 字段别名  FROM 表格名 [AS] 表格别名; #AS可以省略不写

 4.表的自我连接

1) 无重复数值排名

对下面的表进行saving比较并且进行排名通过表的自我连接进行实现

 表的自我连接达到排名的原理分析及操作思路:

1.以上面的数据表为例,假设共有五个人,他们手中的金额各不相同。我们已经进行表的自我连接。

2. 使用count计数,只计数大于等于自身手上金额的人数,比如3000的声望,大于等于她的人数只有2个,就计数值也可以当作她的排名

3.再比如900的无比,大于等于她的有5个人,就该计数值为5,同理可以证明她排名第五。

select A.name,A.saving,count(A.saving) as rank from miss3 as A,info3 as B where A.saving <=B.saving group by A.name,A.saving  order by rank asc;


2)有重复数值排名

表插入数据

select A.name,A.saving,count(A.saving) as rank from miss3 as A,miss3 as B where A.saving < B.saving or (A.name=B.name and A.saving=B.saving) group by A.name,A.saving  order by rank asc;

 5.子查询语句

子查询:连接表格,在WHERE 子句或HAVING 子句中插入另一个SQL语句。

 SELECT "字段1" FROM "表格1" WHERE "字段2" [比较运算符]     #外查询
 (SELECT "字段1" FROM "表格2" WHERE "条件") ;             #内查询

1)普通表数据连接

select * from miss as A, miss3 as B where A.name=B.name;

 2) 子查询加入表连接 :

 select * from miss where name in(select name from miss3 where saving > 2000);

 子查询运用升级

求“英伦地区”的所有saving值之和

select sum(saving) from miss3  where name in (select name from miss where address='英伦');

 五、表连接查询

MYSQL数据库中常用的表连接有三种:

  • inner join(内连接):只返回两个表中联结字段相等的行(有交集的值)

  • left join(左连接):返回包括左表中的所有记录和右表中联结字段相等的记录
  • A  left  join  B  : A为左表,B为右表

  • right join(右连接):返回包括右表中的所有记录和左表中联结字段相等的记
  • A  right join  B:  A为左表 ,B为右表

 

 1. 内连接inner join

select * from miss A inner join miss3 B on A.name = B.name;
 

其他实现内连接的方式:

 select * from miss A, miss3 B where A.name=B.name;
 select * from miss A inner join miss3 B using(name);

 2.左连接 left join

select * from miss A LEFT JOIN miss3 B on A.name=B.name;

 3.右连接 right join 

select * from miss3 A right join miss B on A.name=B.name ;

 六、view 视图的运用

视图:可以被当作是虚拟表或存储查询。

  • 视图跟表格的不同是,表格中有实际储存数据记录,而视图是建立在表格之上的一个架构,它本身并不实际储存数据记录。
  • 临时表在用户退出或同数据库的连接断开后就自动消失了,而视图不会消失。
  • 视图不含有数据,只存储它的定义,它的用途一般可以简化复杂的查询。 比如你要对几个表进行连接查询,而且还要进行统计排序等操作,写SQL语句会很麻烦的,用视图将几个表联结起来,然后对这个视图进行查询操作,就和对一个表查询一样,很方便。
    格式:
CREATE VIEW "视图表名" AS "SELECT 语句";   #创建视图表
 ​
 DROP VIEW "视图表名";                     #删除视图表

 1.视图的创建

创建需求:独立创建一个视图,用来统计info和info3 两张表之间,先对name进行address的汇总,再计算地区的saving之和 。要求体现出address  和sum(sving) 两个字段

create view v_address_saving as select A.address,sum(B.saving) total_saving from miss A inner join miss3 B on A.name=B.name group by address;
 

 视图创建的数据验证:

 2.视图提供的后续便捷操作

 视图的好处:创建视图的过程虽然和高级查询语句(通过两个select语句进行组合条件划分生成派生表)一样,过程是复杂的,但是如果该查询操作是需要经常使用的,创建视图就很有必要,不仅能简化查询过程,还能对该查询进行进一步操作,而且十分简便。

 进一步需求: 需要计算出苏州和上海两个地区的saving之和 

select sum(total_saving) as yinglun_ribuluo_saving from v_address_saving where address='英伦'or address='日不落';

 3.经典定义问题:视图能否插入数据 

视图能否插入数据,要看情况而定:

1)如果视图表是两个表的连接查询(比如视图的A字段来自A表,B字段来自B表,数据是无法插入的)。因为表结构和原表不一致。视图中的字段是根据原表中某个字段,通过函数运算,产生的新字段,而没有真正能够存储的字段,所以该数据是无法插入的。

 2)如果视图表结构与原表保持一致,数据是可以插入的,插入的数据是存储在原表中,视图所更新出的数据,其实是映射原表的数据。

 show create view  分析创建视图的过程: 

 七.联级

UNION联集:将两个SQL语句的结果合并起来,两个SQL语句所产生的字段需要是同样的数据记录种类。

 1. UNION(合并后去重)

生成结果的数据记录值将没有重复,且按照字段的顺序进行排序。#合并后去重 

 格式:[select 语句1] UNION [select 语句2];

select name from miss union select name from  miss3;

 2.UNION ALL(合并后不去重)

select name from miss union all select name from  miss3;

 八、多种方式求表与表的交集值

1.联级视图求交集值

create view v_miss as select distinct name from miss union all select distinct name from miss3;
 ​
select name,count(*) from v_miss group by name;
 ​
 
select name from v_miss group by name having count(*) >1;
 

 2.内连接求交集值 

1)不去重求交集 

select A.name from miss A inner join miss3 B on A.name=B.name;
 ​
select A.name from miss A inner join miss3 B using(name);
 

2) 去重求交集 

select distinct A.name from miss A inner join miss3 B using(name);

3.使用左连接求交集值  

select * from miss A left join miss3 B using(name);
select distinct A.name from miss A left join miss3 B using(name) where B.name is not null;

 4.使用右连接求交集 

 #使用右连接查出store_name字段的交集值,之后去重
 select * from miss A right join miss3 B using(name);
 select distinct A.name from miss A right join miss3 B using(name) where A.name is not null;
 
 ​或
 select distinct A.name from miss A right join miss3 B on A.name=B.name where A.name is not null;
 

 5.使用子查询的方式求交集值

select distinct name from miss where name in (select name from miss3);

 6 取非交集值

(1)联级方法中 count(*)<=1

  (2)左右内连接  将is not null  改为  is  null

(3)子查询 外连接查询 not in (内连接查询)

九、case 条件选择查询语句  

 SELECT CASE ("字段名")
     WHEN "条件1" THEN "结果1"
     WHEN "条件2" THEN "结果2"
     [ELSE "结果N"]
     END
 FROM "表名";
     
 # "条件"可以是一个数值或是公式。ELSE子句则并不是必须的。
mysql> select address,case address
    -> when '无比' then height-10
    -> when 胡德' then height+5
    -> else height+10
    -> end
    -> "new_height",name
    -> from miss;

 十、正则表达式的运用

1.sql正则表达式的常见种类

 2.sql正则运用 

格式:

select "字段" from "表名" where "字段" regexp '正则表达式';

 

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

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

相关文章

题集-栈和队列的相互转化

这里&#xff0c;队列的性质是先入先出&#xff0c;但是栈的性质是后入先出。两个队列就可以通过相互捯实现数据的后入先出。 typedef int QDataType&#xff1b; //这是一个队列结点的结构 typedef struct QueueNode { struct QueueNode* next; QDataType data; }QNode; //这是…

C++之工厂模式

目录 一、为什么要使用工厂模式 优点 缺点 二、简单工厂&#xff08;Simple Factory&#xff09; 好处&#xff1a; 不足&#xff1a; 三、工厂方法&#xff1a; 好处&#xff1a; 不足&#xff1a; 四、抽象工厂&#xff08;Abstract Factory&#xff09; 一、为什…

RWA 成下一轮加密大叙事,PoseiSwap 的价值正在凸显

PoseiSwap是Nautilus Chain上的首个DEX&#xff0c;在Nautilus Chain模块化开发的支持下&#xff0c;PoseiSwap能够以更具延展性的方式来构建应用&#xff0c;并能够为交易者提供极佳的交易体验。基于Nautilus Chain支持下的Zk-Rollup方案&#xff0c;PoseiSwap构建了基于零知识…

文心一言 VS 讯飞星火 VS chatgpt (45)-- 算法导论6.1 3题

三、证明:在最大堆的任一子树中&#xff0c;该子树所包含的最大元素在该子树的根结点上。 文心一言&#xff1a; 在最大堆中&#xff0c;根结点是整个堆中最大元素的孩子&#xff0c;因此它包含的最大元素是在该子树的根结点上。 我们可以通过递归的方式证明任意子树中的最大…

C++11 线程库—互斥锁

前言 多线程因其调度的随机性和时间片分配&#xff0c;如果没有限制的访问临界资源&#xff0c;会导致出现无法预测的结果&#xff0c;也无法达到预期。 所以&#xff0c;访问临界区&#xff0c;需要是原子性的&#xff0c;在一个线程完成之前&#xff0c;不能有其他线程访问&…

找bug号召

我的博客是为了完成这个找 bug 号召&#xff1a; https://bbs.csdn.net/topics/614134877。 文章目录 测试场景之三&#xff1a; 选择你的身份 测试场景之三&#xff1a; 选择你的身份 同样在个人中心的最下面&#xff0c;你可以看到身份选择的界面。 注意&#xff0c;你要把鼠…

Python元组、集合、字典(超详细举例、讲解和区分)

总有一天你要一个人在暗夜中&#xff0c;向那座桥走过去 文章目录 一、元组 字符串、元组、列表的总结 二、集合 1.定义空集合 2.创建集合 &#xff08;1&#xff09;直接创建 &#xff08;2&#xff09;set函数 3.列表、元组、字符串、字典的去重 4.向集合中添加元素…

python---js逆向------再接再励------案例

作者前言 这是我的gitee仓库:https://gitee.com/qin-laoda/python-exercises 有兴趣的小可爱们可以点进去看看, 目录 常见的js加密算法 微信公众号的简单案例 ________________________________ 鉴于有一些小可爱对于js逆向的理解还有一些不解,下面我会再进一步的介绍js…

【计算机视觉 | 目标检测】arxiv 计算机视觉关于目标检测的学术速递(6月 23 日论文合集)

文章目录 一、检测相关(4篇)1.1 Targeted collapse regularized autoencoder for anomaly detection: black hole at the center1.2 RXFOOD: Plug-in RGB-X Fusion for Object of Interest Detection1.3 Toward Automated Detection of Microbleeds with Anatomical Scale Loca…

axios简单使用

axios简单使用 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-wid…

【杂谈】过往时期2-嵌入式求学故事线简忆

前一篇文章 过往时期 - 欢迎来到 Staok - 瞰百易 (gitee.io)。 在我兴趣广泛的过去&#xff0c;关于嵌入式方面的经历啊&#xff0c;讲一条这个的故事线。 小学&#xff0c;电子积木&#xff0c;灯泡&#xff0c;电机&#xff0c;上电发光、风扇旋转&#xff0c;风扇转的快了还…

AnyLogic仿真软件 8.8.2 Crack

AnyLogic仿真软件用于以下行业&#xff1a; 供应链 制造业 运输 仓库运营 铁路物流 矿业 石油和天然气 港口及码头 更多行业 为什么要进行仿真建模&#xff1f; 无风险环境 仿真建模提供了一种安全的方法来测试和探索不同的“假设”场景。在做出现实世界的改变之前做出正确的决…

第10章 隐式转换

第10章 隐式转换 package chapter10object Test01_TestImplicit {def main(args: Array[String]): Unit {val richInt new MyRichInt(12)println(richInt.myMax(15))// 1. 隐式函数implicit def convert(num: Int): MyRichInt new MyRichInt(num)println(12.myMax(15))// 2.…

登录校验原理过程和统一拦截技术(Cookie、Sesstion 和JWT令牌)

一、登录校验 问题&#xff1a;在未登录情况下&#xff0c;我们也可以直接访问部门管理、员工管理等功能。由于浏览器与web服务器中的数据交互是通过HTTP协议的&#xff0c;而HTTP协议是无状态的–即每个页面中的请求和响应都是独立的&#xff0c;没有状态存在。所以我们需要进…

【数据库】关系型数据库与非关系型数据库解析

【数据库】关系型数据库与非关系型数据库解析 文章目录 【数据库】关系型数据库与非关系型数据库解析1. 介绍2. 关系型数据库3. 非关系型数据库4. 区别4.1 数据存储方式不同4.2 扩展方式不同4.3 对事务性的支持不同4.4 总结 参考 1. 介绍 一个通俗易懂的比喻&#xff1a;关系型…

Xpath介绍以及语法

Xpath介绍 XML路径语言&#xff08;XML Path Language&#xff09;&#xff0c;它是一种用来确定XML文档中某部分位置的语言。 XPath基于XML的树状结构&#xff0c;提供在数据结构树中找寻节点的能力。 起初XPath的提出的初衷是将其作为一个通用的、介于XPointer与XSL间的语法模…

第8章 模式匹配

第8章 模式匹配 基本概念和用法 模式守卫 package chapter08object Test01_PatternMatchBase {def main(args: Array[String]): Unit {// 1. 基本定义语法val x 5val y x match {case 1 > "one"case 2 > "two"case 3 > "three"ca…

《Reinforcement Learning: An Introduction》第6章笔记

Chapter 6 Temporal-Difference Learning If one had to identify one idea as central and novel to reinforcement learning, it would undoubtedly be temporal-difference (TD) learning. 时序差分学习&#xff08;temporal-difference (TD) learning&#xff09;组合了Mon…

PID控制算法 – 0、PID原理

1、开局一张图 很多地方都觉得PID的控制结构示意图是这样的&#xff1a; 2、目标值&#xff08;Setpoint&#xff09;、输入值&#xff08;Input&#xff09;、误差&#xff08;Error&#xff09; 其实把上图那个输入改为目标值&#xff08;Setpoint&#xff09;更合适&#…

canvas详解08-基本动画

由于我们是用 JavaScript 去操控 canvas 对象,这样要实现一些交互动画也是相当容易的。在本章中,我们将看看如何做一些基本的动画。 可能最大的限制就是图像一旦绘制出来,它就是一直保持那样了。如果需要移动它,我们不得不对所有东西(包括之前的)进行重绘。重绘是相当费…