索引

在企业真实环境中,用户数据往往至少百万级别的数据,当表中的数据量达到一定的程度之后,有些sql语句查询会比较慢。添加索引可以提高数据库的查询速度。

Mysql 数据库安装

数据库-01
下载 MySQL 安装包地址 : https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.25-1.el7.x86_64.rpm-bundle.tar

也可以直接从语雀下载

测试服务器连接

  1. Host: 1.117.45.85
  2. port: 3306
  3. username: fanmao
  4. password: ABCfanmao55..

创建数据库

image.png

  1. -- 显示所有的数据库
  2. show databases;

删除数据库

-- 删除数据库
DROP database 棍棍;

创建数据库

-- 创建数据库
create database gungun;

---

create database if not EXISTS gungun; -- 如果不存在gungun 数据库就创建

---

CREATE DATABASE if not EXISTS huahua
DEFAULT character set utf8  --  设置字符集为 utf8
DEFAULT collate utf8_bin;   -- 设置校验规则;

创建数据表

数据表存在数据库中,首先选择使用的数据库,

create table student (
    id int(10),
    name varchar(10),
    age int(3)
)

练习

  1. 创建数据库, 数据库的名字为 huahua_5501 (5501改为自己的学号)

    CREATE DATABASE if not EXISTS huahua_5501
    DEFAULT character set utf8  --  设置字符集为 utf8
    DEFAULT collate utf8_bin;   -- 设置校验规则;
    
  2. 使用自己创建的数据库

    use huahua_5501;
    
  3. 在自己的数据库中创建 表 student

  4. 表的列 | id | int | 序号 | | —- | —- | —- | | sname | varchar(50) | 学生姓名 | | birthday | datetime | 学生的生日 | | classid | varchar(10) | 班级编号 |
CREATE TABLE student
(
    id int(10),                       -- int 表示数字 最长10位的数字
    sname VARCHAR(50),        -- VARCHAR 表示内容为字符串 50 最长长度
    birthday datetime,         -- datetime 表示日期
    classid varchar(10)        --  
)

数据库表的数据类型

参考 https://www.runoob.com/mysql/mysql-data-types.html

添加数据

INSERT INTO `huahua_5500`.`student`
(`id`, `sname`, `birthday`, `classid`) 
VALUES 
(1, '张山', '2021-07-05 15:12:06', '101');

-- 添加数据

insert into student
(sname)  -- 列名
VALUES
("hh")       -- 具体的内容


SELECT * from student;

更新数据

update student set sname="hahahahaha" WHERE id = "4";


-- 名字为张三的人员 改为 李四

update student set sname="李四" WHERE sname="张山";

删除表

-- 1. 清空表数据, 表还在 数据没有
TRUNCATE TABLE student;

select * from student;

image.png

将表删掉, 表不存在。

-- 2. 删除表

DROP TABLE student;
Select * from student;

主键,外键

创建表 student

字段名 数据类型 为Null 主键
id int Not Null Primary key
sname varchar(50) Not Null
birthday datetime Not Null
sex varchar(2) Not Null

image.png
image.png
输入表名
image.png

练习

创建表 checkin 考勤表

字段名 数据类型 为Null 主键
id int not null yes
pno varchar(50) not null no
checktime datetime not null no

image.png

CREATE TABLE `huahua_5500`.`checkin`  (
  `id` int NOT NULL AUTO_INCREMENT,
  `pno` varchar(50) NOT NULL,
  `checktime` datetime NOT NULL,
  PRIMARY KEY (`id`)
);

创建表 person 人员表

字段名 数据类型 为Null 主键
id int not null yes
pno varchar(50) not null no
pname varchar(50) not null no
CREATE TABLE `huahua_5500`.`person`  (
  `id` int NOT NULL AUTO_INCREMENT,
  `pno` varchar(50) NOT NULL,
  `pname` varchar(50) NOT NULL,
  PRIMARY KEY (`id`)
);

image.png
添加数据 Person

id pno pname
1 A001 张莹佩
2 A002 王青渊

checkin数据

id pno checktime
1 A001 2021-07-06 12:00:00
2 A002 2021-07-06 12:00:01
3 A002 2021-07-06 12:00:03
4 A002 2021-07-06 02:00:00
5 A002 2021-07-07 12:00:00
INSERT INTO `huahua_5500`.`checkin`(`pno`, `checktime`) VALUES ('A001', '2021-07-06 16:40:25')

查询 今天考勤的数据, 输出 pno,pname,checktime

外键

在上面的练习中,现有 Person 表, 才会有 checkin 考勤表。 考勤表中的 pno 来源 person。

外键是一种约束。

考勤表中的 pno 必须是真实存在的,也就是说 首先在 Person 人员表中创建好人员数据,再在 checkin表中添加考勤数据时 pno数据必须依赖 person。

这时就需要创建外键约束;
image.png
注意事项:

  1. 先分析业务逻辑,排在后面表上创建 外键约束;
  2. 被引用父表 就是 排在前面的表。

  1. 先有 Person 创建人员表, 后有checkin 考勤表, 所以外键建在checkin 表上面
  2. 创建的是时候, 两个表中的 pno 保持一致, 被引用的父表 使用 person 表。

在checkin 表中添加数据的时候,会自动检查 pno 数据,如果添加的pno 数据不对,那么保存就失败。(数据约束)
image.png

问题

  1. 连接MySQL 出现 too many connections

image.png

-- 查看最大的连接数
show variables like "max_connections";

-- 设置最大链接数
set global max_connections = 2000;

作业

  1. (可选项) 参考上述的数据库搭建操作,在自己的服务器上搭建MySql 数据库。
  2. 创建下main

teacher 表

字段名 数据类型 为Null 主键 备注
id int not null yes 序号
tno varchar(50) not null no 老师工号
cno varchar(50) not null no 课程编号
tname varchar(50) not null no 老师名字

course 表

字段名 数据类型 为Null 主键 备注
id int not null yes 序号
cno varchar(50) not null no 课程编号
cname varchar(50) not null no 课程名称

student 表

字段名 数据类型 为Null 主键 备注
id int not null yes 序号
sno varchar(50) not null no 学生学号
sname varchar(50) not null no 学生姓名

adj 选课表

字段名 数据类型 为Null 主键 备注
id int not null yes 序号
sno varchar(50) not null no 学生学号
cno varchar(50) not null no 课程编号

表之间的关系为

  1. 给上述四个表添加外键
  2. 给上述表分别添加一些数据 (自由添加)
  3. 查询选修了语文课的所有学生,输出 老师名字,学生名字,课程名字。
    select tname,sname,cname from course
    inner join teacher on teacher.cno = course.cno
    inner join adj on adj.cno = course.cno
    inner join student on student.sno = adj.sno
    where course.cname ='语文'