数据的重复叫做冗余
多表操作
1、为什么需要分表?
数据的重复叫做冗余,占据大量的数据存储空间,一旦数据发生变化,此时需要大量改动,容易出错。这时就需要分表 。将一张表分离成多张表,取消数据的冗余。
CREATE TABLE classroom(
id INT PRIMARY KEY auto_increment,
name VARCHAR(100) NOT NULL UNIQUE,
descs VARCHAR(255)
)
CREATE TABLE student(
id INT PRIMARY KEY auto_increment,
name VARCHAR(50) NOT NULL,
age int DEFAULT 18,
gender CHAR(2) DEFAULT '男',
address VARCHAR(255) DEFAULT '',
cls_id int
)
INSERT INTO classroom(name,descs)VALUES("java开发班","很容易掉头发");
INSERT into classroom VALUES(null,"Python班","不容易掉头发的");
INSERT INTO classroom(name,descs)VALUES("PHP开发班","打游戏");
INSERT INTO classroom(name,descs)VALUES("WEB测试班","唱歌");
INSERT INTO student(name,age,gender,address,cls_id)VALUES("李雷",22,"男","西安",1);
INSERT INTO student(name,age,gender,address,cls_id)VALUES("韩梅梅",19,"女","西安",4);
INSERT INTO student(name,age,gender,address,cls_id)VALUES("张三",16,"男","北京",2);
INSERT INTO student(name,age,gender,address,cls_id)VALUES("李四",18,"女","西安",3);
INSERT INTO student(name,age,gender,address,cls_id)VALUES("王五",15,"男","西安",1);
2、多表关联查询
自然、交叉连接查询
SQL92 查询多表,必须声明这几张表的关系
SELECT * FROM classroom,student;
SQL98 查询多表,
SELECT * FROM classroom CROSS JOIN student;
上面的查询叫做全连接查询(cross join)查出两表行乘
– 因为没有告诉两张表关联关系,所以进行自动关联,产生笛卡尔积现象
内连接查询
SQL92
-- SQL92标准下
SELECT * FROM classroom,student WHERE classroom.id=student.cls_id;
继续有条件用and连接
SQL98标准下(inner join)
-- SQL98标准下
SELECT * from classroom INNER JOIN student ON(classroom.id=student.cls_id);
继续有条件用where连接。
当学生表有一个没有班级时,班级编号为空时 ,内连接就不管用。内连接不能查到空白的,必须查到两张表有关联关系的。
外连接(outer join)
只有SQL98标准
- 左外连接(left outer join)#左边的表数据全部显示,另一侧如果没有关联关系用null补齐
- 右外连接(right outer join)#右边的表数据全部显示,另一侧如果没有关联关系用null补齐
在这里插入代码片
原来用内连接只能查17条数据,使用外连接可以18条数据
自连接
#自查询,表的外键是指向自身的
-- 查询所有的顶级板块
SELECT * FROM board WHERE parent_id=0;
-- id_1的版本的所有子版本
SELECT boardName FROM board WHERE id=1;
-- 查询id_1的所有子版本
SELECT * FROM board WHERE parent_id=1;
外键约束