MySQL的基本操作
一、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; 注:空值NULL不会被统计,空字符串""会被统计 统计蜀国英雄中攻击值大于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;