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)
定义:让当前表的字段值在另一张表的范围内去选择
语法格式:
foreign key(参考字段名)
references 主表(被参考字段名)
on delete 级联动作
on update 级联动作;
使用规则:
1)主表、从表字段数据类型要一致
2)主表:被参考字段是主键
删除外键:
alter table 表名 drop foreign key 外键名;
外键名查看:show create table 表名
已有表添加外键:
alter table 表名 add
foreign key(stu_id) references jftab(id)
on delete 级联动作
on update 级联动作;
级联动作:
1、cascade : 数据级联删除,级联更新(参考字段)
2、restrict(默认)
从表中有相关记录,不允许主表操作
3、set null
主表删除、更新,从表相关联记录字段值为NULL
2、嵌套查询(子查询)
1、定义:把内层的查询结果作为外层的查询条件
2、语法:
select ... from 表名 where 字段名 运算符(select ... form 表名 where 条件);
3、练习:
select name,gongji from sanguo where gongji<(select avg(gongji) from sanguo);
找出每个国家攻击力最高的英雄的名字和攻击值
select name,gongji, from sanguo
where
(country,gongji) in(select country,max(gongji) from sanguo group by country);
3、多表查询
1、 笛卡儿积:不加where条件
select ... from 表1,表2;
1) 记录多的表的每一条记录,去匹配另一张表的所有记录
2) 2张表记录条数相同,则后表的每条数据去匹配前表的每条记录
2、加where条件
select ... from 表1,表2 where 条件;
select sheng.s_name,city.c_name from sheng,city
-> where
-> sheng.s_id=city.cfather_id;
select sheng.s_name,city.c_name,xian.x_name from sheng,city,xian
-> where
-> sheng.s_id=city.cfather_id and city.c_id=xian.xfather_id;
4、连接查询
1、内连接(inner join)
语法格式:select 字段名列表 from 表1
inner join 表2 on 条件
inner join 表3 on 条件;
select sheng.s_name,city.c_name,xian.x_name from sheng
-> inner join city
-> on sheng.s_id=city.cfather_id
-> inner join xian
-> on city.c_id=xian.xfather_id;
2、外连接
1)左连接(left join)
以左表为主,显示查询结果
语法格式:
select 字段名列表 from 表1
left join 表2 on 条件
left join 表3 on 条件;
select sheng.s_name,city.c_name from sheng left join city on sheng.s_id=city.cfather_id;
> select sheng.s_name,city.c_name,xian.x_name from sheng
-> left join city on sheng.s_id=city.cfather_id
-> left join xian on city.c_id= xian.xfather_id;
2)右连接(right join)
以右表为主显示查询结果,用法同左连接
***5
1、锁
目的:解决客户端并发访问的冲突问题
锁分类:
1)读锁(共享锁)
查询(select):加读锁之后,别人不能更改表记录,但可以进行查询
2)写锁(互斥锁,排他锁)
更新(update):加写锁之后别人不能查,不能改
锁粒度来分:
1)行级锁:Innodb
select:加读锁,锁一行
update:加写锁,锁一行
2)表级锁:MyISAM
select:加读锁,锁一张表
update:加写锁,锁一张表
2、存储引擎(engine:处理表的处理器)
基本操作密令:
1)查看所有的存储引擎
show engines;
2)查看已有表的存储引擎
show create table 表名;
3)创建表制定存储引擎
create table 表名(...)engine=myisam;
4)已有表中更改存储引擎
alter table 表名 engine = myisam;
常用存储引擎的特点:
1)InnoDB特点:
支持事务,外键,行级锁
共享表空间
2)MyISAM特点:
支持表级锁
独享表空间
表名.frm:存放表结构
表名.MYD(mydate) :存放表记录
表名.MYI (myindex) :存放索引信息
3)Memory存储引擎
数据存储在内存中,速度快
服务器重启、Mysql服务重启后表记录消失
4)如何决定使用那个存储引擎
执行查询操作多的表使用MyISAM(若使用InnoDB浪费资源)
执行写操作多的表使用InnoDB
3、MySQL用户账户管理
1)开启MySQL远程连接(改配置文件)
sudo -i
cd /etc/mysql.conf.d/
cp mysql.cnf mysql.cnf.bak2
vi mysql.cnf
#bind-address=127.0.0.1
把前面的#去掉,保存退出
vi mysql.cnf
按a ->改内容->按ESC->按shift + :->wq
/etc/init.d/mysql restart
2)用root用户添加授权用户
用root用户登录mysql : mysql -uroot -p123456
授权:grant 权限列表 on 库名.表名
to "用户名"@"%" identifed by "密码" with grant option;
权限列表:all privileges, select ,update
库名.表名:db4.*, *.*(所有库的所有列表)
示例:
添加授权用户tiger,密码123,对所有库的所有列表有所有权限,可以从任何IP 去连接
grant all privileges on *.* to 'tiger'@'%' identified by '123'
-> with grant option;