python—day38 表之间关系、清空表、多对多、一对一、单表查询

一:表之间的关系多对一关系;

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;
 

猜你喜欢

转载自www.cnblogs.com/kermitjam/p/9014416.html