文章目录
参考资料
本周进行了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;