Java web介绍
- 网页
- 数据库
- JavaWeb程序
数据库相关概念
数据库
存储数据的仓库,数据是有组织的的进行存储
DataBase
数据库管理系统
DBMS
管理数据库,操作数据库
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pyGWy9NP-1678695707505)(/Users/chenwenshuo/Library/Application Support/typora-user-images/截屏2023-03-10 14.17.56.png)]
SQL
Structured Query Language. 结构化查询语言
操作关系型数据库的编程语言
MySQL数据模型
关系型数据库:由多张相互连接的二维表组成的数据库
优点
- 格式一致,易于维护
- 都是使用通用的SQL语言操作,使用方便,可用于复杂查询
- 数据存储在硬盘中,安全
mac 打开 MySQL的方法
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2Y8lN3BH-1678695634787)(/Users/chenwenshuo/Library/Application Support/typora-user-images/截屏2023-03-10 14.30.42.png)]
SQL
简介看上面
语句用法
-
SQL语句可以单行书写或多行书写,以分号结尾
-
MySQl数据库的SQL语言不区分大小写,关键字建议使用大写
-
注释
单行 – 注释内容或#注释内容
多行/*
*/
SQL分类
DDL操作数据库,表
DML对表中数据进行增删改
DQL对表中的数据进行查询
DCL对数据库进行权限控制
DDL
-
查询
show DataBases;
-
创建
create DataBase if not exists db1;
- 删除
drop database if exists db1;
- 使用
use db1;
select database();#查看使用的database
操作表
- 查询
show tables;
desc func;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nbR09X7h-1678695634787)(/Users/chenwenshuo/Desktop/截屏2023-03-10 14.51.30.png)]
- 创建表
creat table 表明(
字段名1 数据类型1,
字段名2 数据类型2,
···
字段名n 数据类型n
);
#最后一行末尾不加逗号
int
varchar() 字符串 括号里加最多几个字符
数据类型
- 数值
- 日期
- 字符串
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6qCkk6ua-1678695634788)(/Users/chenwenshuo/Library/Application Support/typora-user-images/截屏2023-03-10 15.11.09.png)]
常用
age int
score double(总长度,小数点后保留的位数). 0~1002
birthday date
name char(10)定长 存储性能高,浪费空间
name varchar(10)变长 存储性能低,节约空间
看以后数据到底变不变,存储空间大小决定用char还是varchar
create table student(
id int,
name varchar(10),
gender char(1),
birthday date,
score double(5,2),
email varchar(64),
tel varchar(15),
status tinyint
);
- 删除
drop table tb1;
- 修改
alter table student rename to stu;
alter table stu add address varchar(50);
alter table stu modify address char(50);
alter table stu change address addr varchar(30);
alter table stu drop addr;
DML
- 给指定列添加数据
select * from student;#查询所有数据
insert into student(id,name) values(1,'张三');
insert into student(id,name,sex,birthday,score,email,tel,status) valus(2,'李四','男','1999',~~~);
#要是给所有类型添加数据,列名列表是可以省略的
- 修改数据
update student set gender = '女' where name = '张三';
update student set gender = '女' ,score = 99.99 where name = '张三';
#若没有where条件则,表中所有都会改
- 删
delete from student where name = ‘张三’;
DQL
- 基础查询
select
字段列表
from
表明列表
where
条件列表
group by
分组字段
having
分组后条件
order by
排序字段
limit
分页限定
--基础查询=========
--查询 name age 两列
select name ,age from stu;
--查询所有列的数据(但最好不要用)
select * from stu;
--查询地址信息
select address from stu;
--去除重复记录
select distinct address from stu;
--起别名
select name,math as 数学成绩,english as 英语成绩 from stu;
- 条件查询
-- 查询年龄大于20岁并且小于三十的学员信息
select * from stu where age>20 && age<30;
select * from stu where age>20 and age<30;
select * from stu where age between 20 and 30;
--查询入学日期在1990-09-01到1999-09-01之间的学员信息
select * from stu where hire_date between '1998-09-01'and'1999-09-01';
--查询年龄等于18岁的学员信息
select * from stu where age = 18;#一个🟰不是两个
--查询年龄不等于18岁的学员信息
select * from stu where age != 18;
select * from stu where age <> 18;
--查询年龄等于18或者20或者22
select * from stu where age = 18 or 20 or 22;
select * from stu where age in (18,20,22);
--查询英语成绩为null的学员信息;注意null值的比较不能使用= !=.需要使用is is not
select * from stu where english is null;
- 模糊查询 like
通配符:
(1)_:代表单个任意字符
(2)%:代表人一个数字符
--查询姓马的信息
select * from stu where name like '马%';
--查询第二个是花的学员信息
select * from stu where name like'_花%';
- 排序查询
排序方式
ASC:升序排列(默认值)
DESC:降序排列
--查询学生信息,按照年龄升序排列
select * from stu order by age;
--查询学生信息,按照数学成绩降序排列
select * from stu order by math desc;
--查询学生成绩,按照数学成绩降序排列,如果数学成绩一样,在按照英语成绩升序排列
select* from stu order by math desc,english asc;
- 分组查询
聚合函数
将一列数据作为一个整体,进行纵行计算
count 统计数量
max 最大值
min 最小值
sum 求和
avg 求平均值
-- 统计班级一共多少个学生
select count(id) from stu;#count 统计的列名不能为空
select count(*) from stu; #最推荐
-- 查询数学成绩最高分
select max(math) from stu;
--查询数学成绩总分
select sum(math) from stu;
--查询数学成绩平均值
select avg(math) from stu;
查询最低时若列中存在null,不统计!
-- 查询男同学和女同学各自数学平均分
select sex, avg(math) from stu group by sex;
-- 查询男同学和女同学各自数学平均分,分数低于70分的不参与分组
select sex, avg(math) from stu where math>70 group by sex;
-- 查询男同学和女同学各自数学平均分,分数低于70分的不参与分组,分组后人数大于2
select sex, avg(math) from stu where math>70 group by sex having count(*)>2;
where 和 having 的区别:
执行的时机不一样:where时分组前进行限定,不满足where条件,则不参与分组,而having是分组之后对结果进行过滤
可判断的条件不一样:where不能对聚合函数进行判断,having可以
执行顺序:where>聚合函数>having
- 分页查询
-- 从0开始查询,查询3条数据
select * from stu limit 0,3;
-- 每页显示3条数据,查询第1页数据
select * from stu limit 0,3;
-- 第2页
select * from stu limit 3,3;
-- 第3页
select * from stu limit 6,3;
起始索引 = (当前页码-1)*每页显示的条数
limit是mysql的方言
数据库
约束
概念和分类
约束是作用于表中列上的规则,用于限制加入表的数据
约束的存在保证了数据库中的正确性,有效性和完整性
分类
- 非空约束 not null
- 唯一约束 unique
- 主键约束 primary key 主键是一行数据的唯一标识,要求非空且唯一
- 检查约束 check MySQL不支持检查约束
- 默认约束 default
- 外键约束 foreign key
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mdNZjR6f-1678695634788)(/Users/chenwenshuo/Desktop/截屏2023-03-11 08.59.49.png)]
主键加auto increament 会自增长
外键约束让两个表的数据之间建立链接,保证数据的一致性和完整性
-- dep_id关联dept表的id主键
constraint fk_emp_dept foreign key(dep_id)references dept(id);
-- 删除外键
alter table emp drop foreign key fk_emp_dept;
-- 添加外键
alter table emp add constraint fk_emp_dept foreign key(dep_id)references dept(id);
数据库设计
建立数据库中的表结构以及表与表之间的关联关系的过程
步骤
需求分析
逻辑分析
物理设计
维护设计
表关系
表关系之一对多
部门和员工
在多的一方建立外键,指向一的一方的主键
多对多
订单和商品
建立第三张中间表,至少包含两个外键,分别关联两方主键
一对一
用户和用户详细
多用于表拆分,将一个实体中经常使用的字段放一个表,不经常使用的字段放另一张表,用于提升查询性能
在任意一方加入外键,关联另一方主键,并且设置的外键为unique
多表查询
select * from emp,dept; – 不行,会产生笛卡尔积
笛卡尔积:有a,b两个集合,取a,b所有的组合的情况
消除无效数据
查询emp和dept的数据,emp.dep_id = dept.did;
连接查询
- 内连接:相当于查询A,B相交的数据
-- 隐式内连接
select 字段列表 from 表1,2··· where 条件;
-- 显式内连接
select 字段列表 from 表1[inner] join 表2 on 条件;
select emp.name,emp.gender,dept.dname from emp,dept where emp.dep_id = dept.did;
select * from emp inner join dept on emp.dep_id = dept.did;#inner可省略
-
外连接:
左外连接:查询A表所有数据和交集部分数据
右外连接:查询B表所有数据和交集部分数据
select * from emp left join dept on emp.dep_id = dept.did;
select * from emp right join dept on emp.dep_id = dept.did;
子查询
-- 查询中嵌套查询
select *from emp;
select salary from emp where name = '猪八戒';
select *from emp where salary> 3600;
-- 通过子查询查询
select * from emp where salary >(select salary from emp where name = '猪八戒');
-- 单行单列
-- 多行单列
select 字段列表 from 表 where 字段名 = (子查询);
select 字段列表 from 表 where 字段名 in(子查询);
多行多列
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-esMvGD0Q-1678695634788)(/Users/chenwenshuo/Library/Application Support/typora-user-images/截屏2023-03-13 15.18.53.png)]
当作虚拟表
练习
-- 查询所有员工的信息,查询员工编号,员工姓名,工资,职务名称,职务描述
select emp.id,emp.name,emp.slary,job.jname,job.descrioption from emp,job where job_id = job.id;
select emp.id,emp.name,emp.slary,job.jname,job.descrioption from emp inner join job on job_id = job.id;
-- 查询加上部门名称,部门位置
#dept和emp一对多
select emp.id,emp.name,emp.slary,job.jname,job.descrioption,dept.dname,dept.loc from emp,job,dept where job_id = job.id and dept.id = emp.dept_id;
-- 查询员工的姓名,工资和工资等级
select * from emp,salarygrade t2 where emp.salary >= t2.losalary and <= t2.hisalary
-- 查询员工姓名,工资,职务名称,职务描述,部门名称,部门位置,工资等级
select emp.id,emp.name,emp.slary,job.jname,job.descrioption,dept.dname,dept.loc t2.grade from emp,job,dept,salarygrade as t2 where job_id = job.id and dept.id = emp.dept_id
and emp.salary between t2.losalary and t2.hisalary;
-- 查询出部门编号,部门名称,部门位置,部门人数
select * from dept;
select dept_id,count(*) from emp group by dept_id;
select dept.id,dept.dname,dept.loc,t1.count from dept,(select dept_id,count(*) from emp group by dept_id) t1 where dept_id = t1.dept_id;
事务
- 数据库的事务是一种机制,一个操作序列,包含了一组数据库的操作命令
- 事务把所有的命令作为个整体一起向系统提交或撤销操作请求,即这一组数据库命令要么同时成功,要么同时失败
- 事务是一个不可分割的工作逻辑单元
-- 开启事务
start transaction;
begin;
-- 提交事务
commit;
-- 回滚事务;
rollback;
-- 转账操作
-- 李四-500,张三+500 update
update account set money = monny-500 where name = '李四';
update account set money = monny+500 where name = '张三';
-- 开启事务
begin;
update account set money = monny-500 where name = '李四';
update account set money = monny+500 where name = '张三';
commit;
-- 或者
rollback;
#要看是出错的还是正确的
事务四大特征
acid
- 原子性:事务是不可分割的最小操作耽误,要么同时成功,要么同时失败
- 一致性:事务完成时,必须使所有的数据都保持一致状体
- 隔离性:多个事务之间,操作的可见性;
- 持久性:事务一旦提交或回滚,它对数据库中的数据的改变就是永久的
-- 查询事务的默认提交方式
select @@autocommit;
-- 修改事务的默认提交方式
set @@autocommit = 0;