【示例】MySQL-4类SQL语言-DQL

前言

本文主要讲述MySQL中4中SQL语言的使用及各自特点。

SQL语言总共分四类:DDL、DML、DQL、DCL。

本章主要讲述DQL语言。

DQL | Data Query Language

数据查询语言,用来查询数据库中表的记录

总述 | 涵盖几乎所有关键字的DQL语句

编写顺序

SELECT  字段列表

FROM 表名列表

WHERE 条件列表

GROUP BY 分段字段列表

HAVING 分组后条件列表

ORDER BY 排序字段列表

LIMIT 分页参数

执行顺序

FROM 表名列表

WHERE 条件列表

GROUP BY 分段字段列表

HAVING 分组后条件列表

SELECT  字段列表

ORDER BY 排序字段列表

LIMIT 分页参数

单表查询

关键字 | 用在Select后面

查询内容:表字段

# 查询多个字段
SELECT 字段1, 字段2, 字段3 ... FROM 表名;

# 查询所有字段
SELECT * FROM 表名 ;

# 查询字段并设置别名(写不写as都一样)
SELECT 字段1 [ AS 别名1 ] , 字段2 [ AS 别名2 ] ... FROM 表名;
SELECT 字段1 [ 别名1 ] , 字段2 [ 别名2 ] ... FROM 表名;

# 去重查询
SELECT DISTINCT 字段列表 FROM 表名;

# 聚合函数,统计相关信息
SELECT COUNT(1) FROM 表名;

查询内容:聚合函数

聚合查询:以一列数据为整体,进行纵向查询。任何值为Null的字段数据,都不参与聚合查询

函数功能
count( [DISTINCT] expr )统计expr的数量,可以是单纯的列、数字、*
max( column )返回column列的最大值
min( column )返回column列的最小值
avg( [DISTINCT] expr )返回expr的平均值,expr可以是单纯的列,也可以是列之间的四则运算
sum( [DISTINCT] expr )返回expr的总和,expr可以是单纯的列,也可以是表字段函数处理后的结果
# 基础语法
SELECT 聚合函数() FROM 表名;

# 示例
SELECT 
    query_name, 
    ROUND(AVG(rating/position), 2) as quality,
    ROUND(SUM(IF(rating < 3, 1, 0)) * 100 / COUNT(*), 2) as poor_query_percentage
FROM Queries
GROUP BY query_name
having query_name is not null

查询内容:[排序函数+] [聚合函数+] 窗口函数

窗口函数定义:OVER()窗口函数用于定义一个窗口,对一组值进行操作,不需要使用GROUP BY子句对数据进行分组,就能够在同一行同时返回基础列和聚合列。

窗口函数的用法:

OVER ( [ PARTITION BY column ] [ ORDER BY culumn ] )
  • PARTITION BY:用于给指定列进行分组
  • ORDER BY:在分组的前提下,按照指定列对组内数据进行排序,以方便累计处理

应用示例:窗口函数+聚合函数+排序函数

查询内容:表字段函数

参考链接:https://blog.csdn.net/qq_45445505/article/details/137653139

关键字 | 用在Where后面

查询条件:比较远算符

比较运算符写法示例功能
>、>=、<、<=、=WHERE id > 10大于、大于等于、小于、小于等于、等于
<> 或者 !=WHERE id <> 10不等于
BETWEEN ... AND ...WHERE id BETWEEN 10 AND 100在某个范围之内:[最小值、最大值],是个闭区间
IN(...)WHERE id in (10, 12, 14)在in之后的列表中的值,多选一
NOT IN(...)WHERE id NOT IN (1, 5, 9)返回值不在列表内的行
LIKE 占位符WHERE id LikE _ABC模糊匹配:_匹配单个字符, %匹配任意个字符)
IS NULLWHERE id IS NULL判断是否是NULL
IS NOT NULLWHERE id IS NOT NULL判断是否不是NULL

上述部分语句解析:

  • WHERE id LikE _ABC 返回以ABC为结尾,且整体长度为4的数据,例如:1ABC、AABC、ABABC(这个不是,长度不满足)
  • WHERE id LikE %ABC 返回以ABC为结尾,且整体长度大于等于3的数据,例如:ABC、AABC、AAACABC、AAACABCA(这个不是,不满足)
# 基础语法
SELECT 字段列表 FROM 表名 WHERE 条件列表;

# 示例--占位符
select * from emp where name like '__';  		# 查询姓名为两个字的员工
select * from emp where idcard like '%X';		# 查询身份证结尾为X的员工
select * from emp where idcard like '_________________X';		# 查询身份证结尾为X的员工

查询条件:逻辑运算符

常用逻辑运算符功能
AND 或者 &&并且
OR 或者 ||或者
NOT 或者 !非,不是

查询条件:表字段处理函数

# 示例:mod函数
select *
from cinema
where description != "boring" and mod(id, 2) = 1
order by rating desc;

关键字 | 用在Group By后面 + Having后面

分组内容:字段名

# 通用语法
# 分组查询经常和聚合函数一起使用
SELECT 字段列表 FROM 表名 [ WHERE 分组前筛选条件 ] GROUP BY 分组字段名 [ HAVING 分组后过滤条件 ];

Group By的作用:

  • 假设以字段1、字段2进行分组。
  • Select *,返回每一组的第一行数据
  • Select 分组字段, 聚合函数(字段),聚合函数针对每一个分组进行统计,而不是针对全表进行统计

Having的作用:

  • 对Group By分组之后的结果进行条件筛选

  • where和having的区别?

    • 执行时机:where在分组前执行;having在分组后执行

    • 判断条件:where不能对聚合函数进行判断,having可以

    • 执行顺序:where > 聚合函数 > having

示例

# 根据性别分组, 统计男性员工 和 女性员工的数量
select gender, count(*) from emp group by gender;

# 根据性别分组 , 统计男性员工 和 女性员工的平均年龄
select gender, avg(age) from emp group by gender;

# 查询年龄小于45的员工,并根据工作地址分组,获取员工数量大于等于3的工作地址
select workaddress, count(*) AS address_count from emp where age < 45 group by workaddress having address_count >= 3;  # AS可省略

# 示例:返回每个role角色下,所有人的薪水总和,然后根据role分组,筛选总和大于1500的结果
select role, sum(salary) as totle from emp group by role having totle > 1500;

关键字 | 用在Order By后面

排序内容:表字段

SELECT 字段列表 FROM 表名 ORDER BY 字段1 [ASC|DESC] , 字段2 [ASC|DESC];
排序
ASC升序,默认的排序方式
DESC降序

多字段排序的规则:当第一个字段一样时候,才会根据第二个字段排序,后续字段排序同理

示例

# 根据年龄对公司的员工进行升序排序 , 年龄相同 , 再按照入职时间进行降序排序
select * from emp order by age, entrydate desc;

关键字 | 用在Limit后面

分页内容:索引、记录数

SELECT 字段列表 FROM 表名 LIMIT 起始索引, 查询记录数;
  • 分页查询算是数据库的方言,不同的数据库有不同的实现。MySQL中使用的是LIMIT
  • 起始索引、待查询页码、每页记录数之间的关系:
起始索引 = (待查询的页码-1)* 每页记录数

多表查询

联合查询、子查询【重要】

参考文章:https://blog.csdn.net/qq_45445505/article/details/137051199

  • 11
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值