常见操作数据库的方法:
外键
添加外键需注意
1.确保主键和外键字段类型、大小、编码一致
2.确保表引擎一致(engine=Innodb)
3.确保主表中的数据副表中有对应的值
4.确保外键名不重复
create table userinfo(
uid int auto_increment primary key,
name varchar(32),
department_id int,
constraint fk_user_depar foreign key (department_id) references department(id)
)engine=innodb default charset=utf8;
create table department(
id bigint auto_increment primary key,
title char(15)
)engine=innodb default charset=utf8;
唯一索引:
create table t2(
id int ,
nid int,
sid int,
....
unique uq1(nid) # 唯一索引
unique uq2(nid,sid) # 联合索引 作用:加速查找,不能重复,可以为空
)engine=innodb default charset=utf8;
外键的变种: foreign key-->>fk()
一对一:用户表和百合网(admin)
create table userinfo1(
id int auto_increment primary key,
name varchar(20),
age int,
email varchar(20)
)engine=innodb default charset=utf8;
create table admin(
id int not null auto_increment primary key,
username varchar(20) not null,
userpwd varchar(20) not null,
user_id int not null,
unique uq1 (user_id),
CONSTRAINT fk_admin_u1 foreign key(use_id) references userinfo1(id)
)engine=innodb default charset=utf8;
一对多:用户表和部门表
多对多(双向的一对多):用户表和主机表 ,用双向的FK()加快查找速度
用户表
create table userinfo2(
id int not null auto_increment primary key,
name varchar(20),
email varchar(64)
)engine=innodb default charset=utf8;
主机表
create table host(
id int auto_increment primary key ,
name varchar(20)
)engine=innodb default charset=utf8;
中间关联表
create table user2host(
id int auto_increment primary key,
userid not null,
hostid not null,
unique uq_user2_host(userid,hostid)
CONSTRAINT fk_u2h_user2 foreign key(userid) references userinfo2(id),
CONSTRAINT fk_u2h_host foreign key(hostid) references host(id)
)engine=innodb default charset=utf8;
通配符 like
# 表示以a开头的匹配,只要是a开头的都可以
select * from t5 where name like "a%";
# 表示以a开头的匹配,只要以a开头的只能取一位
select * from t5 where name like "a_";
分页 limit
# 表示取10条数据
select * from t5 limit 0,10;
select * from t5 limit 10;
# 表示从10处开始向后取10条数据
select * from t5 limit 10,10;
# 表示从第20行开始向后取10条数据
select * from t5 limit 20,10;
select * from t5 limit 10 offect 20;
排序 order by
# 从小到大
select * from t5 order by id asc;
# 从大到小 倒序 abcd
select * from t5 order by id desc;
# 表示从大到小取前面的2个数据
select * from t5 order by id desc limit 2;
# 优先按照age从大到小排,在根据id从小到大排
select * from t5 order by age desc ,id asc;
分组 group by
create table department5(
id int auto_increment primary key,
title varchar(32)
)engine=innodb default charset=utf8;
insert into department5(title)values("公关"),("IT"),("前台"),("服务");
insert into department5(title)values("飞行");
create table userinfo5(
id int auto_increment primary key,
name varchar(20),
part_id int,
CONSTRAINT fk_user_part FOREIGN key (part_id) REFERENCES department5(id)
)engine=innodb default charset=utf8;
insert into userinfo5(name,part_id)values("旺财",3),("狗蛋",5),("alex",1),("二狗",7),("egon",1);
# 按照 part_id分组
select count(id),max(id), part_id from userinfo5 group by part_id;
常见的聚合函数
max ,min,count,sum,avg
# *****如果对于聚合函数进行二次筛选时必须使用 ---having--- ****
select count(id) as id ,max(id), part_id from userinfo5 group by part_id having part_id >1 ;
连表操作
左右连表
select * from department5,userinfo5 where department5.id = userinfo5.part_id;
# left join左边的全部显示
select * from department5 left join userinfo5 on department5.id = userinfo5.part_id;
# inner join 去除表中出现的 NUll值
select * from department5 inner join userinfo5 on department5.id = userinfo5.part_id;
# right join右边的全部显示
select * from department5 right join userinfo5 on department5.id = userinfo5.part_id;
上下连表
union(列数必须相同,带有自动去重功能)
union all(列数必须相同,不带有自动去重功能)