索引
索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可以快速访问数据库表中的特定信息。
在表Student上按Sno降序建唯一索引
create unique index Stusno on Student (Sno desc);
删除Student表的Stusno索引
alter table Student drop index Stusno;
那么数据库中的索引作用是什么?什么情况下适合建索引什么情况下不适合?
1.通过创建唯一性索引,可以保证表中每一行数据的唯一性
2.可以加快数据的检索速度
3.可以加速表与表之间的链接,在实现数据完整性方面有意义。
4.在使用分组(group by)和排序(Order by)子句进行检索时,同样可以显著减少查询中分组和排序的时间。
当然索引也有不利的方面
1.耗费时间,随着数据量的增加而增加。
2.占据物理空间。
3.对表中数据进行增删改的时候,索引也要动态的维护,降低了数据的维护速度。
哪些列上适合创建索引呢?
1.经常需要搜索的列
2.经常用在连接的列上,这些列主要是一些外键,可以加快连接速度。
3.在经常需要根据范围进行搜索的列上,因为索引已经排序,其指定的范围是连续的。
4.在经常需要排序的列上创建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序查询的速度。
5.在经常使用where子句的列上,加快条件的判断速度
哪些地方不适合建索引呢?
1.那些在查询中很少使用的列
2.那些数据量很少的列
3.当修改操作远远大于检索操作时
视图
视图是从一个或几个基本表中导出的表,是一个虚表。数据库中只存放视图的定义,而不存放视图对应的数据,数据仍然放在基本表里。视图就像一个窗口。
下面举例一些SQL语句
修改基本表:
alter table <表名>
[ add <新列名> <数据类型> [完整性约束] ]
[ drop <完整性约束名> ]
[ modify column <列名> <数据类型>]
向Student表添加入学时间列
alter table Student add S_entrance DATE;
数据查询
select [ all | distinct } <目标列表达式> from <表名>
[ where < 条件表达式 > ]
[ group by <列名> [ having <条件表达式> ] ]
[ order by <列名> [ asc | desc ] ]
查询Student表中具有相同年龄的每个组的人数
select Sage ,count(*) from Student group by Sage;
如果分组后还要按一定的条件对这些组进行筛选,最终只输出满足指定条件的组,则使用having。例如对上例筛选
select Sage ,count(*) from Student group by Sage having count(*) > 1;
若查询涉及多个表,使用连接查询。
若有表Student、SC(选课表),要求查询每个学生及其选修课程的情况:
select Student.* , SC.* from Student,SC where Student.Sno=SC.Sno;
这种称自然连接或内连接。若有学生没有选课,则在SC表里没有相应的元组,造成最终结果舍掉这些学生的信息。
如果想把没有选课的学生也保留在结果中,可以使用外连接。
下面用左外连接(左外连接列出左边表(本例为Student表)中的所有元组)
select Student.*,SC.* from Student left join SC on (Student.Sno=SC.Sno);