一、数据库简介:

1.数据库就是存储数据的仓库,其本质是一个文件系统,数据按照特定的格式将数据存储起来,用户可以对数据库中的数据进行增加,修改,删除及查询操作。
2.数据库管理系统(DataBase Management System,DBMS):指一种操作和管理数据库的大型软件,用于建立、使用和维护数据库,对数据库进行统一管理和控制,以保证数据库的安全性和完整性。用户通过数据库管理系统访问数据库中表内的数据

二、SQL语句:

2.1 SQL分类:

1.数据定义语言:简称DDL(Data Definition Language),用来定义数据库对象:数据库,表,列等。关键字:create,alter,drop等
2.数据操作语言:简称DML(Data Manipulation Language),用来对数据库中表的记录进行更新。关键字:insert,delete,update等
3.数据控制语言:简称DCL(Data Control Language),用来定义数据库的访问权限和安全级别,及创建用户。
4.数据查询语言:简称DQL(Data Query Language),用来查询数据库中表的记录。关键字:select,from,where等

2.2 数据库的数据类型:

分类 类型名称 说明
整数类型 tinyInt 很小的整数,1字节
smallint 小的整数,2字节
mediumint 中等大小的整数,3字节
int(integer) 普通大小的整数,4字节
bigint 大整数,8字节
小数类型 float 单精度浮点数,4字节
double 双精度浮点数,8字节
decimal(m,d) 压缩严格的定点数, m表示数字总位数,d表示保留到小数点后d位,不足部分就添0,如果不设置m、d,默认保存精度是整型
日期类型 year 年份 YYYY 1901~2155,1字节
time 时间 HH:MM:SS -838:59:59~838:59:59,3字节
date 日期 YYYY-MM-DD 1000-01-01~9999-12-3,3字节
datetime 日期时间 YYYY-MM-DD HH:MM:SS 1000-01-01 00:00:00~ 9999-12-31 23:59:59,8字节
timestamp 时间戳 YYYY-MM-DD HH:MM:SS 1970~01~01 00:00:01 UTC~2038-01-19 03:14:07UTC,4字节
文本、二进制类型 CHAR(M) M为0~255之间的整数,固定长度为M,不足后面补全空格
VARCHAR(M) M为0~65535之间的整数
BLOB 允许长度0~65535字节
TINYTEXT 允许长度0~255字节(0 ~ 2^8 - 1)
TEXT 允许长度0~65535字节(0 ~ 2^16 - 1)
LONGTEXT 允许长度0~4294967295字节(2^32 - 1)

三、数据库操作:

3.1 创建数据库语法:

1.#创建数据库 数据库中数据的编码采用的是安装数据库时指定的默认编码 utf8

  1. CREATE DATABASE day21_1;

2.#创建数据库 并指定数据库中数据的编码

  1. CREATE DATABASE day21_2 CHARACTER SET utf8;

3.#修改数据库编码

  1. ALTER DATABASE day21_2 CHARACTER SET=utf8;

4.查询所有数据库

  1. show databases

5.删除数据库(慎用)

  1. drop database day21_2;

6.进入指定数据库

  1. use day21_1;

7.查看正在使用的数据库

  1. select database();

3.2 表结构语法:

3.2.1 创建表结构

格式:
create table 表名(
字段名 类型(长度) 约束,
字段名 类型(长度) 约束
);

  1. CREATE TABLE sort (
  2. sid INT, #分类ID
  3. sname VARCHAR(100) #分类名称
  4. );

3.2.2 查看数据库中所有表

查询数据库中的所有表

  1. show tables;

3.2.3 查看指定表的结构

方法一: desc 表名;
方法二: SHOW COLUMNS FROM 表名;

  1. DESC student;
  2. SHOW COLUMNS FROM student;

image.png

3.2.4 删除表

格式:drop table 表名;

  1. DROP TABLE student;

3.4.4 修改表结构格式(添加列)

语法:alter table 表名 add 列名 类型(长度) 约束;
如下给表添加一个列字段:

  1. ALTER TABLE sort ADD sdesc VARCHAR(20);

如下是一条语句添加多条列字段:

  1. /*添加多个列方法一*/
  2. ALTER TABLE student
  3. ADD address VARCHAR(200) NOT NULL,
  4. ADD home_tel CHAR(11) NOT NULL;
  5. /*add语句之间用逗号分隔,最后用分号结束*/
  6. /*添加多个列方法二*/
  7. ALTER TABLE student
  8. ADD (address VARCHAR(200) NOT NULL,home_tel CHAR(11) NOT NULL);

ps:如果添加多列的情况下 只要是一个添加出现错误,则所有的添加都无效

语法:alter table 表名 add 列名 类型(长度) 约束 after 某个字段;(表示在哪个字段后面添加列)
语法:alter table 表名 modify 列名 类型(长度) 约束;(表示给列添加约束,modify)

3.4.5 修改表的列信息

语法:alter table 表名 change 旧列名 新列名 类型(长度) 约束;

  1. ALTER TABLE sort CHANGE sname snamename VARCHAR(30);

3.4.6 删除表中的字段

语法:alter table 表名 drop 列名;

  1. /*删除一列*/
  2. ALTER TABLE sort DROP snamename;
  3. /*删除多列*/
  4. ALTER TABLE student
  5. DROP home_address,
  6. DROP home_tel;

3.4.7 修改表名

语法:rename table 表名 to 新表名;

  1. RENAME TABLE sort TO category;

3.4.8 修改表的字符集

语法:alter table 表名 character set 字符集;

  1. ALTER TABLE student CHARACTER SET utf8;

3.4.9 DOS操作数据乱码解决

我们在dos命令行操作中文时,会报错
insert into user(username,password) values(‘张三’,’123’);
ERROR 1366 (HY000): Incorrect string value: ‘\xD5\xC5\xC8\xFD’ for column ‘username’ at row 1

原因:因为mysql的客户端编码的问题我们的是utf8,而系统的cmd窗口编码是gbk
如果想要永久修改,通过以下方式:
1.在mysql安装目录下有my.ini文件
default-character-set=gbk 客户端编码设置
character-set-server=utf8 服务器端编码设置
2.注意:修改完成配置文件,重启服务

3.3 表的约束:

3.3.1 主键约束

创建约束的目的就是保证数据的完整性和一致性。
主键对应的字段中的数据必须唯一,且不能为NULL, 一旦重复,数据操作失败(增和改)

3.3.1.1 给表中的字段添加主键约束

语法:Alter table 表名 add primary key(字段列表) auto_increment;

  1. Alter table student add primary key(sid);

3.3.1.2 删除表中的主键

语法:Alter table 表名 drop primary key;

  1. Alter table student drop primary key;

3.3.2 唯一键约束

1.一张表往往有很多字段需要具有唯一性,数据不能重复: 但是一张表中只能有一个主键: 唯一键(unique key)就可以解决表中有多个字段需要唯一性约束的问题.
2.唯一键的本质与主键差不多: 唯一键默认的允许自动为空,而且可以多个为空(空字段不参与唯一性比较)

3.3.3 外键约束

3.3.3.1 添加外键

语法:Alter table 表名 add [constraint 外键名字] foreign key(外键字段) references 父表(主键字段);

3.3.3.2 删除外键约束

语法:Alter table 表名 drop foreign key 外键名; — 一张表中可以有多个外键,但是名字不能相同

3.3.3.3 外键的作用:

1.对子表约束: 子表数据进行写操作(增和改)的时候, 如果对应的外键字段在父表找不到对应的匹配: 那么操作会失败.(约束子表数据操作)
2.对父表约束: 父表数据进行写操作(删和改: 都必须涉及到主键本身), 如果对应的主键在子表中已经被数据所引用, 那么就不允许操作

3.3.3.4 创建外键所需的条件:

1.外键要存在: 首先必须保证表的存储引擎是innodb(默认的存储引擎): 如果不是innodb存储引擎,那么外键可以创建成功,但是没有约束效果.
2.外键字段的字段类型(列类型)必须与父表的主键类型完全一致.
3.一张表中的外键名字不能重复.
4,增加外键的字段(数据已经存在),必须保证数据与父表主键要求对应.

3.4 索引:

索引: 系统根据某种算法, 将已有的数据(未来可能新增的数据),单独建立一个文件: 文件能够实现快速的匹配数据, 并且能够快速的找到对应表中的记录.

3.4.1 在创建表的时候添加索引:
语法:CREATE TABLE 表名称(
……,
INDEX [索引名称] (字段),
……
);

  1. CREATE TABLE t_message(
  2. id INT UNSIGNED PRIMARY KEY,
  3. content VARCHAR(200) NOT NULL,
  4. type ENUM("公告", "通报", "个人通知") NOT NULL,
  5. create_time TIMESTAMP NOT NULL,
  6. INDEX idx_type (type)
  7. );

3.4.2 在建表后创建索引:

3.4.2.1 创建普通索引:

语法一:CREATE INDEX 索引名称 ON 表名(字段);
语法二:ALTER TABLE 表名 ADD INDEX 索引名称(字段);

3.4.2.2 创建唯一索引

语法:CREATE UNIQUE INDEX 索引名 ON 表名(字段)

3.4.2.3 创建联合索引

语法:CREATE INDEX 索引名称 ON 表名(字段1,字段2,字段3)

  1. -- 普通索引:
  2. CREATE INDEX idx_type ON t_message(type); /*添加索引方式1*/
  3. ALTER TABLE t_message ADD INDEX idx_type(type);/*添加索引方式2*/
  4. -- 唯一索引:
  5. CREATE UNIQUE INDEX uidx_type ON t_message(type);
  6. -- 联合索引
  7. CREATE INDEX idx_type1_type2 ON t_message(type1, type2);

3.4.3 查询表中的索引

语法:SHOW INDEX FROM 表名

  1. SHOW INDEX FROM student

image.png

3.4.4 删除表中的索引

语法:DROP INDEX 索引名称 ON 表名;

  1. /* 在t_message表中删除idx_type索引 */
  2. DROP INDEX idx_type ON t_message;

3.4.4 创建索引的原则

  1. 数据量很大,且经常被查询的数据表可以设置索引 (即读多写少的表可以设置索引)
    2. 索引只添加在经常被用作检索条件的字段上 (比如电子商城需要在物品名称关键字加索引)
    3.不要在大字段上创建索引 (比如长度很长的字符串不适合做索引,因为查找排序时间变的很长)

四、数据库4大范式

4.1: 1NF(第一范式):

第一范式: 在设计表存储数据的时候, 如果表中设计的字段存储的数据,在取出来使用之前还需要额外的处理(拆分),那么说表的设计不满足第一范式。
第一范式要求字段的数据具有原子性: 不可再分.
第一范式是数据库的基本要求,不满足第一范式就不是关系型数据库

4.1.1 第一范式例子:

1NF—-原子性
eg1:
image.png
数据表的每一列都是不可分割的基本数据项,同一列中不能有多个值,也不能存在重复的属性。(年级和班级不可以分割)

4.2:2NF(第二范式):

2NF—-唯一性
数据表中的每条记录必须是唯一的。为了实现区分,通常要为表加上一个列来存储唯一标识,这个唯一属性列被称作主键列

4.2.1 第二范式例子:

eg1:
学号为230的学生在2018-07-15考试第一次58没及格,然后当天补考第二次还是58没及格,于是数据库就有了重复的数据。解决办法就是添加一个流水号,让数据变得唯一。
image.png

4.3:3NF(第三范式):

3NF—-关联性
每列都与主键有直接关系,不存在传递依赖

4.3.1 第三范式例子:

依照第三范式,数据可以拆分到不同的数据表,彼此保持关联
image.png

4.4:4NF(逆规范化):

有时候, 在设计表的时候,如果一张表中有几个字段是需要从另外的表中去获取信息. 理论上讲, 的确可以获取到想要的数据, 但是就是效率低一点. 会刻意的在某些表中,不去保存另外表的主键 , 而是直接保存想要的数据信息: 这样一来,在查询数据的时候, 一张表可以直接提供数据, 而不需要多表查询(效率低), 但是会导致数据冗余增加.
如讲师代课信息表

image.png

五、数据库高级(增删改查)

5.1 增加数据(INSERT):

语法:
插入一条数据:Insert [IGNORE] into 表名 [字段1,字段2,……] values (值1,值2,……);

插入多条数据:Insert [IGNORE] into 表名 [字段1,字段2,……] values (值1,值2,……), (值1,值2,……);
ps:IGNORE 代表数据表中存在重复的数据时,数据库不会报错而不会吧重复的数据添加进去

  1. INSERT INTO t_dept(deptno, dname, loc) VALUES(50, "技术部", "北京");#插入一条数据
  2. INSERT INTO t_dept(deptno, dname, loc) VALUES(50, "技术部", "北京"),(51,"开发部","成都");#插入多条数据

5.2 更新数据(UPDATE):

语法:
UPDATE [IGNORE] 表名 SET 字段1=值1, 字段2=值2, ……
[WHERE 条件1 ……]
[ORDER BY ……]
[LIMIT ……];

eg:把底薪低于公司平均底薪的员工,底薪增加150元
sql语句如下

  1. UPDATE t_emp e JOIN
  2. (SELECT AVG(sal) avg FROM t_emp) t
  3. ON e.sal<t.avg
  4. SET e.sal=e.sal+150;

5.3 删除语句(DELETE):

语法:
DELETE [IGNORE] FROM 表名
[WHERE 条件1, 条件2, …]
[ORDER BY …]
[LIMIT …];

子句执行顺序:FROM -> WHERE -> ORDER BY -> LIMIT -> DELETE
ps: ignore表示删除失败就直接忽略而不是报错。
eg1:删除10部门中,工龄超过20年的员工记录

  1. DELETE from t_emp
  2. WHERE deptno=10 AND DATEDIFF(NOW(),hiredate)/365 >20;

eg2:删除20部门中工资最高的员工记录

  1. DELETE FROM t_emp
  2. WHERE deptno=20
  3. ORDER BY sal+IFNULL(comm,0) DESC
  4. LIMIT 1;

5.4 查询数据(SELECT):

语法:
Select [字段别名] /*/All
from 表名
[where条件子句]
[group by子句]
[having子句]
[order by子句]
[limit 子句];
All或者*: 默认保留所有的结果
Distinct: 去重, 查出来的结果,将重复给去除(所有字段都相同)