MySQL简介
一、数据库简介
1、概念:人类在进化的过程中,创造了数字、文字、符号等来进行数据的记录,但是承受着认知能力和创造能力的提升,数据量越来越大,对于数据的记录和准确查找,成为了一个重大难题。计算机诞生后,数据开始在计算机中存储并计算,并设计出了数据库系统。
数据库系统解决的问题:持久化存储、优化读写、保证数据的有效性
当前使用的数据库,主要分为两类:
文档型:如sqlite,就是一个文件,通过对文件的赋值完成数据库的复制
服务型:如mysql、postgre,数据存储在一个物理文件中,但是需要使用终端以tcp/ip协议连接,进行数据库 的读写操作
2、三范式
概念:经过研究和对使用中问题的总结,对于设计数据库提出了一些规范,这些规范被称为范式
范式:
第一范式(1NF):列不可拆分
第二范式(2NF):唯一标识
第三范式(3NF):引用主键
3、E-R模型
当前物理的数据库都是按照E-R模型进行设计的,E代表entry,实体,R代表relationship,关系
一个实体转换为数据库中的一个表
关系描述两个实体之间的对应规则,包括:一对一,一对多,多对多
关系转换为数据库表中的一个列*在关系型数据库中一行就是一个对象
4、主要操作
数据库的操作,包括创建、删除
表的操作,包括创建、修改、删除
数据的操作,包括增加、修改、删除、查询、简称crud
二、数据完整性
1、概念:一个数据库就是一个完整的业务单元,可以包含多张表,数据被存储在表中。在表中为了更加准确的存储数据,保证数据的正确有效,可以在创建表的时候,为表添加一些强制性的验证,包括数据字段的类型、约束
2、字段类型
数字:int,decimal decimal(5,2)表示一共包含五位数,小数包含2位
字符串:char,varchar,text
日期:datatime
布尔:bit
3、约束
主键:primary key 主键只能有一个
非空:not null
唯一:unique 可以有多个,物理上存储的结构是由主键维护的
默认:default
外键:foreign key
三、数据库基本操作
net start mysql:启动mysql服务,以管理员身份运行cmd
net stop mysql:关闭mysql服务,以管理员身份运行cmd
mysql –u root –p:启动mysql客户端
主键:可以保证数据的唯一性
基本命令:
连接数据库:mysql –u 用户名 –p 输入密码
退出登录(断开连接):quit或exit
查看版本(连接后可以执行):select version();
显示当前时间(连接后可以执行):select now();
远程连接:mysql –h ip地址 –u 用户名 –p 输入密码
数据库操作命令
创建数据库:create database 数据库名 charset=utf8;
删除数据库:drop database 数据库名
切换数据库:use 数据名;
查看当前选择的数据库:select database();
表操作命令
查看数据库中所有表:show tables;
创建表:create table 表名(列及类型);
create table student(id int auto_increment primary key, name varchar(20) not null,age int not null,gender bit default 1,address varchar(20),isDelete bit default 0);
auto_increment:表示自增长
primary key:表示主键
not null:表示不为空
删除表:drop table 表名;
查看表结构:desc 表名;
查看建表语句:show create table 表名;
重命名表:rename table 原表名 to 新表名;
修改表:alter table 表名 add|change|drop 列名 类型;
数据操作命令
增:
1.全列插入:insert into 表名values(…)
insert into student values(0,”习大大”,66,1,”北京”,0);
说明:主键列是自动增长,但是在全列插入时需要占位,通常使用0,插入成功以后以实际数据为准。
2.缺省插入:insert into 表名(列1,列2,…) values(值1,值2,…);
3.同时插入多条数据:insert into 表名 values(…),(…),…(…);
删:delete from 表名 where 条件; 注意:没有条件是全部删除,慎用。
改:update 表名 set 列1 = 值1, 列2 = 值2… where 条件;
注意:没有条件是全部列都修改,慎用。
查:select * from 表名;
说明:查询表中的全部数据
查
基本语法:select * from 表名
from关键字后面是表名,表示数据来源于这张表
select后面写表中的列名,如果是*表示在结果集中显示表中的所有列
在select后面的列名部分,可以使用as为列名起别名,这个别名显示在结果集中
如果要查询多个列之间使用逗号分隔
消除重复行:在select后面列名前面使用distinct可以消除重复的行
条件查询:
1.语法:select * from 表名 where 条件;
2.比较运算符:=、>、<、>=、<=、!=或<>
select * from student where id > 2;
3.逻辑运算符:and、or、not
select * from student where id > 2 and gender=0;
4.模糊查询:like
%表示任意多个任意字符
_表示一个任意字符
5.范围查询:in
in:表示在一个非连续的范围内
between:表示在一个连续的范围内
select * from student where id in(4,6,8);
select * from student where id between 6 and 8;
6.空判断
insert into student(name,age) values(“特朗普”,70);
注意:null与””是不同的
判断空:is null 判断非空:is not null
select * from student where address is null;
7.优先级
小括号,not,比较远算符,逻辑运算符
and比or优先级高,如果同时出现并希望先选or,需要结合()来使用
聚合:为了快速得到统计数据,提供了5个聚合函数
1.count(*) 表示计算总行数,括号中可以写*和列名
需求:查询学生总数
示例:select count(*|id) from student;
2.max(列) 表示求此列的最大值
需求:查询女生的编号最大值
示例:select max(id) from student where gender=0;
3.min(列) 表示求此列的最小值
需求:查询女生的编号最小值
示例:select min(id) from student where gender=0;
4.sum(列) 表示求此列的和
需求:查询所有学生的年龄和
示例:select sum(age) from student;
5.avg(列) 表示求此列的平均值
需求:查询所有学生年龄的平均值
示例:select avg(age) from student;
分组:按照字段分组,表示此字段相同的数据会被放到一个集合中。分组后只能查询出相同的数据列,对于有差异的数据列无法显示在结果集中。可以对分组后的数据进行统计,做聚合运算
语法:select 列1,列2,聚合…from 表名 group by 列1,列2,…
需求:查询男女生总数
示例:select gender,count(*) from student group by gender,age;
分组后的数据筛选:select 列1,列2,聚合…from 表名 group by 列1,列2,… having 列1,列2,列3,…聚合…
示例:select gender,count(*) from student group by gender having gender;
where与having的区别:
where是对from后面指定的表进行筛选,属于对原始数据的筛选
having是对group by的结果进行筛选
排序:
语法:select * from 表名 order by 列1 asc|desc,列2 asc|desc,…
说明:1.将数据按照列1进行排序,如果某些列1的值相同,则按照列2进行排序
2.默认按照从小到大的顺序排序
3.asc:升序 desc:降序
需求:将没有被删除的数据按年龄排序
示例:select * from student where isDelete=0 order by age asc,id desc;
分页:
语法:select * from 表名 limit start,count;
说明:start索引从0开始
示例:select * from student where gender=1 limit 0,3;
关联:
建表语句:create table class(id int auto_increment primary key,name varchar(20) not null,stuNum int not null);
create table students(id int auto_increment primary key, name varchar(20) not null,gender bit default 1,classid int not null,foreign key(classid) references class(id));
插入一些数据:
insert into class values(0,’python01’,55),(0,’python02’,50),
(0,’python03’,60),(0,’python04’,80);
insert into students values(0,’tom’,1,1);
insert into students values(0,’lilei’,1,10);
insert into students values(0,’jack’,1,2);
select * from students;
关联查询:
select students.name,class.name from class inner join students on class.id =students.classid;
分类:
1.表A inner join 表B
表A与表B匹配的行将会出现在结果集中
2.表A left join 表B
表A与表B匹配的行会出现在结果集中,外加表A中独有的数据,未对应的数据使用null填充
3.表A right join 表B
表A与表B匹配的行会出现在结果集中,外加表B中独有的数据,未对应的数据使用null填充