1. 程式人生 > >分頁查詢和檢視的含義及小案例

分頁查詢和檢視的含義及小案例

分頁查詢

需求:

每次查詢的記錄較大,通常一頁顯示不下,此時我們可以進行分頁查詢。

關鍵字: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));