JavaWeb学习笔记01——数据库

JavaWeb由数据库、前端、web核心组成,首先学习第一部分数据库

1. MySQL

1.1 登录

登录参数: mysql -u用户名 -p密码 -h要连接的mysql服务器的ip地址(默认127.0.0.1) -P端口号(默认3306)

1.2 MySQL数据模型

关系型数据库: 建立在关系模型基础上的数据库,由多张能相互连接的二维表组成。简单来说,就是通过表来存储数据的数据库

2. SQL

2.1 通用语法

  1. SQL语句可以单行或多行书写,以分号结尾
  2. MySQL的SQL语句不区分大小写
  3. 注释:
    • 单行注释:-- 注释内容(必须有空格) 或 #注释内容(MySQL特有)
    • 多行注释 :/* 注释 */

2.2 语言分类

DDL

数据定义语言:操作数据库和表

1.操作数据库

查询

SHOW DATABASE;

创建

  • 创建数据库
    CREATE DATABASE 数据库名称;
    
  • 创建数据库(判断,如果不存在则不创建)
    CREATE DATABASE IF NOT EXISTS 数据库名称;
    

删除

  • 删除数据库
    DROP DATABASE 数据库名称;
    
  • 删除数据库(判断,如果存在则删除)
    DROP DATABASE IF EXISTS 数据库名称;
    

使用

  • 查看当前使用的数据库
    SELECT DATABASE();
    
  • 使用数据库
    USE 数据库名称;
    

2.操作表

操作语法
查询

  • 查询所有表的名称
    SHOW TABLES;
    
  • 查询表结构
    DESC 表名称;
    

创建

create table tb_user(
   id int,
   username varchar(20), -- 表示不能超过20位
   password varchar(32)  -- 此处不能有逗号
);

注意:最后一行末尾,不能加逗号

删除
与删除数据库方式相同

修改

  • 修改表名
    ALTER TABLE 表名 RENAME TO 新的表名;
    
  • 添加一列
    ALTER TABLE 表名 ADD 列名 数据类型;
    
  • 修改数据类型
    ALTER TABLE 表名 MODIFY 列名 新的数据类型;
    
  • 修改列名和数据类型
    ALTER TABLE 表名 CHANGE 列名 新列名 新数据类型;
    
  • 删除列
    ALTER TABLE 表名 DROP 列名;
    

数据类型
在这里插入图片描述

DML

数据操作语言:对表中数据进行增删改

1.添加数据

给指定列添加数据

INSERT INTO 表名(列名1,列名2...) VALUES(1,2...);
#INSERT INTO stu(id,name) VALUES(1,'张三');

给全部列添加数据

INSERT INTO 表名 VALUES(1,2...);
#INSERT INTO stu VALUES(2,'李四','男','1999-11-11','88.88','[email protected]','13888888888','1');

批量添加数据

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

2.修改数据

UPDATE 表名 SET 列名1=1,列名2=2,...WHERE 条件; -- 如果不加条件则修改所有数据
#UPDATE stu SET gender='女',birthday='1999-12-12',score=99.99 where name = '张三';

3.删除数据

DELETE FROM 表名 WHERE 条件; -- 如果不加条件则删除所有数据
#DELETE FROM stu where name = '张三';

DQL

数据查询语言:对表中数据进行查询(最重要
查询语法

SELECT    字段列表
FROM      表名列表
WHERE     条件列表
GROUP BY  分组字段
HAVING    分组后条件
ORDER BY  排序字段
LIMIT     分页限定

0.聚合函数

select 聚合函数名(列名) from 表名;
# select count(*) from stu; //计算数量列名推荐使用*

在这里插入图片描述
注意:null值不参与所有聚合函数运算

1.基础查询

查询多个字段

SELECT 字段列表 FROM 表名;
SELECT * FROM 表名;   --查询所有数据

去除重复记录

SELECT DISTINCT 字段列表 FROM 表名;

起别名

SELECT name,math as 数学成绩 ,english as 英语成绩 from stu; -- as也可以省略

在这里插入图片描述

2.条件查询

SELECT 字段列表 FROM 表名 WHERE 条件列表;
# select * from stu where hire_date between '1998-9-1' and '1999-9-1'; 
# select * from stu where english = null; -- 报错
-- 模糊查询
# select * from stu where name like '马%';  -- 姓马
# select * from stu where name like '_花%'; -- 第二字为花
# select * from stu where name like '%德%'  -- 名字中含有德

在这里插入图片描述
注意:nul值的比较不能用 = / = ,需要使用 is / is not

3.排序查询

排序方式:

  • ASC:升序排列(默认)
  • DESC:降序排列
select 字段列表 FROM 表名 ORDER BY 排序字段名1 排序方式1, 排序字段名2 排序方式2...;
# select * from stu order by age asc;
# select * from stu order by math desc, english asc; -- 数学成绩相同,则按英语成绩降序

当有多个排序条件时,只有当前面的条件值相同时,才根据后面条件进行排序

4.分组查询

select 字段列表 FROM 表名 GROUP BY 分组字段名 having 分组后条件过滤;
# select sex,avg(math) from stu group by sex;  -- 查询男女同学最高分
# select sex,count(*) ,avg(math) from stu group by sex; -- 查询男女同学人数和最高分
# select sex,count(*) ,avg(math) from stu where math > 70 group by sex;-- 查询男女同学人数和最高分(分数低于70的不参与分组)
# select sex,count(*) ,avg(math) from stu where math > 70 group by sex having count(*) > 2; -- 查询男女同学人数和最高分(分数低于70的不参与分组),且组内人数大于两个

- 分组之后,查询的字段为聚合函数和分组字段,查询其他字段无任何意义

- 执行顺序: WHERE > 聚合函数 > HAVING

- WHERE和HAVING的区别:

  • WHERE在分组之前进行限定,不满足条件则不进行分组,而HAVING是分组之后对结果进行过滤
  • WHERE不能对聚合函数进行判断,HAVING可以

5.分页查询

select 字段列表 from 表名 limit 起始索引 , 查询条目数;
# select * from stu limit 0,3; -- limit起始索引从0开始
# select * from stu limit 3,3; -- limit = (当前页码-1)*条目数
# select * from stu limit 6,3;

起始索引limit = (当前页码-1)* 每页显示的条数

分页查询limit为MySQL的方言,Oracle使用rownumbe,,SQL Server使用top

DCL

数据控制语言:对数据库进行权限控制
*该内容目前使用不到,先不学习

2.3 约束

  • 约束是作用于表中列上的规则,用于限制加入表的数据
  • 约束保证数据库中数据的正确性、有效性和完整性

约束分类

  • 非空约束 NOT NULL
  • 唯一约束 UNIQUE
  • 主键约束 PRIMARY KEY
  • 检查约束 CHECK (MySQL不支持)
  • 默认约束 DEFAULT
  • 外键约束 FOREIGN KEY

建表前添加约束

CREATE TABLE emp (
	# auto_increment:自动增长 当列是数字类型 且 唯一约束
	id INT PRIMARY KEY auto_increment,  #主键:非空且唯一
	ename VARCHAR(50) NOT NULL UNIQUE,
	joindate DATE NOT NULL,
	salary DOUBLE(7,2) NOT NULL,
	bonus DOUBLE(7,2) DEFAULT 0
);

外键约束
创建

  • 建表前添加约束
    create table emp(
    	#表的内容
    	CONSTRAINT 外键名称 FOREIGN KEY(外键列名) REFERENCES 主表(主表列名)
    );
    
  • 建表后添加约束
    ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY(外键列名) REFERENCES 主表(主表列名)
    

删除

ALTER TABLE emp DROP FOREIGN KEY fk_emp_dept;

注意事项:
(1)先创建主表,再创建从表;先添加主表数据,再添加从表信息
(2)外键名称的命名方式:fk_从表名_主表名

3. 数据库设计

3.1 一对一

如:用户 和 用户详情。多用于表拆分,将经常使用的字段放一张表,不经常使用的放另一张表,用于提升查询性能
实现方式
在任意一方加入外键,关联另一方主键,并设施外键为唯一(UNIQUE)

3.2 一对多(多对一)

如:部门表 和 员工表,一个部分对应多个员工,每个员工对应一个部门
实现方式: 在多的一方建立外键,指向一的一方的主键

-- 部门表
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,
	CONSTRAINT fk_emp_dept FOREIGN KEY(dep_id) REFERENCES dept(id)
);

在这里插入图片描述

3.3 多对多

如:商品表 和 订单表,一个商品对应多个订单,一个订单包含多个商品
实现方式: 建立第三张中间表,中间表至少包含两个外键,分别关联两方主键

-- 订单表
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);

在这里插入图片描述

4. 多表查询

4.1 连接查询

内连接: 相当于查询A、B的交集
隐式内连接

SELECT 字段列表 	FROM1,2... WHERE 条件;
# select emp.name,emp.gender,dept.dname from emp,dept where emp.dep_id = dept.did;

显示内连接

SELECT 字段列表 	FROM1 INNER JOIN2 ON 条件;
# select * from emp inner join dept on emp.dep_id = dept.did;

外连接:
左外连接:相当于查询A表所有数据和交集部分的数据

SELECT 字段列表 	FROM1 LEFT OUTER JOIN2 ON 条件;
# select * from emp left outer join dept on emp.dep_id = dept.did;

右外连接:相当于查询B表所有数据和交集部分的数据

SELECT 字段列表 	FROM1 RIGHT OUTER JOIN2 ON 条件;
# select * from emp right outer join dept on emp.dep_id = dept.did;

4.2 子查询

查询中嵌套查询,称嵌套查询为子查询
单行单列:作为条件值,使用 = != > < 等进行条件判断

SELECT 字段列表 FROMWHERE 字段名 = (子查询);
# select * from emp where salary > (select emp.salary from emp where name = '猪八戒');

多行单列:作为条件值,使用in等关键字进行条件判断

SELECT 字段列表 FROMWHERE 字段名 IN (子查询);
# select * from emp where dep_id in (select did from dept where dname = '财务部' or dname = '市场部');

多行多列:作为虚拟表

SELECT 字段列表 FROM (子查询) WHERE 条件;
# select * from (select * from emp where join_date > '2011-11-11') t1 ,dept t2 where t1.dep_id = t2.did;

5. 事务

5.1 事务简介

  • 事务是一种机制、一个操作序列,包含了一组数据库操作命令
  • 事务把所有命令作为一个整体一起向系统提交或撤销操作请求,即这一组数据库命令
    要么同时成功,要么同时失败
  • 事务是一个不可分割的工作逻辑单元
-- 开启事务
START TRANSACTION  # 或者 BEGIN
-- 提交事务
COMMIT;
-- 回滚事务
ROLLBACK;

-- 转账操作示例

BEGIN;  -- 开启事务

update account set money = money - 500 where name = '李四';
update account set money = money + 500 where name = '张三';

COMMIT;  -- 提交事务

ROLLBACK; -- 回滚事务

5.2 事务的四大特征(ACID)

  • 原子性(Atomicity):事务是不可分割的最小单位,要么同时成功,要么同时失败
  • 一致性(Consistency):事务完成时,必须使所有的数据都保持一致状态
  • 隔离性(Isolation):多个事务之间,操作的可见性
  • 持久性(Durability):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的

5.3 事务的默认提交方式

MySQL默认自动提交
查看

select @@autocommit;

运行结果为1表示默认自动提交,为0表示手动提交

修改

set @@autocommit = 0;

猜你喜欢

转载自blog.csdn.net/m0_62721576/article/details/128448175