MySQL基础知识讲解

参考资料

本周进行了Javaweb部分数据库的学习,安装了MySQL和Navicat,以下为参考资料
bilibili–尚硅谷–MySQL8.0版本的安装
bilibili–尚硅谷–MySQL 服务启动与用户登录
CSDN–MySQL+Navicat安装配置教程
CSDN–Navicat使用快速入门教程

数据库知识

如图:
DDL:操作数据库、表等
DML:对表中的数据进行增删改
DQL:对表中的数据进行查询
DCL:对数据库进行权限控制

>DDL

操作数据库
1.查询

查询数据库

show databases;

实现效果如下
在这里插入图片描述

2.创建

创建数据库

create database 数据库名称;

创建数据库(判断,如果不存在就创建)

create database if not exists 数据库名称;

实现效果如下
在这里插入图片描述

3.删除

删除数据库

drop database 数据库名称;

删除数据库(判断,如果存在就删除)

drop database if not exists 数据库名称;

实现效果如下
在这里插入图片描述

4.使用数据库

查看当前使用的数据库

select database();

使用数据库

use 数据库名称;

实现效果如下
在这里插入图片描述

操作数据表
1.创建
 create table 表名(
     字段名1  数据类型1,
     字段名2  数据类型2,
     ......
     字段名n  数据类型n
     );

注意:最后一行末尾,不要加逗号;小括号结束要加分号

例:创建如下表
在这里插入图片描述
实现效果如下
在这里插入图片描述

2.查询

查询当前数据库下所有表的名称

show tables;

查询表结构

desc 表名;

实现效果如下
在这里插入图片描述

3.数据类型

在这里插入图片描述

用法

1.定义某人年龄

age int

2.定义一个分数,为double类型,需确定其精度
score double(总长度,小数点后保留的位数)
例若分数的取值范围为0~100,小数点后位数为2

score double(5,3)

3.日期:birthday date

4.定长字符串 char与变长字符串 varchar
例:存储“张三”
name char(10) ——10:最大存储字符数,直接按最大字符数存储,存储“张三”占10个字符空间
name varchar(10),根据原始数据的长度,根据长度存储字符串,存储“张三”占2个字符空间

例:创建案例
需求:设计一张学生表
1 .编号
2 .姓名, 姓名最长不超过10 个汉字
3 .性别, 因为取值只有两种可能, 因此最多一个汉字
4 .生日, 取值为年月日
5 .入学成绩, 小数点后保留两位
6 .邮件地址, 最大长度不超过64
7 .家庭联系电话, 不一定是手机号码, 可能会出现- 等字符
8 .学生状态( 用数字表示, 正常、休学、毕业. “ )

实现效果如下
在这里插入图片描述
在这里插入图片描述

4.修改
1>修改表名
alter table 表名 rename to 新的表名;

实现效果如下
在这里插入图片描述

2>添加一列
alter table 表名 add 列名 数据类型;

实现效果如下
在这里插入图片描述

3>修改数据类型
alter table 表名 modify 列名 新数据类型;

实现效果如下
在这里插入图片描述

4>修改列名和数据类型
alter table 表名 change 列名 新列名 新数据类型;

实现效果如下
在这里插入图片描述

5>删除列
alter table 表名 drop 列名;

实现效果如下
在这里插入图片描述

5.删除

删除表

drop table 表名;

删除表时判断表是否存在

drop table if exists 表名;

>DML

操作数据
1.添加数据

1.给指定列添加数据

--INSERT INTO 表名(列名1,列名2,...)VALUES(值1,值2,...);

INSERT INTO stu(id,name)VALUES(1,'张三');

2.给全部列添加数据

--给所有列添加数据,列名的列表可以省略(建议不省略)

INSERT INTO stu(id,name,gender,birthday,score,emile,tel,state)VALUES(1,'李四','男','2000-12-20',89.90,'lisi@itcast.cn','13247888888',1);

INSERT INTO stu VALUES(1,'李四','男','2000-12-20',89.90,'lisi@itcast.cn','13247888888',1);

3.批量添加数据

INSERT INTO stu VALUES
(
2,'李四','男','2000-12-20',89.90,'lisi@itcast.cn','13247888888',1
),(
2,'李四','男','2000-12-20',89.90,'lisi@itcast.cn','13247888888',1
),(
2,'李四','男','2000-12-20',89.90,'lisi@itcast.cn','13247888888',1
);
2.修改数据
--修改数据 UPDATE 表名 SET 列名1 = 值1,列名2 = 值2,...[WHERE 条件];

--将张三的性别改为女

UPDATE stu SET gender = '女' WHERE name = '张三';

--注:如果update语句没有加where条件,则会将表中所有数据全部修改
3.删除数据
--删除 DELETE FROM 表名 [WHERE 条件];

--删除张三记录

DELETE FROM stu WHERE name = '张三';

DELETE FROM stu;

--注:删除语句中如果不加条件,则将所有数据都删除

>DQL

基础查询

1.查询多个字段

SELECT 字段列表 FROM 表名;

注:查询所有列数据,列名的列表可以使用*替代,不建议替代,会使代码索引失效

SELECT * FROM 表名;

2.去除重复记录

SELECT DISTINCT a字段列表 FROM 表名;

3.起别名

AS,AS可省略,若省略AS,别名和原始字段名之间至少有一个空格

SELECT 字段列表名 AS 别名 FROM 表名;

举个栗子:实现如下代码,创建一个名为stu的数据表

drop table if exists stu;

create table stu(
id int,
name varchar(20),
age int,
sex varchar(5),
address varchar(100),
math double(5,2),
english double(5,2),
hire_date date
);

INSERT INTO stu(id,name,age,sex,address,math,english,hire_date)
VALUES
(1,'张三',18,'男','杭州',66,78,'2004-08-07'),
(2,'李四',23,'男','湖南',98,87,'1999-09-12'),
(3,'王五',21,'女','北京',56,77,'2001-08-16'),
(4,'孙二',19,'男','武汉',76,65,'2003-05-14'),
(5,'赵一',22,'女','天津',86,NULL,'2002-09-27'),
(6,'郭九',19,'女','湖南',99,99,'2003-01-02'),
(7,'程十',18,'女','杭州',99,99,'2004-10-17'),
(8,'孟六',22,'男','杭州',56,65,'2002-06-09');

实现基础查询:

-- 基础查询===================================

-- 查询 name age 两列

SELECT name,age FROM stu;

-- 查询所有列数据,列名的列表可以使用*替代,不建议替代,会使代码索引失效

SELECT * FROM stu;

SELECT id,name,age,sex,address,math,english,hire_date FROM stu;

-- 查询地址信息

SELECT address FROM stu;

-- 去除重复记录

SELECT DISTINCT address FROM stu;

-- 查询姓名,数学成绩,英语成绩

SELECT name,math,english FROM stu;

SELECT name,math AS 数学成绩,english AS 英语成绩 FROM stu;
条件查询

1.语法

SELECT 字段列表 FROM 表名 WHERE 条件列表;

2.条件
在这里插入图片描述

-- SELECT 字段列表 FROM 表名 WHERE 条件列表;
-- 查询年龄大于20岁的学员信息

SELECT age FROM stu WHERE age>20;

SELECT * FROM stu WHERE age>20;

-- 查询入学日期在'2001-01-01''2004-01-01'

SELECT hire_date FROM stu WHERE hire_date>'2001-01-01' AND hire_date<'2004-01-01';

-- 查询年龄等于19岁的学员信息

SELECT name,age FROM stu WHERE age=19;

-- 查询年龄不等于19岁的学员信息

SELECT name,age FROM stu WHERE age != 19;

-- 查询 年龄等于18岁 或 年龄等于22岁 或 年龄等于23岁 的学员信息

SELECT name,age FROM stu WHERE age=18 or age=22 or age=23;

SELECT name,age FROM stu WHERE age IN(18,22,23);

-- 查询英语成绩为null的学员信息

SELECT * FROM stu WHERE english is null;

模糊查询 ——— LIKE占位符

1)_:代表单个任意字符

2)%:代表任意个数字符

drop table if exists stu;

create table stu(
id int,
name varchar(20),
age int,
sex varchar(5),
address varchar(100),
math double(5,2),
english double(5,2),
hire_date date
);

INSERT INTO stu(id,name,age,sex,address,math,english,hire_date)
VALUES
(1,'张加佳',18,'男','杭州',66,78,'2004-08-07'),
(2,'王灿',23,'男','湖南',98,87,'1999-09-12'),
(3,'张辉',21,'女','北京',56,77,'2001-08-16'),
(4,'马柳佳',19,'男','武汉',76,65,'2003-05-14'),
(5,'赵斌',22,'女','天津',86,NULL,'2002-09-27'),
(6,'马加峰',19,'女','湖南',99,99,'2003-01-02'),
(7,'王保国',18,'女','杭州',99,99,'2004-10-17'),
(8,'孟佳琪',22,'男','杭州',56,65,'2002-06-09');

-- 查询姓‘王’的学员信息

SELECT * FROM stu WHERE name LIKE '王%';

-- 查询第二个字是‘加’的学员信息

SELECT * FROM stu WHERE name LIKE '_加%';

-- 查询名字中包含‘佳’的学员信息

SELECT * FROM stu WHERE name LIKE '%佳%';

排序查询

语法

-- SELECT 字段列表 FROM 表名 ORDER BY 排序字段名1[排序方式1],排序字段名2[排序方式2]...;

排序方式:
ASC:升序排列
DESC:降序排列

注:如果有多个排序条件,当前的排序条件下条件值一样时,才会根据第二条件进行排序

-- 查询学生信息,按照年龄升序排列

SELECT * FROM stu ORDER BY age ASC;

-- 查询学生信息,按照数学成绩降序排列

SELECT * FROM stu ORDER BY math DESC;

-- 查询学生信息,按照数学成绩降序排列,如果数学成绩一样,在按照英语成绩升序排列

SELECT * FROM stu ORDER BY math DESC,english ASC;

聚合函数

概念
对一组数据进行汇总的函数,作用于一组数据,并对一组数据返回一个值
在这里插入图片描述
语法

SELECT 聚合函数名(列名) FROM 表

例:

-- 统计班级总人数

SELECT COUNT(id) FROM stu;

-- 查询数学成绩最高分

SELECT MAX(math) FROM stu;

-- 查询数学成绩最低分

SELECT MIN(math) FROM stu;

-- 查询数学成绩总分

SELECT SUM(math) FROM stu;

-- 查询数学成绩平均分

SELECT AVG(math) FROM stu;

分组查询

语法:

SELECT 字段列表 FROM 表名 [WHERE 分组前限定条件] GROUP BY 分组字段名[HAVING 分组后条件过滤];

WHERE 和 HAVING:
– WHERE是分组之前进行限定,不满足WHERE条件,则不参与分组,且WHERE不能对聚合函数进行判断
– HAVING是分组之后对结果进行过滤,且能对聚合函数进行判断

例:

-- 查询男同学和女同学各自的数学平均分

SELECT sex,avg(math) FROM stu GROUP BY sex;

-- 查询男同学和女同学各自的数学平均分,以及各自人数

SELECT sex,avg(math),COUNT(*) FROM stu GROUP BY sex;

-- 查询男同学和女同学各自的数学平均分,以及各自人数,要求:分数低于70分的不参与分组

SELECT sex,avg(math),COUNT(*) FROM stu WHERE math>70 GROUP BY sex;

-- 查询男同学和女同学各自的数学平均分,以及各自人数,要求:分数低于70分的不参与分组,分组之后要求人数大于2

SELECT sex,avg(math),COUNT(*) FROM stu WHERE math>70 GROUP BY sex HAVING COUNT(*)>2;

分页查询

语法

SELECT 字段列表 FROM 表名 LIMIT 起始索引,查询条目数;

起始索引:从0开始
计算公式:起始索引 = (当前页码-1)*每页显示条数

-- 从0开始查询,查询3条数据

SELECT * FROM stu LIMIT 0,3;

-- 每页显示3条数据,查询第1页数据

SELECT * FROM stu LIMIT 0,3;

-- 每页显示3条数据,查询第2页数据

SELECT * FROM stu LIMIT 3,3;

-- 每页显示3条数据,查询第3页数据

SELECT * FROM stu LIMIT 6,3;

>约束

概念

约束是作用于表中列上的规则,用于限制加入表中的数据

分类
约束名称描述
非空约束(NOT NULL)保证列表中所有数据不能有null值
唯一约束(UNIQUE)保证列中所有数据各不相同
主键约束(PRIMARY KEY)主键是一行数据的唯一标识,要求非空且唯一
检查约束(CHECK)保证列表中的值满足某一条件
默认约束(DEFAULT)保存数据时,未指定值则采用默认值
外键约束(FOREIGN KEY)外键用来让两个表的数据之间建立链接,保证数据的一致性和完整性

案例:根据需求,为表添加合适的约束

首先,创建如下表

-- 员工表
-- 员工表
CREATE TABLE emp(
	id INT PRIMARY KEY auto_increment, -- 员工id,主键且自增长
	ename VARCHAR(50) NOT NULL UNIQUE, -- 员工姓名,非空且唯一
	joindate DATE NOT NULL, -- 入职日期,非空
	salary DOUBLE(7,2) NOT NULL, -- 工资 非空
	bonus DOUBLE(7,2) DEFAULT 0 -- 奖金 如果没有奖金默认为0
);

然后练习

INSERT INTO emp(id,ename,joindate,salary,bonus) values(1,'张三','1999-11-11',8800,5000);

-- 演示主键约束:非空且唯一
INSERT INTO emp(id,ename,joindate,salary,bonus) values(null,'张三','1999-11-11',8800,5000); -- 错误(违反非空性)

INSERT INTO emp(id,ename,joindate,salary,bonus) values(1,'张三','1999-11-11',8800,5000); -- 错误(违反唯一性)

INSERT INTO emp(id,ename,joindate,salary,bonus) values(2,'李四','1999-11-11',8800,5000);

-- 演示非空约束
INSERT INTO emp(id,ename,joindate,salary,bonus) values(3,null,'1999-11-11',8800,5000); -- 错误(违反非空性)

-- 演示唯一约束
INSERT INTO emp(id,ename,joindate,salary,bonus) values(3,'李四','1999-11-11',8800,5000); -- 错误(违反唯一性)

-- 演示默认约束
INSERT INTO emp(id,ename,joindate,salary) values(4,'王五','1999-11-11',8800);

INSERT INTO emp(id,ename,joindate,salary) values(5,'孙二','1999-11-11',8800);

SELECT * from emp; 语句查询表,实现结果如下
在这里插入图片描述


-- 演示自动增长

INSERT INTO emp(ename,joindate,salary,bonus) values('张三1','1999-11-11',8800,5000);

INSERT INTO emp(id,ename,joindate,salary,bonus) values(NULL,'张三2','1999-11-11',8800,5000);

SELECT * from emp; 语句查询表,实现结果如下
在这里插入图片描述

外键约束

概念:

用来让两个表的数据之间建立链接,保证数据统一和完整

语法:
添加外键,dep_id,关联 dept 表的id主键,使用语法一或语法二

语法1(创建表时添加外键)

 CONSTRAINT 外键名称 FOREIGN KEY(外键列名)REFERENCES 主表(主表列名)

语法2(建完表后添加外键)

 ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名称) REFERENCES 主表名称(主表列名称)

删除外键

ALTER TABLE 表名 DROP FOREIGN KEY 外键名称;
-- 外键约束

-- 创建两张表,一张部门表,一张员工表
drop TABLE IF EXISTS dept;

CREATE TABLE dept( -- 部门表
	id INT PRIMARY KEY auto_increment, -- 主键且自增
	dep_name VARCHAR(20),
	addr VARCHAR(50)
);

drop TABLE IF EXISTS emp;

create TABLE emp( -- 员工表
	id INT PRIMARY KEY auto_increment, -- 主键且自增
	ename VARCHAR(50) NOT NULL UNIQUE,
	age INT,-- CHECK
	dep_id INT
	-- 添加外键,dep_id,关联 dept 表的id主键,使用语法一或语法二
	-- 语法1(创建表时添加外键): CONSTRAINT 外键名称 FOREIGN KEY(外键列名)REFERENCES 主表(主表列名)
	-- CONSTRAINT fk_emp_dept FOREIGN KEY(dep_id) REFERENCES dept(id)
);

-- 语法2(建完表后添加外键): ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名称) REFERENCES 主表名称(主表列名称)
 ALTER TABLE emp ADD CONSTRAINT fk_emp_dept FOREIGN KEY (dep_id) REFERENCES dept(id);

-- 添加两个部门
INSERT INTO dept(dep_name,addr)VALUES
('研发部','广州'),('销售部' , '深圳');

-- 添加员工,dep_id表示员工所在的部门
INSERT INTO emp(ename,age,dep_id)VALUES
('张三',20,1),
('李四',20,1),
('王五',20,1),
('赵六',20,2),
('孙七',22,2),
('孟八',18,2);

SELECT * from emp;
SELECT * from dept;


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值