MySQL 高级语句 Part1(进阶查询语句+MySQL数据库函数+连接查询)

高级语句 第一部分

  • 一、MySQL进阶查询语句
    • [1.1 select ----显示表格中一个或数个字段的所有数据记录](#1.1 select ----显示表格中一个或数个字段的所有数据记录)
    • [1.2 distinct ----不显示重复的数据记录](#1.2 distinct ----不显示重复的数据记录)
    • [1.3 where ----有条件查询](#1.3 where ----有条件查询)
    • [1.4 and or ----且 或](#1.4 and or ----且 或)
    • [1.5 in----显示已知的值的数据记录](#1.5 in----显示已知的值的数据记录)
    • [1.6 between----显示两个值范围内的数据记录](#1.6 between----显示两个值范围内的数据记录)
    • [1.7 通配符](#1.7 通配符)
    • [1.8 like ----模糊匹配](#1.8 like ----模糊匹配)
    • [1.9 order by](#1.9 order by)
    • [1.10 group by ----汇总分组](#1.10 group by ----汇总分组)
    • [1.11 having](#1.11 having)
    • [1.12 别名 ----字段別名 表格別名](#1.12 别名 ----字段別名 表格別名)
    • [1.13 子查询语句](#1.13 子查询语句)
    • [1.14 exists](#1.14 exists)
    • [1.15 练习](#1.15 练习)
  • 二、MySQL数据库函数
  • 三、连接查询
    • [3.1 表连接](#3.1 表连接)
    • [3.2 union语句](#3.2 union语句)
    • [3.3 多表查询之求交集值](#3.3 多表查询之求交集值)
    • [3.4 多表查询之求无交集值](#3.4 多表查询之求无交集值)
  • 四、SQL语句执行顺序
  • 小结

一、MySQL进阶查询语句

先建立byyb数据库,再建立location 表和Store_Info 表,用于测试和演示。

bash 复制代码
create database byyb;

use byyb;
create table location (Region char(20),Store_Name char(20));
insert into location values('East','Boston');
insert into location values('East','New York');
insert into location values('West','Los Angeles');
insert into location values('West','Houston');

create table store_info (Store_Name char(20),Sales int(10),Date char(10));
insert into store_info values('Los Angeles','1500','2020-12-05');
insert into store_info values('Houston','250','2020-12-07');
insert into store_info values('Los Angeles','300','2020-12-08');
insert into store_info values('Boston','700','2020-12-08');

1.1 select ----显示表格中一个或数个字段的所有数据记录

bash 复制代码
语法
select "字段" from "表名";

举个例子

sql 复制代码
select * from store_info;
sql 复制代码
select store_name from store_info;

1.2 distinct ----不显示重复的数据记录

bash 复制代码
语法
select distinct "字段" from "表名"
bash 复制代码
#举个例子
select distinct store_name from store_info;

1.3 where ----有条件查询

where是对源语句进行条件查询。

bash 复制代码
语法
select "字段" from "表名" where "条件";
bash 复制代码
#举个例子
select store_name from store_info where sales > 1000;

1.4 and or ----且 或

bash 复制代码
语法
select "字段" from "表名" where "条件1" {[and|or] "条件2"}+ ;
bash 复制代码
#举个例子
select store_name from store_info where sales > 1000 or (sales < 500 and sales > 200);

1.5 in----显示已知的值的数据记录

bash 复制代码
语法
select "字段" from "表名" where "字段" in ('值1', '值2', ...);
bash 复制代码
#举个例子
select * from store_info where store_name in ('los angeles', 'houston');

1.6 between----显示两个值范围内的数据记录

bash 复制代码
语法:select "字段" from "表名" where "字段" between '值1' and '值2';
bash 复制代码
#举个例子
select * from store_info where date between '2020-12-06' and '2020-12-10';

1.7 通配符

bash 复制代码
% :百分号表示零个、一个或多个字符
_ :下划线表示单个字符

'A_Z':所有以 'A' 起头,另一个任何值的字符,且以 'Z' 为结尾的字符串。例如,'ABZ' 和 'A2Z' 都符合这一个模式,而 'AKKZ' 并不符合 (因为在 A 和 Z 之间有两个字符,而不是一个字符)。
'ABC%': 所有以 'ABC' 起头的字符串。例如,'ABCD' 和 'ABCABC' 都符合这个模式。
'%XYZ': 所有以 'XYZ' 结尾的字符串。例如,'WXYZ' 和 'ZZXYZ' 都符合这个模式。
'%AN%': 所有含有 'AN'这个模式的字符串。例如,'LOS ANGELES' 和 'SAN FRANCISCO' 都符合这个模式。
'_AN%':所有第二个字母为 'A' 和第三个字母为 'N' 的字符串。例如,'SAN FRANCISCO' 符合这个模式,而 'LOS ANGELES' 则不符合这个模式。

1.8 like ----模糊匹配

一般和通配符配合使用。

模糊匹配默认会扫描全表,索引不生效。

sql 复制代码
语法
select "字段" from "表名" where "字段" like {模式};
sql 复制代码
#举个例子
select * from store_info where store_name like '%os%';

1.9 order by

按关键字排序

sql 复制代码
语法
select "字段" from "表名" [where "条件"] order by "字段" [asc, desc];
#asc 是按照升序进行排序的,是默认的排序方式。
#desc 是按降序方式进行排序。
sql 复制代码
#举个例子
select store_name,sales,date from store_info order by sales desc;

1.10 group by ----汇总分组

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

group by 有一个原则,凡是在 group by 后面出现的字段,必须在 select 后面出现;

凡是在 select 后面出现的、且未在聚合函数中出现的字段,必须出现在 group by 后面。

sql 复制代码
语法
select "字段1", sum("字段2") from "表名" group by "字段1";

举个例子

sql 复制代码
select store_name, sum(sales) from store_info group by store_name order by sales desc;
sql 复制代码
select store_name,count(store_name) from store_info group by store_name;

1.11 having

对group by语句的结果,进行条件筛选。

用来过滤由 group by 语句返回的记录集,通常与 group by 语句联合使用.

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

sql 复制代码
语法
select "字段1", sum("字段2") from "表格名" group by "字段1" having (函数条件);
sql 复制代码
#举个例子
select store_name, sum(sales) from store_info group by store_name having sum(sales) > 1500;

1.12 别名 ----字段別名 表格別名

as可省略,仅在当前SQL语句生效。

sql 复制代码
语法
select "表格別名"."字段1" [as] "字段別名" from "表格名" [as] "表格別名";
sql 复制代码
#举个例子
select a.store_name store, sum(a.sales) as "total sales" from store_info as a group by a.store_name;

1.13 子查询语句

连接表格,在where 子句或 having 子句中插入另一个 sql 语句。

bash 复制代码
语法
select "字段1" from "表格1" where "字段2" [比较运算符] (select "字段1" from "表格2" where "条件");
#外查询	(#内查询)
#内查询的结果,作为外查询的参数

[比较运算符]
#可以是符号的运算符,例如 =、>、<、>=、<= 
#也可以是文字的运算符,例如 like、in、between
bash 复制代码
#举个例子
select sum(sales) from store_info where store_name in (select store_name from location where region = 'West');
bash 复制代码
#举个例子2
select sum(A.sales) from store_info as A where A.store_name in (select store_name from location as B where B.store_name = A.store_name);
#store_info表 别名为A表,在当前语句中,可以直接用a代替store_info使用
#location表 别名为B表

1.14 exists

用来测试内查询有没有产生任何结果。

如果有,系统就会执行外查询中的sql语句;

如果没有,那整个 SQL语句就不会产生任何结果。

bash 复制代码
语法
select "字段1" from "表格1" where exists (select * from "表格2" where "条件";
bash 复制代码
#举个例子
select sum(sales) from store_info where exists (select * from location where region = 'West');

select sum(sales) from store_info where exists (select store_name from location where region ='Westt');

1.15 练习

通过SQL语句,查找到门店数大于等于2的地区

sql 复制代码
group by store_name having count(store_name) >=2;

select store_name from store_info group by store_name having count(store_name) >=2;

select store_name,count(store_name) from store_info group by store_name having count(store_name) >=2;

二、MySQL数据库函数

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...) 返回集合中最小的值,也可以返回多个字段的最小的值
sql 复制代码
select abs(-1), rand(), mod(5,3), power(2,3), round(1.89);
sql 复制代码
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 值的个数(行数)
count(*) 返回指定列中所有行数,不忽略NULL值
min( ) 返回指定列的最小值
max( ) 返回指定列的最大值
sum(x) 返回指定列的所有值之和

avg

bash 复制代码
select avg(sales) from store_info;

count

bash 复制代码
select count(store_name) from store_info;
bash 复制代码
select count(distinct store_name) from store_info;

max 和 min

sql 复制代码
select max(sales) from store_info;
bash 复制代码
select min(sales) from store_info;

sum

bash 复制代码
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

#示例1:从名字开头的开始,移除Sun Dasheng中的Sun显示

select trim(leading 'Sun' from 'Sun Dasheng');

bash 复制代码
select trim([ [位置] [要移除的字符串] from ] 字符串);
#[位置]:的值可以为 leading (起头), trailing (结尾), both (起头及结尾)。 
#[要移除的字符串]:从字串的起头、结尾,或起头及结尾移除的字符串。缺省时为空格。
sql 复制代码
#子查询语句,select 嵌套select

select trim(leading 'Los' from (select store_name from location where store_name='Los Angeles'));

select trim( trailing 'York' from (select store_name from location where store_name='New York'));

2)concat

字段名 不要加 ' '

字符串 要加' '

sql 复制代码
select concat (region ,' ',store_name) from location;
sql 复制代码
select region|| ' ' || store_name from location;

3)substr

sql 复制代码
select substr(store_name,5) from location where store_name ='Los Angeles';


select substr(store_name,5,6) from location where store_name ='Los Angeles';

4)length

sql 复制代码
 select replace(region,'stern','st'),store_name,length(store_name) from location;

5)replace

sql 复制代码
select replace (region,'st','stern') from location;

三、连接查询

3.1 表连接

表连接 概述
inner join 内连接 只返回两个表中联结字段相等的行记录
left join 左连接 返回包括左表中的所有记录和右表中联结字段相等的记录,不相等的部分返回NULL
right join 右连接 返回包括右表中的所有记录和左表中联结字段相等的记录,不相等的部分返回NULL
union 联集 将两个select查询语句的结果合并,并去重
union all 联集 将两个select查询语句的结果合并,不去重

3.2 union语句

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

union :生成结果的数据记录值将没有重复,且按照字段的顺序进行排序。

sql 复制代码
语法
[select 语句 1] union [select 语句 2];
sql 复制代码
select store_name from location union select store_name from store_info;

union all :将生成结果的数据记录值都列出来,无论有无重复

sql 复制代码
语法
[select 语句 1] union all [select 语句 2];
sql 复制代码
select store_name from location union all select store_name from store_info;

3.3 多表查询之求交集值

取两个SQL语句结果的交集。

sql 复制代码
基本语法
select A.字段 from 左表 A inner join 右表 B on A.字段 = B.字段;
select A.字段 from 左表 A inner join 右表 B using(同名字段);

select A.字段 from 左表 A, 右表 B where A.字段 = B.字段;

select A.字段 from 左表 A where A.字段 in (select B.字段 from 右表 B);

select A.字段 from 左表 A left join 右表 B on A.字段 = B.字段 where B.字段 is not null;
select B.字段 from 左表 A right join 右表 B on A.字段 = B.字段 where A.字段 is not null;

举个例子

sql 复制代码
#求交集
#方式一
select A.store_name from location A inner join store_info B on A.store_name = B.store_name;
sql 复制代码
#方式二
select A.store_name from location A inner join store_info B using (store_name);
sql 复制代码
#取两个SQL语句结果的交集,且没有重复
select distinct A.store_name from location A inner join store_info B on A.store_name = B.store_name;

select distinct A.store_name from location A inner join store_info B using (store_name);
sql 复制代码
select distinct A.store_name from location A inner join store_info B using (store_name) where B.store_name is not NULL;
sql 复制代码
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;
sql 复制代码
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;。

#首先,子查询`select distinct store_name from location`从"location"表中选择所有不重复的店铺名称。
#然后,子查询`select distinct store_name from store_info`从"store_info"表中选择所有不重复的店铺名称。
#使用`union all`将两个子查询的结果合并,并作为临时表A。
#最后,对临时表A按照店铺名称进行分组,使用`having count(*) > 1`筛选出出现次数大于1的店铺名称。

3.4 多表查询之求无交集值

显示第一个SQL语句的结果,且与第二个SQL语句没有交集的结果,且没有重复。

sql 复制代码
求左表无交集
select A.字段 from 左表 A left join 右表 B on A.字段 = B.字段 where B.字段 is null;

select 字段 from 左表 where 字段 not in (select 字段 from 右表);

求右表无交集
select B.字段 from 左表 A right join 右表 B on A.字段 = B.字段 where A.字段 is null;

select 字段 from 右表 where 字段 not in (select 字段 from 左表);

求多表的无交集
select A.字段 from (select distinct 字段 from 左表 union all select distinct 字段 from 右表) A group by A.字段 having count(A.字段)=1;

举个例子

sql 复制代码
select distinct store_name from location where (store_name) not in ( select store_name from store_info);

#子查询`select store_name from store_info`从"store_info"表中选择所有的店铺名称。
#主查询`select distinct store_name from location`从"location"表中选择所有不重复的店铺名称。
#使用`where (store_name) not in`条件将主查询中的店铺名称过滤掉那些在子查询结果中出现的店铺名称。
sql 复制代码
select distinct A.store_name from location A left join store_info B using (store_name) where B.store_name is NULL;

#使用`left join`将"location"表(作为左表,记为A)和"store_info"表(作为右表,记为B)按照店铺名称进行连接。
#使用`using (store_name)`条件指定以店铺名称为连接的字段。
#使用`where B.store_name is NULL`条件过滤掉在连接结果中,店铺名称在"location"表中出现但在"store_info"表中没有匹配的记录。
#最后,使用`distinct`关键字来返回不重复的店铺名称。
sql 复制代码
select A.store_name from (select distinct store_name from location union all select distinct store_name from store_info) as A group by A.store_name having count(*)=1;

#子查询`select distinct store_name from location`从"location"表中选择所有不重复的店铺名称。
#子查询`select distinct store_name from store_info`从"store_info"表中选择所有不重复的店铺名称。
#使用`union all`将两个子查询的结果合并。
#将合并结果作为临时表A,并使用`as A`来给临时表起一个别名。
#在临时表A的基础上,使用`group by A.store_name`对店铺名称进行分组。
#使用`having count(*) = 1`筛选出出现次数为1的店铺名称。

四、SQL语句执行顺序

sql 复制代码
FROM
<left table>

ON
<join_condition>
<join_type>

JOIN
<right_table>

WHERE
<where condition>

GROUP BY
<group_by_list>

HAVING
<having_condition>

SELECT

DISTINCT
<select list>

ORDER BY
<order_by_condition>

LIMIT
<limit number>

########################################################################################################
在SQL中,一般而言,SQL查询语句的执行顺序如下:

1. FROM:指定要查询的数据表或视图。
2. JOIN:根据指定的条件连接多个表。
3. WHERE:基于指定的条件筛选出符合要求的行。
4. GROUP BY:按照指定的列进行分组。
5. HAVING:对分组后的结果进行条件筛选。
6. SELECT:选择要返回的列。
7. DISTINCT:去除重复的行。
8. ORDER BY:按照指定的列进行排序。
9. LIMIT/OFFSET:限制返回的结果数量和起始位置。

小结

sql 复制代码
order by 字段 ASC|DESC                 #排序
group by 字段                          #分组
group by 字段 having 条件表达式        #根据group by分组后的结果再进行条件过滤

表连接
inner join    内连接,只返回两个表的字段相等的行记录
left join     左连接,返回左表所有的行记录和右表字段相等的行记录,不相等的行返回NULL
right join    右连接,返回右表所有的行记录和左表字段相等的行记录,不相等的行返回NULL
union         联集,将两个select查询语句的结果合并,并去重
union all     联集,将两个select查询语句的结果合并,不去重


求交集
select A.字段 from 左表 A inner join 右表 B on A.字段 = B.字段;
select A.字段 from 左表 A inner join 右表 B using(同名字段);

select A.字段 from 左表 A, 右表 B where A.字段 = B.字段;

select A.字段 from 左表 A where A.字段 in (select B.字段 from 右表 B);

select A.字段 from 左表 A left join 右表 B on A.字段 = B.字段 where B.字段 is not null;
select B.字段 from 左表 A right join 右表 B on A.字段 = B.字段 where A.字段 is not null;


求左表无交集
select A.字段 from 左表 A left join 右表 B on A.字段 = B.字段 where B.字段 is null;

select 字段 from 左表 where 字段 not in (select 字段 from 右表);

求右表无交集
select B.字段 from 左表 A right join 右表 B on A.字段 = B.字段 where A.字段 is null;

select 字段 from 右表 where 字段 not in (select 字段 from 左表);

求多表的无交集
select A.字段 from (select distinct 字段 from 左表 union all select distinct 字段 from 右表) A group by A.字段 having count(A.字段)=1;
相关推荐
oMcLin16 小时前
如何在Ubuntu 22.04 LTS上配置并优化MySQL 8.0分区表,提高大规模数据集查询的效率与性能?
android·mysql·ubuntu
Codeking__16 小时前
Redis的value类型介绍——set
数据库·redis·缓存
Xの哲學17 小时前
深入剖析Linux文件系统数据结构实现机制
linux·运维·网络·数据结构·算法
深圳市恒讯科技17 小时前
Linux 文件权限指南:chmod 755、644、drwxr-xr-x 解析
linux·服务器·xr
Wpa.wk17 小时前
性能测试工具 - JMeter工具组件介绍二
运维·经验分享·测试工具·jmeter·自动化·json
朝阳58117 小时前
Ubuntu 22.04 安装 Fcitx5 中文输入法完整指南
linux·运维·ubuntu
youyicc17 小时前
Qt连接Pg数据库
开发语言·数据库·qt
xingzhemengyou117 小时前
Linux taskset指令设置或查看进程的 CPU 亲和性
linux·服务器
开开心心就好17 小时前
图片格式转换工具,右键菜单一键转换简化
linux·运维·服务器·python·django·pdf·1024程序员节
永远在Debug的小殿下17 小时前
wsl安装Ubuntu and ROS2
linux·运维·ubuntu