蓝旭后端第六次培训课 MySQL

Posted 嗯我想想

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了蓝旭后端第六次培训课 MySQL相关的知识,希望对你有一定的参考价值。

命令行操作MySQL

登录

登录的命令:

mysql  -hlocalhost -uroot –p

参数说明:

  • -h:host主机名。后面跟要访问的数据库服务器的地址;如果是登录本机,可以省略
  • -u:user 用户名。后面跟登录数据的用户名,第一次安装后以root用户来登录,是MySQL的管理员用户
  • -p: password 密码。一般不直接输入,而是回车后以保密方式输入。

访问

显示MySQL中的数据库列表:

show databases; 

默认有四个自带的数据库,每个数据库中可以有多个数据库表、视图等对象。

注意!!!这四个默认自带的数据库一定不要去动它!!!
如果有想了解这四个默认的库都是什么作用的,自己去网上查一查,也不再做详细讲解了。

在这里插入图片描述

使用

切换至你想操作的数据库

命令行:

use mysql;

MySQL下可以有多个数据库,如果要访问哪个数据库,需要将其置为当前数据库。

该命令的作用就是将数据库mysql(默认提供的四个数据库之一的名字)置为当前数据库

显示当前数据库的所有数据库表

命令行:

show tables;

通过这个命令,可以查看mysql数据库下的所有数据表。

退出数据库

exit;

Bye!!!
在这里插入图片描述

最后补充

  1. MySQL 层次:不同项目对应不同的数据库组成 - 每个数据库中有很多表 - 每个表中有很多数据
  2. SQL语句的结尾最好加上 ;

SQL语句终于来咯

SQL简介

SQL(Structured Query Language)是结构化查询语言的简称,它是一种数据库查询和程序设计语言,同时也是目前使用最广泛的关系型数据库操作语言。在数据库管理系统中,使用SQL语言来实现数据的存取、查询、更新等功能。SQL是一种非过程化语言,只需提出“做什么”,而不需要指明“怎么做”。

SQL语句分类

数据查询语句 DQL

数据查询语言(Data Query Language,DQL):

  • DQL主要用于数据的查询,其基本结构是使用SELECT子句,FROM子句和WHERE子句的组合来查询一条或多条数据

数据操作语句 DML

  • 数据操作语言(Data Manipulation Language,DML):DML主要用于对数据库中的数据进行增加、修改和删除的操作,其主要包括:(1) INSERT:增加数据 (2) UPDATE:修改数据 (3) DELETE:删除数据

数据定义语句 DDL

  • 数据定义语言(Data Definition Language,DDL):DDL主要用针对是数据库对象(数据库、表、索引、视图、触发器、存储过程、函数)进行创建、修改和删除操作。其主要包括:(1) CREATE:创建数据库对象 (2) ALTER:修改数据库对象 (3) DROP:删除数据库对象

数据控制语句 DCL

  • 数据控制语言(Data Control Language,DCL):DCL用来授予或回收访问 数据库的权限,其主要包括:(1) GRANT:授予用户某种权限 (2) REVOKE:回收授予的某种权限

事务控制语句 TCL

  • 事务控制语言(Transaction Control Language,TCL):TCL用于数据库的事务管理。其主要包括:(1) START TRANSACTION:开启事务 (2) COMMIT:提交事务 (3) ROLLBACK:回滚事务 (4) SET TRANSACTION:设置事务的属性

在这里插入图片描述

创建数据表

认识数据表

表(Table)是数据库中数据存储最常见和最简单的一种形式,数据库可以将复杂的数据结构用较为简单的二维表来表示。二维表是由行和列组成的,分别都包含着数据,如表所示。
在这里插入图片描述
每个表都是由若干行和列组成的,在数据库中表中的行被称为记录,表中的列被称为是这些记录的字段。

记录也被称为一行数据,是表里的一行。在关系型数据库的表里,一行数据是指一条完整的记录。

字段是表里的一列,用于保存每条记录的特定信息。如上表所示的学生信息表中的字段包括“学号”、“姓名”、“性别”和“年龄”。数据表的一列包含了某个特定字段的全部信息。

创建数据表 tb_student

1)新建自己的库

在这里插入图片描述
字符集:
常用utf8mb4,没有特殊要求的话,直接用默认的就好
留个小彩蛋,可以查查utf8和utf8mb4的区别,感兴趣的去多了解了解

排序规则:
自行查看参考博客

2)新建查询

##这是一个单行注释
--这也是一个单行注释

/*
多行注释
多行注释
多行注释
*/

/*
建立一张用来存储学生信息的表
字段包含学号、姓名、性别,年龄、入学日期、班级,email等信息
*/

-- 创建数据库表:
create table tb_student(
        sno int(6), -- 6 代表显示长度 
        sname varchar(5), -- 5 个字符
        sex char(1),
        age int(3),
        enterdate date,
        classname varchar(10),
        email varchar(15)
);
-- 查看表的结构:展示表的字段详细信息
desc tb_student;
-- 查看表中数据:
select * from tb_student;
-- 查看建表语句:
show create table tb_student;
/*
CREATE TABLE `tb_student` (
  `sno` int DEFAULT NULL,
  `sname` varchar(5) DEFAULT NULL,
  `sex` char(1) DEFAULT NULL,
  `age` int DEFAULT NULL,
  `enterdate` date DEFAULT NULL,
  `classname` varchar(10) DEFAULT NULL,
  `email` varchar(15) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
*/

数据表列类型

有能力的可以直接读相关版本的MySQL文档,该链接为5.7版本的官方文档

  1. 整形 INT
  2. 浮点数类型 FLOAT / DOUBLE
  3. 字符串类型 CHAR / VARCHAR
  4. 日期和时间类型 DATE / DATETIME / TIMESTAMP

这里不过多赘述,仅列举了几个,平时用到啥还是去查一下比较好(比如处理金钱的,涉及到精度等问题;处理时间的,涉及到存储格式和转换等问题;处理长文本的,等等)参考博客,网上一堆的,自己找的也OK
熟练掌握常用的数据类型即可

添加数据

-- 查看表记录:
select * from tb_student;
-- 在t_student数据库表中插入数据:
insert into tb_student values (1,'张三','男',18,'2022-5-8','软件1班','123@126.com');
insert into tb_student values (10010010,'张三','男',18,'2022-5-8','软件1班','123@126.com');
insert into tb_student values (2,'张三','男',18,'2022.5.8','软件1班','123@126.com');
insert into tb_student values (2,"张三",'男',18,'2022.5.8','软件1班','123@126.com');
insert into tb_student values (7,"张三",'男',18,now(),'软件1班','123@126.com');
insert into tb_student values (9,"易烊千玺",'男',18,now(),'软件1班','123@126.com');
insert into tb_student (sno,sname,enterdate) values (10,'李四','2023-7-5');

注意事项
int 宽度是显示宽度,如果超过,可以自动增大宽度 int底层都是4个字节
时间的方式多样 ‘1256-12-23’ “1256/12/23” “1256.12.23”
字符串不区分单引号和双引号
如何写入当前的时间 now() , sysdate() , CURRENT_DATE()
char varchar 是字符的个数,不是字节的个数,可以使用binary,varbinary表示定长和不定长的字节个数。
如果不是全字段插入数据的话,需要加入字段的名字

修改数据

-- 修改表中数据
update tb_student set sex = '女' ;
update tb_student set sex = '男' where sno = 10 ;
UPDATE Tb_STUDENT SET AGE = 21 WHERE SNO = 10;
update tb_student set CLASSNAME = 'java01' where sno = 10 ;
update tb_student set CLASSNAME = 'JAVA01' where sno = 9 ;
update tb_student set age = 29 where classname = 'java01';

注意事项
1.关键字,表名,字段名不区分大小写
2.默认情况下,内容不区分大小写
3.删除操作from关键字不可缺少
4.修改,删除数据别忘记加限制条件

删除数据

delete from tb_student where sno = 2;

不要乱删随意删,记得备份备份备份!除非你要删库跑路了QWQ

修改数据表

-- 查看数据:
select * from tb_student;
-- 修改表的结构:
-- 增加一列:
alter table tb_student add score double(5,2) ; -- 5:总位数  2:小数位数 
update tb_student set score = 123.5678 where sno = 1 ; -- 结果:123.57
-- 增加一列(放在最前面)
alter table tb_student add score double(5,2) first;
-- 增加一列(放在sex列的后面)
alter table tb_student add score double(5,2) after sex;
-- 删除一列:
alter table tb_student drop score;
-- 修改一列:
alter table tb_student modify score float(4,1); -- modify修改是列的类型的定义,但是不会改变列的名字
alter table tb_student change score score1 double(5,1); -- change修改列名和列的类型的定义
-- 删除表:
drop table tb_student;

说明

SQL语句真的太多了,我搁着列肯定列不完。。。上述仅列举部分的SQL语句。。。也不用死记硬背,记住常用的就好,如果想学习了解更多的,建议百度 / CDSN
MySQL中文文档链接地址

表的完整性约束

为防止不符合规范的数据存入数据库,在用户对数据进行插入、修改、删除等操作时,MySQL提供了一种机制来检查数据库中的数据是否满足规定的条件,以保证数据库中数据的准确性和一致性,这种机制就是完整性约束。

MySQL中主要支持以下几种种完整性约束,如表所示。 其中Check约束是MySQL8中提供的支持。在这里插入图片描述

非外键约束

主键约束

主键约束(PRIMARY KEY,缩写PK),是数据库中最重要的一种约束,其作用是约束表中的某个字段可以唯一标识一条记录。因此,使用主键约束可以快速查找表中的记录。就像人的身份证、学生的学号等等,设置为主键的字段取值不能重复(唯一),也不能为空(非空),否则无法唯一标识一条记录。

主键可以是单个字段,也可以是多个字段组合。对于单字段主键的添加可使用表级约束,也可以使用列级约束;而对于多字段主键的添加只能使用表级约束。

非空约束

非空约束(NOT NULL,缩写NK)规定了一张表中指定的某个字段的值不能为空(NULL)。设置了非空约束的字段,在插入的数据为NULL时,数据库会提示错误,导致数据无法插入。

无论是单个字段还是多个字段非空约束的添加只能使用列级约束(非空约束无表级约束)

唯一约束

唯一约束(UNIQUE,缩写UK)比较简单,它规定了一张表中指定的某个字段的值不能重复,即这一字段的每个值都是唯一的。如果想要某个字段的值不重复,那么就可以为该字段添加为唯一约束。

无论单个字段还是多个字段唯一约束的添加均可使用列级约束和表级约束

检查约束

检查约束(CHECK)用来限制某个字段的取值范围,可以定义为列级约束,也可以定义为表级约束。MySQL8开始支持检查约束。

默认值约束

默认值约束(DEFAULT)用来规定字段的默认值。如果某个被设置为DEFAULT约束的字段没插入具体值,那么该字段的值将会被默认值填充。 默认值约束的设置与非空约束一样,也只能使用列级约束。

字段值自动增加约束

自增约束(AUTO_INCREMENT)可以使表中某个字段的值自动增加。一张表中只能有一个自增长字段,并且该字段必须定义了约束(该约束可以是主键约束、唯一约束以及外键约束),如果自增字段没有定义约束,数据库则会提示“Incorrect table definition; there can be only one auto column and it must be defined as a key”错误。

由于自增约束会自动生成唯一的ID,所以自增约束通常会配合主键使用,并且只适用于整数类型。一般情况下,设置为自增约束字段的值会从1开始,每增加一条记录,该字段的值加1。

/*
一、常用约束
建立一张用来存储学生信息的表
字段包含学号、姓名、性别,年龄、入学日期、班级,email等信息
约束:
建立一张用来存储学生信息的表
字段包含学号、姓名、性别,年龄、入学日期、班级,email等信息
【1】学号是主键 = 不能为空 +  唯一 ,主键的作用:可以通过主键查到唯一的一条记录【2】如果主键是整数类型,那么需要自增
【3】姓名不能为空
【4】Email唯一
【5】性别默认值是男
【6】性别只能是男女
【7】年龄只能在18-50之间
*/
-- 创建数据库表:
create table t_student(
        sno int(6) primary key auto_increment, 
        sname varchar(5) not null, 
        sex char(1) default '男' check(sex='男' || sex='女'),
        age int(3) check(age>=18 and age<=50),
        enterdate date,
        classname varchar(10),
        email varchar(15) unique
);
-- 添加数据:
--  1048 - Column 'sname' cannot be null 不能为null
-- 3819 - Check constraint 'tb_student_chk_1' is violated. 违反检查约束
insert into tb_student values (1,'张三','男',21,'2023-9-1','java01班','zs@126.com');
-- 1062 - Duplicate entry '1' for key 'tb_student.PRIMARY' 主键重复
-- > 1062 - Duplicate entry 'ls@126.com' for key 'tb_student.email' 违反唯一约束
insert into tb_student values (2,'李四','男',21,'2023-9-1','java01班','ls@126.com');
insert into tb_student values (3,'露露','男',21,'2023-9-1','java01班','ls@126.com');
-- 如果主键没有设定值,或者用null.default都可以完成主键自增的效果
insert into tb_student (sname,enterdate) values ('菲菲','2029-4-5');
insert into tb_student values (null,'小明','男',21,'2023-9-1','java01班','xm@126.com');
insert into tb_student values (default,'小刚','男',21,'2023-9-1','java01班','xg@126.com');
-- 如果sql报错,可能主键就浪费了,后续插入的主键是不连号的,我们主键也不要求连号的
insert into tb_student values (null,'小明','男',21,'2023-9-1','java01班','oo@126.com');
-- 查看数据:
select * from tb_student;

-- 查看建表语句:
show create table t_student;
-- 二、表级约束
CREATE TABLE `t_student` (
  `sno` int NOT NULL AUTO_INCREMENT,
  `sname` varchar(5) NOT NULL,
  `sex` char(1) DEFAULT '男',
  `age` int DEFAULT NULL,
  `enterdate` date DEFAULT NULL,
  `classname` varchar(10) DEFAULT NULL,
  `email` varchar(15) DEFAULT NULL,
  PRIMARY KEY (`sno`),
  UNIQUE KEY `email` (`email`),
  CONSTRAINT `t_student_chk_1` CHECK (((`sex` = _utf8mb4'男') or (`sex` = _utf8mb4'女'))),
  CONSTRAINT `t_student_chk_2` CHECK (((`age` >= 18) and (`age` <= 50)))
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci


-- 三、在创建表以后添加约束:
-- 删除表:
drop table t_student;
-- 创建数据库表:
create table t_student(
        sno int(6), 
        sname varchar(5) not null, 
        sex char(1) default '男',
        age int(3),
        enterdate date,
        classname varchar(10),
        email varchar(15)
);
-- > 1075 - Incorrect table definition; there can be only one auto column and it must be defined as a key
-- 错误的解决办法:就是auto_increment去掉
-- 在创建表以后添加约束:
alter table t_student add constraint pk_stu primary key (sno) ; -- 主键约束
alter table t_student modify sno int(6) auto_increment; -- 修改自增条件
alter table t_student add constraint ck_stu_sex check (sex = '男' || sex = '女');
alter table t_student add constraint ck_stu_age check (age >= 18 and age <= 50);
alter table t_student add constraint uq_stu_email unique (email);
-- 查看表结构:
desc t_student;

约束从作用上的分类

(1) 表级约束:可以约束表中任意一个或多个字段。与列定义相互独立,不包含在列定义中;与定义用‘,’分隔;必须指出要约束的列的名称;

(2) 列级约束:包含在列定义中,直接跟在该列的其它定义之后 ,用空格分隔;不必指定列名;

用navicat去添加约束

外键约束

外键约束(FOREIGN KEY,缩写FK)是用来实现数据库表的参照完整性的。外键约束可以使两张表紧密的结合起来,特别是针对修改或者删除的级联操作时,会保证数据的完整性。

外键是指表中某个字段的值依赖于另一张表中某个字段的值,而被依赖的字段必须具有主键约束或者唯一约束。被依赖的表我们通常称之为父表或者主表,设置外键约束的表称为子表或者从表。

举个例子:如果想要表示学生和班级的关系,首先要有学生表和班级表两张表,然后学生表中有个字段为stu_clazz(该字段表示学生所在的班级),而该字段的取值范围由班级表中的主键cla_no字段(该字段表示班级编号)的取值决定。那么班级表为主表,学生表为从表,且stu_clazz字段是学生表的外键。通过stu_clazz字段就建立了学生表和班级表的关系。
在这里插入图片描述
主表(父表):班级表 - 班级编号 - 主键
从表(子表):学生表 - 班级编号 - 外键

-- 先创建父表:班级表:
create table t_class(
        cno int(4) primary key auto_increment,
        cname varchar(10) not null,
        room char(4)
)
-- 添加班级数据:
insert into t_class values (null,'java001','r803');
insert into t_class values (null,'java002','r416');
insert into t_class values (null,'大数据001','r103');
-- 可以一次性添加多条记录:
insert into t_class values (null,'java001','r803'),(null,'java002','r416'),(null,'大数据001','r103');
-- 查询班级表:
select * from t_class;
-- 学生表删除:
drop table t_student;

-- 创建子表,学生表:
create table t_student(
        sno int(6) primary key auto_increment, 
        sname varchar(5) not null, 
        classno int(4)  -- 取值参考 t_class 表中的cno字段,不要求字段名字完全重复,但是类型长度定义 尽量要求相同
);
-- 添加学生信息:
insert into t_student values (null,'张三',1),(null,'李四',1),(null,'王五',2);
-- 查看学生表:
select * from t_student;

-- 出现问题:
-- 1.添加一个学生对应的班级编码为4:
insert into t_student values (null,'丽丽',4);
-- 2.删除班级2:
delete from t_class where cno = 2;

-- 解决办法,添加外键约束:
-- 注意:外键约束只有表级约束,没有列级约束:
create table t_student(
        sno int(6) primary key auto_increment, 
        sname varchar(5) not null, 
        classno int(4),-- 取值参考t_class表中的cno字段,不要求字段名字完全重复,但是类型长度定义 尽量要求相同
        constraint fk_stu_classno foreign key (classno) references t_class (cno)
);
create table t_student(
        sno int(6) primary 

以上是关于蓝旭后端第六次培训课 MySQL的主要内容,如果未能解决你的问题,请参考以下文章

蓝旭暑期培训Day3——文件上传

2021-10-25计科ACM新生培训第六次培训题解

第六次课作业(质量管理项目人力资源管理)

第五组第六次冲刺例会纪要 2017/7/18

蓝旭暑期培训Day3——JSON使用与简单解析

第十三次立会暨第六次集体开发