一. having子句的使用(结合聚合函数,gruop by 使用)
1.聚合函数
- max(字段名) 获取某字段中的最大值
- min(字段名) 获取某字段中的最小值
- sum(字段名) 计算某字段值的和
- avg(字段名) 计算某字段的平均值
- count(字段名) 计算某字段值中不为null的记录数
- count(*) 计算表中的总记录数
格式:
select 字段 fun_name from [where 条件] [group by filed1,fild2...] [with rollup] [having 条件]
(1). fun_name 表示要做的集合函数操作,也就是数集合函数.
(2). group by 关键字 表示进行分类聚合的字段.比如要按照部门分类统计员工数量,部门就应该写在group by 后面。
(3). with rollup 是可选语法,表明是否对分类聚合后的结果进行再汇总
(4). having 关键字表示对分类后的结果再进行条件过滤。
示例:
统计总人数
select count(1) from A;
统计各个姓的人数
select xing,count(1) from A group by xing;
既要统计各个姓的人数,又统计总人数
select xing,count(1) from A group by xing with rollup;
统计人数大4的姓
select xing,count(1) from A group by xing having count(1)>4;
统计薪水总额,最低薪资,最高薪资
select count(1),min(salary),max(salary) from A;
2.WHERE 子句作用于表和视图,HAVING 子句作用于组。
WHERE 在分组和聚集计算之前选取输入行(因此,它控制哪些行进入聚集计算), 而 HAVING 在分组和聚集之后选取分组的行。
因此,WHERE 子句不能包含聚集函数,因为试图用聚集函数判断那些行输入给聚集运算是没有意义的。相反,HAVING子句总是包含聚集函数。
例如:
select name,email,count(*) as ct from 表名 group by email HAVING ct > 1
先用group by 对email进行分组,在用having来过滤大于1的,这样查找出来的就是重复的记录了.
二. 视图的应用
视图保存的并不是真实的数据,而是一张虚拟的表,不占用内存空间,只是保存了计算需要的sql语句,每次调用的的时候都会自己调用封存的sql语句,从而提高了重用性。并且视图显示的内容会跟原文件同步。视图 不可以与视图进行联结 可以与其他表联结 索引的话都是跟普通表查询一样的 会产生作用
1. 创建视图
create view 视图名 as select 查询语句
示例:
create view test_test1(name) as select name from test_function;
2. 查询视图
select * from 视图名
示例:
select * from test_test1
name |
---|
tom |
alice |
3. 插入数据
insert into 视图名 (列名) values(列值);
示例:
insert into test_function (name) values("张三")
name |
---|
tom |
alice |
张三 |
4. 删除视图
drop view 视图名
三. MySQL的约束
约束是一种限制,它通过对表的行或列的数据做出限制,来确保表的数据的完整性、唯一性。
MySQL中,常见的集中约束:
约束类型 | 关键字 | 说明 |
---|---|---|
主键 | primary key | 唯一,且不为空 |
外键 | froeign key | 关联外表中的主键,可以为空。一旦关联之后,主表中的数据不能先删除,必须先解除关联 |
唯一 | unique | 此列值在整个表都是唯一的,除了空(空和空不相等),可以两个列组合为唯一约束 |
非空 | not null | 确保当前列的值不为空值,非空约束只能出现在表对象的列上。 |
自增 | auto_increment | 自动增加,默认步长为1,一张表只能有一个自动增加字段 |
默认值 | default | 确保当前列的值不为空值 |
1. 主键约束( primary key)
主键约束相当于 唯一约束 + 非空约束 的组合,主键约束列不允许重复,也不允许出现空值。
每个表最多只允许一个主键,建立主键约束可以在列级别创建,也可以在表级别创建。
当创建主键的约束时,系统默认会在所在的列和列组合上建立对应的唯一索引。
-- 基本模式
create table temp(
id int primary key [auto_increment],
name varchar(20)
);
-- 组合模式
create table temp(
id int ,
name varchar(20),
pwd varchar(20),
primary key(id, name)
);
-- 删除主键约束
alter table temp drop primary key;
-- 添加主键约束
alter table temp add primary key(id,name);
-- 修改主键约束
alter table temp modify id int primary key;
2. 外键约束 (foreign key)
外键约束是保证一个或两个表之间的参照完整性,外键是构建于一个表的两个字段或是两个表的两个字段之间的参照关系.
-- 基本模式
-- 主表
create table temp(
id int primary key,
name varchar(20)
);
-- 副表
create table temp2(
id int,
name varchar(20),
classes_id int,
foreign key(id) references temp(id)
);
-- 多列外键组合,必须用表级别约束语法
-- 删除外键约束
alter table student drop foreign key student_id;
-- 主表
create table classes(
id int,
name varchar(20),
number int,
primary key(name,number,ON DELETE CASCADE = True)
);
-- 副表
create table student(
id int auto_increment primary key,
name varchar(20),
classes_name varchar(20),
classes_number int,
/表级别联合外键/
foreign key(classes_name, classes_number) references classes(name, number)
);
-- 删除外键约束
alter table student drop foreign key student_id;
-- 增加外键约束
alter table student add foreign key(classes_name, classes_number) references classes(name, number);
级联操作的属性:
- ON DELETE CASCADE 删除主表中的数据时,从表中的数据随之删除
- ON UPDATE CASCADE 更新主表中的数据时,从表中的数据随之更新
- ON DELETE SET NULL 删除主表中的数据时,从表中的数据置为空
3. 唯一约束(unique)
唯一约束是指定table的列或列组合不能重复,保证数据的唯一性。
唯一约束不允许出现重复的值,但是可以为多个null。
同一个表可以有多个唯一约束,多个列组合的约束。
在创建唯一约束时,如果不给唯一约束名称,就默认和列名相同。
唯一约束不仅可以在一个表内创建,而且可以同时多表创建组合唯一约束。
-- 创建表时设置,表示用户名、密码不能重复
create table temp(
id int not null ,
name varchar(20),
password varchar(10),
unique(name,password)
);
-- 添加唯一约束
alter table temp add unique (name, password);
-- 修改唯一约束
alter table temp modify name varchar(25) unique;
-- 删除约束
alter table temp drop index name;
4. 非空约束 not null 与 默认值 default
非空约束用于确保当前列的值不为空值,非空约束只能出现在表对象的列上。
Null类型特征:
所有的类型的值都可以是null,包括int、float 等数据类型
-- 创建table表,ID 为非空约束,name 为非空约束 且默认值为abc
create table temp(
id int not null,
name varchar(255) not null default 'abc',
sex char null
);
-- 增加非空约束
alter table temp
modify sex varchar(2) not null;
-- 取消非空约束
alter table temp modify sex varchar(2) null;
-- 取消非空约束,增加默认值
alter table temp modify sex varchar(2) default 'abc' null;
5. 查看指定表的所有约束
show create table 表名