資料庫基礎-MySql8.0(第四篇)-多表查詢和子查詢
阿新 • • 發佈:2021-12-06
MySql基礎篇
多表設計:
在儲存不同的一類資訊時
減少資料冗餘
表與表之間如何關聯
資料庫設計正規化:
1.列的原子性(不可再分)
2.要有主鍵(唯一的標識列),表中其他資訊都依賴於主鍵
3.一張表儲存一類資訊,關聯其他表,消除資料冗餘
學生資訊表:
學號,姓名,性別,生日,手機號,年級ID,註冊時間
年級表:
年級ID,年級名稱
-- 老師資訊表
工號,姓名,性別,年級ID
課程資訊表
-- 建立年級表 CREATE TABLE grade(id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(10)) -- 建立學生表 CREATE TABLE student( num INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(10) NOT NULL, sex CHAR(1), birthday DATE, phone CHAR(11), grade_id INT, -- 外來鍵約束 reg_time DATETIME ) -- 弱關係,在表與表關聯時,沒有任何約束 -- 強關係,表與表之間存在約束關係 -- 修改表,新增年級外來鍵約束 -- 外來鍵約束:外來鍵與另一個表中的主鍵對應的 ALTER TABLE student ADD CONSTRAINT grade_fk FOREIGN KEY(grade_id) REFERENCES grade(id) /* 表與表之間的聯絡關係 一對一:一個人有一個學號,一個學號對應一個人 一對多:一個人屬於一個年級 多對一:多名學生屬於一個年級 多對多:一個人可以選多門課程,一個課程可以被多名學生選 */ CREATE TABLE course(id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(10) ) -- 多對多設計一個關係表來儲存學生與課程關係 CREATE TABLE student_course( stu_num INT, course_id INT, CONSTRAINT stu_fk FOREIGN KEY(stu_num) REFERENCES student(num), CONSTRAINT course_fk FOREIGN KEY(course_id) REFERENCES course(id) )
子查詢
-- 子查詢:出現在其他語句(insert update delete select) 中的select語句,成為子查詢或內查詢 -- 外部的查詢語句,稱為主查詢或外查詢 -- 在insert語句中使用子查詢 INSERT INTO stu SELECT * FROM student -- 在update中使用子查詢 UPDATE student SET sex='男' WHERE num IN (SELECT num FROM stu WHERE score>80) -- 在delete語句中使用子查詢 DELETE FROM student WHERE num IN(SELECT num FROM stu WHERE score>=90) -- 查詢語句中使用子查詢 -- select後面:僅僅支援標量子查詢(一行一列) SELECT ( SELECT ts.num FROM student ts WHERE ts.num = t.num ),t.name FROM student t -- 在where後面使用列子查詢 SELECT * FROM student WHERE score IN (SELECT score FROM student WHERE score>60) -- 在where後面使用行子查詢 同時滿足多個條件 SELECT * FROM student WHERE (num,score)=( SELECT MIN(num),MAX(score) FROM student ) -- 在from後使用子查詢 只支援表子查詢(多行多列) -- 把一個查詢出來的結果,可以當一隻那個臨時表 SELECT * FROM( SELECT COUNT(*)c ,sex FROM student GROUP BY sex) t WHERE t.c >= 2