数据操纵语言
这类语句主要用于数据的增加(往表中新增数据)、删除(删除表中的数据)、修改(修改表中的数据)。
SQL关键字如下。
- insert表示向表中插入数据。
- update表示对表中数据进行修改。
- delete表示删除表中数据。
例: - 数据插入
insert into 表名 (字段1,字段2,...)
values(数值1,数值2,...):
- 数据修改
update 表名
set 字段1=数值1
where 条件;
- 数据删除
delete from 表名
where 条件;
简单查询
基本查询语句
select 列名,列名,...
from 表名
where 列名 = 条件;
数据清洗的SQL语句
查找空值
select *
from 教师表
where 教师姓名 is null;
is null用于查询空值
is not null用于查询非空值
重命名列名
select 列名,列名 as 新定义列名
from 表名
where 查询条件;
去掉重复数据
- 对表中单列字段进行去重
select distinct 学号, distinct 姓名
from 学生表;
- 对表中多列字段进行去重
select distinct 访客id,浏览日期
from 用户行为表;
汇总函数和分组的应用
汇总函数也被称为聚合函数,在一堆繁杂数据里进行类似求和,求平均值,求最大值,求最小值等运算后聚合成一个结果的数据
例:
···
select count(天气)
from 天气表
where 天气 = '多云'
···
常用的汇总函数
用途 | 函数 |
---|---|
求某列的行数 | count(列名) count(*) |
对数值类型的某列数据求和 | sum(列名) |
对数值类型的某列数据求平均值 | avg(列名) |
求某列数据的最大值 | max(列名) |
求某列数据的最小值 | min(列名) |
分组汇总
汇总函数经常和分组(group by子句)结合在一起来分析数据
例:
查找“学生表”中所有重复的学生姓名。
解法一
select 姓名,count(姓名) as 计数
from 学生表
group by 姓名;
select 姓名
from 辅助表
where 计数 >1;
结合前两步,将第(1)步中创建的辅助表作为子查询,进行重复姓名计数大于1的SQL查询。
select 姓名
from (
select 姓名,count(姓名) as 计数
from 学生表
group by 姓名;
) as 辅助表
where 计数 >1;
解法二
错误示例:
select 姓名
from 学生表
group by 姓名
where count(姓名) >1;
SQL语句的执行顺序是
from -> where -> group by。
运行到where子句时,表还没有被分组。
如果要对分组后的结果按条件筛选,则需要用到having子句。
例:
select 姓名
from 学生表
group by 姓名
having count(姓名) > 1;
SQL语句的执行顺序是
from -> group by -> having
SQL语句的书写顺序和运行顺序
运行蓝框语句进行查询,运行红框里的子句对查询结果进行操作。
复杂查询
子查询
使用子查询时,可以把子查询看作临时表,也就是子查询的查询结果表,因为这个查询结果表并不是真实存放在数据库中的表,所以把这样的表称为临时表。
使用子查询时,一般需要用as关键字给子查询起个别名,方便在SQL其他地方使用。另外,如果不用as关键字给子查询起别名,那么有时候会报错:“1248-Every derived table must have its own alias”。
in(子查询)
in常用于where子句中,表示查询某个范围内的数据。in和子查询结合在一起的用法是:in(子查询)。
例:
select count(discinct 顾客ID)
from 销售订单表
where
顾客ID in(select distinct 顾客ID from 销售订单表 where 产品='ProductA')
and
顾客ID in(select distinct 顾客ID from 销售订单表 where 产品='ProductB')
and
顾客ID not in(select distinct 顾客ID from 销售订单表 where 产品='ProductC')
all(子查询)和any(子查询)
all(子查询)和any(子查询)需要和比较运算符,包括“大于(>)”“小于(<)”“不等于(<>)”等一起使用。
all(子查询)
all常用于where子句中,表示要满足all(子查询)里的所有条件。
例
select *
from 表格B
where 数字 > all
(select 数字 from 表格A);
注:
<>all(子查询)的作是不等于all(子查询)中子查询结果的所有数据,等同于not in(子查询)。
any(子查询)
select *
from 表格B
where 数字 > any
(select 数字 from 表格A);
临时表with...as
with…as语句可以将SQL语句中的子查询定义为临时表,起到提高SQL语句可读性的作用
例:
with
a as (select distinct 顾客ID from 销售订单表 where 产品='ProductA')
b as (select distinct 顾客ID from 销售订单表 where 产品='ProductB')
c as (select distinct 顾客ID from 销售订单表 where 产品='ProductC')
select count(discinct 顾客ID)
from 销售订单表
where
顾客ID in (select * from a)
and
顾客ID in (select * from b)
and
顾客ID not in (select * from c)
注:
- 用with…as语句定义的临时表,后面必须直接跟使用该临时表的SQL语句,否则临时表将失效。
- 在定义临时表后不能加语句结束符“;”。上面案例的with…as语句中我们就没有加分号“;”。用with…as语句定义的临时表不需要删除,因为它在创建并使用后即释放。
- 如果with…as语句定义的临时表名称与某个数据表或视图重名,则紧跟在该with…as语句后面的SQL语句使用的仍然是临时表,而没有紧跟在with…as语句后面的SQL语句使用的是数据表或视图。
视图
case表达式
多表查询
-
什么时候需要用多表连接?
当需要查询的数据涉及多个表时,需要想到用多表连接的方法。 -
选择哪种类型的连接?
SQL中多表连接的类型包括内连接(inner join)、左连接(left join)、右连接(right join)、全连接(full join)。
当想要生成固定行数的表单或者特别说明了要哪一个表里的全部数据时,就使用左连接或者右连接。其他情况用内连接,取两个表的公共部分。
A Left join B-> A (根据返回需求 需连接上B中与A等条件的部分)
A Right join B -> B(根据返回需求 需连接上A中与B等条件的部分)
A Inner join B -> A∩B(根据返回需求 需连接上A与B等条件的部分) -
一般多个表会通过某个字段产生关联
例:
待补充
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业