學習地址:一天學會 MySQL 數據庫【https://www.bilibili.com/video/BV1Vt411z7wy】
目 錄
2、舉例2(student2數據表==拆字段==》student3數據表)
02、查詢student表中的所有記錄的sname、ssex和class列。
06、查詢student表中“95031 ”班或性別爲“女"的同學記錄。
08、以cno升序、 degree降序查詢score表的所有記錄。
10、查詢score表中的最高分的學生學號和課程號。(子查詢或者排序)
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
查詢練習
- 查詢student表的所有記錄。
- 查詢student表中的所有記錄的sname、ssex和class列。
- 查詢教師所有的單位,即不重複的depart列。
- 查詢score表中成績在60到80之間的所有記錄。
- 查詢score表中成績爲85,86或88的記錄。
- 查詢student表中“95031”班或性別爲“女”的同學記錄。
- 以class降序查詢student表的所有記錄。
- 以cno升序、 degree降序查詢score表的所有記錄。
- 查詢“95031"班的學生人數。
- 查詢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 ) ; /*複合語句*/
- 找到最高分【select max(degree) from score)】
- 找最高分的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;
多謝您的觀看~~~