Mysql是一个关系型数据库管理系统,关系数据库是表组成的。sql语句方便在一个表以及多个表之前做非常复杂的数据查询。非关系型数据库是以键值的方式存储的。
mysql特点是开源 免费 使用范围广,跨平台,提供了多种语言调用的API,是学习互联网公司数据库的首选。
数据库操作
创建数据库:
create database python_test_01 charset=utf8;
删除数据库:
drop database python_test_01;
选择数据库:
use python_test_01;
mysql数据类型
mysql支持多种类型,大郅可以分为三类:数值,日期/时间和字符串(字符)类型
-
整形
mysql数据类型 含义(有符号) tinyint(m) 一个字节 范围(-128~127) smallint(m) 2个字节 范围(-32768~32767) mediumint(m) 3个字节 int(m) 4个字节 bigint(m) 8个字节 -
浮点型(float double)
mysql数据类型 含义 float(m,d) 单精度浮点型 m总个数,d小数位 double(m,d) 双精度浮点型 m总个数,d小数位 -
定点数
浮点型在数据库中存放的是近似值,而定点类型在数据库中存放的是精确值
decimal(m,d)参数 m <65 是总个数,d<30 且d<m是小数位
utf-8
一个英文字符等于一个字节,一个中文三个字节
mysql数据类型 | 含义 |
---|---|
char(n) | 固定长度,最多255个字符 |
varchar(n) | 固定长度,最多65535个字符 |
tinytext | 可变长度 |
text | 可变长度 |
mediumtext | 可变长度 |
longtext | 可变长度 |
char和varchar:
- char(n)若存入字符数小于n,则以空格不起,查询时再将空格去掉,所以char类型存储的字符串末尾时不能有空格
- char(n)固定长度,char(4)不管是存入几个字符,都将占用4个字节,varchar是存入的实际字符数+1个字节
- char类型的字符串检索速度要比varchar类型的快
日期时间类型
mysql数据类型 | 含义 |
---|---|
date | 日期'2021-4--7' |
time | 时间'15:25:13' |
datetime | 日期时间'2021-4-7 15:26:52' |
timestamp | 自动存储记录修改时间 |
若定义一个字段为timestamp,这个字段里的时间数据会随其他字段修改的时候自动刷新,所以这个数据类型的字段可以存放这条记录最后被修改的时间
数据类型的属性
mysql关键字 | 含义 |
---|---|
NULL | 数据列可以包含NULL值 |
not null | 数据列不允许包含null值 |
default | 默认值 |
primary key | 主键 |
auto_increment | 自动递增 |
unsigned | 无符号 |
character set name | 指定一个字符集 |
数据库操作
查看数据库下有哪些表
use 数据库名;
查看当前数据库下有哪些表
show tables;
查看表结构
desc 表名;
插入数据
insert into 表名 values()
insert into classes values(0,'学前班')
查询数据
select * from 表名;(查询所有记录)
select id ,name from 表名(查询指定字段)
主键相关操作
删除主键
-- alter table test01 change id id int
-- alter table test01 drop primary key
创建主键及复合主键
create table test(
id int auto_increment not null,
name varchar(30),
primary key(id,name)
)
创建表后加主键
create table test02(
id int,
name varchar(30)
);
alter table test02 add primary key(id);
alter table test02 change id id int auto_increment;
查询
使用as给字段起别名(给长的字段取别名)
select id as c from student;
可以通过as给表起别名(用在连表查询里,表名比较长的情况)
select stu.id,stu.name from students as stu;
在select后面列前使用distinct可以消除重复的行
select distinct name from student;
我们想查找一下名字为张三的学生?
select * from students where name='张三';
条件查询
使用where对表中的数据筛选,结果为true的行会出现在结果集中
where后面支持多种运算符,进行条件的处理
比较运算符
逻辑运算符
模糊查询
范围查询
空判断
语法格式
select 字段1,字段2 from 表名 where 条件;
select id ,name from class where name ='小哈';
比较运算符
例1:查询编号大于3的学生
select id,name,age from student where id>3;
例2:查询编号不大于4的学生
select id , name from student where id <=4;
例3:查询姓名不是‘'小儿'的学生
select * from students where name !='小儿';
例4:查询没删除的学生
select * from students where id_Delete =0;
逻辑运算符
and or not
例5:查询编号大于3的女同学
select * from student where id >3 and gender ='女';
例6:查询编号小于4或没被删除的学生
select * from students where id<4 or is_delete -0;
例7:查询年龄不为空的学生
select * from students where age is not null;
范围查询
between .....and (相当于 <= 和>=)
查询年龄在20岁到30岁之间的学生
select name from students where age between 20 and 30
模糊查询
like
%表示任意多个任意字符
例7:查询姓张的学生
select * from student where name like '张%';
例8;查询姓张,名是一个字的学生;
select * from student where name like '张_';
例9:查询姓王或柳的学生
select name from students where name like '王%' or name like '柳%';
范围查询
in 表示在一个非连续的范围内
例10:查询编号是1或3或8的学生
select * from students where id in (1,3,8);
例11:查询编号为3至8的学生
select * from students where id between 3 and 8;
例12:查询编号为3至8的男生
select * from students where (id between 3 and 8) and gender =1;
优先级
优先级由高到低的顺序为:小括号,not,比较运算符,逻辑运算符, and比or先运算。如果同时出现并希望先算or,需要结合()使用。
修改删除数据
修改数据语法结构
update 表名 set 字段名 =’值', 字段名=‘值’ where 条件;
如果不加where全部更新,更新时一定要加where条件;
删除数据语法结构
delete from 表名; 删除全部数据
删除名字是一年级的班
delete from class where name='一年级';
根据条件删除
delete from students where id =1;
排序
倒序
(asc(正序),desc(倒序))
select * from sutdents order by age desc;
聚合函数
为了快速得到统计数据,经常会用到如下5个聚合函数
总数
count(*)表示计算总数
例1:查询学生总数
select count(id) from students;
最大值
max(*)
查询女生编号的最大值
select max(id) from students where gender =2;
最小值
min(*)
查询编号最小
select min(id) from students;
求和
sum() 表示求例的总和
select sum(id) from students;
平均值
avg()
例:求男生平均编号值
select avt(id) from students;
分组
group by
将查询结果按照一个或多个字段进行分组,字段值相同的为一组
group by + having
group by 可以加where条件,where条件剥削加以 group by前面
having作用和where 一样,但having只能用于group by
连接查询
mysql支持三种类型的连接查询
内连接查询:查询的结果为两个表匹配到的数据(inner join)
select 字段 from 表名 inner join 表名2 on 关联条件
select * from teacher as a inner join students as b on a.id=b.id;
右连接查询(right join:右表持有的数,对于左表中不存在数据使用null填充
左连接查询(left join ):左表持有的数据,对于右表中不存在的数据使用null填充
事务
事务四大特性(ACID)
- 原子性(atomicity)
- 一致性(consistency)
- 隔离性(isolation)
- 持久性(durabilty)
个很好的事务处理系统,必须具备这些标准特性:
原子性(atomicity)
一个事务必须被视为一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚,对于一个事务来说,不可能只执行其中的一部分操作,这就是事务的原子性
一致性(consistency)
数据库总是从一个一致性的状态转换到另一个一致性的状态。(在前面的例子中,一致性确保了,即使在执行第三、四条语句之间时系统崩溃,支票账户中也不会损失200美元,因为事务最终没有提交,所以事务中所做的修改也不会保存到数据库中。)
隔离性(isolation)
通常来说,一个事务所做的修改在最终提交以前,对其他事务是不可见的。(在前面的例子中,当执行完第三条语句、第四条语句还未开始时,此时有另外的一个账户汇总程序开始运行,则其看到支票帐户的余额并没有被减去200美元。)
持久性(durability)
一旦事务提交,则其所做的修改会永久保存到数据库。(此时即使系统崩溃,修改的数据也不会丢失。)
索引
当数据库中数据量很大时,查找数据会变得很缓慢
优化方案:索引
索引是一种特殊的文件,它们包含着对数据表里所有记录的引用指针。更通俗的说,数据库索引好比是一本书的目类,能加快数据库的查询速度。
索引的目的在于提高查询速度,可以类比字典,如果要查'mysql'这个词,我们肯定要定位到m字母,再找剩下的ysql.
它们的原理都是一样的,通过不断地缩小想要或地数据地范围来筛选处最终想要地结果,同时把随机地事件变成顺序地事件
要注意的是,建立太多的索引将会影响更新和插入的速度,因为它需要同样更新每个索引文件。对于一个经常需要更新和插入的表格,就没有必要为一个很少使用的where字句单独立索引会占用磁盘空间建立索引了,对于比较小的表,排序的开销不会很大,也没有必要建立另外的索引。
主键,唯一,普通,联合
三范式
- 第一范式(确保每列保持原子性)
- 第二范式(确保没列都和主键相关)
- 第三范式(确保每列都和主键列直接相关,而不是间接相关)