一:表之间的关系多对一关系;
1、把所有数据都存放于一张表的弊端;
1.表的组织结构复杂不清晰
2.浪费空间
3.扩展性极差
2、寻找表与表之间的关系的套路
举例:emp表 dep表
步骤一:
1.先站在左表的角度;
2.去找左表emp的多条记录是否对应右表dep的一条记录
3.翻译的意义:
左表emp的多条记录==多个员工
右表dep的一条记录==一个部门
多个部门是否可以属于一个部门;
步骤二:
1.先站在右表的角度;
2.去找右表dep的多条记录是否对应emp的一条记录
3.翻译的意义:
右表dep的多条记录==多个部门
左表emp的一条记录==一个员工
多个部门是否可以包含同一个员工
foreign key会带来什么样的效果?
1 #1、约束1:在创建表时,先建被关联的表dep,才能建关联表emp 2 3 create table dep( 4 id int primary key auto_increment, 5 dep_name char(10), 6 dep_comment char(60) 7 ); 8 9 create table emp( 10 id int primary key auto_increment, 11 name char(16), 12 gender enum('male','female') not null default 'male', 13 dep_id int, 14 foreign key(dep_id) references dep(id) 15 ); 16 17 #2、约束2:在插入记录时,必须先插被关联的表dep,才能插关联表emp 18 insert into dep(dep_name,dep_comment) values 19 ('sb教学部','sb辅导学生学习,教授python课程'), 20 ('外交部','老男孩上海校区驻张江形象大使'), 21 ('nb技术部','nb技术能力有限部门'); 22 23 24 insert into emp(name,gender,dep_id) values 25 ('alex','male',1), 26 ('egon','male',2), 27 ('lxx','male',1), 28 ('wxx','male',1), 29 ('wenzhou','female',3); 30 31 32 #3、约束3:更新与删除都需要考虑到关联与被关联的关系 33 解决方案: 34 1、先删除关联表emp,再删除被关联表dep,准备重建 35 mysql> drop table emp; 36 Query OK, 0 rows affected (0.11 sec) 37 38 mysql> drop table dep; 39 Query OK, 0 rows affected (0.04 sec) 40 41 42 2、重建:新增功能,同步更新,同步删除 43 create table dep( 44 id int primary key auto_increment, 45 dep_name char(10), 46 dep_comment char(60) 47 ); 48 49 create table emp( 50 id int primary key auto_increment, 51 name char(16), 52 gender enum('male','female') not null default 'male', 53 dep_id int, 54 foreign key(dep_id) references dep(id) 55 on update cascade 56 on delete cascade 57 ); 58 insert into dep(dep_name,dep_comment) values 59 ('sb教学部','sb辅导学生学习,教授python课程'), 60 ('外交部','老男孩上海校区驻张江形象大使'), 61 ('nb技术部','nb技术能力有限部门'); 62 63 64 insert into emp(name,gender,dep_id) values 65 ('alex','male',1), 66 ('egon','male',2), 67 ('lxx','male',1), 68 ('wxx','male',1), 69 ('wenzhou','female',3); 70 71 72 # 同步删除 73 mysql> select * from dep; 74 +----+------------------+------------------------------------------------------------------------------------------+ 75 | id | dep_name | dep_comment | 76 +----+------------------+------------------------------------------------------------------------------------------+ 77 | 1 | sb教学部 | sb辅导学生学习,教授python课程 | 78 | 2 | 外交部 | 老男孩上海校区驻张江形象大使 | 79 | 3 | nb技术部 | nb技术能力有限部门 | 80 +----+------------------+------------------------------------------------------------------------------------------+ 81 3 rows in set (0.00 sec) 82 83 mysql> select * from emp; 84 +----+------------------+--------+--------+ 85 | id | name | gender | dep_id | 86 +----+------------------+--------+--------+ 87 | 1 | alex | male | 1 | 88 | 2 | egon | male | 2 | 89 | 3 | lxx | male | 1 | 90 | 4 | wxx | male | 1 | 91 | 5 | wenzhou | female | 3 | 92 +----+------------------+--------+--------+ 93 5 rows in set (0.00 sec) 94 95 mysql> delete from dep where id=1; 96 Query OK, 1 row affected (0.02 sec) 97 98 mysql> select * from dep; 99 +----+------------------+------------------------------------------------------------------------------------------+ 100 | id | dep_name | dep_comment | 101 +----+------------------+------------------------------------------------------------------------------------------+ 102 | 2 | 外交部 | 老男孩上海校区驻张江形象大使 | 103 | 3 | nb技术部 | nb技术能力有限部门 | 104 +----+------------------+------------------------------------------------------------------------------------------+ 105 2 rows in set (0.00 sec) 106 107 mysql> select * from emp; 108 +----+------------------+--------+--------+ 109 | id | name | gender | dep_id | 110 +----+------------------+--------+--------+ 111 | 2 | egon | male | 2 | 112 | 5 | wenzhou | female | 3 | 113 +----+------------------+--------+--------+ 114 2 rows in set (0.00 sec) 115 116 #同步更新 117 mysql> select * from emp; 118 +----+------------------+--------+--------+ 119 | id | name | gender | dep_id | 120 +----+------------------+--------+--------+ 121 | 2 | egon | male | 2 | 122 | 5 | wenzhou | female | 3 | 123 +----+------------------+--------+--------+ 124 2 rows in set (0.00 sec) 125 126 mysql> update dep set id=200 where id =2; 127 Query OK, 1 row affected (0.04 sec) 128 Rows matched: 1 Changed: 1 Warnings: 0 129 130 mysql> select * from dep; 131 +-----+------------------+------------------------------------------------------------------------------------------+ 132 | id | dep_name | dep_comment | 133 +-----+------------------+------------------------------------------------------------------------------------------+ 134 | 3 | nb技术部 | nb技术能力有限部门 | 135 | 200 | 外交部 | 老男孩上海校区驻张江形象大使 | 136 +-----+------------------+------------------------------------------------------------------------------------------+ 137 2 rows in set (0.00 sec) 138 139 mysql> select * from emp; 140 +----+------------------+--------+--------+ 141 | id | name | gender | dep_id | 142 +----+------------------+--------+--------+ 143 | 2 | egon | male | 200 | 144 | 5 | wenzhou | female | 3 | 145 +----+------------------+--------+--------+ 146 2 rows in set (0.00 sec)
二:清空表的补充:
delete from tb1;
强调:上面的这条命令确实可以将表里的所有记录都删掉,但不会将id重置为0,
所以收该条命令根本不是用来清空表的,delete是用来删除表中某一些符合条件的记录
delete from tb1 where id > 10;
如果要清空表,使用truncate tb1;
作用:将整张表重置
三:多对多:
1、什么是多对多
两张表之间是一个双向的多对一关系,称之为多对多
如何实现?
建立第三张表,该表中有一个字段fk左表的id,还有一个字段是fk右表的id
1 create table author( 2 id int primary key auto_increment, 3 name char(16) 4 ); 5 6 create table book( 7 id int primary key auto_increment, 8 bname char(16), 9 price int 10 ); 11 12 insert into author(name) values 13 ('egon'), 14 ('alex'), 15 ('wxx') 16 ; 17 insert into book(bname,price) values 18 ('python从入门到入土',200), 19 ('葵花宝典切割到精通',800), 20 ('九阴真经',500), 21 ('九阳神功',100) 22 ; 23 24 25 create table author2book( 26 id int primary key auto_increment, 27 author_id int, 28 book_id int, 29 foreign key(author_id) references author(id) 30 on update cascade 31 on delete cascade, 32 foreign key(book_id) references book(id) 33 on update cascade 34 on delete cascade 35 ); 36 37 insert into author2book(author_id,book_id) values 38 (1,3), 39 (1,4), 40 (2,2), 41 (2,4), 42 (3,1), 43 (3,2), 44 (3,3), 45 (3,4);
四:一对一
左表的一条记录唯一对应右表的一条记录,反之也一样
1 create table customer( 2 id int primary key auto_increment, 3 name char(20) not null, 4 qq char(10) not null, 5 phone char(16) not null 6 ); 7 8 create table student( 9 id int primary key auto_increment, 10 class_name char(20) not null, 11 customer_id int unique, #该字段一定要是唯一的 12 foreign key(customer_id) references customer(id) #外键的字段一定要保证unique 13 on delete cascade 14 on update cascade 15 ); 16 17 insert into customer(name,qq,phone) values 18 ('李飞机','31811231',13811341220), 19 ('王大炮','123123123',15213146809), 20 ('守榴弹','283818181',1867141331), 21 ('吴坦克','283818181',1851143312), 22 ('赢火箭','888818181',1861243314), 23 ('战地雷','112312312',18811431230) 24 ; 25 26 27 #增加学生 28 insert into student(class_name,customer_id) values 29 ('脱产3班',3), 30 ('周末19期',4), 31 ('周末19期',5) 32 ;
五:单表查询
1 mysql> select * from emp; 2 +----+------------------+--------+--------+ 3 | id | emp_name | gender | dep_id | 4 +----+------------------+--------+--------+ 5 | 2 | egon | male | 200 | 6 | 5 | wenzhou | female | 3 | 7 +----+------------------+--------+--------+ 8 2 rows in set (0.00 sec) 9 10 11 select id,name from emp 12 where id > 1 and name like "%on%" 13 group by dep_id 14 having 分组后的过滤条件 15 order by 排序依据 16 limit n;