分页查询和视图的含义及小案例

分页查询

需求:

每次查询的记录较大,通常一页显示不下,此时我们可以进行分页查询。

关键字:limit

用法:limit begin,size;

begin:记录的开始行数,偏移量

size:每一页最大记录数

注意:limit后面可以是一个参数,一个参数时是指每次最大的查询记录数limit size;

默认记录数从0开始,而不是1

--练习1:查询员工表,查询第一页的数据,每页10条。

select * from emp limit 0,10;

--练习2:查询员工表,查询第二页的数据,每页5条。

select * from emp limit 5,5;

--练习3:按照部门号升序排序,查询第二页的数据,每页5条

select * from emp order by deptno  limit 5,5;

--练习4:按照员工编号降序排序,查询第二页的数据,每页5条。

select * from emp order by empno desc limit 5,5;

--练习5:使用子查询,先排序,再查询每页的数据。

select e.* from (select * from emp order by sal desc) e limit 6,6;

--  执行效率与优化

--- 创建了一张表temp_001,插入了10w条的数据。

- 需求:  每页100条记录,查询第1页的数据

select * from temp_001 limit 100;

--                     查询第11页的数据

--select * from temp_001 limit 1000,100;

--                     查询第101页的数据

--select * from temp_001 limit 10000,100;

--                     查询第1001页的数据

--select * from temp_001 limit 100000,100;

当我们在做分页查询的时候,查询的效率与偏移量有关系,偏移量越大, 效率越低,消耗的时间就会越多。 如上述分页查询

 如何优化分页查询

 (1)我们可以使用子查询先确定作为tid偏移量的位置。

-- (2)再进行分页查询

 select * from where tid>=(查出id的值) limit 100;

--练习:

select * from temp_001 where tid>=
(select tid from temp_001 limit 144000,1) limit 100;

-- 使用  between and

select * from temp_001 
where 
tid between 145000 and 145200 limit 100;

视图:VIEW,表的一部分投影。也是数据库里一个对象。(表的虚拟部分)

视图的作用: 因为视图中含有某表中的部分数据,不在视图中的字段有隐藏效果。相对来说,安全。

--如何操作视图呢?视图可以像表一样,进行增删改查。

--如何创建视图呢?

--格式: create view ViewName as subQuery

--练习1: 将员工表中的10部门的数据封装到一个视图view_emp_deptno_10

create view view_emp_deptno_10 as select * from emp where deptno=10;

-- 通过视图进行DML操作,一定会对表有影响。

-- 通过表进行DML操作,可能会对视图有影响。

--练习2:通过视图,插入数据 empno:9001,ename:'zs',部门号:10

--              插入数据 empno:9002,ename:'ls',部门号:20

--      查询表emp,查询视图view_emp_deptno_10

insert into view_emp_deptno_10 
values (9001,'zs',null,null,null,null,null,10);
insert into view_emp_deptno_10 (empno,ename,deptno)
values (9002,'ls',20);
select * from view_emp_deptno_10;

--with check option:对视图的一种检查约束选项

如果在创建视图有此选项时,表示,只能对视图DML操作可见数据。

反之,对视图不可见的数据,是不可以通过视图进行DML操作的。

--练习2:创建一个视图view_emp_deptno_20

create view view_emp_deptno_20 as select empno,ename,job,sal,deptno
from emp where deptno = 20 with check option;
select * from view_emp_deptno_20;

--练习3:通过视图view_emp_deptno_20插入数据

--      empno:9003,ename:'ww',job:manager,sal:5000,20

--      empno:9004,ename:'zl',job:manager,comm:500,20

--      empno:9005,ename:'qq',job:manager,sal:500,10

insert into  view_emp_deptno_20 values(9003,'ww','manager',5000.0,20);
insert into  
view_emp_deptno_20(empno,ename,job,comm,deptno)values
(9004,'zl','manager',500.0,20);
insert into  view_emp_deptno_20 values(9005,'qq','manager',5000.0,10);

--视图的分类:

--    简单视图:subQuery是一个表中的普通查询语句

--    复杂视图:subQuery是一个可以带有分组函数的,或者关联查询的语句。

--           复杂视图不能对视图进行DML操作,只能进行DQL操作

--练习:创建一个复杂视图view_emp_100,是每个部门的平均工资,最高工资,最低工资,及其部门号。

create view view_emp_100 as select avg(ifnull(sal,0)) avg_sal,max(sal) max_sal,min(sal) min_sal,deptno from emp group by deptno;
select * from view_emp_100;

索引(Index):目的是为了提高查询速度。相当于一本书的目录。

索引也是数据库的对象,占空间。每张表每个字段都可以设置相应索引。

优点: 提高查询速度。

缺点: 占空间,每次进行DML操作时,数据库都要(自动)重新维护索引,降低效率.

总体来说:表中有索引可以提高效率,但不是索引越多越好。当表中的数据量比较小时,无需索引(因为直接查询可以比使用索引更快),当某个字段的值比较少时,也不需要索引,如性别字段只有'f','m'.只有当数据量比较大,和字段值多时,可以使用索引。

--练习1:给emp表中的empno创建索引。

 

--练习2:查询empno为9003的数据

--练习1:给emp表中的empno创建索引。

create index index_emp_empno on emp(empno);

--练习2:查询empno为9003的数据。

select * from emp where empno=9003;

--删除索引,删除视图都是用drop

--drop index  indexName
--drop view   viewName

--练习:数据库中有以下学生信息表:

--Student学生表(SNO姓名,SEX性别,BIRTHDAY出生日期,DEP院系

--Course课程表(CNO编号,CNAME课程名称,CVAL学分)

--SC选课表(SNO学号,CNO课程编号,SCORE成绩)

create table student(sno int,sname varchar(20),dep varchar(20));

create table Course(cno int,cname varchar(20),cval varchar(20));

create table SC(sno int,cno varchar(20),score varchar(20));

--1.写一个SQL语句,查询选修了“数据结构”的总人数

select count(*) from sc where cno=(select cno from Course where cname='数据结构');

--2.写一个SQL语句,查询“张宇”同学选修了的课程和成绩

--法1

select cname,score from Student s,Sc ,Course c where s.sno=sc.sno and c.cno =sc.cno and sname='张宇';

--法2

select cno,score from Course c join (select cno,score from sc where sno=(select sno from student where sname='张宇'))on c.cno=sc.cno;

 

--3.写一个SQL语句,查询挂科学分最多的同学姓名和院系

--先统计每个人都挂了多少学分

--然后用sum(cval)作为新的表  先计算总分--按照学号分组,分数排序筛选出成绩下小于60的学分--学号匹配题目要求的sum(cval)--从student表中选择到符合要求的学号和院系

select sname,dep from student where sno in(

select sno from Course,SC where Course.cno = sc.cno and sc.score<60 group by sc.sno having sum(cval)=

(select sum(cval) sum_ from Course,SC where Course.cno = sc.cno and sc.score<60 group by sc.sno  order by sum_ desc limit 1));

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值