前言:
什么是JavaWeb?
Web:全球广域网,也称为万维网(www),能够通过浏览器访问的网站
JavaWeb:是用Java技术来解决相关web互联网领域的技术栈
- 网页:展现数据
- 数据库:存储和管理数据
- JavaWeb程序:逻辑处理
第一部分 数据库
(一)数据库相关概念
1.数据库
存储数据的仓库,数据是有组织的进行存储
英文:DataBase,简称 DB。
![](https://i-blog.csdnimg.cn/blog_migrate/727279ea54e057c42602a57e33e2d2a0.png)
2.数据库管理系统
管理数据库的大型软件。
英文:DataBase Management System,简称 DBMS。
3.SQL
英文:Structured Query Language,简称SQL,结构化查询语言。
操作关系型数据库的编程语言。
定义操作所有关系型数据库的统一标准。
(二)MySQL数据库(管理系统)
1.MySQL安装
MySQL官网下载:
2.配置
(1)添加环境变量
环境娈量里面有很多选项,这里我们只用到Path(路径)这个参数。
为什么在初始化的开始要添加环境变量呢?
在黑框(即CMD)中输入一个可执行程序的名字,Windows会先在环境变量中的Path所指的路径中寻找一遍,如果找到了就直接执行,没找到就在当前工作目录找,如果还没找到,就报错。我们添加环境变量的目的就是能够在任意一个黑框直接调用MySQL中的相关程序而不用总是修改工作目录,大大简化了操作。
(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
文件保存为my.ini
(3) 初始化MySQL
在命令行窗口中敲入mysqld --initialize-insecure,回车,稍微等待一会,如果出现没有出现报错信息,则证明data目录初始化没有问题,此时再查看MySQL目录下已经有data目录生成。
mysqld --initialize-insecure
注意:要使用管理员身份运行!!!
(4) 注册MySQL服务
在命令行窗口中敲入mysqld -install
mysqld -install
现在你的计算机上已经安装好了MySQL服务了。
(5) 启动MySQL服务
在命令行窗口中敲入net start mysql
net start mysql//启动mysql服务
net stop mysql//停止mysql服务
(6) 在黑框里敲入mysqladmin -u root password 1234,这里的1234就是指默认管理员(即root账户)的密码,可以自行修改成你喜欢的。
mysqladmin -u root password 1234
至此,MySQL配置完毕!
3.登录MySQL
在命令行窗口中输入,mysql -uroot -p1234,若出现下图且左下角为mysq1>,则登录成功。
mysql -uroot -p1234
退出mysql:
exit
或quit
登录参数:
mysql -u用户名 -p密码 -h要连接的mysql服务器的ip地址(默认127.0.0.1) -P端口号(默认3306)
4.MySQL数据模型
关系型数据库
关系型数据库是建立在关系模型基础上的数据库,简单说,关系型数据库是由多张能互相连接的 二维表 组成的数据库
优点:
- 都是使用表结构,格式一致,易于维护。
- 使用通用的SQL语言操作,使用方便,可用于复杂查询。
- 数据存储在磁盘中,安全。
创建数据库:
create database db1;
(三)SQL
1.SQL简介
-
英文:Structured Query Language,简称SQL
-
结构化查询语言,一门操作关系型数据库的编程语言
-
定义操作所有关系型数据库的统一标准
-
对于同一个需求,每一种数据库操作的方式可能会存在一些不一样的地方,我们称为“方言”
2.SQL通用语法
- SQL语句可以单行或多行书写,以分号结尾。
- MySQL数据库的SQL语句不区分大小写,关键字建议使用大写。
- 注释:
单行注释:-- 注释内容 或 #注释内容(MySQL特有)
-- 后要加空格
多行注释:/* 注释 */
3.SQL分类
-
DDL(Data Definition Language)数据定义语言,用来定义数据库对象:数据库,表,列等
-
DML(Data Manipulation Language)数据操作语言,用来对数据库中表的数据进行增删改
-
DQL(Data Query Language)数据查询语言,用来查询数据库中表的记录(数据)
-
DCL(Data Control Language)数据控制语言,用来定义数据库的访问权限和安全级别,及创建用户
4.DDL
(1)DDL --操作数据库
1)查询
SHOW DATABASES;
2)创建
- 创建数据库
CREATE DATABASE 数据库名称;
- 创建数据库(判断,如果不存在则创建)
CREATE DATABASE IF NOT EXISTS 数据库名称;
3)删除
- 删除数据库
DROP DATABASE 数据库名称;
- 删除数据库(判断,如果存在则删除)
DROP DATABASE IF EXISTS 数据库名称;
4)使用数据库
- 查看当前使用的数据库
SELECT DATABASE();
- 使用数据库
USE 数据库名称;
(2)DDL--操作表
1)创建(Create)
CREATE TABLE 表名(
字段名1 数据类型1,
字段名2 数据类型2,
...
字段名n 数据类型n
);
注意:最后一行末尾,不能加逗号!
2)查询(Retrieve)
- 查询当前数据库下所有表名称
SHOW TABLES;
- 查询表结构
DESC 表名称;
3)修改(Update)
修改表名
ALTER TABLE 表名 RENAME TO 新的表名;
添加一列
ALTER TABLE 表名 ADD 列名 数据类型;
修改数据类型
ALTER TABLE 表名 MODIFY 列名 新数据类型;
修改列名和数据类型
ALTER TABLE 表名 CHANGE 列名 新列名 新数据类型;
删除列
ALTER TABLE 表名 DROP 列名;
4)删除(Delete)
- 删除表
DROP TABLE 表名;
- 删除表时判断表是否存在
DROP TABLE IF EXISTS 表名;
5)数据类型
MySQL支持多种类型,可以分为三类:
-
数值
-
日期
-
字符串
6)创建案例
需求:设计一张学生表,请注重数据类型、长度的合理性
-
编号
-
姓名,姓名最长不超过10个汉字
-
性别,因为取值只有两种可能,因此最多一个汉字
-
生日,取值为年月日
-
入学成绩,小数点后保留两位
-
邮件地址,最大长度不超过64
-
家庭联系电话,不一定是手机号码,可能会出现–等字符
-
学生状态(用数字表示,正常、休学、毕业...)
5.图形化客户端工具---Navicat
-
Navicat for MySQL是管理和开发MySQL或 MariaDB的理想解决方案。
-
这套全面的前端工具为数据库管理、开发和维护提供了一款直观而强大的
6.DML
(1)添加(insert)
- 给指定列添加数据
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 表名;
(2)修改(update)
修改表数据
UPDATE 表名 SET 列名1=值1,列名=值2,... [WHERE条件];
注意:修改语句中如果不加条件,则将表中所有数据都修改!
(3)删除(delete)
DELETE FROM 表名 [WHERE条件];
注意:删除语句中如果不加条件,则将所有数据都删除!
7.DQL
查询语法
SELECT
字段列表
FROM
表名列表I
WHERE
条件列表
GROUP BY
分组字段
HAVING
分组后条件
ORDER BY
排序字段
LIMIT
分页限定
(1)基础查询
- 查询多个字段
SELECT 字段列表 FROM 表名;
SELECT * FROM 表名; -- 查询所有数据
- 去除重复记录
SELECT DISTINCT 字段列表 FROM 表名;
- 起别名
AS: AS也可以省略
(2)条件查询(WHERE)
SELECT 字段列表 FROM 表名 WHERE 条件列表;
举例:
- 查询年龄大于20岁的学员信息
SELECT * FROM test WHERE age>20;
- 查询年龄大于等于20岁的学员信息
SELECT * FROM test WHERE age>=20;
- 查询年龄大于等于20岁并且年龄小于等于30岁的学员信息
SELECT * FROM test WHERE age>=20 && age<=30;
或SELECT * FROM test WHERE age>=20 AND age<=30;
或SELECT * FROM test WHERE age BETWEEN 20 AND 30;
- 查询入学日期在'1998-09-01’到'1999-09-01'之间的学员信息
SELECT * FROM test WHERE date BETWEEN '1998-09-01' AND '1999-09-01';
- 查询年龄等于18岁的学员信息
SELECT * FROM test WHERE age=18;
查询年龄不等于18岁的学员信息
SELECT * FROM test WHERE age!=18;
或者SELECT * FROM test WHERE age<>18;
查询年龄等于18岁 或者 年龄等于20岁 或者 年龄等于22岁的学员信息
SELECT * FROM test WHERE age=18 || age=20 || age=22;
或 SELECT * FROM WHERE age=18 OR age=20 OR age=22;
或 SELECT *FROM WHERE age IN (18,20,22);
查询英语成绩为null的学员信息
SELECT * FROM test WHERE english IS NULL;
LIKE 占位符
模糊查询 _单个任意字符 %多个任意字符
- 查询姓'马'的学员信息
SELECT * FROM test WHERE name LIKE '马%';
- 查询第二个字是'花'的学员信息
SELECT * FROM test WHERE name LIKE '_花%';
- 查询名字中包含'德’的学员信息
SELECT * FROM test name LIKE '%德%';
(3)排序查询(ORDER BY)
SELECT 字段列表 FROM 表名 ORDER BY 排序字段名1 [排序方式1],排序字段名2 [排序方式2]...;
排序方式:
-
ASC:升序排列(默认值)
-
DESC:降序排列
注意:如果有多个排序条件,当前边的条件值一样时,才会根据第二条件进行排序!
- 查询学生信息,按照年龄升序排列
SELECT * FROM test ORDER BY age ASC;
或SELECT * FROM test ORDER BY age;
- 查询学生信息,按照数学成绩降序排列
SELECT * FROM test ORDER BY math DESC;
- 查询学生信息,按照数学成绩降序排列,如果数学成绩一样,再按照英语成绩升序排列 查询学生信息
SELECT * FROM test ORDER BY math DESC,english ASC;
或SELECT * FROM test ORDER BY math DESC,english;
(4)聚合函数
概念: 将一列数据作为一个整体,进行纵向计算.
聚合函数分类:
SELECT 聚合函数名(列名) FROM 表名;
注意: null值不参与所有聚合函数运算!
count()
1.主键
2.*
- 统计班级一共有多少个学生
SELECT count(id) FROM test;
- 查询数学成绩的最高分
SELECT max(math) FROM test;
- 查询数学成绩的最低分
SELECT min(math) FROM test;
- 查询数学成绩的总分
SELECT sum(math) FROM test;
- 查询数学成绩的平均分
SELECT avg(math) FROM test;
(5)分组查询(GROUP BY)
SELECT 字段列表 FROM 表名〔MHERE分组前条件限定] GROUP BY 分组字段名[HAVING 分组后条件过滤];
注意:分组之后,查询的字段为聚合函数和分组字段,查询其他字段无任何意义!
where和having区别:
-
执行时机不一样::where是分组之前进行限定,不满足where条件,则不参与分组,而having是分组之后对结果进行过滤。
-
可判断的条件不一样:where不能对聚合函数进行判断,having可以。
执行顺序: where >聚合函数> having
- 查询男同学和女同学各自的数学平均分
SELECT sex,avgmath FROM test GROUP BY sex;
- 查询男同学和女同学各自的数学平均分,以及各自人数
SELECT sex,avg(math),count(*) FROM test GROUP BY sex;
- 查询男同学和女同学各自的数学平均分,以及各自人数,要求:分数低于70分的不参与分组
SELECT sex,avg(math),count(*) FROM test WHERE math>=70 GROUP BY sex;
- 查询男同学和女同学各自的数学平均分,以及各自人数,要求:分数低于70分的不参与分组,分组之后人数大于2
SELECT sex,avg(math),count(*) FROM test WHERE math>=70 GROUP BY sex HAVING count(*)>2;
(6)(LIMIT)
SELECT 字段列表 FROM 表名 LIMIT 起始索引,查询条目数;
- 从开始查询,查询3条数据
SELECT * FROM test LIMIT 0,3;
- 每页显示3条数据,查询第1页数据
SELECT * FROM test LIMIT 0,3;
- 每页显示3条数据,查询第2页数据
SELECT * FROM test LIMIT 3,3;
- 每页显示3条数据,查询第3页数据
SELECT * FROM test LIMIT 6,3;
起始索引:从0开始
计算公式:起始索引=(当前页码-1)*每页显示的条数
tips:
-
分页查询limit是MySQL数据库的方言
-
Oracle分页查询使用rownumbers
-
SQL Server分页查询使用top
实例:
(a)约束
1.概念&分类
约束的概念:
-
约束是作用于表中列上的规则,用于限制加入表的数据
-
约束的存在保证了数据库中数据的正确性、有效性和完整性
约束的分类:
Tips : MySQL不支持检查约束
-- 演示非空约束
INSERT INTO emp (id,name,joindate,salary,bonus) VALUES(2,'李四','1999-11-11',NULL,5000);
-- 演示唯一约束
INSERT INTO emp (id,name,joindate,salary,bonus) VALUES(2,'张三','1999-11-11',8800,5000);
-- 演示默认约束
INSERT INTO emp (id,name,joindate,salary) VALUES(2,'李四','1999-11-11',8800);
-- 演示自动增长:auto_increment:当列是数字类型且唯一约束
INSERT INTO emp (name,joindate,salary,bonus) VALUES('张三','1999-11-11',8800,5000);
INSERT INTO emp (id,name,joindate,salary,bonus) VALUES(NULL,'李四','1999-11-11',8800,5000);
2.非空约束
非空约束用于保证列中所有数据不能有NULL值
- 添加约束
--创建表时添加非空约束
CREATE TABLE 表名(
列名 数据类型 NOT NULL,
...
);
--建完表后添加非空约束
ALTER TABLE 表名 MODIFY 字段名 数据类型 NOT NULL;
- 删除约束
ALTER TABLE 表名 MODIFY 字段名 数据类型;
3.外键约束
外键用来让两个表的数据之间建立链接,保证数据的一致性和完整性
- 添加约束
--创建表时添加外键约束
CREATE TABLE 表名(
列名数据类型,
...
[CONSTRAINT] [外键名称] FOREIGN KEY(外键列名) REFERENC ES 主表(主表列名)
);
--建完表后添加外键约束
ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FORETGN KEY(外键字段名称)REFERENCES 主表名称(主表列名称);
- 删除约束
ALTER TABLE 表名 DROP FOREIGN KEY 外键名称;
要先创建主表,再创建从表
先添加主表中的数据,再添加从表中的数据
--删除外键
alter table emp drop FOREIGNkey fk_emp_dept;
(b)数据库设计
1.数据库设计简介
数据库设计简介
-
软件的研发步骤
-
数据库设计概念
数据库设计就是根据业务系统的具体需求,结合我们所选用的DBMS,为这个业务系统构造出最优的数据存储模型。
建立数据库中的表结构以及表与表之间的关联关系的过程。
有哪些表?表里有哪些字段?表和表之间有什么关系?
-
数据库设计的步骤
1.需求分析(数据是什么?数据具有哪些属性?数据与属性的特点是什么)
2.逻辑分析(通过ER图对数据库进行逻辑建模,不需要考虑我们所选用的数据库管理系统
3.物理设计(根据数据库自身的特点把逻辑设计转换为物理设计)
4.维护设计(1.对新的需求进行建表;2.表优化)
2.表关系
- 一对一
如:用户和用户详情 一对一关系多用于表拆分,将一个实体中经常使用的字段放一张表,不经常使用的字段放另一张表,用于提升查询性能
实现方式:在任意一方加入外键,关联另一方主键,并且设置外键为唯一(UNIQUE)
- 一对多
如:部门和员工
- 多对多
如:商品和订单
一个商品对应多个订单,一个订单包含多个商品
3.表关系之一对多
实现方式:在多的一方建立外键,指向一的一方的主键
4.表关系之多对多
实现方式:建立第三张中间表,中间表至少包含两个外键,分别关联两方主键
5.表关系之一对一
实现方式:在任意一方加入外键,关联另一方主键,并且设置外键为唯一(UNIQUE)
6.数据库设计案例