"""
1、单表查询
增删改查的完整语法
select distinct 字段 from 表 where group by having order by limit
比较:> < =
区间:between and | in | not in
逻辑: and or not
相似:like _%
正则:regexp
聚合函数:group_concat()、max()
having:可以对 聚合函数 结果进行筛选,不能使用 聚合函数 别名
order by:分组后对 聚合函数 进行排序,能使用 聚合函数 别名
limit:条数 | 偏移,条数
2、多表查询
内连接:from emp inner join dep on emp.dep_id = dep.id 只保存两表有对应关系的记录
左连接:from emp left join dep on emp.dep_id = dep.id 左表记录全部保存,右边没有对应记录空填充
右连接:from emp right join dep on emp.dep_id = dep.id 右表记录全部保存,左边没有对应记录空填充
全连接:
from emp left join dep on emp.dep_id = dep.id
union
from emp right join dep on emp.dep_id = dep.id
"""
联合分组
# 数据来源:在单表emp下
# 联合分组:按多个字段综合结果进行分组
# 按 area与port组合后的结果进行分组,只有组合后的结果还一致,才认为是一组
select group_concat(name),area,port from emp group by area,port;
子查询
# 增:insert into 表 select 子查询
# 删:delete from 表 条件是select 子查询(表不能与delete 表相同)
# 查:select 字段 from 表 条件是select 子查询
# 改:update 表 set 字段= 值 条件是select 子查询(表不能与update 表相同)
# 数据来源:在单表emp下
# 子查询:将一条查询sql 的结果作为另一条sql 的条件
# 思考:每个部门最高薪资的那个人所有信息
# 子查询的sql
select dep, max (salary) from emp group by dep;
# 子查询 - 查
select * from emp where (dep, salary) in (select dep, max (salary) from emp group by dep);
# 将子查询转换为一张表
# 创建一个存子查询数据的一张表
create table t1(dep_name varchar (64 ), max_salary decimal (5 ,2 ));
# 子查询 - 增
insert into t1 select dep, max (salary) from emp group by dep;
# 需求
select name, dep_name, salary
from emp join t1
on emp.dep= t1.dep_name and emp.salary= t1.max_salary;
# 子查询 - 改(update 更新的表不能 与 子查询select 的表同表)
# 每个部门最大薪资+ 1
update t1 set max_salary= max_salary+ 1 ;
# 给t1额外增加一个新部门
insert into t1 values ('打杂部' , 100 );
# 子查询 - 改
update t1 set max_salary= max_salary+ 1 where dep_name in (select distinct dep from emp);
# 错误:update 更新的表 与 子查询select 的表 相同
update t1 set max_salary= max_salary+ 1 where dep_name in (select distinct dep_name from t1);
# 子查询 - 删
delete from t1 where dep_name in (select distinct dep from emp);
# 错误: delete 删除的表 与 子查询select 的表 相同
delete from t1 where dep_name in (select distinct dep_name from t1);
all与any:区间修饰条件
# 语法规则
# where id in (1 , 2 , 3 ) = > id是1 或2 或3
# where id not in (1 , 2 , 3 ) = > id不是1 ,2 ,3
# where salary < all (3 , 6 , 9 ) = > salary必须小于所有情况(小于最小)
# where salary > all (3 , 6 , 9 ) = > salary必须大于所有情况(大于最大)
# where salary < any (3 , 6 , 9 ) = > salary只要小于一种情况(小于最大)
# where salary > any (3 , 6 , 9 ) = > salary只要大于一种情况(大于最小)
in < > ()
# 案例
select * from emp where salary < all (select salary from emp where id> 11 );
视图:view
# 数据依赖:单表emp
"""
1)视图是存在内存中的临时表
2)视图的创建依赖select语句,所有就是select语句操作的结果形参的表
3)视图支持对数据的增删查改 ?
4)视图不允许对视图表的字段做修改
5)视图不仅支持创建,也支持更新与删除
"""
# 语法
# 创建视图
mysql> : create view 视图名[(别名们)] as select 语句;
eg> : create view v1 as select dep, max (salary) from emp group by dep;
# 创建或替换视图
mysql> : create or replace 视图名[(别名们)] as select 语句;
mysql> : alter 视图名[(别名们)] as select 语句;
eg> : create or replace view v1(dep_name, max_salary) as select dep, max (salary) from emp group by dep;
eg> : alter view v1(name, salary) as select dep, max (salary) from emp group by dep;
# 删除视图
mysql> : drop view 视图名
eg> : drop view v1;
# 视图可以作为正常表完成连表查询
select name, dep_name, salary
from emp join v1
on emp.dep= v1.dep_name and emp.salary= v1.max_salary;
视图的增删改
# 前提:视图的增删改操作可以直接映射给真实表(本质就是对真实表进行操作)
# 视图可以完成增删改,增删改本质是直接对创建视图的真实表进行操作
create or replace view v2 as select id,name,age,salary from emp;
update v2 set salary= salary+ 1 where id= 1 ;
delete from v2 where id= 1 ;
create or replace view v3 as select * from emp;
insert into v3 values (1 , 'yangsir' , '男' , 66 , 1.11 , '上海' , '那噶的' , '教职部' );
# 总结:操作视图,会影响真实表,反之也会影响
update emp set salary= salary+ 1 where id= 1 ;
事务
# 事务:通常一些业务需要多条sql 参与,参与的sql 会形参一个执行整体,该整体我们就称之为 事务
# 简而言之:事务 - 就是保护多条执行的sql 语句
# 比如:转账就是一个事务:从一个用户将资金转出,再将资金转入到另一个用户
""" 事务的四大特性
1.原子性:事务是一组不可分割的单位,要么同时成功,要么同时不成功
2.一致性:事物前后的数据完整性应该保持一致(数据库的完整性:如果数据库在某一时间点下,所有的数据都符合所有的约束,则称数据库为完整性的状态)
3.隔离性:事物的隔离性是指多个用户并发访问数据时,一个用户的事物不能被其它用户的事务所干扰,多个并发事务之间数据要相互隔离
4.持久性:持久性是指一个事物一旦被提交,它对数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响
"""
# mysql中事务的执行
create table bank(
id int ,
name varchar (16 ),
money decimal (65 , 2 )
);
insert into bank values (1 , 'Tom' , 10 ), (2 , "Bob", 10 );
# 假设出现以下执行情况
# 没有事务支持情况下,Tom的钱就丢了
update bank set money= money-1 where name= 'Tom' ;
update bank set money= money+ 1 where name= 'ruakei' ;
# 将两条sql 看做事务处理
# 开启事务
begin ;
update bank set money= money-1 where name= 'Tom' ;
update bank set money= money+ 1 where name= 'ruakei' ;
# 确认无误,提交事务
commit ;
# 确认有误,回滚
rollback ;
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· DeepSeek智能编程
· 精选4款基于.NET开源、功能强大的通讯调试工具
· [翻译] 为什么 Tracebit 用 C# 开发
· 腾讯ima接入deepseek-r1,借用别人脑子用用成真了~
· DeepSeek崛起:程序员“饭碗”被抢,还是职业进化新起点?