Author: 楚格
2018-11-07 10:34:48
IDE: Pycharm2018.02 Python 3.7
KeyWord :
Explain:
思路:
MySQL
- 主要操作
数据库操作,包括创建,删除
表的操作,包括创建,修改,删除
数据操作,包括增加修改,删除,查询,crud
- E-R模型
E表示entry,实体
R表示relationship,关系
一个实体转换为数据库中的一个表
关系描述二个实体之间关系规则,包括
一对一
一对多
多对多
关系转换为数据库表中的一个列,
早关系型数据库中一行就是一个对象
- 三范式
第一范式, 1NF,列 不可拆分,属性不能拆分了
第二范式, 2NF,唯一标识,属性唯一找到对象,即主键
第三范式, 3NF,引用主键,
说明,后一个范式,都是在前一个范式基础上建立的
- 数据完整性
一个数据就是一个完整的业务单元,
字段类型:
数字,int,decimal(5,2) 5位数其中2位小数
字符串,char,varchar(var变量,存储字符可变), text(大文本)
日期,datatime
布尔:bit
约束
主键约束primary key
非 空约束 not NULL
唯一约束 unique
默认default
外延约束 foreign key
- 连接
CMD
1 >d:
2>cd D:\mysql\mysql-5.7.20-winx64\bin
3>mysql –u root –p
4 >123
5>show databases;
完成打开数据库
6.远程连接
一般在公司开发中,可能会将数据库统一搭建在一台服务器上,所有开发人员共用一个数据库,而不是在自己的电脑中配置一个数据库
运行命令
mysql -hip地址 –u root -p
-h后面写要连接的主机ip地址
-u后面写连接的用户名
-p回车后写密码
数据库操作
>创建数据库
create database 数据库名 charset = utf8
>删除数据库
drop database 数据库名
>切换数据库
use 数据库名
>查看当前选择的数据库
select database();
>查看数据库
show databases;
表的操作
>查看当前数据库中所有表
show tables;
>创建表
Auto_increment表示自动增加
create table 表名(列以及类型)
e.g
Create table students(id int auto_increment primary key,
Sname varchar (10) not null )
>修改表
alter table 表名 add|chang|drop 列名 类型
e.g
alter table students add birthday datatime;
>删除表
drop table 表名;
>更改表名称
rename table 原表名 to 新表名
>查看表的创建语句
show create table ‘表名’
数据操作
>查询
Select * from 表名
>增加
全列插入:insert into 表名 values(。。。)
e.g
insert into aa values(2,'cao2',1,22,23);
缺省插入:insert into 表名(列1,列2) values(值1,值2);
e.g
insert into aa(name) values(’chu4’);
同时插入多条数据:insert into 表名 values(。。。),(。。。);
e.g
insert into aa values(5,’chu4’,0),(6,’chu5’,1);
或 insert into 表名 (列1,) values(值1 )
e.g
insert into aa(id,name,asd) values(5,’chu4’,0),(6,’chu5’,1);
主键列是自动增加,但是全列插入时需要占位,通常使用0,
插入成功后以实际数据为准。
>修改
update 表名 set 列1= 值1 where 条件
update aa set name=’chu9’where id=6
>删除
delete from 表名 where 条件
>逻辑删除,本质就是修改操作update
Alter table students add isdelete bit default 0;
如果需要删除
update students isdelete =1 whre …
备份与恢复
数据备份
>进入超级管理员
sudo –s
>进入MySQL库目录
cd/var/lib/mysql
>运行MySQLdump 命令
Mysqldump –uroot –p 数据库名>~/desktop/备份文件.sql
数据恢复
连接MySQL,创建数据库
退出连接,执行如下命令
Mysql –uroot –p 数据库名 <~/desktop/备份文件.sql
7 命令
>具体表内容
desc 表名;
8 查询的基本语法
select * from 表名;
from 关键字后面写表名,表示数据来源于是这张表名。
select 后面写表中的列名,如果是* 表示在结果中显示表中所有列
在select后面的列名部分,如果使用as 为列起别名,这个别名出现在结果集中
如果要查询多个列,之间使用逗号分隔。
>消除重复行
在select后面列前使用distinct 可以消除重复行
Select distinct a2 from aa;
9条件
使用where子句对表中的数据筛选,结果为true的行为会出现在结果集中
Select * from 表名 where 条件
比较运算符
等于=
大于>
大于等于>=
小于<
小于等于<=
不等于!= 或 <>
逻辑运算符
and
or
not
模糊查询
like
%表示任意多个任意字符
_表示一个任意字符
e.g
查询姓楚
select * from students where name like ‘楚%’;
查询姓楚并且名字是一个字的学生
select * from students where name like ‘楚_’;
查询姓楚或格的学生
select * from students where name like ‘楚%’ or name like ‘%楚_’;
范围查询
in 表示在非连续的范围内
查询标号是1或3或8
Select * from students where id in(1,3,8);
Between … and … 表示在一个连续的范围内
查询学生是3至8的学生
Select * from students where id between 3 and 8;
空判断
注意:NULL 与 ‘’ 是不同的
判空 is null
查询没有填写地址的学生
Select * from studends where hometown is null;
判断非空
查询写了填写地址的学生
select * from studends where hometown is not null;
‘’空字符串
优先级
小括号,not,比较运算符,逻辑运算符
and比or先运算,如果同时出现并希望先算or,需要结合()使用
10分组
分组
按照字段分组,表示此字段相同的数据 会被放到一个组中
分组后,只能查询出相同数据列,对于有差异的数据列,无法出现在结果集中
可以对分组后的数据进行统计,做聚合运算
语法
select 列1,列2, 聚合 from 表名 group by 列1,列2….
查询男女总数
select gender as 性别,count(*) from studens group by gender;
select hometown as 家乡,count(*) from studens group by hometown;
分组后的数据筛选
语法
select 列1,列2, 聚合… from 表名 group by 列1,列2,列3… having 列1,… 聚合…
having 后面的条件运算符与where的相同
查询男生总人数
方案一
Select count(*)from students where gender=1
方案二
Select gender as 性别,count(*)from students group by gender having gender=1
对比 where与having
Where是from后面指定的表进行数据筛选,属于对原始数据的筛选
Having 是对group by 的结果进行筛选。
11聚合
为了快速得到统计数据,提供了5个聚合函数
Count(*)表示计算总行数,括号中写*与列名相同,结果是相同的
Max(列)表示求此列的最大值
Min(列)表示求此列的最小值
Sum(列)表示此列的和
Avg(列)表示此列的平均值
12排序
为了方便查看数据,可以对数据进行排序
select * from 表名 order by 列1 asc|desc , 列2 asc|desc,
将行数据按照列1进行排序,如果某些行列1的值相同,则按照2排序
默认从小到大排序
asc 从小到大排序,
desc从大到小排序
select * from aa order by a3 desc;
13分页
获取部分分行
当数据量过大时,在一页中查看数据是一件非常麻烦的事。
语法
Select * from 表名 limit start,count;
从start开始,获取count 条数据
Start从0开始
14
执行顺序比较重要
15实体与实体之间有三种对应关系
视图用于完成查询语句的封装
事务可以保证复杂的增删改操作有效
当数据巨大时,为了提高查询速度可以通过索引实现
foreign key(stuid) references key;
13连接查询
关键:找到表间的关系,当前的关系是
students表的id---scores表的stuid
subjects表的id---scores表的subid
则上面问题的答案是:
select students.sname,subjects.stitle,scores.score
from scores
inner join students on scores.stuid=students.id
inner join subjects on scores.subid=subjects.id;
结论:当需要对有关系的多张表进行查询时,需要使用连接join
连接查询
连接查询分类如下:
表A inner join 表B:表A与表B匹配的行会出现在结果中
表A left join 表B:表A与表B匹配的行会出现在结果中,外加表A中独有的数据,未对应的数据使用null填充
表A right join 表B:表A与表B匹配的行会出现在结果中,外加表B中独有的数据,未对应的数据使用null填充
在查询或条件中推荐使用“表名.列名”的语法
如果多个表中列名不重复可以省略“表名.”部分
如果表的名称太长,可以在表名后面使用' as 简写名'或' 简写名',为表起个临时的简写名称
14事务
当一个业务逻辑需要多个sql完成时,如果其中某条sql语句出错,则希望整个操作都退回
使用事务可以完成退回的功能,保证业务逻辑的正确性
事务四大特性(简称ACID)
原子性(Atomicity):事务中的全部操作在数据库中是不可分割的,要么全部完成,要么均不执行
一致性(Consistency):几个并行执行的事务,其执行结果必须与按某一顺序串行执行的结果相一致
隔离性(Isolation):事务的执行不受其他事务的干扰,事务执行的中间结果对其他事务必须是透明的
持久性(Durability):对于任意已提交事务,系统必须保证该事务对数据库的改变不被丢失,即使数据库出现故障
要求:表的类型必须是innodb或bdb类型,才可以对此表使用事务
查看表的创建语句
show create table students;
修改表的类型
alter table '表名' engine=innodb;
事务语句
开启begin;
提交commit;
回滚rollback;
示例1
步骤1:打开两个终端,连接mysql,使用同一个数据库,操作同一张表
终端1:
select * from students;
------------------------
终端2:
begin;
insert into students(sname) values('张飞');
步骤2
终端1:
select * from students;
步骤3
终端2:
commit;
------------------------
终端1:
select * from students;
示例2
步骤1:打开两个终端,连接mysql,使用同一个数据库,操作同一张表
终端1:
select * from students;
------------------------
终端2:
begin;
insert into students(sname) values('张飞');
步骤2
终端1:
select * from students;
步骤3
终端2:
rollback;
------------------------
终端1:
select * from students;
15
>性能分析
开启
set profiling=1;
查看时间
show profiles;