一》分组查询与分组筛选
分组查询关键字:group by 分组字段名1,分组字段名2,..
1.使用分组后,在select语句中只允许出现分组字段和多行函数。
2.多字段分组,则按by后次序依次分组。
3.在where子句中不允许出现多行函数。
分组筛选关键字:having
1.针对分组进行分组后的数据筛选,允许使用多行函数。
2.having关键字必须和分组结合使用,不允许单独使用。
where与having
1.分组语句中使用where进行字段级别的筛选,使用having进行多行函数的筛选。
2.where字句不允许出现多行函数,having允许出现多行函数。
3.where和having都可以使用普通字段进行直接筛选,但where效率高于having。
where执行顺序:from->where->group by->select->order by
having执行顺序:from->group by->select->having->order by
二》 增删查改及数据备份
注:增删改操作后,不会立即进行数据写入,还需手动对数据进行提交,若数据有问题可回滚。主键非空唯一,用于唯一标识一条数据。
-
增:insert int 表名(字段名,字段名,...)values(值1,值2,...);
注:值和字段数量和顺序必须一一对应,如果全字段插入,可省略字段名部分。
-
删:delete from 表名 ---删除表中所有记录
delete from 表名 where 条件 ---删除符合条件的指定数据
truncate table 表名 ---删除表中所有记录,效率高于delete
-
改:update 表名 set 字段名=新值,字段名=新值...
update 表名 set 字段名=新值,字段名=新值... where 条件
-
备份:只会备份表结构和表数据,不会备份约束
--表全部备份:create table 新表名 as select * from 备份表名
--表部分备份:create table 新表名 as select 字段名1,字段名2,...from 备份表名
--数据整体插入:insert into 插入表名 select * from 表名
注:插入字段数量,类型都要和查询结果字段一致
三》二维表维护
- 添加新字段:alter table 表名 add 字段名 类型
- 修改表名:rename 原表名 to 新表名
- 修改字段类型:alter table 表名 modify 字段名 新类型
- 修改字段名:alter table 表名 rename column 字段名 to 新字段名
- 删除字段:alter table 表名 drop column 字段名
- 删除表:drop table 表名
四》约束
- 主键:primary key
- 非空约束:not null
- 检查约束:check(条件)
- 唯一约束:unique
使用:
-
直接在创建表的字段后使用 约束关键字
-
在创建表的语句最后使用
例:constraints pk_表名_字段名 primary key(字段名);
constraints ck_表名_字段名 check(字段名 is not null);
constraints un_表名_字段名 unique(字段名);
-
在创建表后使用 alter table 表名 add constraints pk_表名_字段名 primary key(字段名);
-
删除约束 alter table 表名 drop constraints 约束名;
外键:当一张表的某个字段的值需要依赖另外一张表的某个字段的值,则使用外键约束,主动依赖的表称为子表,被依赖的表称为父表。在子表插入的数据在父表不存在,则会自动报错。
使用:
- 在子表字段后直接使用 references 父表名(字段)
- 在创建表的语句的最后使用 constraints fk_子表名_字段名 foreign key(字段名) references 父表名(字段名)
- 在创建表后使用 alter table 表名 add constraints fk_子表名_字段名 foreign key references 父表名(字段名)
- 删除外键 alter table 表名 drop constraints 外键约束名
缺点:无法直接删除父表数据,除非级联删除
级联删除:在添加外键约束时,使用关键字 on delete cascade
使用:当删除父表数据时,自动删除子表相关所有数据
缺点: 无法保留子表历史数据
使用关键字on delete set null,删除父表数据时,将子表中依赖 字段设置为null(子表依赖字段不能添加非空约束)
五》序列
create sequence 序列名
- 默认开始是没有值的,也就是指针指在了没有值的位置
- 序列名.nextval每次执行都会自增一次,默认步长为1(increment by 可改变步长)
- 序列名.currval查看当前序列的值,开始是没有的
- 作为主键使用时,动态获取之间值,新增数据时极大的避免了主键冲突(序列名.nextval作为主键)
六》视图
创建视图:create view 视图名 as select 对外提供的内容 from 真实表名
删除视图:drop view 视图名
特点:
- 保护真实表,隐藏重要字段数据,保护数据
- 在视图中的操作会映射执行到真实表中
- 可以手动开启只读模式,使用关键字 with read only