数据库
数据库基础操作
-- 链接数据库
mysql -uroot -p
-- 查看所有库
show databases;
-- 创建数据库
create database python13 default charset=utf8;
-- 删除数据库
drop database li;
-- 打开数据库
use python13;
-- 查看当前库中的所有表
show tables;
-- 查看建表语句
show create table python13\G;
-- 创建表
creat table classinfo(
id int(10) unsigned not null auto_increment primary key,
name varchar(20)
)default charset=utf8;
-- 插入数据
insert into test(id,name) values(1,'小明');
-- 查询指定表中的所有数据
select * from classinfo;
-- 删除指定表中的数据
delete from classinfo;
-- 删除表
drop table classinfo;
-- 更新数据 更新classinfo中的id=1的数据name='韩梅梅'
-- 如果后面不加where条件则会修改表中所有name的数据
update classinfo set name='韩梅梅' where id=1;
-- 查看表结构
desc classinfo;
-- 返回结果
mysql> desc classinfo;
+-------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------------+------+-----+---------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| name | varchar(10) | YES | | NULL | |
+-------+------------------+------+-----+---------+----------------+
2 rows in set (0.00 sec)
修改表结构
- 格式: alter table 表名 action(更改选项);
添加字段
-- alter table 表名 add 新字段名 字段类型和约束;
alter table classinfo add phone varchar(11) not null;
在指定字段后面添加新字段:
-- alter table 表名 add 新字段名 字段类型和约束 after 字段名;
alter table classinfo add age int(4) after email;
在最前面添加字段:
-- alter table 表名 add 新字段名 字段类型和约束 first;
alter table classinfo add aaa varchar(10) first;
删除字段:
-- alter table 表名 drop 字段名;
alter table classinfo drop aaa;
修改字段信息: change(可以修改字段名) modify(只修改字段信息)
注意:使用change修改字段信息时要写两次字段名
-- 修改user表中age字段信息(类型);
alter table classinfo modify age varchar(10) not null;
-- 修改user表的pwd字段改为password字段并添加了默认值;
alter table classinfo change pwd password varchar(32) not null;
索引操作
唯一索引 unique
-- 为classinfo表中的name字段添加唯一性索引,索引名为username;
alter table classinfo add unique username(name);
普通索引 index
-- 给user表中的phone 字段添加一个普通索引 索引名叫po
alter table classinfo add index po(phone);
删除索引:
-- 删除唯一索引:
alter table user drop index username;
-- 删除普通索引
alter table user drop index po;
修改表名: alter table 旧表名 rename as 新表名
-- 修改classinfo表的表名
alter table classinfo rename as class;
更改AUTO_INCREMENT初始值:
ALTER TABLE 表名称 AUTO_INCREMENT=1
更改表类型:
ALTER TABLE 表名称 ENGINE="InnoDB"
事务
- 将一组操作看做一个事物,如果有一个操作失败,都是失败;都成功,才成功
表的类型
myisam
- 存储时会有三个文件 frm:数据的存储 MYD:数据的结构 MYI:数据索引
- 不支持事务
innodb
- 储存时有两个文件 frm:数据结构 ibd:索引和数据
- 支持事务
InnoDB 查询效率低于 myisam
- 数据存的地址:
datadir = /var/lib/mysql
- innodb引擎 当服务重启后会重新计算自增值
- myisam引擎 重启服务不会重新计算自增值
数据的操作
添加数据
-- 基本添加(指定所有的字段,给对应值)
insert into class(id,username,password,age,sex,phone,height) values(null,'zhangsan',md5(123456),'男',18,'110',170);
-- 指定部分字段添加
insert into users(username,phone) values('lisi','135');
-- 不指定字段
insert into users values(null,'zhaoliu',null,null,'女',32,null,null);
-- 批量添加
insert into users(username,phone) values('tianqi','男'),('wangba','女'),('pijiu','男');
更新数据
- update 表名 set username='houhouhou' where 条件信息;
-- 将id为4的age改为35,sex改为男值
update class set age=35,sex='男' where id=4;
-- 将id值为2和4的数据值sex改为女,phone改为138438
update class set sex='女',phone='138438' where id=2 or id=4;
删除数据
- 格式:delete from 表名 [where 条件]
-- 删除users表中age值为25到30的数据
delete from class where age>=25 and age<=30;
查询数据
基本查询
select * from 表名;
where条件查询:
-- 1. 查询班级为py13期的学生信息
select * from class where classname='py13';
-- 2. 查询班级为py13期的男学生信息
select * from class where classname="py13" and sex="男";
-- 3. 查询年龄在30以上的男生
select * from class where age>30 and sex="男";
-- 4. 查询年龄在20至25岁的学生信息
select * from class where age>=20 and age<=25;
select * from class where age between 20 and 25;
-- 5. 查询年龄不在20至25岁的学生信息
select * from class where age<20 or age>25;
select * from class where age not between 20 and 25;
-- 6. 查询py13和py9期的女生信息
select * from class where classname in('py13','py9') and sex='女';
select * from class where (classname='py13' or classname='py9') and sex='女';
like 子句查询(模糊查询)
% 任意个数的任意字符
_ 一个任意字符
-- 查询姓名以小结尾的数据
select * from class where name like '%小';
select * from class where name regexp '.+小$';
-- 查询姓名为两个字符的
select * from class where name like '__';
-- 查询名字当中包含小的数据
select * from class where name like '%小%'
MySQL的统计函数(聚合函数)
- max() min() count() sum() avg()
-- 当前表中有多少条数据?
select count(*) from class;
-- 获取学生表中最大、最小以及平均年龄是多少?
select max(age),min(age),avg(age) from class;
-- 获取表中男生的数量
select count(sex) from class where sex="男";
-- 统计py13的平均年龄
select avg(age) from class where classname='py13';
GROUP BY 语句 分组
-- 统计每个班级的人数
select classname,count(*) from users group by classname;
-- 统计班级信息,按性别分组,并统计每组人数;
select sex,count(*) from class group by sex;
-- 统计每个班级的,男生和女生各多少人数。
select classname,sex,count(*) from users group by classname,sex;
ORDER BY 排序 -- asc 默认升序 desc 降序
-- 按年龄进行排序 升序
select * from class order by age;
-- 降序 desc
select * from class order by age desc;
-- 如果有两个字段排序 县排序第一个字段,然后在第一个字段排序的基础上在此进行排序
-- 只写一个关键字
-- 班级升序,然后对每个班级的年龄降序
select * from class order by classname ,age desc;
limit 分页
- 格式:select * from 表名 limit 每一页数据的开始,每一页的数量;
-- 查找前5条数据
select * from class limit 5;
-- 以4条数据分一页,取第一页。
select * from class limit 0,4;
-- 取第二页
select * from class limit 4,4;
-- 取第三页
select * from class limit 8,4;
-- start = (p-1)*4 4
-- 统计班级为py13的男女生各多少人?
select sex,count(*) from class where classname='py13' group by sex;
-- 获取年龄最大的5位学生信息?
select * from class order by age desc limit 5;
-- 获取每个班级的平均年龄,并按平均年龄降序,
select classname,avg(age) from users group by classname order by avg(age) desc;
select classname,avg(age) avgage from users group by classname order by avgage desc;
-- 统计每个班级的人数,按人数从大到小排序,取前3条。
select classname,count(*) c from class group by classname order by c desc limit 3;
数据导出
退出mysql命令行
导出库
mysqldump -u用户名 -p 要导出的库名>./导出的文件名
导出表
mysqldump -u用户名 -p 要导出的库名 表名>./导表的文件名
导入:
导入库的时候,数据库里要有这个库
mysql -u用户名 -p 库名<备份的库文件/表文件
高级特性
多表联查
嵌套查询
- 将一个sql语句作为另一个sql语句的查询条件
- 不推荐使用,影响查询效率
-- 查询小红所在的班级
select * from student where name ='小红';
select * from class where id=10;
select * from class where id=(select * from student where name='小红');
where 关联查询
- 格式:select * from 表1,表2 where 表1.外键=表2.关联字段 [查询条件(分组、排序、分页)];
-- 查询所有学员对应的班级
select * from student,class where student.classid=class.id;
-- 查询学员的姓名和对应的班级信息
select student.id,student.name,class.classname from student,class where student.classid=class.id;
-- 简写(别名))
select s.classid,s.name,c.classname from sutdent s,class c where s.classid=c.id;
-- 统计每个班级的人数
select c.classname,count(s.id) from student s,class c where s.classid=c.id group by c.classname;
join 链接查询
内链接 inner join
- 获取两个表中字段匹配关系的记录
- 只查询两个表有对应匹配的信息
-- 查询新闻信息,并补齐新闻类别信息
select * from news inner join newtype on news.typeid=newtype.id;
左链接 left join
- 获取左表的所有记录,即使右表没有对应匹配的记录
- 写在
left join
左侧为左表,右侧为右表 - 右表没有对应匹配的记录用null补齐
-- 查询新闻信息,并补齐新闻类别信息
select * from news left join newtype on news.typeid=newtype.id;
右链接 right join
- 获取右表的所有记录,即使左表没有对应匹配的记录
- 左表没有对应匹配的记录用null补齐
select * from news right join newtype on news.typeid=newtype.id;
练习
-- 统计每个新闻类别下的新闻数量,采用where关联统计
select newtype.type,count(*) from news,newtype where news.typeid=newtype.id group by newtype.type;
-- 统计每个新闻类别下的新闻数量,采用内链接统计
select newtype.type,count(*) from news inner join newtype on news.typeid=newtype.id group by newtype.type;
-- 统计每个新闻类别下的新闻数量,采用左链接统计
select newtype.type,count(*) from news left join newtype on news.typeid=newtype.id group by newtype.type;
事务
MySQL 事务主要用于处理操作量大,复杂度高的数据。比如说,在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个事务!
在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务。
事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行。
事务用来管理 insert,update,delete 语句
一般来说,事务是必须满足4个条件(ACID): Atomicity(原子性)、Consistency(稳定性)、Isolation(隔离性)、Durability(可靠性)
- 事务的原子性:一组事务,要么成功;要么撤回。
- 稳定性 :有非法数据(外键约束之类),事务撤回。
- 隔离性:事务独立运行。一个事务处理后的结果,影响了其他事务,那么其他事务会撤回。事务的100%隔离,需要牺牲速度。
- 可靠性:软、硬件崩溃后,InnoDB数据表驱动会利用日志文件重构修改。可靠性和高速度不可兼得,innodb_flush_log_at_trx_commit选项(即执行commit语句),决定什么时候把事务保存到日志里。
事物的处理方法
- BEGIN 开始一个事务
- ROLLBACK 事务回滚
- COMMIT 事务确认
开启事务
BEGIN;
执行sql...
成功执行 事务提交
commit
失败执行 事务回滚
rollback
复制表
复制表结构
- create table 目标表名 like 原表名;
- 只复制表结构,不复制数据
create table classinfo like class;
复制表数据
- insert into 目标表名 select * from 原表名;
- 常用于暴力添加数据
insert into classinfo select * from class;
数据库视图
- 类似于表,也有字段和记录
- 依赖于源数据,当源数据发生变化时,视图里的数据自动发生变化
- 简化sql查询操作,主要用于数据的展示
创建视图:
create view 视图名字 as sql查询语句;
删除视图:
drop view 视图名字;
MySQL常用内置函数
字符串处理函数
- 链接字符传:
concart(s1,s2...sn);
- 返回值为字符串长度:
length(str);
数值函数
-
abs(x)
:返回x的绝对值 -
round(x,y)
:返回参数x的四舍五入的有y位小数的值
日期和时间函数
-
now()
返回当前日期和时间, -
unix_timestamp(date)
返回date时间的unix时间戳 -
date_fomat(date,fmt)
返回按字符串fmt格式化日期date值 -
datediff(expr,expr2)
返回起始时间和结束时间的间隔天数
其他常用函数
-
database()
返回当前数据库名 -
version()
返回当前服务器版本 -
user()
返回当前登陆用户名 -
inet_aton
返回当前IP地址的数字表示inet_aton("192.168.80.250");
-
inet_ntoa(num)
返回当前数字表示的ipinet_ntoa(3232256250)
; -
password(str)
返回当前str的加密版本 -
md5(str)
返回字符串str的md5值
触发器
-- 创建一个触发器,当对users表中数据进行添加时,修改统计的数据
\d //
create trigger countuser after insert on user for each row
begin
update user_count set num = num+1;
end;
//
有一个库来存储users表中删除的数据
create trigger deluser before delete on users for each row
begin
insert into del_users values(old.id,old.username,old.password,old.email,old.age,old.sex,old.phone,old.classid,old.money);
end;
恢复数据库
- bin-log日志储存地址:/var/log/mysql/mysql-bin.log
- 查看日志文件:show binary logs;
步骤
前期准备
- 必须开启bin-log日志
数据库恢复步骤
- 导出日志文件,并修改日志文件,删除删库操作
- 导入备份数据
- 导入日志文件
SQL优化
优化sql步骤
- 慢查询日志
- 找出执行慢的sql语句
- 进行具体语句分析,优化或建立索引
有关慢查询操作
-- // 查看“慢查询”的配置信息
show variables like "%slow%";
-- // 查看“慢查询”的时间定义
show variables like "long%";
-- //设置“慢查询”的时间定义
set long_query_time=0.2;
-- //开启慢日志
set global slow_query_log='ON';
扩展内容
-- 查看有关mysql数据库服务器的一些信息
show [session|global] status;
session:当前连接
global:数据库服务器启动之后
show global status;
show status like 'Com_%' 一般查看以com开头的
// 根据执行的sql语句(次数)
Com_select:查询
Com_update:修改次数
Com_insert:插入次数
Com_delete:删除的次数
// 此处是影响的行数(比如查询一次显示20行,那么行数增加20行)
InnoDB_rows_read:执行select操作的次数
InnoDB_rows_updated:执行update的次数
InnoDB_rows_inserted:执行insert操作的次数
InnoDB_rows_deleted:执行delete操作的次数
connections:连接mysql的数量
Uptime:服务器已经工作的秒数
Slow_queries:慢查询的次数
mysql> show variables like '%slow%';
+---------------------------+--------------------------------------------+
| Variable_name | Value |
+---------------------------+--------------------------------------------+
| log_slow_admin_statements | OFF |
| log_slow_slave_statements | OFF |
| slow_launch_time | 2 |
| slow_query_log | OFF |
| slow_query_log_file | /var/lib/mysql/yc-virtual-machine-slow.log |
+---------------------------+--------------------------------------------+
mysql> show variables like "long%";
+-----------------+-----------+
| Variable_name | Value |
+-----------------+-----------+
| long_query_time | 10.000000 |
+-----------------+-----------+
1 row in set (0.00 sec)