在存储不同的一类信息时
减少数据冗余
表与表之间如何关联
数据库设计范式: 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