DQL 数据查询语句

本文详细介绍了SQL中的DQL数据查询语句,包括投影操作、表前缀别名查询、计算列、去重、条件查询、LIMIT、IN查询、ORDER BY排序、时间函数、条件判断语句(IF与CASE WHEN)以及聚合函数和分组查询(GROUP BY)等。通过实例讲解了每个查询操作的使用方法和注意事项,并提到了SQL语句的执行顺序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

DQL 数据查询语句

查询结构:

select 目标表的列名或列表达式集合
​
from基本表或(和)视图集合
​
【where 条件表达式】
​
【group by 列名集合】
​
【having 组条件表达式】
​
【order by 列名【集合】】

注意 Where,GroupBy,Having,OrderBy 顺序

1.投影操作

投影操作是查询语句里必须有的,关键字是select.

select 列1 from 表名

select 列1,列2,列3 from 表名

select * from 表名      -- 全部查询

怎么寻找到的?

先去找表,执行form后面,然后找到该表的列名

2.表前缀.列名.别名查询

select 表名.列名 from 表名

别名可以直接写中文,可以不用双引号或者单引号

第二种

别名就是为了在输出看结果的时候,改变列名,便于观察,不会改名表的列名。

select 表名.列名 as 别名 from 表名

select t_student_table.t_name 
from t_student_table

select t.t_name as name  
 from t_student_table as t

这里 t.t_name 是用的表名的别名t ,在跟上列名t_name

还可以空格+别名 ,这样可以省略as

select t.t_name name  from t_student_table t

select 别名.列名 as 别名 from 表名 as 别名,使用表别名的时候,原表的表名就不能再使用

select t_student_table.t_name from t_student_table as t
-- 这里的表名暂时变成t了,
t_student_table.列名就找不到了。
-- 注意执行顺序是先执行from,在执行select

3.计算列

在数据库管理中,我们可以

select t.t_class*10 from 
t_student_table as t

我们可以在返回t_class列的数据是可以计算,不影响原来的表中的值。

select concat(t.t_class*10,"班") class from t_student_table as t

concat关键字是字符串拼接函数,得到的数据是乘10后的多少班,比如10班,20班

4.去重 (distinct)

select distinct f_city from t_employee; -- 查找员工都来自什么城市
-- 去掉重复的数据,查出不同的城市

5.条件查询

where子句应用搜索条件在select查询获得的数据之后。但是条件值都是布尔值。

类别运算符说明
比较运算符=,<,>,<=,>=,<>比较两个表达式
逻辑运算符AND ,OR, NOT组合两个表达式的运算结果或取反
范围运算符BETWEEN,NOT BETWEEN搜索值是否在范围内
列表运算符IN,NOT IN查询值是否属于列表值之一
字符匹配符LIKE ,NOT LIKE字符串是否匹配
未知值IS NULL ,IS NOT NULL查询值是否为NULL

比较运算符说明
=等于
<,>大于 小于
,<=,>=大于等于 小于等于
<>

逻辑运算符说明
AND并且(都要成立)
OR或者(成立其一就可以)
NOT取反

范围运算符说明
BETWEEN 下限 and 上限在这个范围
NOTBETWEEN 下限 and上限不在这个范围

列表运算符说明
IN属于这个类型
NOT IN不属于属于这个类型

字符匹配符说明
LIKE字符串匹配
NOT LIKE字符串不匹配

select 列1, 列2 from 表名 where 列c like 模式

通配符:

“ _”:匹配任何字符

“%”:匹配0或者任意个数的字符

“[]”:匹配单个字符 eg: H[ea]% Have Hand

"[^]":不在指定范围的单个字符

eg:Hea%  Hope,Hub

未知值说明
IS NULL查询值是NULL
IS NOT NULL查询值不是NULL
判断是否为空时,不能用=,is null 或 is not null

6.limit查询

select 列1,列2... from 表面 limit 开始序列号,返回行数 -- 注意开始序列号是从0开始,仅在mysql使用。 -- 如果是从0开始,也就是第一条开始,那么可以写成 limit 返回行数

select 列1,列2,列3...列n 
from t_employee limit 开始序列, 结束序列;
-- 列如 
select * from t_employee limit 5,4;  
-- 从第6列开始,查询以下4条信息
 
-- 缩写格式:limit n  =   limit 0, n;
​

7.in查询

-- 定义集合关系,在指定的某几个值进行查询,不能使用运算符

-- 查询技术部/销售部员工,可以用定义结合

-- in(值1,值2...)查看int里面的值

not int(值1,值2...)查看除了int里的值

-- 查看职位是"舔狗部","女神部","保安部"的员工信息
select * from t_employee where f_deptName in
("舔狗部","女神部","保安部");
-- 查看除了职位是"舔狗部",
"女神部","保安部"的员工信息
select * from t_employee 
where f_deptName  not 
in("舔狗部","女神部","保安部");

8.order by

排序操作,指查询出来的结果投影出来以后哪一列的顺序进行排序

-- order by 默认情况下升序(ASC),降序(desc)

select * from t_employee 
order by f_money desc ;
-- 按照工资的从大道小排序(desc)

-- 多列排序时,首先以列1排序,而且只有当列1相同时,才会以列2规则排序,依次类推

-- 多列排序时,列1写order by ,后面的多列只需要列名即可。

select * from t_employee 
order by f_money desc , 
f_birthday;
-- 按工资排序从大到小(desc)时,
当工资相同的时候,在按照生日的从小到大排序。

9.mysql的时间函数

-- now() 得到当前时间的年月日 时分秒

-- curdate() 得到当前时间的年月日

-- date_add(@dt,interval 数值 时间) 得到指定时间数值后的以后日期

-- timestampdiff(时间,@dt1,@dt2) @dt1与@dt2之间相差多少时间

-- year(@dt) 得到指定的时间年份

-now();

获得当前的 年月日 时分秒

select now();  
-- 当前的时间 2023-04-27 14:03:45 

curdate();

获得当前的 年月日

select curdate(); 
-- 当前的时间 2023-04-27

yaer();

得到指定日期的年份 select year(now()); 2023(今年)

select year(now());  
--  2023(今年)
select year(2000-3-3); 
-- 得到 2000,只得到年份

month()

SELECT MONTH("2000-2-2")
-- 获得某一年份的月份,只得到月份

date_add

date_add(@dt,interval 数值 时间);

-- 获取指定日期多少时间间隔后的日期,
@dt为指定日期,数值是你的时间, 
时间是以哪种方式计算
select date_add
(now(),interval 20 year); 
-- 得到当前时间20年以后
select date_add
(now(),interval 20 day);
-- 得到当前时间的20天以后
select date_add
(now(),interval 3month);
-- 得到当前时间的3个月以后

timestampdiff

timestampdiff(时间,@dt1,@dt2)

select timestampdif
(day,"2022-3-3",now()); 
-- 2022-3-3到现在相差多少天
select timestampdiff
(year,"1998-4-3",now()); 
-- 1998-4-3到现在相差多少年
​
-- 查询员工的同时查出他的年龄
(原来列中并没有age列),
所以我们需要他的生日-当前时间
select *
timestampdiff
(year,f_birthday,now()) age 
from t_employee ;

10.条件判断语句(if与case when)

1.if判断语句

-- mysql 允许调查结果的不同,返回不同的内容

-- if语句类似于三目运算符,条件为真返回第一个,为假返回第二个

select *,if
(f_money>2000,"合格","不合格") moneyNotOrNo from t_employee
​

2.case when 判断语句

多分支采用case when

-- case when 条件1 then 数据1

-- when 条件2 then 数据2

-- when 条件3 then 数据3

-- ...

-- else 数据n

end

---------在书写的时候,先写case与end,只有当条件满足的时候,才会执行then后面的数据,同时注意多分支的时候别忘了else保底。

-- 加工资
update t_employee set f_money= f_money+(case when  f_deptName="管理部" then  500
when  f_deptName="开发部" then  300
when  f_deptName="成品课" then  200
else  100 
end );

11.聚合函数

-- count() 统计数量

-- sum() 获取单个列的合计值

-- avg() 获取单个列的平均值

-- max() 获取单个列的最大值

-- min() 获取单个列的最小值

-- count() 函数

来计算表中记录的个数或者列中值的个数

-- * 统计所以行,包括空行(null)

-- all 列名 统计所以非空行数 默认情况直接写列名,不写all

-- distinct 列名 统计所以非空且不重复的行数

select count(*)
 from t_employee ; 
-- 统计所以的行
 
select count(f_money) 
from t_employee;
 -- 统计所得的非空行 
          
select count(distinct f_money) 
from t_employee; 
-- 统计所以非空行数且不重复的和

-- sum()函数

获取单个列的合计值

-- all 列名 统计所以非空行数的和 默认情况直接写列名,不写all

-- distinct 列名 统计所以非空且不重复的行数的和

select sum(f_money)
 from t_employee;
 -- 统计所以工资的非空行数的和
​
select sum(distinct f_money)
 from t_employee; 
-- 统计所以工资的非空行数且不重复的和

-- avg()函数

获取单个列的平均值

-- all 列名 统计所以非空行数和的平均值 默认情况直接写列名,不写all

-- distinct 列名 统计所以非空且不重复的行数和的平均值

select avg(f_money) 
from t_employee; 
-- 这里的平均值没有算空行。
​
select avg(distinct f_money)
 from t_employee;
 -- 这里的平均值没有算空行和重复。
​
select sum(f_money)/count(*) 
from t_employee;  
-- 平均工资算了空行和重复数据

max() 与min()

-- max(列名) 获取单个列的最大值

-- min(列名) 获取单个列的最小值

select max(f_money),min(f_money)
from t_employee;

13.分组查询(Group by)

-- mysql 提供了一种

-- group by 语句是根据by 指定的规则对数据进行分组。

select 列A 聚合函数(聚合函数规范)
from 表名 where 过滤条件 
group by 列A;
-- 根据规则分组,会把规则相同的数据分到一组
-- 多规则分组时,多条规则都相同才会分到一组
-- 例:按照部门和性别分组 销售部和女 销售部和男
select f_deptName , t_gender, 
count(*) emdu from  t_employee 
group by f_deptName, t_gender;
​

分组列的限制

-- 1.分组列(group by),也就是group by出现的语句,也就是只能分出group by出现的语句

-- 2.聚合函数列

having 语句

-- 用于在聚合后进行筛选。因为聚合函数在分组后执行,而分组又在过滤条件(where)之后执行

-- 只有通过where语句在能分组,所以having语句是在分组之后进行过滤

where与 having 的区别

-- where运行在分组之前,不能执行任何聚合函数 -- having 是运行在分组之后,只能用于聚合函数的过滤

SQL语句的执行顺序

非常重要

--SQL语句的执行顺序(后执行的子句,可以使用前执行的子句中的计算结果、定义的别名等)

--第一步 先执行 from

-- 第二步 where的条件过滤

-- 第三步 group by 分组

-- 第四步 执行select的投影列

-- 第五步 having的条件过滤

-- 第六步 执行order by 排序

-- 第七步 执行limit语句 返回限定值

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值