MySQL超详细学习教程,全网最硬核学习路线!
1. 数据库的相关概念
1.1 数据
1.2 数据库
1.3 数据库管理系统
1.4 数据库系统
1.5 SQL
2. MySQL数据库
2.1 MySQL安装
这里选择下载的产品版本是 5.7.24
,原因是各个库支持的最完善且相对于最新版本更加的稳定。
2.2 MySQL配置
2.2.1 添加环境变量
2.2.2 新建配置文件
[mysql]
default-character-set=utf8
[mysqld]
character-set-server=utf8
default-storage-engine=INNODB
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
2.2.3 初始化MySQL
mysqld --initialize-insecure
2.2.4 注册MySQL服务
mysqld -install
2.2.5 启动MySQL服务
net start mysql
net stop mysql
mysqladmin -u root password 1234
2.3 MySQL登录和退出
mysql -uroot -p密码
mysql -u用户名 -p密码 -h要连接的mysql服务器的ip地址(默认127.0.0.1) -P端口号(默认3306)
exit
quit
2.4 MySQL卸载
net stop mysql
mysqld -remove mysql
2.5 MySQL数据模型
3. SQL语句
3.1 SQL简介
3.2 通用语法
3.3 SQL分类
4. DDL- 操作数据库
4.1 查询
show databases;
4.2 创建数据库
create database 数据库名称;
create database if not exists 数据库名称;
4.3 删除数据库
drop database 数据库名称;
drop database if exists 数据库名称;
4.4 使用数据库
use 数据库名称;
select database();
5. DDL- 操作数据表
5.1 数据类型
数据类型 | 解释 |
---|---|
tinyint | 小整数型,占1个字节 |
int | 大整数型,占4个字节 |
double | 浮点类型 |
数据类型 | 解释 |
---|---|
date | 日期值,只包含年月日 |
datetime | 混合日期和时间值,包含年月日时分秒 |
数据类型 | 解释 |
---|---|
char | 定长字符串 |
varchar | 变长字符串 |
5.2 查询表
show tables;
desc 表名称;
5.3 创建表
create table 表名称(
字段名1 数据类型,
字段名2 数据类型,
...
字段名n 数据类型 #这里是不需要加上,的
);
5.4 删除表
drop table 表名;
drop table if exists 表名;
5.5 修改表
alter table 表名 rename to 新的表名;
alter table 表名 add 列名 数据类型;
alter table 表名 modify 列名 新数据类型;
alter table 表名 change 列名 新列名 新数据类型;
alter table 表名 drop 列名;
6. 实战案例详解
create database if not exists student;
use student;
create table stu(
id int ,-- 编号
name varchar(10),-- 姓名
gender char(1),-- 性别
birthday date,-- 生日
score double(5,2) ,-- 分数
addr varchar(50),-- 地址
status tinyint-- 状态
);
7. DML- 增删改数据
7.1 添加数据
insert into 表名(列名1,列名2...) values(值1,值2...);
insert into 表名 values(值1,值2...);
insert into 表名(列名1,列名2...) values(值1,值2...),(值1,值2...),(值1,值2...)...;
insert into 表名 values(值1,值2...),(值1,值2...),(值1,值2...)...;
select * from 表名;
insert into tb_user(id,name) values(2,'李四');
7.2 修改数据
update 表名 set 列名1=值1,列名2=值2...[where 条件];
update tb_user set passwor d ='abc123' where name='张三';
7.3 删除数据
delete from 表名 [where 条件];
delete from tb_user where name='李四';
8. DQL- 数据的查询操作
SELECT
字段列表
FROM
表名列表
WHERE
条件列表
GROUP BY
分组字段
HAVING
分组后条件
ORDER BY
排序字段
LIMIT
分页限定
-- 删除stu表
drop table if exists stu;
-- 创建stu表
CREATE TABLE stu (
id int, -- 编号
name varchar(10), -- 姓名
age int, -- 年龄
gender varchar(5), -- 性别
math double(5,2), -- 数学成绩
english double(5,2) -- 英语成绩
);
-- 添加数据
INSERT INTO stu(id,name,age,gender,math,english)
VALUES
(1,'小张',23,'男',66,78),
(2,'小李',20,'女',98,87),
(3,'小陈',55,'男',56,77),
(4,'小樊',20,'女',76,65),
(5,'小马',20,'男',86,NULL),
(6,'小赵',57,'男',99,99);
8.1 基础查询
1. 基础查询语法
select 字段列表 from 表名;
select * from 表名;
select distinct 字段列表 from 表名;
select 字段名 别名 from 表名;
2. 基础查询练习
select name,math from stu;
select name,english 英语成绩 from stu;
8.2 条件查询
1. 条件查询语法
select 字段列表 from 表名 where 条件列表;
运算符 | 功能描述 |
---|---|
> | 大于 小于 等于 不等于 |
between…and… | 在这个范围之内 |
in(…) | 多选一 |
is null / is not null | 是null / 不是null |
and 或 && | 并且 |
or 或 || | 或者 |
2. 条件查询练习
select * from stu where age>20;
select * from stu where age in(18,20,21);
select * from stu where name like '%张%';
8.3 排序查询
1. 排序查询语法
select 字段列表 from 表名 order by 排序字段名1 [排序方式]...;
2. 排序查询练习
select * from stu order by math DESC;
8.4 聚合函数
1. 聚合函数语法
函数名 | 功能 |
---|---|
count(列名) | 统计数量(一般选用不为null的列) |
max(列名) | 最大值 |
min(列名) | 最小值 |
sum(列名) | 求和 |
avg(列名) | 平均值 |
select 聚合函数 from 表名;
2.聚合函数练习
select count(id) from stu;
select count(*) from stu;
select avg(math) from stu;
8.5 分组查询
1. 分组查询语法
select 字段列表 from 表名 [where 分组前的条件限定] group by 分组字段名 [having 分组后的条件过滤]
2. 分组查询练习
select gender, avg(math),count(*) from stu where math > 70 group by gender;
select gender, avg(math),count(*) from stu where math > 70 group by gender having count(*) > 2;
8.6 分页查询
1. 分页查询语法
select 字段列表 from 表名 limit 查询起始索引,查询条目数;
2. 分页查询练习
select * from stu limit 0,3;
9. 约束的概念
10. 约束的分类
约束类型 | 功能 |
---|---|
非空约束 NOT NULL | 保证列中所有的数据不能有null值 |
唯一约束 UNIQUE | 保证列中所有数据各不相同 |
主键约束 PRIMARY KEY | 主键是一行数据的唯一标识,要求非空且唯一 |
检查约束 CHECK | 保证列中的值满足某一条件 |
默认约束 DEFAULT | 保存数据时,未指定值则采用默认值 |
外键约束 FOREIGN KEY | 外键用来让两个表的数据之间建立链接,保证数据的一致性和完整性 |
11. 非空约束
CREATE TABLE 表名(
列名 数据类型 NOT NULL,
…
);
ALTER TABLE 表名 MODIFY 字段名 数据类型 NOT NULL;
ALTER TABLE 表名 MODIFY 字段名 数据类型;
12. 唯一约束
CREATE TABLE 表名(
列名 数据类型 UNIQUE [AUTO_INCREMENT],
-- AUTO_INCREMENT: 当不指定值时自动增长
…
);
CREATE TABLE 表名(
列名 数据类型,
…
[CONSTRAINT] [约束名称] UNIQUE(列名)
);
ALTER TABLE 表名 MODIFY 字段名 数据类型 UNIQUE;
ALTER TABLE 表名 DROP INDEX 字段名;
13. 主键约束
CREATE TABLE 表名(
列名 数据类型 PRIMARY KEY [AUTO_INCREMENT],
…
);
CREATE TABLE 表名(
列名 数据类型,
[CONSTRAINT] [约束名称] PRIMARY KEY(列名)
);
ALTER TABLE 表名 ADD PRIMARY KEY(字段名);
ALTER TABLE 表名 DROP PRIMARY KEY;
14. 默认约束
CREATE TABLE 表名(
列名 数据类型 DEFAULT 默认值,
…
);
ALTER TABLE 表名 ALTER 列名 SET DEFAULT 默认值;
ALTER TABLE 表名 ALTER 列名 DROP DEFAULT;
15. 外键约束
CREATE TABLE 表名(
列名 数据类型,
…
[CONSTRAINT] [外键名称] FOREIGN KEY(外键列名) REFERENCES 主表(主表列名)
);
ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名称) REFERENCES 主表名称(主表列名称);
ALTER TABLE 表名 DROP FOREIGN KEY 外键名称;
16. 约束的案例练习
-- 删除stu表
drop table if exists stu;
-- 创建stu表
CREATE TABLE stu (
id int primary key, -- 编号 主键
name varchar(10) not null unique, -- 姓名 非空,唯一
age int not null, -- 年龄 非空
gender varchar(5) not null, -- 性别 非空
math double(5,2) not null, -- 数学成绩 非空
english double(5,2) default 0 -- 英语成绩 默认为0
);
insert into stu(id,name,age,gender,math,english) values(1,'小张',23,'男',66,78);
insert into stu(id,name,age,gender,math,english) values (null,'小李',20,'女',98,87);
insert into stu(id,name,age,gender,math,english) values (1,'小陈',55,'男',56,77);
insert into stu(id,name,age,gender,math,english) values (2,NULL,20,'女',76,65);
验证唯一约束:
insert into stu(id,name,age,gender,math,english) values
(5,'小张',20,'男',86,NULL);
insert into stu(id,name,age,gender,math) values (6,'小赵',23,'男',99);
-- 删除表
DROP TABLE IF EXISTS emp;
DROP TABLE IF EXISTS dept;
-- 部门表
CREATE TABLE dept(
id int primary key auto_increment,
dep_name varchar(20),
addr varchar(20)
);
-- 员工表
CREATE TABLE emp(
id int primary key auto_increment,
name varchar(20),
age int,
dep_id int,
-- 添加外键 dep_id,关联 dept 表的id主键
CONSTRAINT fk_emp_dept FOREIGN KEY(dep_id) REFERENCES dept(id)
);
-- 添加 2 个部门
insert into dept(dep_name,addr) values
('研发部','西安'),('销售部', '成都');
-- 添加员工,dep_id 表示员工所在的部门
INSERT INTO emp (NAME, age, dep_id) VALUES
('张三', 20, 1),
('李四', 20, 2);
17. 数据库设计
17.1 概念
17.2 表的关系
-- 删除表
DROP TABLE IF EXISTS tb_emp;
DROP TABLE IF EXISTS tb_dept;
-- 部门表
CREATE TABLE tb_dept(
id int primary key auto_increment,
dep_name varchar(20),
addr varchar(20)
);
-- 员工表
CREATE TABLE tb_emp(
id int primary key auto_increment,
name varchar(20),
age int,
dep_id int,
-- 添加外键 dep_id,关联 dept 表的id主键
CONSTRAINT fk_emp_dept FOREIGN KEY(dep_id) REFERENCES tb_dept(id)
);
-- 删除表
DROP TABLE IF EXISTS tb_order_goods;
DROP TABLE IF EXISTS tb_order;
DROP TABLE IF EXISTS tb_goods;
-- 订单表
CREATE TABLE tb_order(
id int primary key auto_increment,
payment double(10,2),
payment_type TINYINT,
status TINYINT
);
-- 商品表
CREATE TABLE tb_goods(
id int primary key auto_increment,
title varchar(100),
price double(10,2)
);
-- 订单商品中间表
CREATE TABLE tb_order_goods(
id int primary key auto_increment,
order_id int,
goods_id int,
count int
);
-- 建完表后,添加外键
alter table tb_order_goods add CONSTRAINT fk_order_id FOREIGN key(order_id) REFERENCES
tb_order(id);
alter table tb_order_goods add CONSTRAINT fk_goods_id FOREIGN key(goods_id) REFERENCES
tb_goods(id);
create table tb_user_desc (
id int primary key auto_increment,
city varchar(20),
edu varchar(10),
income int,
status char(2),
des varchar(100)
);
create table tb_user (
id int primary key auto_increment,
photo varchar(100),
nickname varchar(50),
age int,
gender char(1),
desc_id int unique,
-- 添加外键
CONSTRAINT fk_user_desc FOREIGN KEY(desc_id) REFERENCES tb_user_desc(id)
);
18. 多表查询
DROP TABLE IF EXISTS emp;
DROP TABLE IF EXISTS dept;
# 创建部门表
CREATE TABLE dept(
did INT PRIMARY KEY AUTO_INCREMENT,
dname VARCHAR(20)
);
# 创建员工表
CREATE TABLE emp (
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(10),
gender CHAR(1), -- 性别
salary DOUBLE, -- 工资
dep_id INT,
FOREIGN KEY (dep_id) REFERENCES dept(did) -- 外键,关联部门表(部门表的主键)
);
-- 添加部门数据
INSERT INTO dept (dNAME) VALUES ('研发部'),('财务部'),('销售部');
-- 添加员工数据
INSERT INTO emp(NAME,gender,salary,dep_id) VALUES
('小张','男',3000,1),
('小李','女',3600,2),
('小王','男',9000,2),
('小美','女',5000,null);
18.1 内连接查询
-- 隐式内连接查询
SELECT 字段列表 FROM 表1,表2… WHERE 条件;
-- 显示内连接查询
SELECT 字段列表 FROM 表1 [INNER] JOIN 表2 ON 条件;
select * from emp,dept where dep_id=did;
select * from emp inner join dept on dep_id=did;
18.2 外连接查询
-- 左外连接
SELECT 字段列表 FROM 表1 LEFT [OUTER] JOIN 表2 ON 条件;
-- 右外连接
SELECT 字段列表 FROM 表1 RIGHT [OUTER] JOIN 表2 ON 条件;
select * from emp left outer join dept on dep_id=did;
select * from emp right outer join dept on dep_id=did;
18.3 子查询
select * from emp where salary >(select salary from emp where name='小李');
select * from emp where dep_id in (select did from dept where dname='研发部' or dname= '财务部');
select * from (select * from emp where salary>3000) t1, dept where t1.dep_id=dept.did;
19. 事务
19.1 概念
19.2 语法
START TRANSACTION;
或者
BEGIN;
commit;
rollback;
DROP TABLE IF EXISTS account;
-- 创建账户表
CREATE TABLE account(
id int PRIMARY KEY auto_increment,
name varchar(10),
money double(10,2)
);
-- 添加数据
INSERT INTO account(name,money) values('张三',1000),('李四',1000);
-- 开启事务
BEGIN;
-- 转账操作
-- 1. 查询李四账户金额是否大于500
-- 2. 张三账户 -500
UPDATE account set money = money - 500 where name = '张三';
3%0;--出现异常
-- 3. 李四账户 +500
UPDATE account set money = money + 500 where name = '李四';
-- 提交事务
COMMIT;
-- 回滚事务
ROLLBACK;