MySQL数据库之基础查询语句(DQL数据查询语句)

目录

一、查询条件

(1)where子句

(2)like模糊查询

二、查询结果处理

(1)设置查询列

(2)列的计算

(3)as字段取别名

(4)distinct 消除重复⾏

(5)函数

(6)分组查询group by

(7)排序 - order by

(8)分⻚查询 - limit


数据库的基础查询语法:从数据表(单个表/多个表)中提取出满足特定条件的语句为查询语句。

基本的查询语法如下:

select 结果显示语句 from 需要查询的表 where 查询条件语句 结果处理语句;

基本的查询语句是通过select ...from .... where ....的形式呈现。本次文章主要讲述的是结果显示语句,查询条件语句,结果处理语句。

一、查询条件

(1)where子句

where子句:在删除、修改及查询的语句后都可以添加where⼦句(条件),⽤于筛选满⾜特定的添加的数据进⾏删除、修改和查询操作。因此,在数据库的所有操作中where子句是重中之中。

#删除
delete from tableName where conditions;
#修改更新
update tabeName set ... where conditions;
#查询
select .... from tableName where conditions;

where后接赛选条件语句,条件语句是通过条件关系运算符和逻辑关系运算符进行的条件赛选。

条件关系运算符:

## = 等于。
select * from stus where stu_num = '20210101';

## != <> 不等于。
select * from stus where stu_num != '20210101';
select * from stus where stu_num <> '20210101';

## > ⼤于。
select * from stus where stu_age>18;

## < ⼩于。
select * from stus where stu_age<20;

## >= ⼤于等于。
select * from stus where stu_age>=20;

## <= ⼩于等于。
select * from stus where stu_age<=20;

## between and 区间查询 between v1 and v2 [v1,v2],含有左右数值。
select * from stus where stu_age between 18 and 20;

逻辑关系运算符:

## and 并且 筛选多个条件同时满⾜的记录
select * from stus where stu_gender='⼥' and stu_age<21;

## or 或者 筛选多个条件中⾄少满⾜⼀个条件的记录
select * from stus where stu_gender='⼥' or stu_age<21;

## not 取反
select * from stus where stu_age not between 18 and 20;

(2)like模糊查询

where后除了简单的关系运算符外,还可以跟like+模糊匹配符进行模糊匹配。除此之外还有正则表达式的方法进行模糊匹配,在后续的学习中我们会单独提及正则表达式的用法。
基本语法:

select * from tableName where 列名 like 'reg';

LIKE 关键字支持百分号“%”和下划线“_”通配符。

“%”是 MySQL 中最常用的通配符,它能代表任何长度的字符串,字符串的长度可以为 0。例如,a%b表示以字母 a 开头,以字母 b 结尾的任意长度的字符串。该字符串可以代表 ab、acb、accb、accrb 等字符串。

“_”只能代表单个字符,字符的长度不能为 0。例如,a_b可以代表 acb、adb、aub 等字符串。

总结如下:

% 表示任意多个字符 【 %o% 包含字⺟o】
_ 表示任意⼀个字符 【 _o% 第⼆个字⺟为o】
示例:

# 查询学⽣姓名包含字⺟o的学⽣信息
select * from stus where stu_name like '%o%';

# 查询学⽣姓名第⼀个字为`张`的学⽣信息
select * from stus where stu_name like '张%';

# 查询学⽣姓名最后⼀个字⺟为o的学⽣信息
select * from stus where stu_name like '%o';

# 查询学⽣姓名中第⼆个字⺟为o的学⽣信息
select * from stus where stu_name like '_o%';

二、查询结果处理

查询结果处理分为两个部分,一是在select之后,from语句之前的结果显示语句,同时在这儿也可以进行结果的处理,运用聚合函数进行计算,二是在where条件语句之后,对结果进行排序、分组。

(1)设置查询列

设置查询列,是在select之后,from之前设置你所需要显示结果的列。columname是列名,列名个数就是显示的个数,若填入字符*,则显示查询结果的全部列的对应数据。

select columName1,columnName2,... from stus where stu_age>20;

(2)列的计算

通过与计算列相匹配的数据类型的数据通过数学运算符进行计算称为列的计算,如法格式如下:

## 出⽣年份 = 当前年份 - 年龄
select stu_name,2021-stu_age from stus;

(3)as字段取别名

我们通过查询语句得到的最后显示结果列名往往是原来的列名,当我们需要对生成的结果列名进行修改,得到我们想要的结果表时,我们可以通过as进行赋名,当然除了as的方法,我们还可以通过空格+别名的方式进行重新命名。当然这个方法在我们后面的多表联查时表名的赋予也同样适用。

#我们可以为查询结果的列名 去⼀个语义性更强的别名 (如下案例中 as 关键字也可以省
略)
select stu_name,2021-stu_age as stu_birth_year from stus;

select stu_name as 姓名,2021-stu_age as 出⽣年份 from stus;

(4)distinct 消除重复⾏

我们经常在表里查询信息时会不可避免的出现重复值,列如在查询年龄时会出现年龄的人,我们想要得到 表的年龄值时就可以通过distinct语句将结果进行筛查。

select distinct stu_age from stus;

(5)函数

①聚合函数

SQL中提供了⼀些可以对查询的记录的列进⾏计算的函数——聚合函数
count:用于统计计数

# 统计学⽣表中学⽣总数
select count(stu_num) from stus;

# 统计学⽣表中性别为男的学⽣总数
select count(stu_num) from stus where stu_gender='男';

max:用于求出数值类型的最大值

select max(stu_age) from stus;

min:用于求出数值类型的最小值

select min(stu_age) from stus where stu_gender='⼥';

sum:用于数值类型的数据求和

# 计算所有性别为男的学⽣的年龄的综合
select sum(stu_age) from stus where stu_gender='男';

avg:用于数值类型的数据求平均数

select avg(stu_age) from stus where stu_gender='男';

②⽇期函数
当我们向⽇期类型的列添加数据时,可以通过字符串类型赋值(字符串的格式必须为
yyyy-MM-dd hh:mm:ss)
如果我们想要获取当前系统时间添加到⽇期类型的列,可以使⽤ now() 或者 sysdate()
对于一个数据库系统,操作人员往数据库中插入数据,删除数据、更新数据时,我们都希望能知道数据修改的时间,数据操作人是谁,因此日期函数就可以很好的解决这个问题,直接可以获取当前系统的时间。

# 通过now()获取当前时间
insert into
stus(stu_num,stu_name,stu_gender,stu_age,stu_tel,stu_qq,stu_enterence)
values('20210109','张⼩四','⼥',20,'13434343355','1233333',now());

# 通过sysdate()获取当前时间
insert into
stus(stu_num,stu_name,stu_gender,stu_age,stu_tel,stu_qq,stu_enterence)
values('20210110','李雷','男',16,'13434343366','123333344',sysdate());

③字符串函数
通过SQL指令对字符串进⾏处理。

concat()拼接函数

# concat(colnum1,colunm2,...) 拼接多列

select concat(stu_name,'-',stu_gender) from stus;

 upper()字段值换成大写

# upper(column) 将字段的值转换成⼤写
select upper(stu_name) from stus;

 upper()字段值换成小写

# lower(column) 将指定列的值转换成⼩写
select lower(stu_name) from stus;

substring()定列中截取部分显示

# substring(column,start,len) 从指定列中截取部分显示 start从1开始
select stu_name,substring(stu_tel,8,4) from stus;

(6)分组查询group by

分组:就是将数据表中的记录按照指定的类进⾏分组
在MySQL数据库查询语句(DQL)中对结果集的分组、赛选、排序都有严格的顺序要求,只能按照以下顺序来写,调换位置会报错。

select 分组字段/聚合函数
from 表名
[where 条件]
group by 分组列名 
[having 条件]
[order by 排序字段]

注意:

①select 后使⽤ * 显示对查询的结果进⾏分组之后,显示每组的第⼀条记录(这种显示通
常是⽆意义的)
②select 后通常显示分组字段和聚合函数(对分组后的数据进⾏统计、求和、平均值等)
语句执⾏属性: 先根据where条件从数据库查询记录 ! group by对查询记录进⾏分
组 #执⾏having对分组后的数据进⾏筛选
 

# 先对查询的学⽣信息按性别进⾏分组(分成了男、⼥两组),然后再分别统计每组学⽣的个数
select stu_gender,count(stu_num) from stus group by stu_gender;

# 查询所有学⽣,按年龄进⾏分组,然后分别统计每组的⼈数,再筛选当前组⼈数>1的组,再按
年龄升序显示出来
select stu_age,count(stu_num)
from stus
group by stu_age
having count(stu_num)>1
order by stu_age;

(7)排序 - order by

将查询到的满⾜条件的记录按照指定的列的值升序/降序排列,排序可以分为单字段排序和多字段排序。
排序的基础语法如下:

select * from tableName where conditions order by columnName asc|desc;

order by columnName 表示将查询结果按照指定的列排序
asc 按照指定的列升序(默认)
desc 按照指定的列降序

# 单字段排序
select * from stus where stu_age>15 order by stu_gender desc;

# 多字段排序 : 先满⾜第⼀个排序规则,当第⼀个排序的列的值相同时再按照第⼆个列的规则
排序
select * from stus where stu_age>15 order by stu_gender asc,stu_age desc;

 

(8)分⻚查询 - limit

当数据表中的记录⽐较多的时候,如果⼀次性全部查询出来显示给⽤户,⽤户的可读性/
体验性就不太好,因此我们可以将这些数据分⻚进⾏展示。

select ...
from ...
where ...
limit num1,num2
#①param1 int , 表示获取查询语句的结果中的第⼀条数据的索引(索引从0开始)
#②param2 int, 表示获取的查询记录的条数(如果剩下的数据条数<param2,则返回剩下
的所有记录)

例题:

对数据表中的学⽣信息进⾏分⻚显示,总共有10条数据,我们每⻚显示3条
 

# 查询第⼀⻚:
select * from stus [where ...] limit 0,3; 

# 查询第⼆⻚:
select * from stus [where ...] limit 3,3;

# 查询第三⻚:
select * from stus [where ...] limit 6,3;

# 如果在⼀张数据表中:
# pageNum表示查询的⻚码
# pageSize表示每⻚显示的条数
# 通⽤分⻚语句如下:
select * from <tableName> [where ...] limit (pageNum-
1)*pageSize,pageSize;

猜你喜欢

转载自blog.csdn.net/Sheenky/article/details/124081775