MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。
MySQL所使用的 SQL 语言是用于访问数据库
的最常用标准化语言。MySQL 软件采用了双授权政策,分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择 MySQL 作为网站数据库。
传统记录的缺点
1.0 不易保存
2.0 备份困难
3.0 查找不便
现代化手段—-文件
1.0 使用简单,列如python中的open可以打开文件。用read/write对文件进行读写,close关闭文件
2.0 对于数据量较大的数据,不能够很好地满足,而且性能较差
3.0 不易扩展
现代化手段—-数据库
1.0 持久化存储
2.0 读写速度极高
3.0 保证数据的有效性
4.0 对程序支持性非常好,容易扩展
数据库
数据库就是一种特殊的文件,其中存储着需要的数据
关系型数据库核心元素
1.0 数据行(记录)
2.0 数据列(字段)
3.0 数据表(数据行的集合)
4.0 数据库(数据表的集合)
关系数据库 RDBMS
Relational Database Management System
当前主要使用俩种类型的数据库:关系型数据库、非关系型数据库
所谓的关系型数据库RDBMS,是建立在关系模型基础上的数据库,
借助于集合代数等数学概念和方法来处理数据库中的数据
celery 最终实现效果就是异步任务以及定时任务
那我们先来看看celery底层是什么
broker、backend、生产者、消费者、还有celery来调度任务
消息队列 用来存储任务 以及调度任务
那我们也可以使用 queue来实现异步任务
关系型数据库的主要产品
oracle:在以前的大型 项目中使用,银行,电信等项目
mysql:web时代使用最广泛的关系型数据库
ms sql server:在微软的项目中使用
sqlite:轻量级数据库,主要应用在移动平台
数据完整性
1.0 一个数据库就是一个完整的业务单元,可以包含多张表,数据被存储在表中
2.0 在表中为了更加准确的存储数据,保证数据的正确有效,可以在创建表的时候,为表添加一些强制性的验证,包括数据字段的类型、约束
数据类型
可以通过查看帮助文档查阅所有支持的数据类型
使用数据类型的原则是:
够用就行,尽量使用取值范围小的,而不用大的,这样可以更多的节省存储空间
常用数据类型如下:
整数:int,bit
小数:decimal
字符串:varchar,char
日期时间: date, time, datetime
枚举类型(enum)
特别说明的类型如下:
decimal表示浮点数,如decimal(5,2)表示共存5位数,小数占2位
char表示固定长度的字符串,如char(3),如果填充’ab’时会补一个空格为’ab ‘
varchar表示可变长度的字符串,如varchar(3),填充’ab’时就会存储’ab’
字符串text表示存储大文本,当字符大于4000时推荐使用
对于图片、音频、视频等文件,不存储在数据库中,而是上传到某个服务器上,然后在表中存储这个文件的保存路径
MySQL操作
基本操作
登录mysql
mysql -u账户名 -p密码
退出mysql
quit exit ctrl+d
查看库
show databases;
进入库
use 库名
查看当前库
select database();
删除数据库
drop database 库名;
创建一个库
create database 库名 charset=utf8;
表的基本操作
查看数据库里的所有表
show tables;
###
查看表结构
desc 表名;
###
创建表
create table 表名()
给表添加字段
alter table 表名 add 字段名 类型
重命名表里的字段名
alter table 表名 change 旧名 新民 类型 约束
修改表里的字段类型及约束(不需要重命名)
alter table 表名 modify 字段名 新类型 约束
删除字段
alter table 表名 drop 字段名
删除表
drop table 表名
查看创建表的语句
show create table 表
修改表名
alter table 旧表名 rename to 新表名
类型
int 整形
primary key
auto_increment
not null
varchar(20)
decimal(5,3)
enum("男","女","妖")
datetime
约束
primary key 主键
auto_increment 自增
not null 非空
foreign key 外键
unique 唯一
default 默认
unsigned 无符号约束
表的增删改查
查
查询表的所有数据
select * from 表名;
查询指定的列
select 列名1,列名2 from 表名;
增
全列插入
insert into 表名 values(id int primary key auto_increment )
指定列插入
(插入的数据和列名对应)
insert into 表名(列名1,列名2) values ( )
指定列插入
insert into 表名( 列名) values ( ..........)
指定列一行一行插入
insert into 表名( 列名) values ( ..........)
改
修改表里的数据
update 表名 set 列名=新的值 where id = **;
删
delete from 表名 where id = ** ;
起别名
select 列名 as 新列名, 列名1 as 新列名1 from 表名
去重 单列
select distinct 列名 from 表名
外键
添加外键
1.0方式
create table goods(cate_id int unsigned, foreign key(cate_id) references 主表名(id) ) charset=utf8 ;
2.0
alter table 表名 add foreign key(子表列名) references 主表(主键)
删除外键方式
show create table 表名 查看 复制
+——-+—————————————————————————————-+
| emp_2 | CREATE TABLE emp_2
(
id
int(11) NOT NULL AUTO_INCREMENT,
name
varchar(20) DEFAULT NULL,
emp_sid
int(10) unsigned DEFAULT NULL,
PRIMARY KEY (id
),
KEY emp_2
(emp_sid
),
CONSTRAINT emp_2_ibfk_1
FOREIGN KEY (emp_sid
) REFERENCES emp
(sid
)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+——-+—————————————————————————————–+
1 row in set (0.00 sec)
alter table 表名 drop foreign key emp_2_ibfk_1;
数据的查
select * from 表名 where 条件
比较运算符
= < <= = !=
逻辑运算符
and 两个条件必须同时满足
or 两个条件满足一个就可以
not 相反的
模糊查询
% 匹配多个任意字符
_ 匹配任意一个字符
select * from 表名 where 要查找的列名 like'%或者_'
范围查询
非连续范围
in
select * from student where id in (3,6,9);
连续范围
between and
select * from student where id between 3 and 8;
判断空值
空 is null
select * from student where pingjia is null;
非空 is not null
select * from student where pingjia is not null;
条件优先级
由高到低
小括号 >not > 比较运算符> 逻辑运算符>
and 比or 优先 如果希望or比and优先 加 ( )
修改mysql的密码
update user set password= password('新密码') where user= 'root';
排序
order by
asc 升序
desc 降序
select * from 表名 where order by 要排序的列 asc;
select * from 表名 where order by 要排序的列 asc,同等条件下 high desc;
聚合函数
总数
select count(*) from 表名 ;
最大值
select max(查找的值) from 表名 ;
最小值
select min(查找的值) from 表名 where 条件;
和
select sum(查找的值) from 表名 where 条件;
平均值
select avg(查找的值) from 表名 where 条件;
select round(avg(查找的值),保留几位小数) from 表名 where 条件;
起别名
只能在本次查询使用
select 名称 as 起的名称 from 表名
消除重复行
distinct
select distinct 列名 from 表名
分组
group by 在查询结果后面进行分组
select 分组的名称 from 表名 group by 分组的名称;
计算最大的值
select 分组的名称,count(*) from 表名 group by 要分组的名称;
一组有多个的分组
select gender,group_concat(name) from students group by gender;
平均分组
select 要分组的名,round(avg(分组的名称),保留几位小数) from 表名 group by 要分组的名称;
条件查询分组
select 要分组的名,group_concat(name),round(avg(分组的名称),保留几位小数) from 表名 group by 要分组的名称 having round(avg(age),1) > 25;
子查询
select 查询条件 from 表名 where age > (select round(avg(age),2) from 表名)
select 分组的名称 from 表名 where cls_id in(select 分组名 from 表名);
分页
limit
start 代表从某个位置开始
count 代表从开始位置往后数几个
select * from students limit 4,2;
例1:查询前3行男生信息
select * from 表名 where limit 3,2 3往后2个(4,5)
0,2 每页显示2个,第一个页面
2,2 每页显示2个,第二个页面
4,2 每页显示2个,第三个页面
6,2 每页显示2个件 limit 0,3;
连接查询
内连接
select * from 表1 inner join表2 on 表一.字段名 = 表2.字段名
左连接
select * from 表1 left join 表2 on 表一.字段名 = 表2.字段名
右连接
select * from 表1 right join 表2 on 表一.字段名 = 表2.字段名
自连接/自关联
自连接查询就是把一张表模拟成左右两张表,然后进行连表查询。
自连接就是一种特殊的连接方式,连接的表还是本身这张表
自连接必须起别名
子查询
当一条SELECT 语句满足不了查询条件 这个时候就需要子查询
在一个select 语句中 嵌套一个select 语句 那么这个被嵌套的就叫子查询
主查询
第一条select 语句就是 主查询
子查询和主查询的关系
1、子查询是嵌套在主查询中的
2、子查询要么是子查询的条件 要么就是数据源
3、子查询必须是一条完整的select 语句
子查询的分类
1、标量子查询 返回的是一行一列
select * from 表名 where age > ( select avg(age) from 表名);
2、列级子查询 返回的是一列多行
select name from classes where id in (select cls_id from students);
3、行级子查询 返回的是一行多列
身高最高 年龄最大
select * from students where (height,age) = (select max(height),max(age) from students);
表设计
一对一
一对多 通过外键
多对多 需要建立第三张表进行多表联查
视图
1、一个select 查询数据后返回数据的结果集
是一张虚拟的表 会随着基本表的数据改变而变化
适用于 经常 查询的表
创建的语句
create view 视图名称 as (select 语句)
查看视图的语句
show tables;
使用视图的语句
select * from 视图名
删除视图
drop view 视图名
视图的作用
提高了重用性 像一个函数一样
让数据更加清晰 方便查询
提高了安全性 可以针对不同用户
对数据库重构 却不影响数据的执行
事务
是一个操作序列 要么不执行 要么一起执行
四大特性
一致性
原子性
持久性
隔离性
事物的开启
begin / start transaction
事物的提交
commit
事务的回滚
rollback
索引
目的 提高查询速率
创建索引
create index 索引名称 on 表名(字段名称)
删除索引
drop index 索引名称 on 表名
查看索引
show index from 表名
定义视图
建议以v_开头
create view 视图名称 as select查询语句
create view v_05A as select 语句
create view v_05A as select "05A" as "班级",s.name as "姓名",s.gender as "性别" from students as s where s.cid in (select c.id from class as c where c.name="05A");
查看视图
查看表会将所有的视图也列出来
show tables;
使用视图
视图的用途就是查询
select * from v_05A;
删除视图
drop view 视图名称;
drop view v_05A;
视图的作用
提高了重用性,就像一个函数
对数据库重构,却不影响程序的运行
提高了安全性能,可以对不同的用户
让数据更加清晰
索引的使用
查看索引
show index 索引名 from 表名;
创建索引
如果指定字段是字符串,需要指定长度,建议长度与定义字段时的长度一致
字段类型如果不是字符串,可以不填写长度部分
create index 索引名称 on 表名(字段名称(长度))
删除索引:
drop index 索引名称 on 表名;
索引demo
创建测试表testindex
create table test_index(title varchar(10));
查询
- 开启运行时间监测:
set profiling=1;
- 查找第1万条数据ha-99999
select * from test_index where title='ha-99999';
- 查看执行的时间:
show profiles;
- 为表title_index的title列创建索引:
create index title_index on test_index(title(10));
- 执行查询语句:
select * from test_index where title='ha-99999';
- 再次查看执行的时间
show profiles;
- Post link: https://yanxiang.wang/mysql%E5%AD%A6%E4%B9%A0/
- Copyright Notice: All articles in this blog are licensed under unless otherwise stated.