从零开始学java(9)

day 9

今天继续数据库。。

12. 分组查询的详解

select stuName,SUM(mark),AVG(mark),COUNT(*) 
from student 
where  mark is not null -- 根据什么条件查询
group by stuName -- 根据什么字段进行统计
having COUNT(*)=2 -- 分组之后的结果进行筛选
order by SUM(mark)desc; -- 对最终的结果进行排序

1.根据条件 执行查询 — where
2.对根据指定的条件查询出来的结果进行聚合函数各种操作, sum() count() avg() max() min()
3.聚合之前 设置分组 进行各种聚合的条件, 根据分组的条件进行聚合。
注意:不设置分组默认统计的是整个表格的数据。
加了分组,默认根据分组条件进行统计 – group by

4.对于分组之后的结果再一次进行筛选 – having 写聚合函数得到的结果进行再一次过滤。

5.对最终的结果进行 排序 – order by

注意事项 :
使用了聚合函数,就不可以查询其他的普通字段,默认只会查询出第一条数据。
但是可以查询 group by 之后的字段。

13.数据库的单表操作

DML操作:插入,删除,修改。
DQL操作:查询。
DDL操作:对库,对表进行操作
对库操作:
1.查看当前用户下所有的数据库
show databases;

2.创建数据库
– 1.当表格或者数据库 不存在的时候 才会创建数据库
create database if not exists firstdb charset utf8 collate utf8_unicode_ci;
3.使用数据库
use firstdb;
4.删除数据库
– 2.当数据库存在的时候才删除,不存在的时候不会删除
drop database if exists firstdb;
5.查看当下数据库里面的所有表
show tables;

操作表格

查看表结构:desc 表名;

创建表:create table;

删除表 :drop 表名;

1.添加新的字段

alter table student add java int default 60 not null;
select * from student;

2.修改字段的长度,数据类型

alter table student modify stuName varchar(40);

3.整个修改字段

alter table student change java mysql int not null;

4.删除字段

alter table student drop mysql;

5.修改表名

alter table student rename to student01;

14.数据库密码忘记了怎么办?

1.跳过密码保护。。。
找到mysql的配置文件 my.ini文件(C:\ProgramData\MySQL\MySQL Server 5.7)
添加一个配置: skip-grant-tables
添加完配置之后 保存配置
在这里插入图片描述
注意: 不要修改其他设置!!!

2.重启mysql服务。。。
<1>.windows+R 打开运行界面 输入 services.msc
<2>.找到mysql服务 重启mysql服务

3.进入 doc界面 运行界面输入cmd
输入mysql即可直接进入到数据库中,不需要再输入密码

4.修改密码
用户信息一般是保存在系统数数据库中的 mysql据库中的user表中。

-- 通过password进行密码加密
update `user` set authentication_string=PASSWORD('123456')
where `user`='root';

新密码改为‘123456’、

password() 对字符串进行加密(md5加密)

5.改回来之后 记得删除配置文件中 的 skip-grant-tables

6.重启服务

问题就已经解决了

15.三大范式

3大范式:
1.第一范式:遵循每一个列都是不可分割的最小单元,列的原子性。
2.第二范式:满足第一范式的基础之上,每一张表格都只能描述一件事情,表格的原子性。
3.第三范式:满足第二范式的基础之上,表格中的任何一个字段都必须和主建直接相关,而非间接相关。。
字段与表格记录之间是一个1:1的关系 这才叫直接相关 ,间接相关指的是表格记录与字段之间存在
1:n --1对多
或者 m:n-- 多对多

反范式:
当有些字段 可以通过已有的字段进行计算得到,我们可以省略,有的时候完全根据范式设计数据库会影响效率,有的时候会根据项目的需求灵活的调整,如果为反范式 能够提高效率 ,也是可以的。

16.外键约束(foreign key)

-- 1.创建数据库
create database if not exists schoolDB01 charset utf8 collate utf8_unicode_ci;
#2.使用数据库
use schoolDB01;
#3.创建学生表 student
create table student(
sid int auto_increment primary key,
stuName varchar(30) not null,
stuPass varchar(30) default '1234' not null,
stuSex varchar(5) default '男' not null,
entranceTime timestamp -- 入学时间
);

#4.创建课程表 course
create table course(
cid int auto_increment primary key,
cName varchar(30) not null
);
#5.创建成绩表 mark
create table mark(
mids int auto_increment primary key,
cid int,
sid int,
score int
);
-- 6、建立student与mark主外键关系
-- student 主键表  mark 外键表 sid
alter table mark  -- 外键表名
add constraint mark_sid_FK01  -- 外键名字 (自定义的)
foreign key(sid) -- 添加外键约束对应的字段 
references student(sid);  -- 主键表   

-- 7、建立course表与 mark的主外键关系
-- course 主键表  mark 外键表  cid 
alter table mark 
add constraint mark_cid_Fk02
foreign key(cid)
references course(cid);
-- 8、外键表的值 来自于主键表          
-- 所以插入数据的时候 先插入主键表的数据 再插入外键表的数据。
-- 8.1 插入学生信息。。
insert into student(stuName) values('张三');
insert into student(stuName) 
values('李小龙'),('王五'),('赵六'),('刘德华');

select * from student;
-- 8.2 插入课程信息
insert into course(cName)values('java'),('mysql'),('web');
select * from course;

-- 外键表的值引用自 主键表的数据  
-- 主键表中没有的数据 外键表无法引用。。。
insert into mark(sid,cid,score)
values(1,2,88),(1,3,73),
(2,1,88),(2,2,73),(2,3,88),
(3,1,56),(3,2,83),(3,3,68),
(4,1,45),(4,2,67),(4,3,78),
(5,1,69),(5,2,79),(5,3,98);

select * from mark;

# 9.删除主键表的时候注意 不能删除被引用了的数据。。。
# 需要将与之关联的外键信息删除之后才能删除主键表的数据。。。
delete from student ;
# 没有被引用的主键对应的记录可以删除
delete from student where sid=6;
select * from student;

17.多表查询

需要查询的数据来自多个表格:

select 表1名称.字段1,… 表2名称.字段1,…
from 表1名称1,表2名称
where 表与表之间的引用关系;

# 等价连接
select 
student.stuName,student.entranceTime,
course.cName,
mark.score
from student,course,mark
where student.sid=mark.sid and course.cid=mark.cid ;

# 查询各个学生的总分 按照总分排名
select 
student.stuName,
SUM(mark.score)
from student,course,mark
where student.sid=mark.sid and course.cid=mark.cid 
group by student.`stuName`
having SUM(mark.`score`) >=220
order by SUM(mark.score) desc;

# 内连接 inner join 
select 
student.stuName,student.entranceTime,
course.cName,
mark.score
from student
inner join mark
on student.sid=mark.sid
inner join course
on course.cid=mark.cid
where student.`stuName`='张三';


# 左连接 
select 
student.stuName,student.entranceTime,
course.cName,
mark.score
from student
left join mark
on student.sid=mark.`sid`
left join course
on mark.cid=course.cid;
# 右连接,右连接和左连接格式一样

关于内连接,左连接,右连接的详解和区别可以去参考
plg17的博客:

https://blog.csdn.net/plg17/article/details/78758593

发布了13 篇原创文章 · 获赞 2 · 访问量 580

猜你喜欢

转载自blog.csdn.net/Muyaaa/article/details/103923737