当前位置: 首页 > news >正文

[MySQL] MySQL 高级(进阶) SQL 语句

一、高效查询方式

1.1 指定指字段进行查看

事先准备好两张表

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

1.2 对字段进行去重查看  

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

1.3 where条件查询 

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

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

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

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

1.5 查询取值列表中的数据 

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

1.6 between的引用 

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

1.7 like的查询方式

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

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

 _:划线表示单个字符

SELECT * FROM Store_Info WHERE Store_Name like '%os%';
SELECT * FROM store_info WHERE Store_Name like '_os%';

1.8 排序方式进行查询 

order by,按关键字排序。

注意:

  • 一般对数值字段进行排序。
  • 如果对字符类型的字段进行排序,则会按首字母排序。
SELECT Store_Name,Sales,Date FROM store_info ORDER BY Sales DESC;
SELECT Store_Name,Sales,Date FROM store_info ORDER BY Sales asc;
#ASC是按照升序进行排序的,是默认的排序方式。#DESC是按降序方式进行排序。

 二、运用函数查询

2.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), round(1.89);
SELECT round(1.8937,3), truncate(1.235,2), ceil(5.2), floor(2.1), least(1.89,3,6.1,2.1);

2.2 聚合函数  

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

SELECT count(Store_Name) FROM store_info;
SELECT count(DISTINCT Store_Name) FROM Store_Info;SELECT max(Sales) FROM Store_Info;
SELECT min(Sales) FROM Store_Info;SELECT sum(Sales) FROM Store_Info;

2.3 字符串函数 

字符串函数作用
trim()返回去除指定格式的值
concat(x,y)将提供的参数 x 和 y 拼接成一个字符串
substr(x,y)获取从字符串 x 中的第 y 个位置开始的字符串,跟substring()函数作用相同
substr(x,y,z)获取从字符串 x 中的第 y 个位置开始长度为 z 的字符串
length(x)返回字符串 x 的长度
replace(x,y,z)将字符串 z 替代字符串 x 中的字符串 y
upper(x)将字符串 x 的所有字母变成大写字母
lower(x)将字符串 x 的所有字母变成小写字母
left(x,y)返回字符串 x 的前 y 个字符
right(x,y)返回字符串 x 的后 y 个字符
repeat(x,y)将字符串 x 重复 y 次
space(x)返回 x 个空格
strcmp(x,y)比较 x 和 y,返回的值可以为-1,0,1
reverse(x)将字符串 x 反转
 (1)去除字符 trim
 SELECT TRIM ([ [位置] [要移除的字符串] FROM ] 字符串);SELECT TRIM ([ [位置] [要移除的字符串] FROM ] 字符串);​#[位置]:值可以为 LEADING (起头), TRAILING (结尾), BOTH (起头及结尾)。 #[要移除的字符串]:从字串的起头、结尾,或起头及结尾移除的字符串。缺省时为空格。

(2) 截取 substr
SELECT substr(Store_Name,3) FROM location WHERE Store_Name = 'Los Angeles';
SELECT substr(Store_Name,2,4) FROM location WHERE Store_Name = 'New York';

 

(3)字段拼接 
  1)concat(x,y)
SELECT concat(Region, Store_Name) FROM location WHERE Store_Name = 'Boston';

2)使用 || 符号 
SELECT Region || ' ' || Store_Name FROM location WHERE Store_Name = 'Boston';

(4)返回字符长度 length 
select length(name) from city;

(5)替换 replace 
SELECT REPLACE(Region,'ast','astern')FROM location;

三、高级查询语句 

3.1 GROUP BY(用于分组和汇总) 

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

   "GROUP BY"有一个原则,凡是在"GROUP BY"后面出现的字段,必须在SELECT 后面出现;

        凡是在SELECT 后面出现的、且未在聚合函数中出现的字段,必须出现在"GROUP BY"后面。

 (1)汇总统计
select name, count(name) from city group by name;

(2)汇总并对其指定字段(数字类)进行累加 
select name,sum(name) from city group by name;

(3)汇总并对其指定字段(数字类)进行累加,再进行降序 
select name,sum(name) from city group by name order by sum(name) desc;

3.2 HAVING 过滤 

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

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

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

SELECT Store_Name, SUM(Sales) FROM store_info GROUP BY Store_Name HAVING SUM(Sales) > 1500;

3.3 别名设置查询  

 语法格式: 

 SELECT 字段1,字段2 AS 字段2的别名 from 表名;   #AS可以省略不写
(1)字段别名
SELECT A.Store_Name Store, SUM(A.Sales) "Total Sales" FROM store_info A GROUP BY A.Store_Name;
 (2)表别名
SELECT 表格别名.字段1 [AS] 字段别名  FROM 表格名 [AS] 表格别名; #AS可以省略不写

3.4  子查询语句 

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

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

普通的表数据连接: 

select * from location A, store_info B where A.Store_Name=B.Store_Name;

子查询加入表连接 : 

select * from store_info where Store_Name in(select Store_Name from location where Sales > 1000);

3.5 EXISTS 

  • 用来测试内查询有没有产生任何结果,类似布尔值是否为真。
  • 如果内查询有结果的话,系统就会执行外查询中的SQL语句。若是没有结果的话,那整个SQL语句就不会产生任何结果。

格式: 

 SELECT "字段1" FROM "表格1" WHERE EXISTS (SELECT * FROM "表格2" WHERE "条件");SELECT SUM(Sales) FROM store_info WHERE EXISTS (SELECT * FROM location WHERE Region = 'West');

 四、表连接查询 

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

  • inner join(内连接):只返回两个表中联结字段相等的行(有交集的值)
  • left join(左连接):返回包括左表中的所有记录和右表中联结字段相等的记录
  • A  left  join  B  : A为左表,B为右表
  • right join(右连接):返回包括右表中的所有记录和左表中联结字段相等的记
  • A  right join  B:  A为左表 ,B为右表

(1) 内连接 inner join 

SELECT * FROM location A INNER JOIN store_info B on A.Store_Name = B.Store_Name ;
SELECT * FROM location A, store_info B WHERE A.Store_Name = B.Store_Name;
SELECT A.Region REGION, SUM(B.Sales) SALES FROM location A, store_info B 
WHERE A.Store_Name = B.Store_Name GROUP BY REGION;

 

(2)左连接 left join 

SELECT * FROM location A LEFT JOIN store_info B on A.Store_Name = B.Store_Name ;

 (3)右连接 left join 

SELECT * FROM location A RIGHT JOIN store_info B on A.Store_Name = B.Store_Name ;

五、view 视图的运用 

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

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

格式:

CREATE VIEW "视图表名" AS "SELECT 语句";   #创建视图表​DROP VIEW "视图表名";                     #删除视图表

(1)视图的创建 

view V_sales as select store_namee,sum(sales) from store_info group by store_namme;

视图创建的数据验证: 

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

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

select store_name from V_sales group by store_name having count(store_name) = 1;

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

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

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

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

六、UNION 联级

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

6.1 UNION(合并后去重)

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

格式:[select 语句1] UNION [select 语句2];
SELECT Store_Name FROM location UNION SELECT Store_Name FROM store_info;

6.2 UNION ALL(合并后不去重)  

SELECT Store_Name FROM location UNION ALL SELECT Store_Name FROM store_info;

七、交集值与无交集值

7.1 求交集值

SELECT DISTINCT A.Store_Name FROM location A INNER JOIN store_info B USING(Store_Name);SELECT DISTINCT Store_Name FROM location WHERE (Store_Name) IN (SELECT Store_Name FROM store_info);SELECT DISTINCT A.Store_Name FROM location A LEFT JOIN store_info B USING(Store_Name) WHERE B.Store_Name IS NOT NULL;SELECT A.Store_Name FROM (SELECT B.Store_Name FROM location B INNER JOIN store_info C ON B.Store_Name = C.Store_Name) A 
GROUP BY A.Store_Name;SELECT A.Store_Name FROM 
(SELECT DISTINCT Store_Name FROM location UNION ALL SELECT DISTINCT Store_Name FROM store_info) A 
GROUP BY A.Store_Name HAVING COUNT(*) > 1;

 

 

7.2 求无交集值 

SELECT DISTINCT Store_Name FROM location WHERE (Store_Name) NOT IN (SELECT Store_Name FROM store_info);SELECT DISTINCT A.Store_Name FROM location A LEFT JOIN store_info B USING(Store_Name) WHERE B.Store_Name IS NULL;SELECT A.Store_Name FROM 
(SELECT DISTINCT Store_Name FROM location UNION ALL SELECT DISTINCT Store_Name FROM store_info) A 
GROUP BY A.Store_Name HAVING COUNT(*) = 1;

 

http://www.lryc.cn/news/268273.html

相关文章:

  • 创建springboot项目
  • “双十一、二” 业务高峰如何扛住?韵达快递选择 TDengine
  • STM32L432+LIS3DH【加速度传感器】:端侧AI
  • VCG Mesh刚性旋转(变换矩阵)
  • R语言【base】——system.file() 在软件包等中查找文件的完整文件名。
  • HTML制作暴雨特效
  • cesium实现区域贴图及加载多个gif动图
  • blackbox黑盒监控部署(k8s内)tensuns专用
  • “C语言“——scanf()、getchar() 、putchar()、之间的关系
  • Spring Boot3 Web开发技术
  • 学习笔记:数据挖掘与机器学习
  • highcharts的甘特图设置滚动时表头固定,让其他内容跟随滚动
  • ElasticSearch 架构设计
  • HTML---定位
  • JVM高频面试题(2023最新版)
  • webpack学习-7.创建库
  • MQTT - 笔记
  • Django 安装
  • 推荐一个vscode看着比较舒服的主题:Dark High Contrast
  • YCSB 测试表预分区
  • K8s 教程
  • python:改进型鳟海鞘算法(SSALEO)求解23个基本函数
  • Hive-数据模型详解(超详细)
  • docker的常规使用总结
  • CSS 文字弹跳效果
  • 什么是动态IP?静态IP和动态IP有什么区别?
  • Linux 与 Shell
  • 大数据-Hive练习-环比增长率、同比增长率、复合增长率
  • C++ 考前难点总结
  • ARM 汇编语言知识积累