目录
概念
数据库,就是存放数据的仓库,数据库(DataBase,简称DB)是长期存储在计算机内部有结构的、大量的、共享的数据集合
特点
1长期存储:持久存储,因为数据库存储数据的本质是将数据存储在.db的文件中
2有结构:
类型:存放的数据是有类型的
关系:存储数据与数据之间的关系 -
3 大量:大多数存储在数据库中的数据,实际上就是存储在磁盘的文件中
4 共享:多个应用程序可以通过数据库实现数据的共享
关系型数据库与非关系型数据库
关系型数据库
采用了关系模型来组织数据的存储,以行和列的形式存储数据并记录数据与数据之间的关系 将数据存储在表格中,可以通过建立表格与表格之间的关联来维护数据 与数据之间的关系。
非关系型数据库
采用键值对的模型来存储数据,只完成数据的记录,不会记录数据与数据之间的关系。 在非关系型数据库中基于其特定的存储结构来解决一些大数据
相关术语
数据库(Database):存储数据的集合,提供数据存储服务 -
数据(Data): 实际上指的是描述事物的符号记录
数据库管理系统(Database Management System,DBMS ):数据库管理系统,是位于用户与操作系统之间的一层数据管理软件 -
数据库系统管理员(Database Anministrator,DBA):负责数据库创建、使用及维护的专门人员 数据库系统(Database System,DBS):数据库系统管理员、数据库管理系统及数据库 组成整个单元
MySQL:MySQL这个数据库是关系型数据库是免费的,使用Navicat工具会比较方便,好操作。
记录/元组:表的一行称为一条记录(元组)
结构化查询语言SQL
简介:SQL(Structured Query Language)结构化查询语言,用于存取、查询、更新数据以及管 理关系型数据库系统
分类
根据SQL指令完成的数据库操作的不同,可以将SQL指令分为四类 数据存在表中,表是存储在数据库中,mysql中可以有多个数据库 表:类似与Execl -
1. DDL(Data Definition Language)数据定义语言 - 用于完成对数据库对象(数据库、数据表、视图、索引等)的创建、删除、修改
2. DML(Data Manipulation Language)数据操作/操纵语言 用于完成对数据表中的数据的添加、删除、修改操作
3. DQL(Data Query Language)数据查询语言 用于将数据表中的数据查询出来
4. DCL(Data Control Language)数据控制语言 用于完成事务管理等控制性操作
基本语法
SQL指令不区分大小写 但是在后期编写sql指令时,sql提供的关键字一般使用大写,自定义的名称用小写
每条SQL表达式结束之后都以;结束
SQL关键字之间以空格进行分隔
SQL之间可以不限制换行(可以有空格的地方就可以有换行)
MySQL注释:
单行注释:-- 注释内容 注意:在--后要加空格
单行注释:#注释内容
多行注释:/*注释内容*/
DDL:数据定义语言
作用:用于完成对数据库对象(数据库、数据表、视图、索引等)的创建、删除、修改
数据库操作
1.查询数据库:
show databases; 显示当前MySQL中的数据库列表
SHOW DATABASES;
显示指定名称的数据库
SHOW CREATE DATABASE zday0101;
2.创建数据库
create database 库名; 直接创建
CREATE DATABASE zday0102;
create database if not exists 库名; 判断一下,如果没有就创建
CREATE DATABASE IF NOT EXISTS zday0102;
create database 库名 character set 字符集;
字符集:数据存储在数据库中采用的编码格 式 utf8、gbk
CREATE DATABASE zday0103 CHARACTER SET 'utf8';
3.修改数据库字符集
alter database 库名 character set 字符集;
默认编码格式根据软件工具,创建时加上
ALTER DATABASE zday0103 CHARACTER SET utf8;
根据报错,可知此mysql数据库不支持gbk
4.删除数据库
drop database 库名;
DROP DATABASE zday0103;
drop database if exists 库名; 判断一下,没有就不删了
DROP DATABASE IF EXISTS zday0103;
5.使用/切换数据库
use 库名;
如果要对库中的表进行操作,需要切库
USE zday0102;
数据表操作
数据类型
数据表中支持操作的数据类型
数值型
类型 | 内存空间 | 范围 | 说明 |
tinyint | 1byte | 有符号 -128~127 无符号 0~255 | 特小型整数 |
smallint | 2byte | 有符号 -32768 ~ 32767 无符号 0~65535 | 小性整数 |
mediumint | 3byte | te 有符号 -2^31 ~ 2^31 - 1 无符号 0~2^32-1 | 中型整数 |
int/integer | 4byte | 整数 | |
bigint | 8byte | 大型整数 | |
float | 4byte | 单精度小数 | |
double | 8byte | 双精度数字 | |
decimal | 第一参数 +2 | 用于记录精准数字,如 金额 |
decimal(m,d)
m是数字的最大位数,他的范围是从1-65;
d是小数点后的位数,他的范围是0-30,并且不能大于m。
如果m被省略了,那么m的值默认为10, 如果d被省略了,那么d的值默认为0.
举例表示:
1、decimal(5,2) 所指代的范围是-999.99~999.99 数字的最大位数是5位,小数点右侧是 2位,即有两位小数。
字符串类型
类型 | 字符长度 | 说明 |
char | 0~255字节 | 定长字符串,最多可以存储255个字符 ;当我们指定数 据表字段为char(n) 此列中的数据最长为n个字符,如 果添加的数据少于n,则补'\u0000'至n长度 |
varchar | 0~65536 字节 | 可变长度字符串,此类型的类最大长度为65535;当我 们指定数据表字段为varchar(n) 此列中的数据最长为 n个字符,如果添加的数据少于n,不会补齐长度 |
tinyblob | 0~255 字节 | 存储二进制字符串 |
blob | 0~65535 字节 | 存储二进制字符串 |
mediumblob | 0~1677215 字 节 | 存储二进制字符串 |
longblob | 0~4294967295 字节 | 存储二进制字符串 |
tinytext | 0~255 字节 | 文本数据(字符串) |
text | 0~65535 字节 | 文本数据(字符串) |
mediumtext | 0~1677215 字 节 | 文本数据(字符串) |
longtext | 0~4294967295 字节 | 文本数据(字符串),大型文本记录,如小说书,笔记等 |
char(长度),varchar(长度)
4.1版本前,长度为字节,之后是字符长度
日期类型
类型 | 格式 | 说明 |
date | 2022-11-00 | 日期,只存储年月日 |
time | 11:12:13 | 时间,只存储时分秒 |
year | 2021 | 年份 |
datetime | 2021-09-13 11:12:13 | 日期+时间,存储年月日时分秒 |
timestamp | 20210913111213 | 日期+时间 (时间戳) |
存储时得严格按照填写
创建表
数据表实际就是一个二维的表格,一个表格是由多列组成,表格中的每一列称之为表格的 一个字段
语法:
create table 表名( 字段名1 数据类型 约束1 约束2,
字段名2 数据类型 约束,
字段名3 数据类型
);
USE zday0101;#切到数据库之下
CREATE TABLE student (#创建一个student表
s_id INT,
s_name VARCHAR(50),
s_age INT,
s_sex VARCHAR(10) #这个记得不要加,
);
查询表
show tables; 查询当前库下所有表名
SHOW TABLES;
desc 表名; 查询表结构
DESC student;
修改表
1.alter table 旧表名 rename to 新表名; 修改表名
ALTER TABLE student RENAME TO stu;
2.alter table 表名 character set 字符集; 修改字符集
数据表也是有字符集的,默认字符集和数据库一致
ALTER TABLE stu CHARACTER SET utf8;
3.alter table 表名 add 列名 类型; 添加列(字段)
ALTER TABLE stu ADD s_length INT;
4.alter table 表名 change 旧列名 新列名 类型;
修改列(字段)的列表和类型
ALTER TABLE stu CHANGE s_name s_namee CHAR(50);
5.alter table 表名 modify 列名 类型; 只修改列(字段)类型
ALTER TABLE stu MODIFY s_sex CHAR(10);
6.alter table 表名 drop 列名; 删除列(字段)
ALTER TABLE stu DROP s_length;
删除表
drop table 表名; 删除数据表
DROP TABLE students;
drop table if exists 表名; 当数据表存在时删除数据表
DROP TABLE IF EXISTS students;
约束
概念:在创建数据表的时候,指定的对数据表的列的数据限制性的要求(对表的列中的数据进行 限制)
作用:保证数据的有效性 ,保证数据的完整性 ,保证数据的正确性
分类:
非空约束(not null):
限制此列的值必须提供,不能为null
唯一约束(unique):
在表中的多条数据,此列的值不能重复
主键约束(primary key):
非空+唯一,能够唯一标识数据表中的一条数据
一张表只能有一个主键
CREATE TABLE god(
g_id INT PRIMARY KEY,#主键
g_name VARCHAR(50) NOT NULL #非空约束
)
CREATE TABLE god(
g_id INT,
g_name VARCHAR(50)NOT NULL,
PRIMARY KEY(g_id)#两种主键写法都可以
);
#语法:alter table 表名 drop primary key;#删除表主键约束
#语法:alter table 表名 modify 字段名 数据类型 primary key;#创建表之后添加主键约束
联合主键:
CREATE TABLE god(
g_id INT,
g_name VARCHAR(50)NOT NULL,
PRIMARY KEY(g_id,g_name)
);
注意:在实际企业项目的数据库设计中,联合主键使用频率并不高;当一个张数据表中没 有明确的字段可以作为主键时,我们可以额外添加一个ID字段作为主键。
自增长约束(auto_increment):
每次+1,从1起
当有些数据表中没有合适的列作为主键时,我们可以额外定义一个与记录本身无关的列 (ID)作为主键,此列数据无具体的含义主要用于标识一条记录,在mysql中我们可以将此 列定义为int,同时设置为 自动增长 ,当我们向数据表中新增一条记录时,无需提供ID列的 值,它会自动生成
CREATE TABLE god(
g_id INT PRIMARY KEY auto_increment,
g_name VARCHAR(50)NOT NULL
);
检查约束(check):
保证列中的值满足某一条件
CREATE TABLE god(
g_id INT PRIMARY KEY auto_increment,
g_name VARCHAR(50)NOT NULL,
g_age INT NOT NULL
check(g_age >= 0 and g_age <= 200)
);
默认约束(default):
保存数据时,未指定值则采用默认值
CREATE TABLE god(
g_id INT PRIMARY KEY auto_increment,
g_name VARCHAR(50)NOT NULL,
g_age INT DEFAULT 500,
g_elem CHAR(10) DEFAULT'水'
);
外键约束(foreign key):
建立不同表之间的关联关系
修改约束
可以使用修改列的方式,删除,添加或修改约束
alter table 表名 modify 字段名 数据类型 [约束];
没有约束为删除约束,有约束为添加或修改约束
ALTER TABLE god MODIFY g_elem CHAR(10) NOT NULL;
DML数据操作语言
插入数据
insert into 表名(列名1, 列名2....) values(值1,值2....);
# 向数据表中指定的列添加数据(不允许为空的列必须提供数据)
insert into stus(stu_num,stu_name,stu_gender,stu_age,stu_tel)
values('20210101','张三','男',21,'13030303300');
# 数据表名后的字段名列表顺序可以不与表中一致,但是values中值的顺序必须与表名后字
段名顺序对应
insert into stus(stu_num,stu_name,stu_age,stu_tel,stu_gender)
values('20210103','王五',20,'13030303302','女');
# 当要向表中的所有列添加数据时,数据表名后面的字段列表可以省略,
#但是values中的值的顺序要与数据表定义的字段保持一致;
insert into stus values('20210105','孙琦','男',21,'13030303304','666666');
# 不过在项目开发中,即使要向所有列添加数据,也建议将列名的列表显式写出来(增强SQL
的稳定性)
insert into stus(stu_num,stu_name,stu_gender,stu_age,stu_tel,stu_qq)
values('20210105','孙琦','男',21,'13030303304','666666');
修改数据
update 表名 set 列名1=值1,列名2=值2 [where 条件];
# 将学号为20210105的学生姓名修改为“孙七”(只修改一列)
update stus set stu_name='孙七' where stu_num='20210105';
# 将学号为20210103的学生 性别修改为“男”,同时将QQ修改为 777777(修改多列)
update stus set stu_gender='男',stu_qq='777777' where stu_num='20210103';
# 根据主键修改其他所有列
update stus set stu_name='韩梅
梅',stu_gender='女',stu_age=18,stu_tel='13131313311' ,stu_qq='999999' where
stu_num='20210102';
# 如果update语句没有where子句,则表示修改当前表中所有行(记录)
update stus set stu_name='Tom';
删除数据
delete from 表名 where [条件];
# 删除学号为20210102的学生信息
delete from stus where stu_num='20210102';
# 删除年龄大于20岁的学生信息(如果满足where子句的记录有多条,则删除多条记录)
delete from stus where stu_age>20;
# 如果删除语句没有where子句,则表示删除当前数据表中的所有记录(敏感操作)
delete from stus;