MySQL高阶SQL语句

MySQL高阶SQL语句

MySQL常用查询

  • 对 MSQL数据库的查询,除了基本的查询外,有时候需要对查询的结果集进行处理。例如只取 10条数据、对查询结果进行排序或分组等等

1、按关键字排序

  • 类比于windows 任务管理器
  • 使用 select 语句可以将需要的数据从 mysql 数据库中查询出来,如果对查询的结果进行排序,可以使用 order by 语句来对语句实现排序,并最终将排序后的结果返回给用户。这个语句的排序不光可以针对某一个字段,也可以针对多个字段。
1.1 语法
SELECT columnl,column2,.., FRoM table name ORDER BY columnl, column2, ...
1.2 ASC和DESC

ASC: 是按升序进行排序的,是默认的排序方式,即ASC可以省略。select 语句中如果没有指定具体的排序方式,则默认按 ASC方式进行排序。

DESC: 是按降序方式进行排列。当然 order by 前面也可以使用 where 语句对查询结果进一步过滤。

  • 创建数据库数据表
create database xi;
#创建数据库

use xi;
#切换到数据库

create table ww(id int(4),name varchar(10) primary key not null,score decimal(5,2),address varchar(40),hobbid int(8));
#创建表

desc ww;
#查看表的结构信息

insert into ww values(1,'aaaa',80,'beijing',2);
insert into ww values(2,'bbbb',49,'miandian',2);
insert into ww values(3,'cccc',90,'qingdao',4);
insert into ww values(4,'dddd',60,'shanghai',5);
insert into ww values(5,'yyyy',98,'shanghai',3);
insert into ww values(6,'nnnn',30,'hangzhou',3);
insert into ww values(7,'mmmm',11,'nanjing',5);
insert into ww values(8,'xxxx',88,'hunan',5);
#表中插入数据

select * from ww;
#查看数据表信息

image-20240326134505689

image-20240326134614186

1.3 对数据表中信息进行排序
1.3.1 普通排序
select name,score from ww order by score;
#选择name,score字段,按分数score进行排序,默认是升序

select name,score from ww order by score desc;
#选择name,score字段,按分数score进行排序,降序

image-20240326134857258

1.3.2 结合where进行条件过滤
  • order by 结合where语句进行条件过滤
select name,score from ww where address='shanghai' order by score desc;
#选择name,score字段,对地址是shanghai的score分数进行降序排序

image-20240326135415408

1.3.3 对多个字段进行排序
  • order by 语句也可以使用多个字段来进行排序,当排序的第一个字段相同的记录有多条的情况下,这些多条的记录再按照第二个字段进行排序,字段之间使用英文逗号隔开,优先级是按先后顺序而定
select id,name,hobbid from ww order by hobbid desc,id desc;
#选择id,name,hobbid字段,先按hobbid进行降序排序,如果一致,则按id进行降序排序

select id,name,hobbid from ww order by hobbid desc,id;
#选择id,name,hobbid字段,先按hobbid进行降序排序,如果一致,则按id进行升序排序

image-20240326135239556

2、区间判断及查询不重复记录

2.1 and/or —— 且/或
2.1.1 普通查询
select * from ww where score > 70 and score <= 90;
#查看表中score大于60并且小于等于90的记录

select * from ww where score < 60 or score > 90;
#查看表中score大于60或者小于等于90的记录

image-20240326140723848

2.1.2 嵌套/多条件查询
select * from ww where score > 70 or (score > 80 and score < 90);
#查看表中score大于80或者(大于30并且小于70)的记录,括号里面的内容执行完是一个准确的数字

image-20240326141148712

2.2 distinct 查询不重复记录
  • 格式
select distinct 字段 from 表名;
select distinct hobbid from ww;
#去掉表中hobbid字段重复的部分

image-20240326141614152

3、对结果进行分组

  • 通过 sql 查询出来的结果,还可以对其进行分组,使用 group by 语句来实现 ,group by 通常都是结合聚合函数一起使用的

  • 常用的聚合函数包括:计数(COUNT)、 求和(SUM)、求平均数(AVG)、最大值(MAX)、最小值(MIN),group by 分组的时候可以按一个或多个字段对结果进行分组处理。

3.1 普通分组
  • 语法格式
select count(字段1),字段2 from 表名 group by 字段2;
select count(name),hobbid from ww group by hobbid;
#以hobbid字段的数进行分组,基于name计数,统计出相同hobbid的个数

image-20240326143010044

3.2 结合where语句分组
select count(name),hobbid from ww where score >= 60 group by hobbid;
#以hobbid字段的数进行分组,基于name计数,统计出score大于等于60的相同hobbid的个数

image-20240326143648931

3.3 结合order by 语句分组排序
select count(name),score,hobbid from ww where score >= 80 group by hobbid order by score desc;
#以hobbid字段的数进行分组,基于name计数,统计出score大于等于80的相同hobbid的个数,并按score降序排列

image-20240326144048435

3.4 其他分组记录
select count(*) from ww;
#统计表中有多少行记录(此方法会进行全表扫描)

select count(name) from ww;
#统计表中有多少行记录(使用字段查询,速度会比count(*)快,因为此方法只扫描name字段列)

select sum(score) from ww;
#统计score的总和

select max(score) from ww;
#查询表中score最大数

select min(score) from ww;
#查询表中score最小数

select avg(score) from ww;
#查询表中score平均数

image-20240326144609647

image-20240326144831078

4、限制结果条目

  • 在使用mysql select 语句进行查询时,结果返回的是所有匹配的记录(行)。有时候仅需要返回第一行或者前几行,这时候就需要用到 limit 语句

  • limit 的第一个参数是位置偏移量(可选参数),是设置 mysql 从哪一行开始显示。 如果不设定第一个参数,将会从表中的第一条记录开始显示。需要注意的是,第一条记录的 位置偏移量是 0,第二条是 1,以此类推。第二个参数是设置返回记录行的最大数目。

4.1 普通限制查询
select * from ww limit 4;
#查询所有数据显示前5行(位置偏移量从0开始,以此类推,0表示字段行)

select * from ww limit 6,1;
#查询所有数据从第7行开始,显示后面1行内容

image-20240326150447277

4.2 结合order by 语句,限制查询并排序
select * from ww order by id limit 4;
#查询表中数据,按id字段进行升序排序,只显示前5行

select * from ww order by id desc limit 3;
#显示表的最后3行内容

image-20240326151310852

image-20240326151553843

5、设置别名

  • 在 mysql查询时,当表的名字比较长或者表内某些字段比较长时,为了方便书写或者多次使用相同的表,可以给字段列或表设置别名。使用的时候直接使用别名,简洁明了,增强可读性
  • 其中 AS 语句是可选的。AS 之后的别名,主要是为表内的列或者表提供临时的名称,在查询过程中使用,库内实际的表名或字段名是不会被改变的
5.1 设置别名—alias
select name as 姓名,score 成绩,address 地址 from ww;
#设置name,score,address别名,alias是临时的,不会改变表的结构

select w.name as 姓名,w.score 成绩,w.address 地址 from ww as w;
#多表同字段会显示区别

select sum(score) 总分数 from ww;
#查询表中score的总和

image-20240326152042873

image-20240326152748068

5.2 做为连接语句的操作符,创建新表
  • as创建一个新表并定义表结构,插入表数据(与原表相同)
  • 但是”约束“没有被完全”复制“过来,如果原表设置了主键,那么附表的:default字段会默认设置一个0
5.2.1 创建新表,将之前表中的记录复制到新表中
create table xx01 as select * from ww;
#复制ww表信息,生成新的数据表xx01

select * from xx01;
#查看数据表信息

image-20240326152926847

5.2.2 结合where语句,使用as创建新表
create table xx02 as select * from ww where score >= 80;
#筛选ww表中score大于等于80的分数信息,生成新的数据表xx02

image-20240326153247534

  • as会复制原表的表结构和数据,但是约束条件不会被复制,比如原表设置了主键,但新表中不会有主键

image-20240326153644257

5.3 使用场景
  • 对复杂的表进行查询的时候,别名可以缩短查询语句的长度
  • 多表相连查询的时候(通俗易懂、减短sql语句)

6、通配符

  • 通配符主要用于替换字符串中的部分字符,通过部分字符的匹配将相关结果查询出来

  • 通配符主要跟like一起使用,并协同where语句共同完成查询任务

%:表示零个、一个或者多个字符

_:表示单个字符
6.1 查询name字段以x开头的记录
select id,name from ww where name like 'x%';
#查询表中name字段以x开头的记录

image-20240326155319648

6.2 查询address字段以n结尾的记录
select * from ww where address like '%n';
#查询表中address字段以n结尾的记录

image-20240326155445413

6.3 查询address字段hu__n中有两个字符的记录
  • 常用于模糊查询
select * from ww where address like 'hu__n';
#查询表中address字段hu__n中有两个字符的记录

image-20240326155820465

6.4 查询address字段中包含g的记录
select * from ww where address like '%g%';
#查询表中address字段中包含g的记录

image-20240326160027594

6.5 查询address字段qing后面3个字符的记录
select * from ww where address like 'qing___';
#查询表中address字段qing后面3个字符的记录

image-20240326160202098

6.6 通配符%与_可以结合使用
select * from ww where address like 'h%_';
#查询表中address字段以“h”开头的记录

image-20240326160340510

相关推荐

  1. MySQL语句

    2024-03-27 20:24:02       31 阅读
  2. mysql语句

    2024-03-27 20:24:02       23 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-27 20:24:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-27 20:24:02       100 阅读
  3. 在Django里面运行非项目文件

    2024-03-27 20:24:02       82 阅读
  4. Python语言-面向对象

    2024-03-27 20:24:02       91 阅读

热门阅读

  1. 记录一次Vcenter跨VDS网络迁移

    2024-03-27 20:24:02       40 阅读
  2. numpy矩阵做二维卷积

    2024-03-27 20:24:02       45 阅读
  3. KY111 日期差值

    2024-03-27 20:24:02       41 阅读
  4. WPF 自定义按钮类实现

    2024-03-27 20:24:02       40 阅读
  5. 形式语言理论简介及应用

    2024-03-27 20:24:02       41 阅读
  6. std::ratio

    2024-03-27 20:24:02       45 阅读
  7. 一些常见的MySQL问题和答案

    2024-03-27 20:24:02       41 阅读
  8. Docker未授权访问漏洞

    2024-03-27 20:24:02       49 阅读