MySQL数据库学习笔记

目录

为什么使用数据库?

1. 实体和记录

2. 数据库和数据库表

3. 数据完整性

数据完整性由以下三个方面构成:

        1. 域完整性:

      2. 实体完整性:

        3. 参照完整性:

主键和外键

主键

外键

数据类型

        1. 整数类型

2. 小数类型

3. 日期和时间类型

4. 字符串类型

5. bit类型

数据表操作

        1. 创建数据表

2. 查询表结构

3. 修改表结构

3.1. 修改表名

3.2. 添加字段

       3.2.1.添加到末尾:

        3.2.2. 添加到最前

        3.2.3. 添加到中间

        3.2.4. 删除字段

        3.2.5. 修改字段名

        3.2.6. 修改字段数据类型

4. 删除数据表

4.1. 级联删除/级联更新cascade

常见约束

1. 主键约束

1.1.特点

1.2. 定义在列后

1.3. 独立定义

1.4. 删除主键

1.5. 指定主键

1.6. 主键自增

1.6.1. 设置主键自增

1.6.2. 删除主键自增

2. 非空约束

3. 唯一约束

4. 外键约束

1. 基本格式

5. 检查约束

6. 默认值约束

6.1. 通过修改表结构设置默认约束

6.2. 删除默认约束

插入数据

1. 基本语法

2. 使用 NSERT INTO…SELECT...FROM 语句复制表数据

删除数据

修改数据

操作表中的数据

1. 查询数据表

1.1.查询表中的所有字段

1.1.1. 使用“*”通配符查询所有字段

1.1.2. 列出表的所有字段

1.1.3.查询表中指定的字段

2. 过滤重复数据

3. 指定别名

3.1. 为表指定别名

3.2. 为字段指定别名

4. 限制查询结果的条数

4.1. 指定初始位置

4.2. 不指定初始位置

4.3. 与OFFSET组合使用

4.4.分页查询

5. 对查询结果进行排序

5.1. 单字段排序

5.2. 多字段排序

6. 按条件查询数据

6.1. 单一条件的查询语句

6.2. 多条件的查询

6.3. 带有“%”通配符的查询

6.4. 带有“_”通配符的查询

6.5. 使用通配符的注意事项和技巧

7. 范围查询

8. 空值查询/非空值查询

9. 分组查询

9.1. group by单独使用

9.2. group by与group_concat()

9.3. group by与聚合函数

9.4. GROUP BY 与 WITH ROLLUP

10. 分组过滤

11. 交叉连接

12. 内连接

13. 外连接

13.1. 左外连接

  13.2. 右外连接

MySQL中的函数

1. 数值型函数

2. 字符串函数

3. 日期时间函数

4. 聚合函数

5. 转换函数

高级查询:子查询

1. 子查询概述

2. 比较运算符

3, IN | NOT IN

4. EXISTS | NOT EXISTS

5. 子查询分类

5.1. 嵌套子查询

5.2. 相关子查询

6. 实例

6.1 实例1

6.1.1. 首先执行内层查询,查询出tb_depts表中“研发部”的部门编号:

6.1.2然后执行外层查询,查询出deptId的值为1的员工姓名

6.6.3. 用多表连接查询来实现:

6.2. 实例2

6.3. 实例3:检索年龄比“肖丽”大的员工

6.3.1第1步:查询出“肖丽”的出生日期;​

6.3.2. 第2步:查询出比上述出生日期小的员工;

6.3.3. 合并上述两个步骤,用一条指令实现:

6.4. 实例4:查询出未及格课程的课程编号和课程名称

6.4.1. 第1步:从scores分数表中查询出未及格课程的课程编号:

6.4.2. 第2步:从courses课程表中查询出这些课程编号的课程:

6.4.3. 合并上述两个步骤,用一条指令实现:

6.4.4. 用多表连接查询实现:

6.5. 小结

高级查询之相关子查询

1. 相关子查询的特点

2. 子查询部分不能单独执行

3. 子查询部分是反复执行的

CASE...END

事务

1. 事务的概念

2. 事务的4个重要属性(ACID)★★★★★

(1)原子性(atomicity):

(2)一致性(consistency):

(3)隔离性(isolation):

(4)持久性(durability):

3. 并发事务带来的问题?

3.1. 查看隔离级别:

​编辑存储过程

1. MySQL的存储过程

2. delimiter命令

3. 创建存储过程

3.1. 有输入参数的存储过程

3.2. 有输出参数的存储过程

4. 调用存储过程

5. 删除存储过程

6. 变量(创建(DECLARE)和赋值(SET))

if结构

1. if

2. if else

3. if...elseif..else


为什么使用数据库?

       使用数据库可以安全高效地存储、检索、管理大量的数据

1. 实体和记录

        实体:每一行数据对应一个实体

        记录:实体的别名

2. 数据库和数据库表

不同的实体组织在一起,构成了数据库的“表”

数据库的表:实体的集合

数据库:表的集合

3. 数据完整性

作用:保证用户输入的数据保存到数据库中是正确的。

确保数据的完整性=在创建表时给表中添加约束

完整性的分类:

        1)实体完整性:行

        2)域完整性:列

        3)引用完整性:学生表(学号,姓名) 成绩表(学号,科目,成绩) 科目表(科目编号,科目名称)

数据完整性(Data Integrity)是指数据的精确性(Accuracy) 和可靠性(Reliability)。

数据完整性由以下三个方面构成:

        1. 域完整性

是指一个列的输入有效性,是否允许为空值。强制域完整性的方法有:限制类型、格式或可能值的范围。

      2. 实体完整性:

是指保证表中所有的行唯一。实体完整性要求表中的所有行都有一个唯一标识符。这个唯一标识符可能是一列,也可能是几列的组合,称为主键。也就是说,表中的主键在所有行上必须取唯一值。

        3. 参照完整性:

是指保证主关键字和外部关键字之间的参照关系。它涉及两个或两个以上表数据的一致性维护。

外键值将引用表中包含此外键的记录和被引用表中主键与外键相匹配的记录关联起来。在输入、更改或删除记录时,参照完整性保持表之间已定义的关系,确保键值在所有表中一致。

主键和外键

       主键(primary key):是被挑选出来,作表的行的du惟一标识的候选关键字。一个表只有一个主关键字。主关键字又可以称为主键。 主键可以由一个字段,也可以由多个字段组成,分别成为单字段主键或多字段主键。

外键(foreign key):如果公共关键字在一个关系中是主关键字,那么这个公共关键字被称为另一个关系的外键。由此可见,外键表示了两个关系之间的相关联系。以另一个关系的外键作主关键字的表被称为主表,具有此外键的表被称为主表的从表。外键又称作外关键字。

主键

定义: 唯一标识一条记录,不能有重复的,不允许为空

作用:用来保证数据完整性,用来和其他表建立联系用的

个数 :主键只能有一个,一个表可以有多个外键

如果一列或者多列能够唯一标识表中的每一行,则这样的列可以作为主键。

外键

表的外键是另一表的主键, 外键可以有重复的, 可以是空值

数据类型

        1. 整数类型

        

        

说明:不同的整数类型有不同的取值范围,并且需要不同的存储空间,因此应根据实际需要选择最合适的类型,这样有利于提高查询的效率和节省存储空间

2. 小数类型

从上表中可以看到,DECIMAL 的存储空间并不是固定的,而由精度值 M 决定,占用 M+2 个字节。

decimal(10,4) 中的10代表整数位数加上小数为数不能超过10位,后面的4代表小数是4位,如果插入数据时小数位数不足4位,会补0,如果大于4位,会四舍五入。

3. 日期和时间类型

4. 字符串类型

下面将不同的字符串保存到 CHAR(4) 和 VARCHAR(4) 列,说明 CHAR 和 VARCHAR 之间的差别,如下表所示。

5. bit类型

存储0和1,使用SQL语句往表中插入数据时,可以使用true代表1,false代表0   

字节(Byte)=8位(bit) [6] 

1KB( Kilobyte,千字节)=1024B [6] 

1MB( Megabyte,兆字节)=1024KB [6] 

1GB( Gigabyte,吉字节,千兆)=1024MB [6] 

1TB( Trillionbyte,万亿字节,太字节)=1024GB [6] 

1PB( Petabyte,千万亿字节,拍字节)=1024TB [6] 

1EB( Exabyte,百亿亿字节,艾字节)=1024PB [6] 

1 ZB(Zettabyte,十万亿亿字节,泽字节)=1024EB [6] 

1YB( Yottabyte,一亿亿亿字节,尧字节)=1024ZB [6] 

BB( Brontobyte,千亿亿亿字节)=1024YB [6]

数据表操作

        1. 创建数据表

创建数据表的过程是规定数据列的属性的过程,同时也是实施数据完整性(包括实体完整性、引用完整性和域完整性)约束的过程。接下来我们介绍一下创建数据表的语法形式。

语法:

CREATE TABLE 表名(

列名 数据类型 约束,

...

)

注意:

在执行上面的指令之前,先检查一下当前数据库是不是我们所期望的数据库。如果不是,则可以用USE指令切换过来。语法:

USE 数据库名

2. 查询表结构

在 MySQL 中,使用 SQL 语句创建好数据表之后,可以查看结构的定义,以确认表的定义是否正确。

指令:

DESC 表名

3. 修改表结构

在 MySQL 中可以使用 ALTER TABLE 语句来改变原有表的结构,例如增加或删减列、更改原有列类型、重新命名列或表等。

其语法格式如下:

ALTER TABLE <表名> [修改选项]

修改选项的语法格式如下:

{ ADD COLUMN <列名> <类型>

| CHANGE COLUMN <旧列名> <新列名> <新列类型>

| ALTER COLUMN <列名> { SET DEFAULT <默认值> | DROP DEFAULT }

| MODIFY COLUMN <列名> <类型>

| DROP COLUMN <列名>

| RENAME TO <新表名>

3.1. 修改表名

ALTER TABLE 表名 RENAME TO 新表名

3.2. 添加字段

       3.2.1.添加到末尾:

ALTER TABLE 表名 ADD COLUMN 字段名 数据类型

        3.2.2. 添加到最前

ALTER TABLE 表名 ADD COLUMN 字段名 数据类型 FIRST

        3.2.3. 添加到中间

ALTER TABLE 表名 ADD COLUMN 字段名 数据类型 AFTER 已有字段名

        3.2.4. 删除字段

ALTER TABLE 表名 DROP COLUMN 字段名

        3.2.5. 修改字段名

ALTER TABLE 表名 CHANGE 旧字段名 新字段名 数据类型

        3.2.6. 修改字段数据类型

ALTER TABLE 表名 MODIFY 字段名 新数据类型

4. 删除数据表

在删除表的同时,表的结构和表中所有的数据都会被删除,因此在删除数据表之前最好先备份,以免造成无法挽回的损失。

使用 DROP TABLE 语句可以删除一个或多个数据表,语法格式如下:

DROP TABLE [IF EXISTS] 表名1 [ ,表名2, 表名3 ...]

4.1. 级联删除/级联更新cascade

级联删除:当删除主表的记录时,从表的相关记录也会一起删除

级联更新:当更新主表的记录时,从表的相关记录也会一起更新

删除SET NULL:当删除主表的记录时,从表的相关记录会变成NULL

更新SET NULL:当更新主表的记录时,从表的相关记录会变成NULL

删除restrict:当删除主表的记录时,如果数据被从表引用,则不能删除,要想删除,应该先删除从表的相关记录。

 更新restrict:当更新主表的记录时,如果数据被从表引用,则不能更新,要想更新,应该先修改从表的相关记录。

级联更新:ON UPDATE CASCADE

级联删除:ON DELETE CASCADE

常见约束

1. 主键约束

主键约束是使用最频繁的约束。在设计数据表时,一般情况下,都会要求表中设置一个主键。主键是表的一个特殊字段,该字段能唯一标识该表中的每条信息

通过主键,确定一个唯一的记录

使用主键应注意以下几点:

  1. 每个表只能定义一个主键。
  2. 主键值必须唯一标识表中的每一行,且不能为 NULL,即表中不可能存在有相同主键值的两行数据。这是唯一性原则
  3. 一个字段名只能在联合主键字段表中出现一次。
  4. 联合主键不能包含不必要的多余字段。当把联合主键的某一字段删除后,如果剩下的字段构成的主键仍然满足唯一性原则,那么这个联合主键是不正确的。这是最小化原则。

1.1.特点

确定为主键的列,不能为空,也不能重复

具体操作

指定主键约束,使用的是 PRIMARY KEY 关键字

一般来说,主键约束主要用在创建表时,指定约束的方式有两种:

1.2. 定义在列后

CREATE TABLE students (
sid INT (8) PRIMARY KEY,
sname VARCHAR(5),
department VARCHAR(32),
birthday date
)

1.3. 独立定义

如果在表已经创建好的前提下,还可以通过下列两种方式进行主键的指定和删除

CREATE TABLE students (
sid INT(8),
sname VARCHAR(5),
department VARCHAR(32),
birthday date,
PRIMARY KEY(sid)
)

1.4. 删除主键

ALTER TABLE students
DROP PRIMARY KEY;

1.5. 指定主键

ALTER TABLE students
ADD PRIMARY KEY(sid);

ALTER TABLE students
MODIFY sin INT PRIMARY KEY;

1.6. 主键自增

主键必须是整型,才能实现自增

CREATE TABLE students (
sid INT(8) PRIMARY KEY AUTO_INCREMENT,
sname VARCHAR(5),
department VARCHAR(32),
birthday date
)

主键自增一般用在创建表的时候,使用 AUTO_INCREMENT,直接跟在列名后即可

如果表已经创建好了,还可以进行是否自增的修改

1.6.1. 设置主键自增
ALTER TABLE students CHANGE sid sid INT AUTO_INCREMENT;
ALTER TABLE students MODIFY sid INT AUTO_INCREMENT;
1.6.2. 删除主键自增
ALTER TABLE students CHANGE sid sid INT;
ALTER TABLE students MODIFY sid INT;

说明:上面设置以及删除都给出了 CHANGE MODIFY 两种,有什么区别呢?

CHANGE 后要多一个列名 sid(可以修改) ,所以总结如下:

  • 只修改类型用 MODIFY
  • 既修改列名,也修改类型用 CHANGE

2. 非空约束

非空约束用来约束表中的字段不能为空

指定非空约束列的值不能为空,我们使用 NOT NULL 来实现这个功能

CREATE TABLE students  (
  sid INT(8) PRIMARY KEY AUTO_INCREMENT,
  sname varchar(5) NOT NULL, -- sname 不为空
  department varchar(32),
  birthday date
);

创建表完后,添加非空约束

ALTER TABLE students MODIFY sname VARCHAR(5) NOT NULL;

删除 sname 的非空约束

ALTER TABLE students MODIFY sname VARCHAR(5);

3. 唯一约束

唯一约束与主键约束有一个相似的地方,就是它们都能够确保列的唯一性。与主键约束不同的是,唯一约束在一个表中可以有多个,并且设置唯一约束的列是允许有空值的,虽然只能有一个空值。

唯一约束,就是指定这个字段(列)的值必须是唯一的,这种感觉就类似主键,例如我们下面要求创建表的时候,指定 sname 不能重名

CREATE TABLE students  (
  sid INT(8) PRIMARY KEY AUTO_INCREMENT,
  sname VARCHAR(5) NOT NULL UNIQUE, -- sname唯一 
s  department VARCHAR(32),
  birthday date
);

在创建表后,添加唯一约束

ALTER TABLE students MODIFY sname VARCHAR(8) UNIQUE;

删除唯一约束(本质上就是删除索引)

ALTER TABLE students DROP INDEX sname;-- 这两种方法都是可以的
drop index sname on students;

4. 外键约束

外键约束经常和主键约束一起使用,用来确保数据的一致性。

外键的理论定义是比较复杂的,我在以前公众号写过的一篇数据库理论文章中有提及过,但是这一篇我们重点讲解 MySQL 的使用,所以,我们把理论都换成例子和通俗的大白话,先来看个问题:

学生实体和课程实体分别用关系学生课程来表示,它们之间的联系用关系选课来表示

学生(学号,姓名,所在系,生日)
课程(课程编号,课程名,授课老师)
选课(学号,课程编号,成绩)

问题:判断各关系的候选键、主键、外键

答:

  • 学生中(students) 学号可以确认唯一的学生是候选键,可做主键,姓名需要在不重名的情况下也可以,但是实际情况不能保证没有重名不合适,课程中(course) 课程编号可以确认唯一的课程是候选键,可做主键,而选课中(sc_relation),需要由学号和课程编号共同才能确定唯一的值,所以两者共同构成候选键,并做主键
  • 选课关系中的 学号(sc_relation.sid)  课程号(sc_relation.cid) ,分别代表选课关系的外键,他们分别对应 学生关系的学号(students.sid) 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值