分頁查詢和檢視的含義及小案例
分頁查詢
需求:
每次查詢的記錄較大,通常一頁顯示不下,此時我們可以進行分頁查詢。
關鍵字: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));