1:首先唯一索引:
create table t5(
id int,
num int,
unique(num))engine=Innodb charset=utf8;
作用: num列的值不能重复
加速查找
create table t5(
id int,
num int,
unique(int,num))engine=Innodb charset=utf8;
里面放两个 是联合所引.他的作用是:
num列和id列的值 一起不能重复
也可以放多个 代表里面的值都一起不能重复
1:外键另外两种使用方式
1:昨天说的一对多
部门表:
id depart_name
1 公关部
2 公共部
3 保安部
员工表:
id name age depart_id(外键)
1 lxxx 12 2
2 xxxx 13 1
3 xxxx 13 2
2:一对一
用户表:
id name age
1 zekai 23
2 eagon 34
3 lxxx 45
4 owen 83
博客表:
id url user_id (外键 + 唯一约束)
1 /linhaifeng 2
2 /zekai 1
3 /lxxx 3
4 /lxxx 4
4. 多对多:
用户表:
id name phone
1 root1 1234
2 root2 1235
3 root3 1236
4 root4 1237
5 root5 1238
6 root6 1239
7 root7 1240
8 root8 1241
主机表:
id hostname
1 c1.com
2 c2.com
3 c3.com
4 c4.com
5 c5.com
为了方便查询, 用户下面有多少台主机以及某一个主机上有多少个用户, 我们需要新建第三张表:
user2host:
id userid hostid
1 1 1
2 1 2
3 1 3
4 2 4
5 2 5
6 3 2
7 3 4
创建的时候, userid 和 hostid 必须是外键, 然后联合唯一索引 unique(userid, hostid)
Django orm 也会设计
二:数据行的操作
1:增 insert into 表明 (列名1,列名2) values (值1,值2),(值1,值2),()....
2:insert into 表名 (列名1,列名2) select 列名1,列名2 from 表明2;
删除 delete from 表名; #这样就把整张表删掉了
delete from表名 where id > 10: 删掉条件之内的
where 后面可以加多个条件 用 and or 隔开,跟python一样 and就是并且 or 就是或
2:查询
select * from 表名; #这样就把所有的数据都列出来了
select name,age from 表名;
后面还可以加where条件筛选
select * from表名 where id=10;
运算符 就是> < >= <= = !=
还有个between and 是闭区间
id between 1 and 10;
in 在某个集合内
然后通配符
select * from 表名 where name like 'aaa%'
select * from 表名 where name like 'aaa_'
然后限制取几条
limit 前面是偏移量 后面是取得数据量
select * from t3 limit 0,10 就是第一页的十条数据
网页的页面就是用的这个原理
然后排序 order by 列名 desc
是降序排序
升序是 order by 列名 asc
select * from t4 order by num desc, name asc;
如果前一列的值相等的话, 会按照后一列的值进行进一步的排序.
.
分组
select age,聚合函数 from 表名 group by 列名; 就会将这一列相同的数据分为一组
count() sum() max() min() avg()
having的二次删选:是跟在group后面的
1).having与where类似,可筛选数据
2). where针对表中的列发挥作用,查询数据
3). having针对查询结果中的列发挥作用,筛选数据
f. 连表操作
select * from userinfo, department; (笛卡尔积) # 后面可以跟各种条件
左连接 left join
就意思以左边的为主题 左边的表全部显示, 右边没有用到不显
select * from userinfo left join department on userinfo.depart_id=department.id;
右连接: right join
select * from userinfo right join department on userinfo.depart_id=department.id;
右边的表全部显示, 左边没关联的用null表示
内连接: inner join
左右两边的数据都会显示
只需要记住左连接left join 就可以了
可以用连接语法链接多张表 通过某一个特定条件
查询的顺序是 首先 where 然后group by 跟着having 然后order排序 最后limit
where针对表中的列发挥作用,查询数据
having针对查询结果中的列发挥作用,筛选数据