mysql(2.索引与约束以及设计)
一、约束
1.非空约束
not null
2.主键约束
create table t1(
id int not null primary,
name varchar(20) not null
)
注意:不能为空,不能重复,一个表中只能有一个主键
3.唯一约束
create table t2(
id int(10) not null,
name varchar(255),
unique name_age(name,age)
)
注意:被约束的字段不能重复
4.外键 foreign key
部门表
create table dept(
dept_id int(30) not null auto_increment primary key,
dept_name varchar(255) not null
)
-- 员工表
create table emp(
id int(10) not null auto_increment primary key,
name varchar(50) not null,
dept_id int(10) not null,
constraint f_key foreign key (dept_id) references db2.dept(dept_id) on delete cascade
)
5. 默认值 default
create table t5 (
id int not null auto_increment PRIMARY key,
name VARCHAR(255) not null DEFAULT 'wusir'
)
二.数据库设
1.概念
1.有效存储数据
2.满足用户的多种需求
2.关系
1-1 :最少需要1张表
1-n :最少需要2张表
n-n :最少需要3张表
3.数据库三范式
1.保证每列的原子性
2.保证每列都与主键相关
3.保证每列都和主键直接相关,而不能是间接相关
三范式的详解:http://www.cnblogs.com/wangfengming/p/7929118.html
三. 索引
1.概念:相当于书的目录,快速找到数据 好处:可以帮助你提高查询效率,数据量越大越明显
缺点: 新增和删除数据时,效率较低
2.索引方法:
1.hash 是以key-value 的形式进行索引存储
2.BTree 是以二叉树方式进行索引存储。(默认存储索引类型)
3.索引分类
1. 普通索引 create INDEX name_index on person(name);
2. 唯一索引 create unique INDEX name_age on person(name,age);
3. 主键索引 alter table person MODIFY id int PRIMARY key;
4. 组合索引 create unique INDEX name_age on person(name,age);
5. 全文索引 full text :原理是分词查找
练习:http://www.cnblogs.com/wangfengming/p/7978183.html
--聚合函数:
1.max() 最大
2.min() 最小
3.avg() 平均
4.sum() 求和
5.count() 总个数
--分组函数
1.group by
和他配合的是 having
普通的条件用where
left join 条件用 on
--排序:
order by asc ,desc
--去重
distinct
group by
--分页
limit
参数1:从第几条开始,起始位置为0
参数2:显示的条数
--多表联合查询(会产生笛卡尔乘积)
1.左连接查询: A left join B on 条件 left join C on 条件
2.右连接查询: right join
3.内连接查询:inner join
create table liuyan(
id int PRIMARY KEY auto_increment,
title VARCHAR(32) not NULL,
author VARCHAR(16),
addtime VARCHAR(12) NOT NULL,
content text NOT NULL,
isdelete tinyint not null DEFAULT 0
)
1.在留言表最后添加一列状态(status char(1) 默认值为0)
alter table liuyan add status TINYINT DEFAULT 0 after isdelete
2.修改留言表author的默认值为’youku’,设为非空
alter table liuyan modify author varchar(16) not null default 'youku'
3.删除liuyan表中的isdelete字段
ALTER TABLE liuyan DROP isdelete
4.为留言表添加>5条测试数据
insert into liuyan values
(null,'介绍','大雄','1000','哥不是一匹好马,但也不是一头普通的毛驴',null),
(null,'叮当猫','熊熊','2000','你牙缝里有韭菜,扣出来贼哥吃',null),
(null,'花花','苗苗','3000','苗苗问花花:卖萌是褒义词还是贬义词?',null),
(null,'霞哥','雄大','4000','斗战色佛',null),
(null,'晨晨','逗比','5000','你笑起来像一朵菊花,菊花残,man腚伤',null);
要求将id值大于3的信息中author字段值改为admin
update liuyan set author='admin' where id>3
删除id号为4的数据。
delete from liuyan from id=4
为留言表添加>15条测试数据,要求分三个用户添加
懒.....
查询所有留言信息
select id,title,author,addtime,content,status from liuyan;
查询某一用户的留言信息
select id,title,author,addtime,content,status from liuyan where author='用户名称';
查询所有数据,按时间降序排序
select id,title,author,addtime,content,status from liuyan order by addtime desc;
.获取id在2到6之间的留言信息,并按时间降序排序
select id,title,author,addtime,content,status from liuyan where id between 2 and 6;
.统计每个用户留了多少条留言,并对数量按从小到大排序。
select author,count(id) as'留言条数' from liuyan group by author order by count(id) desc
.将id为8、9的两条数据的作者改为’doudou’.
update liuyan set author ='doudou' where id in(8,9);
.取出最新的三条留言。(使用limit)。
select * from ( select id,title,author,addtime,content,status from liuyan ORDER BY addtime desc)hahg LIMIT 3
.查询留言者中包含”d”字母的留言信息,并按留言时间从小到大排序
select id,title,author,addtime,content,status from liuyan where author like'%d%' order by addtime asc;
.删除”作者”重复的数据,并保留id最大的一个作者
delete from liuyan where author in(
select author from (select author from liuyan group by author having count(1)>1) a
)
and id not in(
select id from (select max(id) id from liuyan group by author having count(1)>1) b
)=