一、mysql的启动和连接
1.、服务控制(启动、查看状态、停止、重启,重载)
两种方法(Ubuntu系统)
-
- sudo /etc/init.d/mysql start | status | stop | restart | reload
- service mysql start | status | stop | restart | reload
2 、连接数据库
-
- mysql -h主机地址 -u用户名 [-P3306] -p密码
二、库的管理
1、创建库(指定字符集)
create database 库名;
create database 库名 default charset = utf8 #指定字符集
2、查看库的字符集
show create database 库名;
3、查看当前所在库
select database();
4、切换库
use 库名;
5、查看库已有表
show tables;
6、删除库
drop database 库名;
三、表管理(表的创建、查看、删除)
1、创建表
create table 表名(字段名1 数据类型1,字段2 数据类型2...);
create table 表名(字段名1 数据类型1,字段2 数据类型2...)default charset = utf8;
2、查看表的字符集和存储引擎
show create table 表名;
3、查看表结构
desc 表名;
4、删除表
drop 表名;
四、表字段管理
1、添加字段(add)
alter table 表名 add 字段名 数据类型; #默认添加到末尾
alter table 表名 add 字段名 数据类型 first; #添加到第一个字段
alter table 表名 add 字段名 数据类型 after 字段名; # 添加到指定字段后面
2、修改字段数据类型
alter table 表名 modify 字段名 新数据类型;
注: 修改数据类型时会受到表中原有数据类型的限制
3、修改字段名
alter table 表名 change 旧名 新名 数据类型;
4、删除字段
alter table 表名 drop 字段名;
5、修改表名
alter table 表名 rename 新表名;
五、表记录操作(表内容的增、删、改、查)
1、插入表记录
insert into 表名 values(记录1的字段的值),(记录2的字段的值)...;
insert into 表名(指定要插入的字段名) values(记录1的字段的值),(记录2的字段的值)...;
注意: 没有指定插入字段名的话,后面必须插入全部字段的值,如果指定了只需插入指定字段值即可。
2、查询表记录
select * from 表名; # 查看所有的表记录
select 字段1,字段2...... from 表名; # 查看指定字段记录
注:其它更复杂的查询后面逐步说明
3、删除表记录
delete from 表名 where 条件;
注:delete 语句后面如果不加where子句,会将表中所有记录删除。
4、更新表记录
update 表名 set 字段1=值1,字段2=值2...... where 条件;
注意:update 语句后面如果不加where子句,会将表中所有记录修改。
进阶查询部分
PS:此表作为下面示例所用(表名:sanguo)
id |
name |
gongji |
fangyu |
sex |
country |
1 |
诸葛亮 |
120 |
20 |
男 |
蜀国 |
2 |
司马懿 |
119 |
25 |
男 |
魏国 |
3 |
关5羽 |
188 |
60 |
男 |
蜀国 |
4 |
赵云6 |
200 |
66 |
男 |
魏国 |
5 |
孙权 |
100 |
60 |
男 |
吴国 |
6 |
貂蝉 |
666 |
10 |
女 |
魏国 |
7 |
NULL |
1000 |
99 |
女 |
魏国 |
8 |
|
1005 |
88 |
女 |
蜀国 |
9 |
9周瑜 |
80 |
100 |
男 |
吴国 |
10 |
黄忠 |
130 |
80 |
男 |
蜀国 |
11 |
孙策 |
110 |
90 |
男 |
吴国 |
12 |
荀粲 |
80 |
100 |
男 |
魏国 |
13 |
华佗 |
60 |
200 |
男 |
NULL |
六、where 子句
ps:配合查询、修改、删除操作
语法格式(以查询为例):
select * from 表名 where 条件;
1、where 子句后的运算符操作
数值比较运算符:=、!=、>、>=、<、<=
字符比较运算符:=、!=
示例:
找出攻击力高于150的英雄和攻击值
select name,gongji from sanguo where gongji > 150;
找出防御力不等于100的英雄信息
select * from sanguo where fangyu != 100;
2、逻辑比较
运算符:and 、or
and:两个或多个条件需要同时满足
or:两个或多个条件满足一条即可
示例:
找出攻击值大于200的蜀国英雄的名字和攻击值
select name,gongji from sanguo where gongji > 200 and country = "蜀国";
将吴国英雄中攻击值为110的英雄的攻击值设置为100,防御值设置为60
update sanguo set gongji=100 where gongji=110;
3、范围内比较
between and 、in、not in
语法:
字段名 between 值1 and 值2
字段名 in 值1 或 字段名 in (值1,值2...)
字段名 not in 值1
示例:
查找攻击值在100-200之间的蜀国英雄信息
select * from sanguo where gongji between 100 and 200;
找到蜀国和吴国以外国家的女英雄信息
select * from sanguo where sex="女" and country not in ("蜀国","吴国");
4、查询空
is null 、is not null
示例:
查找姓名为NULL的蜀国女英雄信息
select * from sanguo where name is null and sex="女";
查找姓名为""的英雄的id、姓名和国家
select * from sanguo where name="";
注意:null 为空值,必须用 is 或者 is not 去匹配,而""为空字符串,用 = 或者 != 去匹配。
5、模糊比较
语法:where 字段名 like 表达式;
表达式:
_ : 匹配单个字符
% : 匹配0到多个字符(null不会被匹配)
示例:
匹配名字中至少有两个字的英雄
select * from sanguo where name like "_%_";
匹配名字为三个字的英雄
select * from sanguo where name like "___";
匹配姓赵的英雄
select * from sanguo where name like "赵%";
6、正则匹配查询 regexp
语法:where 字段名 regexp 正则表达式;
常用的正则表达式符号:
^ : 以...开头
$ : 以...结尾
. : 匹配任意一个字符
[] : 包含...内容
* : 匹配前面的子表达式零次或多次
示例:
匹配名字中带数字的英雄信息
select * from sanguo where name regexp "[0-9]";
匹配名字中以数字开头的记录
select * from sanguo where name regexp "^[0-9]";
匹配名字中以数字结尾的记录
select * from sanguo where name regexp "[0-9]$";
匹配以 司 开头,以 懿 结尾的记录
select * from sanguo where name regexp "^司.*懿$";
七、order by子句(排序)
语法格式:order by 字段名 排序方式;
排序方式:asc(默认):升序 desc:降序
示例:
将英雄按防御值从低到高排序
select * from sanguo order by fangyu asc; #asc 可不写
将蜀国英雄按攻击值从高到底排序
select * from sanguo where country = "蜀国" order by gongji desc;
将魏蜀两国的男英雄中名字中为三个字的英雄按防御值升序排列
select * from sanguo
where sex = "男" and country in ("魏国","蜀国") and name like "___"
order by fangyu;
八、limit子句
作用:用于限制显示查询的记录条数
语法:limit m,n;
m:表示从第m+1条开始显示记录
n:表示显示多少条记录
# m可以省略
# 永远放在SQL语句的最后面
示例:
查找防御值倒数第2名到倒数第4名的蜀国英雄记录
select * from sanguo where country = "蜀国" order by fangyu limit 1,3;
查找攻击值前3名且名字不为空值的蜀国英雄的姓名、攻击值和国家
select name,gongji,country from sanguo
where country = "蜀国" and name is not null
order by gongji desc limit 3;
九、聚合函数
avg(字段名):求字段的平均值
sum(字段名):求和
max(字段名):求最大值
min(字段名):求最小值
count(字段名):统计该字段记录的条数
示例:
找到最强攻击值是多少
select max(gongji) as best from sanguo;
注:这里的as 相当于设置一个别名best,可以省略。
统计一下id,name两个字段分别有多少记录
select count(id),count(name) from sanguo;
统计蜀国英雄中攻击值大于200的英雄的数量
select count(*) from sanguo where country="蜀国" and gongji > 200;
# count(*)的意思是指被筛选出来的记录只要有一个字段不是空值就会被统计
十、group by子句(先分组,再聚合)
作用:给查询的结果进行分组
语法:group by 字段名;
示例:
统计sanguo表中一共有哪几个国家
select country from sanguo group by country;
计算所有国家的平均攻击力
select countr,avg(gongji) from sanguo group by country;
# 先分组,在求分组后每组的(国家)平均攻击力,最后将国家去重显示出来。
查找所有国家中,英雄数量最多的前2名的国家的名称及英雄数量
select country,count(*) as 英雄数量 from sanguo
group by country order by 英雄数量 desc limit 2;
# 可以使用中文作为别名
十一、having
示例:
找出平均攻击力大于105的国家的前2名,显示国家名称和平均攻击力
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.having语句弥补了where条件子句不能与聚合函数联合使用的不足,where操作的
是表中实际的字段,having操作的是集合函数生成的显示列
十二、distinct
作用:不显示字段的重复值
示例:
sanguo表中一共有哪些个国家
select distinct country from sanguo;
计算蜀国一共有多少个英雄
select count(distinct name) from sanguo where country = "蜀国";
注:1.distinct处理的是distinct和from之间的所有字段,所有字段的值必须完全相同才可以去重
2.distinct不能对任何字段做聚合处理
十三、查询表记录时可以做数学运算
+ 、-、 *、/、 %
示例:
查询时显示所有英雄的攻击力 * 10
select name,gongji*10,country from sanguo;
总结(执行顺序)
1、where ...
2、group by ...
3、select ... 聚合函数 from 表名
4、having ...
5、order by ...
6、limit ...
约束
作用:
为了保证数据的完整性、一致性、有效性,可以限制无效的数据插入到数据表中
约束分类:
默认约束(default)
作用:在插入记录时,如果不给该字段赋值,则使用默认值
格式:
字段名 数据类型 default 默认值,
非空约束
作用:不允许该字段的值有空值NULL记录
格式:
字段名 数据类型 not null
示例:
创建一张表,name字段的默认值是“张三”
create table t1(name varchar(20) default "张三", age tinyint unsigned);
向表中添加一个字段,值不能为空
alter table t1 add id int not null;
索引
定义:
对数据库中表的一列或者多列的值进行排序的一种结构(MySQL中索引用Btree方式)
索引的优缺点:
优点:
可以加快数据的检索速度
缺点:
当对表中的数据进行增加、修改、删除的时候,索引需要动态维护,降低了数据的维护速度
索引需要占用物理存储空间(数据库目录/var/lib/mysql)
创建索引:
# name字段
create index name on t1(name);
ps:可以开启性能测试,有索引和无索引的检索用时区别
1.开启性能测试
show variables like "%pro%";
set profiling = 1;
2.查看性能分析结果
show profiles;
# 与没有索引的进行对比
3.关闭性能测试
set profiling = 0;