I know, i know
地球另一端有你陪我
一、SQL
1、简单合并 union
为了提高效率,数据库中大多不会将所有数据存放于一个表中
常见的优化方式是将关键字提取,作为桥梁
将大的表拆分为小的表
此时想要再查询数据,往往需要将多个表放在一起参照
即为 合并
-- 去重
select * from student
union
select * from score
-- 不去重
select * from student
union all
select * from score
上述两个都是将两个现有表直接上下拼接
要求两个表的字段数相同
2、连接 join on
预备知识:笛卡尔积,即排列组合
1001 李四 数学 1001
1002 王五 数学 1002
1003 赵六 数学 1003
笛卡尔积得到
1001 李四 数学 1001
1001 李四 数学 1002
1001 李四 数学 1003
1001 王五 数学 1001
1001 王五 数学 1002
1001 王五 数学 1003
1001 赵六 数学 1001
1001 赵六 数学 1002
1001 赵六 数学 1003
1、内连接 inner join on
求得左右表的笛卡尔积,得到一张新的大表
根据 on 的条件筛选出符合条件的数据,最终显示
select * from student
inner join score
on student.id=score.studentid;
2、左连接 left join 右连接 right join
左连接:
在 inner join on 的基础上,补齐左表被筛选下来的属性
另一边空的位置用 null 补齐
右连接:
在 inner join on 的基础上,补齐右表被筛选下来的属性
另一边空的位置用 null 补齐
-- 左连接
select * from student
left join score
on student.id=score.studentid;
-- 右连接
select * from student
right join score
on student.id=score.studentid;
3、判断 if & case
1、if
格式:if(boolean testCondition, T valueTrue, T valueFalseOrNull)
select name,if(age is null,18,age) from fgh;
2、case when then
格式:CASE WHEN a THEN b [WHEN c THEN d]* [ELSE e] END
select
case when sex=1 then '男' when sex=0 then '女' else '未知' end
from fgh;
注: 若是 enum 中,1 代表 1,0 实际是 2
关于 sql 中的字符串,尽量使用单引号,避免 java 中需要额外处理
4、备份
1、创建时复制
create table fgh as select * from student
2、创建空表,插入备份的数据
create table fgh(
id int(11),
name varchar(255),
age int(11),
sex enum('0','1')
) engine innodb;
insert into fgh select * from student
二、视图 view
类似于一种映射,用于对表的引用
创建方法的方式和 table 类似
1、可以正常的使用查找
2、关于增删改,只有一种情况下可以正常使用,即视图和原单表完全相同(对应)
create view fgh as ...
三、事务
某些时刻,对于一组指令,我们需要他们能够同时生效,或同时失败
一荣俱荣,一损俱损
此时可以使用事务
其原理是将范围内的指令写入缓冲区
过程中若发生错误,或接收到特殊指令,将抹除缓冲区
即相当于范围内的指令未能生效,这个动作叫做 回滚(ROLLBACK)
若接收到提交指令,则将缓冲区内的指令一并生效
– 开始一个事务 begin
– 回滚 rollback
– 提交 commit
begin;
需要处理的指令
commit;
begin;
需要处理的指令
rollback;