一,外键 (一对多)
作用: 1. 约束 2. 节省空间
--------------------------------------------------------------------------------
建表时外键设置为0 , 可以忽略外键 , 可删除表
添加列:alter table 表名 add 列名 类型
删除列:alter table 表名 drop column 列名
修改列:
alter table 表名 modify column 列名 类型; -- 类型
alter table 表名 change 原列名 新列名 类型; -- 列名,类型
添加主键:
alter table 表名 add primary key(列名);
删除主键:
alter table 表名 drop primary key;
alter table 表名 modify 列名 int, drop primary key;
添加外键:alter table 从表 add constraint 外键名称(形如:FK_从表_主表) foreign key 从表(外键字段) references 主表(主键字段);
删除外键:alter table 表名 drop foreign key 外键名称
create table department ( id int auto_increment primary key, depart_name varchar(32) not null default '', num int not null default 0 )engine=Innodb charset=utf8; create table userinfo ( id int auto_increment primary key, name varchar(32) not null default '', depart_id int not null default 1, # constraint 外键名(fk_userinfo_depart) foreign key (列名(depart_id)) references 表名(department)(关联的列名(id)), # constraint fk_userinfo_depart foreign key (depart_id) references department(id) )engine=Innodb charset=utf8; ps: 1. 不能将创建外键的语句单独拿出来,以下方式可以 alter table userinfo add constraint fk_userinfo_depart foreign key (depart_id) references department(id); alter table userinfo drop foreign key 外键名称(fk_userinfo_depart ); 2. 外键关联的时候, 必须关联的是表的主键ID 3. 练习的时候, 将语句写在文本中, 然后考过去执行 4. 主键索引 : 加速查找 + 不能为空 + 不能重复
1, 唯一索引:
1. 唯一索引: create table t5( id int, num int, unique(num) )engine=Innodb charset=utf8;
作用: num列的值不能重复 加速查找 create table t6( id int, num int, unique(id, num) )engine=Innodb charset=utf8;
联合唯一索引作用:
num列和id列的值不能重复 加速查找 create table t6( id int, num int, unique(id, num......) )engine=Innodb charset=utf8;
2, 一对多:
部门表: id depart_name 1 公关部 2 公共部 3 保安部 员工表: id name age depart_id(外键) 1 lxxx 12 2 2 xxxx 13 1 3 xxxx 13 2
3, 一对一:
用户表: 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)
二 , 数据行的操作:
增: insert into 表名 (列名1, 列名2,) values(值1, 值2); insert into 表名 (列名1, 列名2,) values(值1, 值2),(值1,值2),(值n,值n); insert into 表名 (列名1, 列名2,) select 列名1, 列名2 from 表名; 删除: delete from 表名; delete from 表名 where id > 10 delete from 表名 where id < 10 delete from 表名 where id <= 10 delete from 表名 where id >= 10 delete from 表名 where id != 10 delete from 表名 where id = 10 and name='xxx'; and : 并且 两个条件都必须要成立 delete from 表名 where id = 10 or name='xxx'; or : 或者 只要满足一个条件成立
修改: update 表名 set name='zekai', age=23 where id > 10; 查询: 基本: select * from 表名; select name , age from 表名;
1, where 条件查询:
select * from 表名 where id=10; select * from 表名 where id >10 and id<15; select * from 表名 where id > 10; != : 不等与 >= <= between and: 闭区间 select * from t4 where id between 9 and 12; in: 在某一个集合中 select * from t4 where id in (9,10,11....); select * from t4 where id in (select id from t3 where id between 2 and 4)
2. 通配符:
alex select * from 表 where name like 'ale%' - ale开头的所有(多个字符串) select * from 表 where name like 'ale_' - ale开头的所有(一个字符)
3,限制取几条:
select * from 表名 limit 索引偏移量, 取出多少条数据; select * from t3 limit 0, 10; 第一页 select * from t3 limit 10, 10; 第二页 page = input('page:') page 索引偏移量 数据量(offset) 1 0 10 2 10 10 3 20 10 4 30 10 page (page-1)*offset offset 分页核心SQL: select * from t3 limit (page-1)*offset, offset;
4,排序:
order by 降序: select * from t4 order by 列名 desc; descending 升序: select * from t4 order by 列名 asc; ascending 多列: create table t7( id int auto_increment primary key, num int not null default 0, age int not null default 0 )charset=utf8; insert into t7 (num, age) values (2, 12),(3,13),(4, 12); select * from t4 order by num desc, name asc; 如果前一列的值相等的话, 会按照后一列的值进行进一步的排序.
5,分组
select age, 聚合函数(count(num)/sum(num)/max(num)/min(num)/avg(num)) from 表名 group by 列名; select age, avg(num) from t7 group by age; select age, count(num) from t7 group by age; select age, count(num) as cnt from t7 group by age; 显示别名 as having的二次删选:
select age, count(num) as cnt from t7 group by age having cnt>1; where 和 having的区别:
1). having与where类似,可筛选数据 2). where针对表中的列发挥作用,查询数据 3). having针对查询结果中的列发挥作用,二次筛选数据, 和group by配合使用
6, 连表操作
select * from userinfo, department; (笛卡尔积) select * from userinfo, department where userinfo.depart_id=department.id; 左连接: 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
左右两边的数据都会显示 ps: a.只需要记住左连接 left join b.可以连接多张表 通过某一个特定的条件 注意查询的顺序:
select name,sum(score) from 表 where id > 10 group by score having age> 12 order by age desc limit 2, 10