数据库学习
1.1操作数据库CURD(Mysql不区分大小写)
1.创建数据库
create database [IF NOT EXISTS] westos;
2.删除数据库
drop database [IF EXISTS] westos;
3.使用数据库
use westos;
4.查看数据库
show databases;
5.创建表
CREATE TABLE `student` (
`id` int(4) NOT NULL AUTO_INCREMENT COMMENT '学号',
`name` varchar(220) NOT NULL DEFAULT '匿名' COMMENT '姓名',
`pwd` varchar(220) NOT NULL COMMENT '密码',
`sex` char(2) NOT NULL DEFAULT '女' COMMENT '性别',
`day` datetime DEFAULT NULL COMMENT '出生日期',
`address` varchar(220) NOT NULL DEFAULT '匿地址' COMMENT '地址',
`email` varchar(220) NOT NULL COMMENT '邮箱',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
6.修改删除表
修改
--修改表名称
alter table teacher rename as teacher1;
--增加表字段
alter table teacher add name varchar(220);
--修改表字段 (重命名:修改约束)
alter table teacher modify name varchar(220); --修改约束
alter table teacher change name teacher_name varchar(220); --字段重命名
删除
---删除表(如果存在再删除)
drop table if exists teacher;
7.插入表数据
INSERT INTO 表名 (id—–) values(id—–)
INSERT INTO westos.student (id, name, pwd, sex, day, address, email) VALUES (1, '狗蛋', '12345678', '男', '2021-12-08 13:34:44', '安徽合肥', '5104@sohu.com')
8.修改表数据
Update 表名 SET 字段 =’李四’ where 字段=’***’
-- 一定要指定条件 where
update student set address ='安徽合肥市' where name='狗蛋';
9.查找表数据
Select 字段名(要什么查什么,全都要就*) from表 where 字段=’ ‘;
select id, name, pwd, sex, day, address, email from student where name='狗蛋';
10.删除表数据
DELETE FROM 表 where 字段 =’ ‘
DELETE FROM westos.student WHERE id = 2;
所有创建和删除都要添加判断不然会报错
11.逆向语句查询
show create table student; --查看建表语句
desc student; --查看表结构
12.去重关键字
select distinct studentno from result --distinct
Where语句
--查询考试成绩在90分以上100分一下
select studentno ,studentresult from result where studentresult >= 90 && result.studentresult<=100;
--区间查询
--between a between b and c A在BC之间为true
select studentno,studentresult from result where studentresult between 95 and 100;
--除了1000号之外所有学生的成绩
select studentno ,studentresult from result where result.studentno<>1000;
select studentno ,studentresult from result where result.studentno!=1000;
select studentno ,studentresult from result where not result.studentno =1000;
Like语句
--开头是姓刘的 %(代表0到任意一个字符) _代表一个字符
select studentno, studentname from student where student.studentname like '刘%';
--后面是一个字符开头是刘的人
select studentno, studentname from student where student.studentname like '刘_';
--左右匹配带刘的都展示
select studentno, studentname from student where student.studentname like '%刘%';
in语句
--查询某个区间 他是一个或者多个具体的值
select studentno,studentname from student where studentno in (1001,1002,1003);
null not null 语句
select studentno,studentname from student where address is null;
select studentno,studentname from student where address is not null;
联表查询 join
select s.studentno, studentname, subjectno, studentresult
from student s
inner join
result r
where s.studentno = r.studentno;
#左查询
select s.studentno, studentname, subjectno, studentresult
from student s
left join result r
on s.studentno = r.studentno;
#右查询
select s.studentno, studentname, subjectno, studentresult
from student s
right join
result r
on s.studentno = r.studentno;
select s.studentno, studentname, subjectname, studentresult
from student s
right join result r
on r.studentno = s.studentno
inner join subject sub
on r.subjectno = sub.subjectno;
分页limit和排序 orderby
--desc 降序 esc升序
select r.studentno, studentname, subjectname, studentresult
from result r
left join student s
on r.studentno = s.studentno
inner join subject sub
on r.subjectno = sub.subjectno
where sub.subjectname like '%C%'
order by studentresult desc
select s.studentno,studentname,subjectname,studentresult
from student s
inner join result r
on s.studentno = r.studentno
inner join subject sub
on sub.subjectno=r.subjectno
where sub.subjectname like '%C%' && r.studentresult > 30
order by r.studentresult desc
limit 0,10
联表查询 和 子查询
--子查询
select s.studentno,studentname
from student s
inner join result r on s.studentno = r.studentno
where r.studentresult >=30 and subjectno = (
select subjectno from subject where subjectname = 'C语言-1'
);
select s.studentno,studentname
from student s
inner join result r on s.studentno = r.studentno
inner join subject s2 on r.subjectno = s2.subjectno
where r.studentresult>=30 && s2.subjectname='C语言-1'
分组查询
select subjectname,max(studentresult),min(studentresult),avg(studentresult)
from result r
inner join subject s on r.subjectno = s.subjectno
group by r.subjectno ----通过什么来分组
having avg(studentresult)>=70 ----分组过后用having来再次筛选数据 而不是where
;
聚合函数
select count(address)from student; --会去掉null值
select count(1)from student; --不忽略null值
select count(*)from student; --不忽略null值
select count(studentname) from student where studentname ='铁蛋';
select sum(studentresult) 总分 from result;
select avg(studentresult) 平均 from result;
select max(studentresult) 最高 from result;
select min (studentresult) 最低 from result;
事务原则:原子性,一致性,持久性,隔离性(ACID) (脏读幻读)
原子性(Atomicity)
一个事务要么全部提交成功,要么全部失败回滚,不能只执行其中的一部分操作,这就是事务的原子性
一致性(Consistency)
事务前后的数据完整性要保持一致 事务前总金额1000 事务后也是1000
持久性(Durability)
事务一旦被提交 那就持久化到数据库中 不可逆
隔离性(Isolation)
事务的隔离性是指在并发环境中,并发的事务时相互隔离的,一个事务的执行不能不被其他事务干扰。不同的事务并发操作相同的数据时,每个事务都有各自完成的数据空间,即一个事务内部的操作及使用的数据对其他并发事务时隔离的,并发执行的各个事务之间不能相互干扰。
隔离所导致的问题
脏读
指一个事物读取了另一个事务未提交的数据
不可重复读
在一个事务中读取表的某个数据,多次读取不同(不一定是读取错误,可能是某些场合不对)
幻读 虚读
是指在一个事务内读取到了其他事务插入的数据,导致前后读取不一致
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 ggchzzz@163.com