数据库概念

数据库,简而言之可视为电子化的文件柜——存储电子文件的处所,用户可以对文件中的数据运行新增、截取、更新、删除等操作。

​ 所谓“数据库”系以一定方式储存在一起、能予多个用户共享、具有尽可能小的冗余度、与应用程序彼此独立的数据集合

数据库管理系统,是为管理数据库而设计的电脑软件系统,一般具有存储、截图、安全保障、备份等基础功能

现在我们通常使用关系型数据库管理系统来存储和管理数据,所谓的关系型数据库,是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据。

展示出来的界面:

实际存储数据内容:

  • 表头: 每一列的名称
  • 列: 具有相同数据类型的数据的集合
  • 行:每一行用来描述某条记录的具体信息
  • 值:行的具体信息,每个值必须与该列的数据类型相同
  • 键:特殊的列,这一列的值在当前列中具有唯一性

关系型数据库的特点

  • 数据库以表格的形式出现
  • 每行为各种记录名称
  • 每列位记录名称所对应的数据域
  • 许多的行和列组成一张表单
  • 若干的表单组成 database 数据库

MySQL数据库

MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司。MySQL 是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。

  • MySQL 是开源的,所以你不需要支付额外的费用。
  • MySQL 支持大型的数据库。可以处理拥有上千万条记录的大型数据库。
  • MySQL 使用标准的 SQL 数据语言形式。
  • MySQL 可以运行于多个系统上,并且支持多种语言。这些编程语言包括 C、C++、Python、Java、Perl、PHP、Eiffel、Ruby 和 Tcl 等。
  • MySQL 对PHP有很好的支持,PHP 是目前最流行的 Web 开发语言。
  • MySQL 支持大型数据库,支持 5000 万条记录的数据仓库,32 位系统表文件最大可支持 4GB,64 位系统支持最大的表文件为8TB。
  • MySQL 是可以定制的,采用了 GPL 协议,你可以修改源码来开发自己的 MySQL 系统

MySQL的安装

https://dev.mysql.com/downloads/mysql/ 官网提供了所有平台的MySQL版本下载,下载对应版本的MySQL,下载完成后根据引导安装即可。

在windows下跟随引导安装mysql完成后,安装过程中会提示设置账号和密码,这里直接将账号和密码设置为root /root ,完成安装,想要在cmd中进入msyql的命令行,必须将mysql添加到系统环境变量Path路径中。

C:\Program Files\MySQL\MySQL Server 5.6\bin

在命令行中执行mysql -uroot -proot,进入到mysql的命令行

下载并安装navicat进行数据库管理

创建、删除数据库

create database 数据库名;

drop database 数据库名;

选择数据库

use 数据库名

接下来你的所有操作都会在这个数据库中执行

MySQL数据类型

在mysql中支持多种类型的数据结构,大致可以分为三类: 数值、时间和字符串。

  • 数值类型
类型 大小 范围(有符号) 范围(无符号) 用途
TINYINT 1 字节 (-128,127) (0,255) 小整数值
SMALLINT 2 字节 (-32 768,32 767) (0,65 535) 大整数值
MEDIUMINT 3 字节 (-8 388 608,8 388 607) (0,16 777 215) 大整数值
INT或INTEGER 4 字节 (-2 147 483 648,2 147 483 647) (0,4 294 967 295) 大整数值
BIGINT 8 字节 (-9,223,372,036,854,775,808,9 223 372 036 854 775 807) (0,18 446 744 073 709 551 615) 极大整数值
FLOAT 4 字节 (-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) 0,(1.175 494 351 E-38,3.402 823 466 E+38) 单精度 浮点数值
DOUBLE 8 字节 (-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 双精度 浮点数值
DECIMAL 对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2 依赖于M和D的值 依赖于M和D的值 小数值
  • 时间类型
类型 大小 (字节) 范围 格式 用途
DATE 3 1000-01-01/9999-12-31 YYYY-MM-DD 日期值
TIME 3 '-838:59:59'/'838:59:59' HH:MM:SS 时间值或持续时间
YEAR 1 1901/2155 YYYY 年份值
DATETIME 8 1000-01-01 00:00:00/9999-12-31 23:59:59 YYYY-MM-DD HH:MM:SS 混合日期和时间值
TIMESTAMP 4 1970-01-01 00:00:00/2038结束时间是第 2147483647 秒,北京时间 2038-1-19 11:14:07,格林尼治时间 2038年1月19日 凌晨 03:14:07 YYYYMMDD HHMMSS 混合日期和时间值,时间戳
  • 字符串类型
类型 大小 用途
CHAR 0-255字节 定长字符串
VARCHAR 0-65535 字节 变长字符串
TINYBLOB 0-255字节 不超过 255 个字符的二进制字符串
TINYTEXT 0-255字节 短文本字符串
BLOB 0-65 535字节 二进制形式的长文本数据
TEXT 0-65 535字节 长文本数据
MEDIUMBLOB 0-16 777 215字节 二进制形式的中等长度文本数据
MEDIUMTEXT 0-16 777 215字节 中等长度文本数据
LONGBLOB 0-4 294 967 295字节 二进制形式的极大文本数据
LONGTEXT 0-4 294 967 295字节 极大文本数据

CHAR 和 VARCHAR 的区别:

定义一个char[10]和varchar[10],如果存进去的是‘abcd’,那么char所占的长度依然为10,除了字符‘abcd’外,后面跟六个空格,而varchar就立马把长度变为4了,取数据的时候,char类型的要用trim()去掉多余的空格,而varchar是不需要的。

MySQL创建数据表

create table 表名 (字段名称,字段类型(长度));

#int后面不写长度,会给默认长度11
#一般来说 我们会把主键设置为 自动递增,每次增加一行数据,主键+1
create table school(
	school_id int auto_increment,
	school_code int(5),
	school_name varchar(100),
	school_addr varchar(100),
	insert_time datetime,
	primary key(school_id)
);

删除数据表

drop table 表名

drop table school;

插入数据

insert into table_name (field1,field2,....)  values (value1,value2,....);
insert into table_name values (value1,value2,....);
#类似python中的位置参数和 关键字参数
insert into school(school_code,school_name,school_addr,insert_time)
values
(11111,"北京大学","中国北京",now());
insert into school(school_code,school_name,school_addr,insert_time)
values
(22222,"清华大学","中国北京",now());
insert into school(school_code,school_name,school_addr,insert_time)
values
(33333,"北京科技大学","中国北京",now());
insert into school
values
(4,44444,"哈佛大学","美国",now());
insert into school
values
(0,55555,"哈尔滨佛学院","哈尔滨",now());

查询数据

select 数据名称1,数据名称2
from 表名
where 条件
limit 查询条数
offset 查询偏移

# 查询全部
select * from school;

# 查询全部的学校编号和名字
select school_code,school_name from school;

# 查询来自中国北京的学校编码和名字
select school_code,school_name from school where school_addr = "中国北京";

# 查询来自中国北京的学校编码和名字,只显示2条
select school_code,school_name from school where school_addr = "中国北京" limit 2;

# 查询来自中国北京的学校编码和名称,从第二条开始查询,只显示1条
select school_code,school_name from school where school_addr = "中国北京" limit 2 offset 2;

Where 语句

where 语句类似python语言中的if条件,检索出满足条件的数据,同时可以使用and or逻辑语句来查询

select school_code,school_name from school where school_addr = "中国北京" and school_name = "北京大学";

select school_code,school_name from school where school_addr = "中国北京" or school_addr = "美国";

在where语句中还可以使用操作符来进行匹配

操作符 描述 实例
= 等号,检测两个值是否相等,如果相等返回true (A = B) 返回false。
<>, != 不等于,检测两个值是否相等,如果不相等返回true (A != B) 返回 true。
> 大于号,检测左边的值是否大于右边的值, 如果左边的值大于右边的值返回true (A > B) 返回false。
< 小于号,检测左边的值是否小于右边的值, 如果左边的值小于右边的值返回true (A < B) 返回 true。
>= 大于等于号,检测左边的值是否大于或等于右边的值, 如果左边的值大于或等于右边的值返回true (A >= B) 返回false。
<= 小于等于号,检测左边的值是否小于于或等于右边的值, 如果左边的值小于或等于右边的值返回true (A <= B) 返回 true
select school_code,school_name from school where school_id >= 3;

like语句

# where 条件中还可以用like语句来进行模糊匹配
# 查询出名字包含北京的大学信息
# like通常和%一起使用,但是如果不使用%那么他的效果就和 =号一样
select school_code,school_name from school where school_name like "北京%";

更新数据

#将查询出来的结果中的字段进行更新,可以同时更新多个字段

update table_name set field1=new-value1,field2=new-value2
where 条件

update school set school_code=12345,school_addr='中国首都北京' where school_name = "北京大学"; 

删除数据

#将查询出来的结果全部删除

delete from 表名 where 条件

delete from school where school_addr = "美国";

排序

# 将查询出来的结果排序
select 字段1,字段2 from 表1,表2
order by 字段1,字段2

select * from school order by school_code;

select * from school order by school_code desc;

select * from school order by school_code,school_name;

select * from school order by school_code,school_name desc;

分组

select 字段 from 表
where 条件
group by 字段;

select * from school
group by school_addr;

#计算出现的次数
select *,count(*) from school
group by school_addr;

UNION 操作符

union操作符用于连接两个以上的select语句的结果组合到一个结果集合中

select 字段名称1,字段名称2 from 表名
where 查询条件
union [all]
select 字段名称1,字段名称2 from 表名
where 查询条件
create table school(
	id int auto_increment,
	school_code int(5),
	school_name varchar(100),
	school_addr varchar(100),
	primary key(id)
);

insert into school(school_code,school_name,school_addr)
values
(11111,"北京大学","中国北京"),
(22222,"清华大学","中国北京"),
(33333,"北京科技大学","中国北京"),
(44444,"哈佛大学","美国"),
(55555,"哈尔滨佛学院","中国哈尔滨");

create table student(
	id int auto_increment,
	student_name varchar(100),
	school_name varchar(100),
	primary key(id)
);

insert into student(student_name,school_name)
values
("张一","福州大学"),
("李二","山东大学"),
("苏四","北京大学"),
("钱五","清华大学");

# union合并两个结果集,删除重复的数据
select school_name from school
union
select school_name from student;

select school_name,school_addr from school
union
select student_name,school_name from student;

#union合并两个结果集,不删除重复的数据
select school_name from school
union all
select school_name from student;

聚合函数

用于对一组值进行统计,并且返回唯一值,这些函数被称为聚合函数
count()	统计记录的条数
sum()	求和函数,求出表中某个字段所有值的总和
avg()	求出某个字段,所有值的平均数
max()	求出某个字段的最大值
min()	求出某个字段的最小值

create table student(
	id int auto_increment,
	student_id varchar(100),
	student_name varchar(100),.
	student_grade int,
	primary key(id)
);

insert into student(student_id,student_name,student_grade)
values
(10101,"小明",65),
(10101,"小华",28),
(10101,"小李",98),
(10101,"小花",25),
(10101,"小琴",98),
(10101,"小马",100),
(10101,"小宋",65);

select count(student_grade) from student;
select sum(student_grade) from student;
select avg(student_grade) from student;
select max(student_grade) from student;
select min(student_grade) from student;

连接查询

SQL中的常用连接查询,交叉连接、内连接、外连接

交叉连接:从一张表表中循环取出每一条记录,每条记录都去另外一张表进行匹配,最终形成的结果叫做笛卡尔积se

select 字段1,字段2 from 表1 cross join 表2
select 字段1,字段2 from 表1,表2,

create table uniforms(
	id int auto_increment,
	model varchar(100),
	primary key(id)
);

insert into uniforms(model)
values
('a'),
('b'),
('c');

create table student(
	id int auto_increment,
	student_name varchar(100),
	school_name varchar(100),
	primary key(id)
);

insert into student(student_name,school_name)
values
("张一","福州大学"),
("李二","山东大学"),
("苏四","北京大学"),
("钱五","清华大学");

select * from student,uniforms;
select * from student cross join uniforms;
select mode from student cross join uniforms;

内连接: 组合两个表的记录,返回关联字段相符的记录,也就是返回两个表的交集部分

1568296973205
create table student(
	id int auto_increment,
	student_name varchar(100),
	school_name varchar(100),
	primary key(id)
);

insert into student(student_name,school_name)
values
("张一","福州大学"),
("李二","山东大学"),
("苏四","北京大学"),
("钱五","清华大学");


create table student_grade(
	id int auto_increment,
	student_name varchar(100),.
	grade int,
	primary key(id)
);

insert into student_grade(student_name,grade)
values
("张一",65),
("李二",28),
("孟五",65),
("钱六",28);

select * from student join student_grade on student.student_name = student_grade.student_name;

select student.student_name,student.school_name,student_grade.grade from student join student_grade on student.student_name = student_grade.student_name;

外连接:

分为 左连接 、右连接

有null
select * from student left join student_grade on student.student_name = student_grade.student_name;

select * from student_grade left join student on student.student_name = student_grade.student_name;

有null
select * from student_grade right join student on student.student_name = student_grade.student_name;

select * from student right join student_grade on student.student_name = student_grade.student_name;

9856

一对一关系

两个表,第一个表中的某一行与第二个表中的一行相关,同时第二个表中的某一行吗,也只与第一个表中的一行相关,这两个表为1对1关系。

  • 一个表包含了太多的数据列,于是分离成两个表
  • 为了划分不同的安全级别
  • 常用的数据组成一个表
学校表 学校资产表
id 学校编码 学校名称 学校地址 id 学校表id(外键) 学校资产
1 11111 北京大学 中国北京 1 1 500
2 22222 清华大学 中国北京 2 2 400
3 33333 北京科技大学 中国北京 3 3 300
4 44444 哈佛大学 美国 4 4 500
5 55555 哈尔滨佛学院 中国哈尔滨 5 5 5
create table school(
	id int auto_increment,
	school_code int(5),
	school_name varchar(100),
	school_addr varchar(100),
	primary key(id)
);
insert into school(school_code,school_name,school_addr)
values
(11111,"北京大学","中国北京"),
(22222,"清华大学","中国北京"),
(33333,"北京科技大学","中国北京"),
(44444,"哈佛大学","美国"),
(55555,"哈尔滨佛学院","中国哈尔滨");

# unique表示唯一性
create table assets(
	id int auto_increment,
	assets_num int,
	school_id int unique,
    primary key(id),
	constraint fk_school foreign key(school_id) references school(id)
);

insert into assets(assets_num,school_id)
values
(500,1),
(400,2),
(300,3),
(500,4),
(5,5);

select * from school a left join assets b on a.id = b.school_id;

一对多关系

第一张表的一行可以与第二张表的多行相对应

一对多关系是最常见的关系类型

学校表
id 学校编码 学校名称 学校地址
1 11111 北京大学 中国北京
2 22222 清华大学 中国北京
3 33333 北京科技大学 中国北京
4 44444 哈佛大学 美国
5 55555 哈尔滨佛学院 中国哈尔滨
老师表
id 老师编码 老师名字 老师所属学校id
1 101 李白 1
2 102 杜甫 1
3 103 白居易 1
4 201 孟浩然 2
5 202 李贺 2
6 301 苏轼 3
create table teacher(
	id int auto_increment,
	teacher_code int,
	teacher_name varchar(100),
	school_id int,
	primary key(id),
	constraint fk_teacher foreign key(school_id) references school(id)
);

insert into teacher(teacher_code,teacher_name,school_id)
values
(101,"李白",1),
(102,"杜甫",1),
(103,"白居易",1),
(104,"孟浩然",2),
(202,"李贺",2),
(301,"苏轼",3);

多对多关系

多对多的关系是无法直接在两张表中表示关系的,需要借助第三张表

老师表 老师-学生表
id 老师编码 老师名字 老师所属学校id id 老师id 学生id
1 101 李白 1 1 1 1
2 102 杜甫 1 2 1 2
3 103 白居易 1 3 1 3
4 201 孟浩然 2 4 1 4
5 202 李贺 2 5 1 5
6 301 苏轼 3 6 1 6
7 2 7
学生表 8 2 1
id 学生学号 学生名字 9 2 2
1 10101 小明 10 2 3
2 10102 小华 11 3 4
3 10103 小李 12 3 5
4 10104 小花 13 3 6
5 10105 小琴 14 3 7
6 10106 小马 15 3 1
7 10107 小宋 16 3 2
create table teacher(
	id int auto_increment,
	teacher_code int,
	teacher_name varchar(100),
	primary key(id)
);

insert into teacher(teacher_code,teacher_name)
values
(101,"李白"),
(102,"杜甫"),
(103,"白居易"),
(104,"孟浩然"),
(202,"李贺"),
(301,"苏轼");

create table student(
	id int auto_increment,
	student_id int,
	student_name varchar(100),
	primary key(id)
);

insert into student(student_id,student_name)
values
(10101,"小明"),
(10101,"小华"),
(10101,"小李"),
(10101,"小花"),
(10101,"小琴"),
(10101,"小马"),
(10101,"小宋");

create table tearcher2student(
id int auto_increment,
teacher_id int,
student_id int,
constraint fk_student2 foreign key(student_id) references student(id),
constraint fk_tearcher2 foreign key(teacher_id) references teacher(id),
primary key(id)
);

insert into tearcher2student(teacher_id,student_id)
values
(1,1),
(1,2),
(1,3),
(1,4),
(1,5),
(1,6),
(1,7),
(2,1),
(2,2),
(2,3),
(2,4),
(3,5),
(3,6),
(3,7);