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的博客: