1、高级查询
(1)总结
3、select ... 聚合函数 from 表名
1、where ...
2、group by ...
4、having ...
5、order by ...
6、limit ...;
(2)order by:给查询结果排序
order by 字段名 ASC(升序,是默认的)/DESC(降序)
(3)limit (永远放在SQL命令的最后写)
显示查询记录的条数
用法:
limit n; --->显示 n 条记录
limit m,n; ----->从第m + 1条记录开始显示n条记录
limit 2,3; 显示第3,4,5三条记录
(4)分页
每页显示5条记录,显示第4页的内容
第1页:limit (1-1)*5,5 # 1 2 3 4 5
第2页:limit (2-1)*5,5 #6 7 8 9 10
第3页:limit (3-1)*5,5 #11 12 13 14 15
...
第m页:limit (m-1)*n,n
(5)聚合函数
分类
avg(字段名) : 求该字段的平均值
sum(字段名) : 求和
max(字段名) : 求最大值
min(字段名) : 求最小值
count(字段名) : 统计该段记录的个数
(6)group by:给查询的结果进行分组
计算每个国家的平均攻击力:
select country,avg(gongji) from sanguo group by country;
先分组 再聚合 再去重
注意:
select 之后的字段名如果没有在group by 之后出现,则必须要对该字段进行聚合(聚合函数)
(7)、having语句
作用:对查询结果进行进一步的帅选
练习:找出平均攻击力大于105的国家的前2名,显示国家名和平均攻击力
mysql> select country,avg(gongji) from sanguo group by country
-> having avg(gongji)>105
-> order by avg(gongji) DESC
-> limit 2;
注意:
1、having语句通常和group by 语句联合使用,过滤由group by 语句返回的记录集
2、where只能操作表中实际存在字段,having语句可操作由聚合函数生成的显示列
(8)distinct:不显示字段的重复值
语法:select distinct 字段1,字段2 from 表名
select count(distinct country) as n from sanguo;
注意:distinct和from之间的所有字段值都相同才会去重
(9)查询表记录时可以做数学运算
运算符:+ - * / %
示例: select id,name,gongji*2 from sanguo;
2、约束:
(1)、作用:保证数据的一致性、有效性
(2)、约束分类:
①默认约束(default)
插入记录时,不给该字段赋值,则使用默认值
sex enum("M","F","S") default "S"
②非空约束(not null)
不允许该字段的值为NULL
id int not NULL
id int not NULL default 0
3、索引:
对数据库中的一列或多列的值进行排序的一种结构(BTree)
(1)普通索引(index)
使用规则:
① 可设置多个字段,字段值无约束
②把经常用来查询的字段设置为索引字段
③KEY标志:MUL
普通索引的创建:
①创建表时创建
create table t1(
...,
...,
index(name),
index(id);
②已有表中创建:
create index 索引名 on 表名(字段名);
查看索引:
①desc 表名;
②show index from 表名\G;
删除普通索引:
drop index 索引名 on 表名;
(2)唯一索引(unique)
①使用规则:
可以设置多个字段
约束:字段值允许重复,但可以为NULL
KEY标志:UNI
②创建:
创建表时创建
unique(phnumber),
unique(cardnumber)
已有表创建:
create unique index 索引名 on 表名
③查看、删除同普通索引
(3)主键索引(primary key)
① 使用规则:
一个表中只能有一个字段为主键字段
约束:
字段值不允许重复,也不能为NULL
KEY标志:PRI
通常设置记录编号字段为id,能够唯一锁定一条记录
② 创建:
创建表时:
方法1: id int primary key auto_increment,
name varchar(20) not null
)auto_increment=10000,charset=utf8,engine=InnoDB;
**InnoDB,MyISAM
两种类型有什么区别:MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持。
MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但是不提供事务支持,而 InnoDB提供事务支持,外键等高级数据库功能。
MyISAM类型的二进制数据文件可以在不同操作系统中迁移。也就是可以直接从Windows系统拷贝 到linux系统中使用。
alter table 表名 auto_increment=10000;
方法2 :id int auto_increment,
name varchar(20),
primary key(id,name) #复合主键
已有表:
alter table 表名 add primary_key(id);
③删除主键
先删除自增长属性(modify)
alter table 表名 modify id int
删除主键:
alter table 表名 drop primary key;
(4)外键(foreign key)