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;

多謝您的觀看~~~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章