数据库
首页 > 数据库> > MySQL数据库-笔记03【范式(1NF、2NF、3NF)、数据查询练习-10条练习题(附答案解析)】

MySQL数据库-笔记03【范式(1NF、2NF、3NF)、数据查询练习-10条练习题(附答案解析)】

作者:互联网

学习地址:一天学会 MySQL 数据库https://www.bilibili.com/video/BV1Vt411z7wy】 

目   录

16-数据表设计-第一范式1NF

1、举例1(student2数据表)

2、举例2(student2数据表==拆字段==》student3数据表)

17-数据表设计-第二范式2NF

1、订单表(联合主键=>共同组成订单表的主键)

2、订单表问题(不满足2NF)

3、拆表

18-数据表设计-第三范式3NF

19-查询练习-数据准备

1、新建一个查询用的数据库:selectTest

2、建立数据表(学生表、课程表、成绩表、教师表)

2.1、学生表(student)

2.2、教师表(teacher)

2.3、课程表(course)

2.4、成绩表(score)

3、往数据表中添加数据

3.1、添加学生信息

3.2、添加教师信息

3.3、添加课程信息

3.4、添加成绩信息

20-查询练习-1-10

01、查询student表的所有记录。

02、查询student表中的所有记录的sname、ssex和class列。

03、查询教师所有的单位,即不重复的depart列。

04、查询score表中成绩在60到80之间的所有记录。

1、查询区间(between...and...)

2、运算符比较(>、<)

05、查询score表中成绩为85,86或88的记录。

06、查询student表中“95031 ”班或性别为“女"的同学记录。

07、以class降序查询student表的所有记录。

1、降序(desc)

2、升序(asc;默认状态)

08、以cno升序、 degree降序查询score表的所有记录。

09、查询“95031"班的学生人数。

10、查询score表中的最高分的学生学号和课程号。(子查询或者排序)

1、子查询(复合语句)

21-查询练习-10过程解析

1、子查询-过程解析

2、排序


16-数据表设计-第一范式1NF

第一范式(1NF):数据表中的所有字段都是不可分割的原子值。

1、举例1(student2数据表)

create table student2(
    id int primary key,
    name varchar(20),
    address varchar(30)
);
insert into student2 values(1, '张三', '中国河南省001号');
insert into student2 values(2, '张三', '中国河南省002号');
insert into student2 values(3, '张三', '中国河南省003号');

address字段 包含的信息,可以再分!

字段值可以继续拆分的数据表,不满足 第一范式!

2、举例2(student2数据表==拆字段==》student3数据表)

create table student3(
    id int primary key,
    name varchar(20),
    country varchar(30),
    province varchar(30),
    city varchar(30),
    details varchar(30)
);
insert into student3 values(1, '阿星', '中国', '河南省', '商丘市', '梁园区钻石总统府1号');
insert into student3 values(2, '阿星', '中国', '河南省', '商丘市', '梁园区黄金总统府2号');
insert into student3 values(3, '阿星', '中国', '河南省', '商丘市', '梁园区蓝钻总统府3号');

 

 范式,设计的越详细,对于某些实际操作可能更好,但是不一定都是好处。

 

address  =====》  country  |  province  |  city  |  details

17-数据表设计-第二范式2NF

第二范式(2NF):必须是在满足第一范式的前提下。第二范式要求:除主键外的每一列都必须完全依赖于主键。

如果要出现不完全依赖,只可能发生在联合主键的情况下。

 

第二范式(2NF):1NF + 除主键外的每一列都要完全依赖于主键。

1、订单表(联合主键=>共同组成订单表的主键)

-- 订单表
create table myorder(
    product_id int,
    customer_id int,
    product_name varchar(20),
    customer_name varchar(20),
    primary key(product_id, customer_id) /*共同组成订单表的主键*/
);

2、订单表问题(不满足2NF)

product_id 只和 product_name 有关;

customer_id 只和 customer_name 有关。

 

出现了 联合主键,可能会出现一些列 只依赖于 主键的某一部分。

除主键以外的其它列,只依赖于主键的部分字段。

 

拆表:拆分 为 主表 和 副表

3、拆表

拆分成三个表之后,就满足了第二范式的设计! !

-- 订单表
create table myorder(
    order_id int primary key,
    product_id int, /*完全依赖于主键*/
    customer_id int /*完全依赖于主键*/
);


-- 产品表
create table product(
    id int primary key,
    name varchar(20) /*完全依赖于主键*/
);


-- 客户表
create table customer(
    id int primary key,
    name varchar(20) /*完全依赖于主键*/
);

18-数据表设计-第三范式3NF

第三范式(3NF):必须是在满足第二范式的前提下。第三范式要求:除开主键列的其它列之间,不能有传递依赖关系。

第三范式(3NF):2NF + 除开主键列的其它列之间,不能有传递依赖关系。

  • customer_id int,   /*customer_phone与order_id有关系*/
  • customer_phone varchar(15)   /*customer_phone与order_id、customer_id有关系 ===》关系冗余! */
create table myorder(
    order_id int primary key,
    product_id int,
    customer_id int, /*customer_phone与order_id有关系*/
    customer_phone varchar(15) /*customer_phone与order_id、customer_id有关系 ===》关系冗余!*/
);


-- ======应该这样写!====== --


-- 客户表
create table customer(
    id int primary key,
    name varchar(20), /*完全依赖于主键*/
    phone varchar(15)
);

19-查询练习-数据准备

1、新建一个查询用的数据库:selectTest

CREATE DATABASE selectTest;

选择 该 数据库!

USE selectTest;

2、建立数据表(学生表、课程表、成绩表、教师表)

2.1、学生表(student)

CREATE TABLE student( /*学生表*/
    sno VARCHAR(20) PRIMARY KEY COMMENT'学生学号',
    sname VARCHAR(20) NOT NULL COMMENT'学生姓名,不能为空',
    ssex VARCHAR(10) NOT NULL COMMENT'学生性别',
    sbirthday DATETIME COMMENT'学生生日-出生年月日',
    class VARCHAR(20) COMMENT'学生所在的班级'
);

2.2、教师表(teacher)

CREATE TABLE teacher(
    tno VARCHAR(20) PRIMARY KEY COMMENT'教师编号',
    tname VARCHAR(20) NOT NULL COMMENT'教师姓名',
    tsex VARCHAR(20) NOT NULL COMMENT'教师性别',
    tbirthday DATETIME COMMENT'教师生日-出生年月日',
    prof VARCHAR(20) NOT NULL COMMENT'教师职称',
    depart VARCHAR(20) NOT NULL COMMENT'教师所在部门'
);

2.3、课程表(course)

CREATE TABLE course(
    cno VARCHAR(20) PRIMARY KEY COMMENT'课程号',
    cname VARCHAR(20) NOT NULL COMMENT'课程名称',
    tno VARCHAR(20) NOT NULL COMMENT'教师编号 外键关联teacher表',
    FOREIGN KEY(tno) references teacher(tno)
);

-- 报错:Failed to open the referenced table 'teacher'
-- 需要先创建teacher表!

2.4、成绩表(score)

CREATE TABLE score (
    sno VARCHAR(20) not null COMMENT'成绩表的编号,依赖学生学号',
    cno VARCHAR(20) not null COMMENT'课程号 依赖于 课程表中的cno',
    degree decimal COMMENT'成绩',
    foreign key(sno) references student(sno),
    foreign key(cno) references course(cno),
    primary key(sno, cno) /*设置联合主键*/
);

3、往数据表中添加数据

3.1、添加学生信息

-- 添加学生信息---学生表数据
INSERT INTO student VALUES('101','曾华','男','1977-09-01','95033');
INSERT INTO student VALUES('102','匡明','男','1975-10-02','95031');
INSERT INTO student VALUES('103','王丽','女','1976-01-23','95033');
INSERT INTO student VALUES('104','李军','男','1976-02-20','95033');
INSERT INTO student VALUES('105','王芳','女','1975-02-10','95031');
INSERT INTO student VALUES('106','陆军','男','1974-06-03','95031');
INSERT INTO student VALUES('107','王尼玛','男','1976-02-20','95033');
INSERT INTO student VALUES('108','张全蛋','男','1975-02-10','95031');
INSERT INTO student VALUES('109','赵铁柱','男','1974-06-03','95031');

3.2、添加教师信息

-- 添加教师信息---教师表数据
INSERT INTO teacher VALUES('804','李诚','男','1958-12-02','副教授','计算机系');
INSERT INTO teacher VALUES('856','张旭','男','1969-03-12','讲师','电子工程系');
INSERT INTO teacher VALUES('825','王萍','女','1972-05-05','助教','计算机系');
INSERT INTO teacher VALUES('831','刘冰','女','1977-08-14','助教','电子工程系');

3.3、添加课程信息

-- 添加课程信息---课程表数据
INSERT INTO course VALUES('3-105','计算机导论','825');
INSERT INTO course VALUES('3-245','操作系统','804');
INSERT INTO course VALUES('6-166','数字电路','856');
INSERT INTO course VALUES('9-888','高等数学','831');

 

3.4、添加成绩信息

-- 添加成绩信息---成绩表数据
INSERT INTO score VALUES('103','3-245','86');
INSERT INTO score VALUES('105','3-245','75');
INSERT INTO score VALUES('109','3-245','68');
INSERT INTO score VALUES('103','3-105','92');

INSERT INTO score VALUES('105','3-105','88');
INSERT INTO score VALUES('109','3-105','76');
INSERT INTO score VALUES('103','6-166','85');

INSERT INTO score VALUES('105','6-166','79');
INSERT INTO score VALUES('109','6-166','81');

 

20-查询练习-1-10

查询练习

  1. 查询student表的所有记录。
  2. 查询student表中的所有记录的sname、ssex和class列。
  3. 查询教师所有的单位,即不重复的depart列。
  4. 查询score表中成绩在60到80之间的所有记录。
  5. 查询score表中成绩为85,86或88的记录。
  6. 查询student表中“95031”班或性别为“女”的同学记录。
  7. 以class降序查询student表的所有记录。
  8. 以cno升序、 degree降序查询score表的所有记录。
  9. 查询“95031"班的学生人数。
  10. 查询score表中的最高分的学生学号和课程号。(子查询或者排序)

01、查询student表的所有记录。

select * from student;

 

02、查询student表中的所有记录的sname、ssex和class列。

select sname, ssex, class from student;

03、查询教师所有的单位,即不重复的depart列。

select distinct depart from teacher;

04、查询score表中成绩在60到80之间的所有记录。

1、查询区间(between...and...

查询区间:between...and...   闭区间   [min, max]

select * from score where degree between 60 and 80;

 

2、运算符比较(>、<)

select * from score where degree > 60 and degree < 80;

05、查询score表中成绩为85,86或88的记录。

表示或者关系的查询。

select * from score where degree in(85, 86, 88);

06、查询student表中“95031 ”班或性别为“女"的同学记录。

or 表示 或者!

select * from student where class='95031' or ssex='女';

07、以class降序查询student表的所有记录。

升序(asc;默认状态)、降序(desc)

1、降序(desc)

select * from student order by class desc; /*desc降序*/

2、升序(asc;默认状态)

select * from student order by class;      /*desc降序;asc默认升序*/

select * from student order by class desc; /*desc降序;asc默认升序*/

08、以cno升序、 degree降序查询score表的所有记录。

select * from score order by cno asc, degree desc;

09、查询“95031"班的学生人数。

select count(*) from student where class = '95031';

10、查询score表中的最高分的学生学号和课程号。(子查询或者排序)

1、子查询(复合语句)

select sno, cno from score where degree = ( select max(degree) from score ) ; /*复合语句*/

21-查询练习-10过程解析

10、查询score表中的最高分的学生学号课程号。(子查询或者排序)

1、子查询-过程解析

select sno, cno from score where degree = ( select max(degree) from score ) ; /*复合语句*/
  1. 找到最高分【select max(degree) from score)】
  2. 找最高分的sno、cno【select sno, cno from score where degree = ( select max(degree) from score) ;】

2、排序

limit x, y;   【x:开始位置;y:取多少】【limit (从那开始取),(取到多少结束);】

第一个实参 表示 从第几条开始查,第二个实参 表示 查几条!

select sno, cno from score order by degree;

select sno, cno, degree from score order by degree;

select sno, cno, degree from score order by degree limit 0, 1;

select sno, cno, degree from score order by degree desc limit 0, 1;

多谢您的观看~~~

标签:3NF,03,10,INTO,查询,INSERT,score,VALUES,student
来源: https://blog.csdn.net/weixin_44949135/article/details/106694730