1. 程式人生 > 其它 >資料庫基礎-MySql8.0(第四篇)-多表查詢和子查詢

資料庫基礎-MySql8.0(第四篇)-多表查詢和子查詢

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