mysql复习篇及一对多和多对多的总结(17.6.26 )
一、疑问
1.varchar 与 char 区别
答:char 只能存储指定的字符长度,varchar存储的字符长度是可变动的
例子 char(10),varchar(10) ,10代表是字符长度是10,char表示只能存储10个字符大于10不存储小于10也按10个位置来,varchar,存入多少就按多少来。
char优缺点:效率高,与varchar相比浪费内存。
varchar优缺点; 节省空间,效率低。
2.select * from t1 where nid in (1,2,3) 代码意思;
答:只显示规定的数据
3.mysql 如何实现区间查询;
答:select * from preson where nid betwenn 2 and 5;
4.查询到的内容如何排序 提示:desc
select
*
from
表
order
by
列
asc
- 根据 “列” 从小到大排列
select
*
from
表
order
by
列
desc
- 根据 “列” 从大到小排列
select
*
from
表
order
by
列1
desc
,列2
asc
- 根据 “列1” 从大到小排列,如果相同则按列2从小到大排序
5.限制 代码提示:
select
*
from
表 limit 5; - 只显示前5行;
select
*
from
表 limit 4,5; - 从第4行开始,显示后面的5行;
select
*
from
表 limit 5 offset 4 - 和上面一样
6.分组(聚合函数) 代码提示:select from t1 group by partment
:select count(nid2) from t1 group by partment
:select count(nid) from t1 group by partment having count(nid)>2;
#sum avg min max
答:
select
num
from
表
group
by
num # num列中只显示不重合的
select
num,nid
from
表
group
by
nid,num #nid列中显示所有不重合的,num依附nid
select
num,nid
from
表
where
nid > 10
group
by
num,nid
order
nid
desc
select
num,nid,
count
(*),
sum
(score),
max
(score),
min
(score)
from
表
group
by
num,nid
7.利用t2搜索t1(跨表操作)代码提示: select name email from t1 where nit in (1,2,3)
:select name email from t1 where nit in(select nid from t2)
答: 显示t1中的name和email 前提是:nid 是 t2表中的nid
8.查询到的结果重新命名,代码提示: select name as n ,email from t1;
答:修改得到结果的表头为 'n'
9.核实 pymysql 在执行完插入、更新、删除后 返回的结果是什么;
答:结果是个num数值,表示删几行、增加几行、修改了几行。
10.pymysql 获取插入内容的id;
答:new_id = cursor.lastrowid 既可以获取新增数据的行数;
二、一对多与多对多
a.一多对多
1、你所认识的一对多;
答:就是一个表要利用另一个表的数据,不用再重新造重复的数据而产生的机制;
一对多 是指:主表中的一项可以与副表中的某一项有关系(一夫一妻制);
2.1、 Navicat for MySQL 实现一对多;
答:实现成功,注意事项,最好在新建立表的时候就把外键一块给创建了,要不然后面很麻烦
表设计==> 外键==>栏位(自己要借鉴的列)==>参考表==>参考的栏位==>ctrl+s
2.2、 代码实现;
CREATE TABLE person1( nid INT (11) AUTO_INCREMENT, NAME VARCHAR (32), email VARCHAR (32), part_nid INT, PRIMARY KEY (nid), -- KEY fk_xxx (part_nit), CONSTRAINT fk_xxx FOREIGN KEY (part_nid) REFERENCES part1 (nid) )
2.3、 代码删除和添加一对多;
删除:alter table person1 drop foreign key fk_xxx
添加:alter table person1 add constraint fk_xxx foreign key(part_nid) references part1(nid)
3、实现一对一及一对多的查询:
要求:分别用 left join、inner join 灵活实现;未能实现
普通条件查询 SELECT person.name,part1.nidd from person,part1 where person.nid = part1.nidd
一张表的关联查询:
select * from 主表 left join 副表 on 主表关联列 = 副表关联列 where ...
与多张表的关联查询:
select * from 主表
left join 副表 on 主表关联列 = 副表关联列
left join 副表 on 主表关联列 = 副表关联列
where ...
还有 inner join 与 right join 功能 都差不多。
b.多对多
1、你是如何理解多对多的;
多对多 是指:主表中的一项可以与副表中的多项有关系(一夫多妻制);
2、Navicat for MySQL 实现多对多,提示:创建表一,表二、表三、 利用表三建立表一与表二的关系;
答:完成
3、实现灵活查找 提示 利用join
select * from 主表
left join 副表1 on 主表关联列 = 副表1关联列
left join 副表2 on 主表关联列 = 副表2关联列
where ...