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 通用语法
- SQL语句可以单行或多行书写,以分号结尾
- MySQL的SQL语句不区分大小写
- 注释:
- 单行注释:-- 注释内容(必须有空格) 或 #注释内容(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 字段列表 FROM 表1,表2... WHERE 条件;
# select emp.name,emp.gender,dept.dname from emp,dept where emp.dep_id = dept.did;
显示内连接
SELECT 字段列表 FROM 表1 INNER JOIN 表2 ON 条件;
# select * from emp inner join dept on emp.dep_id = dept.did;
外连接:
左外连接:相当于查询A表所有数据和交集部分的数据
SELECT 字段列表 FROM 表1 LEFT OUTER JOIN 表2 ON 条件;
# select * from emp left outer join dept on emp.dep_id = dept.did;
右外连接:相当于查询B表所有数据和交集部分的数据
SELECT 字段列表 FROM 表1 RIGHT OUTER JOIN 表2 ON 条件;
# select * from emp right outer join dept on emp.dep_id = dept.did;
4.2 子查询
查询中嵌套查询,称嵌套查询为子查询
单行单列:作为条件值,使用 = != > < 等进行条件判断
SELECT 字段列表 FROM 表 WHERE 字段名 = (子查询);
# select * from emp where salary > (select emp.salary from emp where name = '猪八戒');
多行单列:作为条件值,使用in等关键字进行条件判断
SELECT 字段列表 FROM 表 WHERE 字段名 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;