首先昨天的外键,是一个字段关联一个字段。现在我们用两个字段关联两个字段。
create table t1{
nid int(11) not null AUTO_INCREMENT,
pid int(11) not null,
primary key(nid,pid)
}
create table t2{
id int(11) not null AUTO_INCREMENT primary key,
id1 int,
id2 int,
CONSTRAINT fk_t1_t2 foreign key(id1,id2) references t1(nid,pid)
}
select *和写字段的区别?
1、在 abc 字段有索引的情况下,mysql 是可以不用读 data,直接使用 index 里面的值就返回结果的。但是一旦用了 select *,就会有其他列需要读取,这时在读完 index 以后还需要去读 data 才会返回结果,这样就造成了额外的性能开销。
2、SELECT *,需要数据库先 Query Table Metadata For Columns,一定程度上为数据库增加了负担(影响网络传输的性能)。
AUTO_INCREMENT的设置:
# 会话可以理解为 cmd下mysql -u -p之后到你关闭的这段时间
# SQL Server默认是全局的
show session variable like 'auto_inc%';#查看当前会话全局变量
set session auto_increment_increment=2;#设置当前会话步长
set session auto_increment_offset=10;#设置会话自增起始值下一个id为10
show global variable like 'auto_inc%';#查看系统全局变量
set global auto_increment_increment=2;#设置系统步长
set global auto_increment_offset=10;#设置系统自增起始值下一个id为10
alter table t1 AUTO_INCREMENT=20;# 设置表步长
唯一索引与联合唯一索引
create table t1(
id int,
mun int,
num int,
unique uniqueName(num),# 单独唯一索引
unique uniqueNane(num,mun)# 联合唯一索引
)
表与表之间的关系
#一对一
一根笔只能对应一个笔盖,创建一个笔与笔盖关系表。用笔主体设置外键关联到笔盖,然后设置联合唯一索引
FK+UNIQUE
#一对多
一个班级对应多个学生,创建一个班级表。用学生设置外键关联到班级,然后学生设置唯一索引
FK+UNIQUE
#多对多
去网吧一个人可以玩很多台机器,一台机器也可以被很多人玩,创建一个上机记录表。用机器设置外键关联到人。
FK
对记录操作的深入应用:
# 插入
insert into table t1(name,age) values('alex',18),('eric',12);# 多条插入
insert into table t1(name,age) select name,age from t2;表记录插入
# 修改
update t1 set name='name2',age=12 where id>2 and name='name1';# 多条件查询修改
# 查询
select id,name as nickname from t1 where id <> 12;# i!=12,不等于的两种方式
select id,name from t1 where id between 1 and 12;# 区间查询[1,12]
select id,name from t1 where id not in(1,2,3);# not in查询
select id,name from t1 where id in(select oid from t2 where oid > 10)# in查询
# 通配符查询
select id,name from t1 where name like "a%"# 通配符
# a%;asad,ass,aaaa
# a_;aw,aq,ae
select * from user where username like 'P_boy';
# 表示长度为5,以p开头,以boy结尾
select username from user where username like '%pbo/_%' escape '/';
# escape的作用是用来转义,比方说我们有需求:要查%或者_,那么我们就需要用到转义
# 限制查询
select * from t1 limit 2;# 取2条
select * from t1 limit 2,10;# 2向后取10条
select * from t1 limit 10 offset 2;# 2向后取10条
select * from t1 order by desc limit 10;# 大到小,后10条
select * from t1 order by asc;# 小到大
select * from t1 order by name asc,id desc;# 先name小到大,同样的name按id从大到小
# 聚合查询
select departid,max(id) from t1 group by departid;# 取departid分组中最大的id
select departid,min(id) from t1 group by departid;# 取departid分组中最小的id
select departid,count(id) from t1 group by departid;# departid分组的人数
# sum()统计字段值
# avg()统计平均值
select count(id) from t1;# 不分组 直接返回记录数
select departid,count(id) from t1 group by departid having count(id)>1;# where 后面不能加聚合函数
# 连表查询
select id,name,departname from user,depart;# 笛卡尔积
select id,name,departname from user,depart where user.departid=depart.id;
select id,name,departname from user left join depart on user.departid=depart.id;# 左边(user)表的全部展示
select id,name,departname from user right join depart on user.departid=depart.id;# 右边(depart)表的全部展示
select id,name,departname from user inner join depart on user.departid=depart.id;# 左右边存在null的记录隐藏
网友评论