一、数据库介绍
1.1、数据库概念
数据库是按照数据结构来组织、存储和管理数据的仓库。是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合。
数据库软件还提供了高效的增加、删除、修改、查询数据的解决方案
数据库:存放数据的仓库
数据库(Database,简称DB)是长期存储在计算机内部有结构的、大量的、共享的数据集合
-
长期存储:持久化(不删除,永久存储)
-
有结构:
类型:数据库不仅可以存放数据,而且存放的数据环视有类型的
关系:存储数据与数据之间的关系 -
大量:大多数据库都是文件系统的,也就是说存储在数据库中的数据实际上就是存储在磁盘的文件中(存储大量的数据)
-
共享:多个应用程序可以通过数据库实现数据的共享
1.2、为什么要使用数据库
使用数据库的原因多种多样,但主要可以归结为以下几个方面:首先,数据库提供了一个使用数据库的原因多种多样,但主要可以归结为以下几个方面:首先,数据库提供了一个结构化的方式来存储和管理大量数据。例如,如果你正在创建一个电影信息检索的网站,需要查询演员信息和电影信息,这时候如果所有的数据都存在普通文件中,那么检索的效率将会非常低。而如果使用数据库,就可以有效地解决这个问题。其次,数据库可以帮助用户快速且方便地存取和检索数据。此外,数据库还能确保数据的安全性和一致性。总的来说,数据库的存在极大地提高了我们处理和利用数据的效率。
1.3、关系型数据库与非关系型数据库
- 关系型数据库
关系型数据库,采用了关系模型来组织数据的存储,以行和列的形式存储数据并记录数据之间的关系,将数据存放在表格中,可以通过建立表格与表格之间的关联来维护数据与数据之间的关系
学生信息 ------ 学生表
班级信息 ------ 班级表
常见的关系型数据库有:MySQL,SQL Server,Oracle,达梦数据库等
- 非关系型数据库
非关系型数据库,采用键值对的模型来存储数据,只完成数据的记录,不会记录数据与数据之间的关系
在非关系型数据库中基于其特定的存储结构来解决一些大数据应用的难题
NoSQL(Not only SQL )数据库来指代非关系型数据库
1.4、数据库术语
- 数据库(Database):存储的数据的集合,提供数据存储的服务
- 数据(Data):实际上指的是描述事物的符号记录
- 数据库管理系统(Database Management System,DBMS):数据库管理系统,是位于用户与操作系统之间的一层数据管理软件
- 数据库系统管理员(Database Anministrator,简称DBA):负责数据库创建、使用与维护的专门人员
- 数据库系统(Database System,DBS):数据库系统管理员,数据库管理系统及数据库组成整个单元
1.5、mysql下载及地址
mysql下载地址:https://www.mysql.com/
点击DOWNLOADS,学习的时候选择社区版本就行
点击红色方框中的链接
然后选择Windows版本的下载,第一个是线上版本,第二个是有安装包的安装方式
二、安装mysql数据库
打开安装包后出现的是以下界面
- Server only:服务端安装
- Client only:客户端安装
- Full:安装包内所有插件
- Custom:自定义安装
我这里选择的是自定义安装
上图中选择安装的第一个MySQL Server 8.0.35 - x64是mysql服务,是必须安装的
第二个则是mysql推出的可视化软件,这个根据自己选择是否安装
注意:mysql默认安装在C盘,要修改到其他盘符,必须点击一下,然后选择那一段较短的蓝色字体进行修改安装位置
下一步
下一步,点击execute,等进度完成后点击下一步
下一步
下一步
设置管理员密码
输入密码后点击下一步
点击no,然后下一步
我这里是全选,然后下一步
下一步
点击执行,完成安装
最后在进行两次完成就彻底安装完成
三、mysql的管理工具
当完成数据库的安装之后,mysql是以服务的形式运行在Windows或linux操作系统上的,用户可以通过DBMS工具来对mysql数据库进行操作
当安装完成mysql之后,默认安装了mysql command line client,此工具是一个命令行形式的工具,通常我们会单独安装可视化的DBMS工具
常用工具
- SQLyog
- Navicat for MySQL
- DBeaver
3.1、mysql command line client使用
- 开始菜单–>mysql 8.0 command line client
- 输入密码(如果密码输入错误,或者mysql服务没有启动,窗口会自动闪退)
四、SQL结构化查询语言
4.1、SQL概述
SQL结构化查询语言,用于存取、查询、更新数据以及管理关系型数据库系统
4.2、SQL发展
SQL的发展历史可以追溯到20世纪70年代初,当时由IBM公司的San Jose, CaliforniaSQL的发展历史可以追溯到20世纪70年代初,当时由IBM公司的San Jose, California研究实验室的埃德加·科德发表将数据组成表格的应用原则,通常被称为Codd’s Relational Algebra。1974年,唐纳德·克努特首先提出了SQL语言,并在美国国家标准局(ANSI)的支持下,于1986年10月通过了SQL语言的美国标准,称为SQL86。
自那时以来,SQL经历了多次更新和扩展。例如,在1988年,微软与Ashton-Tate合作开发了Sybase SQL Server for IBM OS/2,并在次年发布了SQL Server 1.0。此外,SQL Server使用了ANSI SQL-92的扩展集,称为T-SQL,这也遵循了ANSI制定的SQL-92标准。
4.3、SQL分类
根据SQL指令完成的数据库操作的不同,可以将SQL指令分为四类
- DDL Data Definition Language 数据定义语言
用于完成对数据库对象(数据库、数据表、视图、索引等)的创建、删除、修改
- DML Date Manipulation Language 数据操作/操纵语言
用于完成对数据表中的数据的添加、删除、修改操作
添加:将数据存储到数据表中
删除:将数据从数据表移除
修改:对数据表中的数据进行修改
- DQL Data Query Language 数据查询语言
用于数据表中的数据查询
- DCL Data Control Language 数据控制语言
用于完成事物管理等控制性操作
4.4、数据定义语言
4.4.1、DDL数据库操作
查询数据库
## 显示当前mysql中的数据库列表
mysql> show databases;
# 显示指定命令的数据库创建时的SQL指令
mysql> show create database test1_db;
创建数据库
# 创建数据库,数据库名称可以自定义
mysql> create database test_db;
# 创建数据库时指定数据库的字符集,一般默认就是utf-8
mysql> create database test1_db character set utf8;
# 判断数据库是否存在,不存在则直接创建该数据库,存在,也不会报错
mysql> create database if not exists test1_db;
修改数据库
# 修改test_db的字符集为gbk
mysql> alter database test_db character set gbk;
删除数据库
# 删除数据库
mysql> drop database test1_db;
# 判断是否已经删除test1_db数据库,未删除,直接删除,删除,不报错
mysql> drop database if exists test1_db;
使用/切换数据库
# 使用/切换test_db数据库
mysql> use test_db;
4.4.2、DDL数据表操作
创建数据表
mysql> create table students(
--创建编号列
-> stu_num char(8) not null unique,
-- 创建名字列
-> stu_name varchar(20) not null unique,
-- 创建性别列
-> stu_gender char(2) not null unique,
-- 创建年龄列,年龄为整数
-> stu_age int not null unique,
-- 创建电话列
-> stu_tel char(11) not null unique,
-- 创建qq号列
-> stu_qq varchar(11) not null unique,
-- 创建微信号列
-> stu_weixin varchar(100) not null unique);
char(10):字符串类型的意思,10代表10个字节
varchar(20):可变字符串,一个字节占两个字符
not null:约束不能为空
unique:约束不可重复
约束不能重复和为空:如:电话号和编号不能是空着的,也不能编号和电话号是重复的同一个
查看数据表
从这里开始不在用cmd
# 查看所有的数据表
show tables;
# 查看数据表结构
desc students;
删除数据表
# 删除数据表
drop table students;
# 判断是否已删除,自行删除
drop table if exists students;
# 删除字段名(列)
alter table students drop stu_num;
修改数据表
# 修改表名
alter table students rename to studebts_db;
# 修改表的字符集是gbk还是utf-8
alter table students character set utf-8;
# 在表中新加一个字段(列)
alter table students add stu_bj varchar(10);
# 修改字段名和类型
alter table students change stu_num stu_num1 int ;
# 只修改字段类型
alter table students modify stu_num int;
4.5、mysql数据类型
数据类型:指的是数据表中的列中支持存放的数据的类型
4.5.1、数值类型
在mysql中有多种类型可以存放数值,不同的类型存放的数值范围或形式是不同的
类型 | 内存空间大小 | 范围 | 说明 |
---|---|---|---|
tinyint | 1byte | 有符号:-128 ~ 127 无符号:0 ~ 255 | 特小型整数(年龄) |
smalint | 2byte(16bit) | 有符号:-32768 ~ 32767 无符号:0 ~ 65535 | 小型整数 |
mediumint | 3byte | 有符号:-2^31 ~ 2^31 - 1 无符号:0 ~ 2^32 - 1 | 中型整数 |
int/integer | 4byte | 整数 | |
bigint | 8byte | 大型整数 | |
float | 4byte | 单精度 | |
double | 8byte | 双精度 | |
decimal | 一般情况,第一参数+2 | decimal(10,2),表示数值一共有10位,小数有两位 |
注意:前三种一般用的很少,一般整数类型会直接使用int/integer类型,过大就会使用bigint类型,浮点数会使用double类型
4.5.2、字符串类型
存储字符串序列的类型
类型 | 字符长度 | 说明 |
---|---|---|
char | 0 ~ 255字节 | 定长字符串,最多可以存储255个字符;当我们指定数据表字段为char(n),此列中的数据最长为n个字符,如果添加的数据少于n,则补’\u0000’至n长度 |
varchar | 0 ~ 65536字节 | 可变长度字符串,此类型的类最大长度为65535 |
tinyblob | 0 ~ 255字节 | 存储二进制字符串 |
blob | 0 ~ 65535字节 | 存储二进制字符串 |
mediumblob | 0 ~ 1677215字节 | 存储二进制字符串 |
longblob | 0 ~ 4294967295字节 | 存储二进制字符串 |
tinytext | 0 ~ 255字节 | 文本数据 (字符串) |
text | 0 ~ 65535字节 | 文本数据 (字符串) |
mediumtext | 0 ~ 1677215字节 | 文本数据 (字符串) |
longtext | 0 ~ 4294967295字节 | 文本数据 (字符串) |
注意:在数据库中存储图片或者视频音频等内容,一般是存储,文件在服务器上的路径,当然如果非要存储就需要将图片等数据转成二进制进行存储,所以blob类型是可以存储所有类型的,但是前提是需要转换成二进制,所以此类型用的很少
longtext类型一般用于varchar类型存储不下的时候
常用类型也就是char和varchar这两种
4.5.3、日期类型
在mysql数据库中,我们可以使用字符串来存储时间,但是如果我们需要基于时间字段进行查询操作就便于查询实现
类型 | 格式 | 说明 |
---|---|---|
date | 2024 - 01 - 01 | 日期,只存储年月日 |
time | 12:12:12 | 时间,只存储时分秒 |
year | 2024 | 年份 |
datetime | 2024 - 01 - 01 12:12:12 | 日期 + 时间,存储年月日时分秒 |
timestamp | 20240101 121212 | 日期 + 时间(时间戳) |
4.6、字段约束
在创建数据表的时候,指定的对数据表的列的数据限制性的要求(对表的列中的数据进行限制)
常见的约束
- 非空约束:限制此列的值必须提供,不能为null
- 唯一约束:在表中的多条数据,此列的值不能重复
- 主键约束:非空+唯一,能够唯一标识数据表中的一条数据
- 外键约束:建立不同表之间的关联关系
4.6.1、唯一约束
在表中的多条数据,此列的值不能重复
设置book_id不可重复
CREATE TABLE books (
book_id CHAR(5) UNIQUE,
book_name VARCHAR(10) NOT NULL,
book_author VARCHAR(5)
);
4.6.2、主键约束
主键就是数据表中记录的唯一标识,在一张表中只能有一个主键(主键可以是一个列,也可以是多个列的组合)
当一个字段声明为主键之后,添加数据时:
1.此字段数据不能为null
2.此字段数据不能重复
设置book_id为主键约束
CREATE TABLE books1 (
book_id CHAR(5) PRIMARY KEY,
book_name VARCHAR(10) NOT NULL,
book_author VARCHAR(5)
);
删除主键约束
alter table books1 drop primary key;
创建表之后添加主键约束
alter table books1 modify book_id char(5) primary key;
4.6.3、主键自动增长
- 定义int类型字段自动增加:auto_increment
字符类型必须为int类型
CREATE TABLE books (
book_id int(5) PRIMARY KEY auto_increment,
book_name VARCHAR(10) NOT NULL,
book_author VARCHAR(5)
);
注:主键自动增长,只能保证唯一性,不能保证连续性,如:从1开始,中间删除2,不会再次出现2,会直接到数字3
4.6.4、联合主键
联合主键就是将数据表中的多列组合在一起设置为表的主键
CREATE TABLE grades (
stu_num CHAR(8),
course_id INT,
score INT,
PRIMARY KEY (stu_num, course_id)
);
4.6.5、DML数据操作语言
用于完成对数据表中数据的插入、删除、修改操作
创建表
create table students(
stu_num char(8) primary key,
stu_name varchar(20) not null,
stu_gender char(2) not null,
stu_age int not null,
stu_tel char(11) not null unique,
stu_qq varchar(11) unique,
stu_wei varchar(11) unique
)
插入数据
# 方法一
insert into students(
stu_num,
stu_name,
stu_gender,
stu_age,
stu_tel,
stu_qq,
stu_wei
)
values(
'20240101',
'张三',
'男',
18,
'13837202197',
'1684331250',
'13837202197'
);
# 方法二
insert into students values(
'20240102',
'李四',
'男',
18,
'15346924588',
'1584395120',
'15796321450'
)
删除数据
# 删除stu_num=20240102的学生信息
delete from students where stu_num='20240102';
# 删除stu_age>18的学生信息
delete from students where stu_age>18;
# 删除整个数据表
delete from students;
修改数据
# 根据条件修改stu_age
update students set stu_age= 22 where stu_num='20240102';
# 根据条件修改年龄,并且在为空的stu_qq列中加入数据
update students set stu_age= 22,stu_qq='1854223059' where stu_num='20240102';
查看数据表
select * from students;
4.6.7、DQL数据查询语言
从数据表中提取满足特定条件的记录
单表查询
多表联合查询
查询基础语法
# 查询stu_name字段列
select stu_name from students;
# 查询多个字段列
select stu_name,stu_qq,stu_wei from students;
where子句查询 - 条件关系运算符
# where条件等于20240103
select * from students where stu_num='20240103';
# 条件不等于20240103
select * from students where stu_num != '20240103';
select * from students where stu_num <> '20240103';
# 年龄条件大于18
select * from students where stu_age > 18;
# 年龄条件小与20
select * from students where stu_age < 20;
# 年龄条件大于等于20
select * from students where stu_age >= 20;
where子句查询 - 条件逻辑运算符
# and 并且 筛选多个同时满足条件的数据
select * from students where stu_age=18 and stu_gender='男';
# or 或 筛选多个条件中至少满足一个条件的数据
select * from students where stu_age=18 or stu_gender='男';
4.6.8、模糊查询
# 查询学生电话中包含0的学生信息
select * from students where stu_tel like '%0%';
# 查询学生姓名第一个字为张的学生信息
select * from students where stu_name like '张%';
# 查询学生电话最后一个数字为0的学生信息
select * from students where stu_tel like '%0';
# 查询学生电话中的第二个数字为3的学生信息
select * from students where stu_tel like '_3%';
# 对字段列进行模糊查询
select stu_tel from students where stu_tel like '_0%';
# 计算stu_age的出生年月日
select stu_name,2024 - stu_age from students where stu_age;
# 计算stu_age的出生年月日并生成别名
select stu_name,2024 - stu_age as stu_year from students where stu_age;
# 对年龄进行去重
select distinct stu_age from students;
4.6.9、排序
# 单字段排序
select * from students where stu_age >=18 order by stu_gender desc;
select * from students where stu_age >18 order by stu_gender desc;
# 多字段排序
select * from students where stu_age >18 order by stu_gender asc,stu_age desc;
4.6.10、聚合函数
SQL中提供了一些可以对查询的记录的列进行计算的函数 – 聚合函数
count – > 统计函数
max --> 最大值
min --> 最小值
sum --> 求和
avg -->平均值
# count:统计学生数量
select count(stu_num) from students;
# 统计学生中为男性的数量
select count(stu_num) from students where stu_gender='男';
# 找出年龄最大的
select max(stu_age) from students;
# 找出男性中年龄最大的
select max(stu_age) from students where stu_gender='男';
# 找出年龄最小的
select min(stu_age) from students;
# 找出男性中年龄最小的
select min(stu_age) from students where stu_gender='男';
# 求出年龄的总和
select sum(stu_age) from students;
# 求出男生年龄的总和
select sum(stu_age) from students where stu_gender='男';
# 求出年龄的平均值
select avg(stu_age) from students;
# 求出男生年龄的平均值
select avg(stu_age) from students where stu_gender='男';
4.6.11、日期函数
- 当我们向日期类型的列添加数据时,可以通过字符串类型赋值(字符串的格式必须为yyyy-MM-dd hh:mm:ss)
- 如果想要获取当前系统时间添加到日期类型的列,可以使用now()或sysdate()
# 添加时间列
alter table students add stu_shijian datetime;
# 新增一条数据,并获取时间
# 手动添加时间
insert into students(stu_num,stu_name,stu_gender,stu_age,stu_tel,stu_qq,stu_wei,stu_shijian)
values('20240110','周周','女',20,'14695240321','14236975201','1234950147','2024-01-01 09:00:00');
# 添加系统时间
insert into students(stu_num,stu_name,stu_gender,stu_age,stu_tel,stu_qq,stu_wei,stu_shijian)
values('20240110','周周','女',20,'14695240321','14236975201','1234950147',now());
insert into students(stu_num,stu_name,stu_gender,stu_age,stu_tel,stu_qq,stu_wei,stu_shijian)
values('20240110','周周','女',20,'14695240321','14236975201','1234950147',sysdate());