精灵巫婆 发表于 2015-1-16 22:48:52

MYSQL网页编程之PL/SQL初学者必读:几十个有用的PL/SQL...

越来越多的开发者将继续选择MySQL。Evans的总裁JohnAndrews表示,MySQL学习教程用户对MySQL和其他开源数据库的评价正在赶上甚至超过很多专有商业数据库软件。初学
第一阶段
Q.编写一个PL/SQL程序块以显现所给出雇员编号的雇员的具体信息。
A.
DECLARE
erecemp%ROWTYPE;
BEGIN
SELECT*INTOerecFROMempWHEREempno=&雇员编号;
DBMS_OUTPUT.PUT_LINE(EmpNo||||Ename||||Job||||Manager||||HireDate||||Salary||||Commision||||DeptNo);
DBMS_OUTPUT.PUT_LINE(erec.ename||||erec.job||||erec.mgr||||erec.hiredate||||erec.sal||||erec.comm||||erec.deptno);
END;
/
Q.编写一个PL/SQL程序块以盘算某个雇员的年度薪水总额。
A.
DECLARE
esalNUMBER;
eenameemp.ename%TYPE;
BEGIN
SELECT(NVL(sal,0)+NVL(comm,0))*12,enameINTOesal,eenameFROMempWHEREempno=&雇员编号;
DBMS_OUTPUT.PUT_LINE(eename||sYearsSalaryis||esal);
END;
/
Q.按以下加薪比实行:
DeptnoRaise(%age)
105%
2010%
3015%
4020%
加薪的百分比是以他们现有的薪水为依据的。写一PL/SQL以对指定雇员加薪。
A.
DECLARE
vcounterNUMBER:=10;
vraiseNUMBER;
BEGIN
LOOP
EXITWHENvcounter>40;
UPDATEempsetsal=NVL(sal,0)+NVL(sal,0)*0.05WHEREdeptno=vcounter;
vcounter:=vcounter+10;
ENDLOOP;
END;
/

Q.编写一PL/SQL以向"emp"表增加10个新雇员编号。
(提醒:假如以后最年夜的雇员编号为7900,则新雇员编号将为7901到7910)
A.
DECLARE
vcounterNUMBER;
BEGIN
SELECTMAX(empno)INTOvcounterFROMemp;
FORiIN1..10
LOOP
vcounter:=vcounter+1;
INSERTINTOemp(empno)VALUES(vcounter);
ENDLOOP;
END;
/
Q.只利用一个变量来办理实行课功课4。
A
DECLARE
erecemp%ROWTYPE;
--vraiseNUMBER;
BEGIN
SELECT*INTOerec
FROMemp
WHEREename=&ename;
IFerec.job=CLERKTHEN
UPDATEempSETsal=sal+500WHEREempno=erec.empno;
ELSIFerec.job=SALESMANTHEN
UPDATEempSETsal=sal+1000WHEREempno=erec.empno;
ELSIFerec.job=ANALYSTTHEN
UPDATEempSETsal=sal+1500WHEREempno=erec.empno;
ELSE
UPDATEempSETsal=sal+2000WHEREempno=erec.empno;
ENDIF;
--UPDATEempSETsal=sal+vraiseWHEREempno=erec.empno;
--DBMS_OUTPUT.PUT_LINE(vraise);
END;
/
Q.承受两个数相除而且显现了局。假如第二个数为0,则显现动静"DIVIDEBYZERO"。
A.
DECLARE
num1NUMBER;
num2NUMBER;
BEGIN
num1:=#
num2:=#
DBMS_OUTPUT.PUT_LINE(num1||/||num2||is||num1/num2);
EXCEPTION
WHENZERO_DIVIDETHEN
DBMS_OUTPUT.PUT_LINE(DidntyourteachertellyounottoDIVIDEBYZERO?);
END;
/


第二阶段
Q.编写一个PL/SQL程序块,对名字以"A"或"S"入手下手的一切雇员按他们的基础薪水的10%加薪。
A.
DECLARE
CURSORc1IS
SELECT*FROMempWHERESUBSTR(ename,1,1)=AORSUBSTR(ename,1,1)=SFORUPDATEOFsal;

BEGIN
FORiINc1
LOOP
UPDATEempSETsal=NVL(sal,0)+NVL(sal,0)*0.1WHERECURRENTOFc1;
ENDLOOP;
END;
/
Q.编写一PL/SQL,对一切的"发卖员"(SALESMAN)增添佣金500.
A.
DECLARE
CURSORc1IS
SELECT*FROMempWHEREjob=SALESMANFORUPDATEOFsal;
BEGIN
FORiINc1
LOOP
UPDATEempSETsal=NVL(sal,0)+500WHERECURRENTOFc1;
ENDLOOP;
END;
/
Q.编写一PL/SQL,以提拔两个资历最老的"人员"为"初级人员"。(事情工夫越长,优先级越高)
A.
DECLARE
CURSORc1IS
SELECT*FROMempWHEREjob=CLERKORDERBYhiredateFORUPDATEOFjob;
--升序分列,工龄长的在后面

BEGIN
FORiINc1
LOOP
EXITWHENc1%ROWCOUNT>2;
DBMS_OUTPUT.PUT_LINE(i.ename);
UPDATEempSETjob=HIGHCLERKWHERECURRENTOFc1;
ENDLOOP;
END;
/
Q.编写一PL/SQL,对一切雇员按他们基础薪水的10%加薪,假如所增添的薪水年夜于5000,则作废加薪。
A.
DECLARE
CURSORc1ISSELECT*FROMempFORUPDATEOFsal;

BEGIN
FORiINc1
LOOP

IF(i.sal+i.sal*0.1)<=5000THEN
UPDATEempSETsal=sal+sal*0.1WHERECURRENTOFc1;
DBMS_OUTPUT.PUT_LINE(i.sal);
ENDIF;

ENDLOOP;
END;
/
Q.显现EMP中的第四笔记录。
A.
DECLARE
CURSORc1ISSELECT*FROMemp;

BEGIN
FORiINc1
LOOP
IFc1%ROWCOUNT=4THEN
DBMS_OUTPUT.PUT_LINE(i.EMPNO||||i.ENAME||||i.JOB||||i.MGR||||i.HIREDATE||||i.SAL||||i.COMM||||i.DEPTNO);
EXIT;
ENDIF;
ENDLOOP;
END;
/


第三阶段
Q.利用REF游标显现"EMP"表中的值。
A.
DECLARE
TYPEemprectypISRECORD
(
EMPNOemp.empno%TYPE,
ENAMEemp.ename%TYPE,
JOBemp.job%TYPE,
MGRemp.mgr%TYPE,
HIREDATEemp.hiredate%TYPE,
SALemp.sal%TYPE,
COMMemp.comm%TYPE,
DEPTNOemp.deptno%TYPE
);
TYPEemp_cursorISREFCURSORRETURNemp%ROWTYPE;
vemp_curEMP_CURSOR;
vemp_recEMPRECTYP;
BEGIN
OPENvemp_curFORSELECT*FROMemp;
LOOP
FETCHvemp_curINTOvemp_rec;
EXITWHENvemp_cur%NOTFOUND;
DBMS_OUTPUT.PUT(vemp_rec.empno||||vemp_rec.ename||||vemp_rec.job);
DBMS_OUTPUT.PUT(vemp_rec.mgr||||vemp_rec.hiredate||||vemp_rec.sal);
DBMS_OUTPUT.PUT_line(vemp_rec.comm||||vemp_rec.deptno);
ENDLOOP;
CLOSEvemp_cur;
END;
/
Q.从"EMP"中取得值送到PL/SQL表,将PL/SQL表中的薪水值增添500,并向用户显现增添的薪水及其他具体信息。
A.
DECLARE
TYPEemprecISRECORD
(
EMPNOemp.empno%TYPE,
ENAMEemp.ename%TYPE,
JOBemp.job%TYPE,
MGRemp.mgr%TYPE,
HIREDATEemp.hiredate%TYPE,
SALemp.sal%TYPE,
COMMemp.comm%TYPE,
DEPTNOemp.deptno%TYPE
);

iBINARY_INTEGER:=1;

TYPEemp_tabISTABLEOFEMPRECINDEXBYbinary_integer;
vempEMP_TAB;

CURSORc1ISSELECT*FROMemp;
BEGIN
FORxINc1
LOOP
vemp(i).empno:=x.empno;
vemp(i).ename:=x.ename;
vemp(i).job:=x.job;
vemp(i).mgr:=x.mgr;
vemp(i).hiredate:=x.hiredate;
vemp(i).sal:=x.sal+500;
vemp(i).comm:=x.comm;
vemp(i).deptno:=x.deptno;
i:=i+1;
ENDLOOP;

FORjIN1..i-1
LOOP
DBMS_OUTPUT.PUT(vemp(j).empno||||vemp(j).ename||||vemp(j).job);
DBMS_OUTPUT.PUT(vemp(j).mgr||||vemp(j).hiredate||||vemp(j).sal);
DBMS_OUTPUT.PUT_line(vemp(j).comm||||vemp(j).deptno);

ENDLOOP;
END;
/
Q.一旦将值送到PL/SQL表后,实验在PL/SQL表中拔出新纪录而且删除某些现有的纪录。
A.
DECLARE
TYPEemprecISRECORD
(
EMPNOemp.empno%TYPE,
ENAMEemp.ename%TYPE,
JOBemp.job%TYPE,
MGRemp.mgr%TYPE,
HIREDATEemp.hiredate%TYPE,
SALemp.sal%TYPE,
COMMemp.comm%TYPE,
DEPTNOemp.deptno%TYPE
);

iBINARY_INTEGER:=1;

TYPEemp_tabISTABLEOFEMPRECINDEXBYbinary_integer;
vempEMP_TAB;

CURSORc1ISSELECT*FROMemp;
BEGIN
FORxINc1
LOOP
vemp(i).empno:=x.empno;
vemp(i).ename:=x.ename;
vemp(i).job:=x.job;
vemp(i).mgr:=x.mgr;
vemp(i).hiredate:=x.hiredate;
vemp(i).sal:=x.sal;
vemp(i).comm:=x.comm;
vemp(i).deptno:=x.deptno;
i:=i+1;
ENDLOOP;
--FORjIN1..i-1
--LOOP
--DBMS_OUTPUT.PUT(vemp(j).empno||||vemp(j).ename||||vemp(j).job);
--DBMS_OUTPUT.PUT(vemp(j).mgr||||vemp(j).hiredate||||vemp(j).sal);
--DBMS_OUTPUT.PUT_line(vemp(j).comm||||vemp(j).deptno);

--ENDLOOP;

--拔出纪录
DBMS_OUTPUT.PUT_LINE(拔出纪录:);
vemp(i).empno:=1000;
vemp(i).ename:=Goldens;
vemp(i).job:=Software;
vemp(i).mgr:=null;
vemp(i).hiredate:=2003-01-04;
vemp(i).sal:=8888;
vemp(i).comm:=10;
vemp(i).deptno:=10;

FORjIN1..i
LOOP
DBMS_OUTPUT.PUT(vemp(j).empno||||vemp(j).ename||||vemp(j).job);
DBMS_OUTPUT.PUT(vemp(j).mgr||||vemp(j).hiredate||||vemp(j).sal);
DBMS_OUTPUT.PUT_line(vemp(j).comm||||vemp(j).deptno);

ENDLOOP;
--删除第5、6笔记录
DBMS_OUTPUT.PUT_LINE(删除第5、6笔记录:);
FORjIN5..i-2
LOOP
vemp(j).empno:=vemp(j+2).empno;
vemp(j).ename:=vemp(j+2).ename;
vemp(j).job:=vemp(j+2).job;
vemp(j).mgr:=vemp(j+2).mgr;
vemp(j).hiredate:=vemp(j+1).hiredate;
vemp(j).sal:=vemp(j+2).sal;
vemp(j).comm:=vemp(j+2).comm;
vemp(j).deptno:=vemp(j+2).deptno;
ENDLOOP;
vemp(i-1).empno:=null;
vemp(i-1).ename:=null;
vemp(i-1).job:=null;
vemp(i-1).mgr:=null;
vemp(i-1).hiredate:=null;
vemp(i-1).sal:=null;
vemp(i-1).comm:=null;
vemp(i-1).deptno:=null;
vemp(i).empno:=null;
vemp(i).ename:=null;
vemp(i).job:=null;
vemp(i).mgr:=null;
vemp(i).hiredate:=null;
vemp(i).sal:=null;
vemp(i).comm:=null;
vemp(i).deptno:=null;

FORjIN1..i-2
LOOP
DBMS_OUTPUT.PUT(vemp(j).empno||||vemp(j).ename||||vemp(j).job);
DBMS_OUTPUT.PUT(vemp(j).mgr||||vemp(j).hiredate||||vemp(j).sal);
DBMS_OUTPUT.PUT_line(vemp(j).comm||||vemp(j).deptno);

ENDLOOP;


END;
/


第四阶段
Q.编写一历程以承受用户输出的三个部门编号并显现个中两个部门编号的部门称号。
A.
CREATEORREPLACEPROCEDUREDeptName(no1dept.deptno%TYPE,no2dept.deptno%TYPE,no3dept.deptno%TYPE)AS
vflagNUMBER;
vdeptno1dept.deptno%TYPE;
vdeptno2dept.deptno%TYPE;
vdname1dept.dname%TYPE;
vdname2dept.dname%TYPE;

BEGIN
vflag:=TO_NUMBER(TO_CHAR(SYSDATE,SS));
IF(vflag>=1ANDvflag<=10)OR(vflag>=50ANDvflag<60)THEN
SELECTdeptno,dnameINTOvdeptno1,vdname1FROMdeptWHEREdeptno=no1;
SELECTdeptno,dnameINTOvdeptno2,vdname2FROMdeptWHEREdeptno=no2;
ELSIF(vflag>=11ANDvflag<=20)OR(vflag>=40ANDvflag<50)THEN
SELECTdeptno,dnameINTOvdeptno1,vdname1FROMdeptWHEREdeptno=no1;
SELECTdeptno,dnameINTOvdeptno2,vdname2FROMdeptWHEREdeptno=no3;
ELSE
SELECTdeptno,dnameINTOvdeptno1,vdname1FROMdeptWHEREdeptno=no2;
SELECTdeptno,dnameINTOvdeptno2,vdname2FROMdeptWHEREdeptno=no3;
ENDIF;
DBMS_OUTPUT.PUT_LINE(部门编号:||vdeptno1||||部门称号:||vdname1);
DBMS_OUTPUT.PUT_LINE(部门编号:||vdeptno2||||部门称号:||vdname2);

END;
/
EXECUTEDeptName(10,20,30);

Q.编写一历程以显现所指定雇员名的雇员部门名和地位。
A.
CREATEORREPLACEPROCEDUREDeptMesg(penameemp.ename%TYPE,pdnameOUTdept.dname%TYPE,plocOUTdept.loc%TYPE)AS
BEGIN
SELECTdname,locINTOpdname,ploc
FROMemp,dept
WHEREemp.deptno=dept.deptnoANDemp.ename=pename;
END;
/
VARIABLEvdnameVARCHAR2(14)
VARIABLEvlocVARCHAR2(13)

EXECUTEDeptMesg(SMITH,:vdname,:vloc);
PRINTvdnamevloc;

Q.编写一个给特别雇员加薪10%的历程,这以后,反省假如已雇佣该雇员凌驾60个月,则给他分外加薪3000.
A.
CREATEORREPLACEPROCEDURERaise_Sal(noINNUMBER)AS
vhiredateDATE;
vsalemp.sal%TYPE;
BEGIN
SELECThiredate,salINTOvhiredate,vsalFROMempWHEREempno=no;
IFMONTHS_BETWEEN(SYSDATE,vhiredate)>60THEN
vsal:=NVL(vsal,0)*1.1+3000;
ELSE
vsal:=NVL(vsal,0)*1.1;
ENDIF;
UPDATEempSETsal=vsalWHEREempno=no;
END;
/
VARIABLEnoNUMBER
BEGIN
:no:=7369;
END;
/
EXECUTERaise_Sal(:no)
SELECTempno,ename,sal,comm,hiredateFROMempWHEREempno=:no;

Q.编写一个函数以反省所指定雇员的薪水是不是无效局限内。分歧职位的薪水局限为:
DesignationRaise
Clerk1500-2500
Salesman2501-3500
Analyst3501-4500
Others4501andabove.
假如薪水在此局限内,则显现动静"SalaryisOK",不然,更新薪水为该局限内的最水值。
A.
CREATEORREPLACEFUNCTIONSal_Level(noemp.empno%TYPE)RETURNCHARAS
vjobemp.job%TYPE;
vsalemp.sal%TYPE;
vmesgCHAR(50);
BEGIN
SELECTjob,salINTOvjob,vsalFROMempWHEREempno=no;
IFvjob=CLERKTHEN
IFvsal>=1500ANDvsal<=2500THEN
vmesg:=SalaryisOK.;
ELSE
vsal:=1500;
vmesg:=Haveupdatedyoursalaryto||TO_CHAR(vsal);
ENDIF;
ELSIFvjob=SALESMANTHEN
IFvsal>=2501ANDvsal<=3500THEN
vmesg:=SalaryisOK.;
ELSE
vsal:=2501;
vmesg:=Haveupdatedyoursalaryto||TO_CHAR(vsal);
ENDIF;
ELSIFvjob=ANALYSTTHEN
IFvsal>=3501ANDvsal<=4500THEN
vmesg:=SalaryisOK.;
ELSE
vsal:=3501;
vmesg:=Haveupdatedyoursalaryto||TO_CHAR(vsal);
ENDIF;
ELSE
IFvsal>=4501THEN
vmesg:=SalaryisOK.;
ELSE
vsal:=4501;
vmesg:=Haveupdatedyoursalaryto||TO_CHAR(vsal);
ENDIF;
ENDIF;
UPDATEempSETsal=vsalWHEREempno=no;
RETURNvmesg;
END;
/
DECLARE
vmesgCHAR(50);
vempnoemp.empno%TYPE;
BEGIN
vempno:=&empno;
vmesg:=Sal_Level(vempno);
DBMS_OUTPUT.PUT_LINE(vmesg);
END;
/
--SELECTempno,ename,sal,comm,hiredateFROMempWHEREempno=:no;

Q.编写一个函数以显现该雇员在此构造中的事情天数。
A.
CREATEORREPLACEFUNCTIONHire_Day(noemp.empno%TYPE)RETURNNUMBERAS
vhiredateemp.hiredate%TYPE;
vdayNUMBER;

BEGIN
SELECThiredateINTOvhiredateFROMempWHEREempno=no;
vday:=CEIL(SYSDATE-vhiredate);
RETURNvday;
END;
/
DECLARE
vdayNUMBER;
vempnoemp.empno%TYPE;
BEGIN
vempno:=&empno;
vday:=Hire_Day(vempno);
DBMS_OUTPUT.PUT_LINE(vday);
END;
/

--SELECTempno,ename,sal,comm,hiredateFROMempWHEREempno=:no;


第五阶段
Q.编写一个数据包,它有两个函数和两个历程以操纵"emp"表。
该数据包要实行的义务为:
拔出一个新雇员;删除一个现有雇员;显现指定雇员的全体薪水(薪水+佣金);显现指定雇员地点部门称号。
A.
CREATEORREPLACEPACKAGEemppackAS
PROCEDUREinsrec(pempnoemp.empno%TYPE,penameemp.ename%TYPE,
pjobemp.job%TYPE,pmgremp.mgr%TYPE,
phiredateemp.hiredate%TYPE,psalemp.sal%TYPE,
pcommemp.comm%TYPE,pdeptnoemp.deptno%TYPE);
PROCEDUREdelrec(pempnoINNUMBER);
FUNCTIONselsal(pempnoNUMBER)RETURNNUMBER;
FUNCTIONseldname(pempnoNUMBER)RETURNVARCHAR2;
END;
/
CREATEORREPLACEPACKAGEBODYemppackAS
PROCEDUREinsrec(pempnoemp.empno%TYPE,penameemp.ename%TYPE,
pjobemp.job%TYPE,pmgremp.mgr%TYPE,
phiredateemp.hiredate%TYPE,psalemp.sal%TYPE,
pcommemp.comm%TYPE,pdeptnoemp.deptno%TYPE)
IS
BEGIN
INSERTINTOempVALUES(pempno,pename,pjob,pmgr,phiredate,
psal,pcomm,pdeptno);
DBMS_OUTPUT.PUT_LINE(1recordiscreated.);
ENDinsrec;
PROCEDUREdelrec(pempnoINNUMBER)
IS
BEGIN
DELETEFROMempWHEREempno=pempno;
DBMS_OUTPUT.PUT_LINE(1recordisdeleted.);
ENDdelrec;
FUNCTIONselsal(pempnoNUMBER)RETURNNUMBER
IS
vTotalSalNUMBER;
BEGIN
SELECTNVL(sal,0)+NVL(comm,0)INTOvTotalSal
FROMemp
WHEREempno=pempno;
RETURNvTotalSal;
ENDselsal;
FUNCTIONseldname(pempnoNUMBER)RETURNVARCHAR2
IS
vdnamedept.dname%TYPE;
BEGIN
SELECTdnameINTOvdname
FROMemp,dept
WHEREempno=pempnoANDemp.deptno=dept.deptno;
RETURNvdname;
ENDseldname;
END;
/

--实行包中的历程和函数
EXECUTEemppack.insrec(1111,Goldens,MANAGER,7698,2003-01-18,2000,400,30);
EXECUTEemppack.delrec(1111);

DECLARE
salaryNUMBER;
BEGIN
salary:=emppack.selsal(7369);
DBMS_OUTPUT.PUT_LINE(TotalSalaryis||salary);
END;
/
DECLARE
departmentVARCHAR2(30);
BEGIN
department:=emppack.seldname(7369);
DBMS_OUTPUT.PUT_LINE(Departmentnameis||department);
END;
/

Q.编写一个数据库触发器以显现当任什么时候候雇员加薪时的加薪情形。
A.
CREATEORREPLACETRIGGERemp_SalUp
AFTERUPDATEOFsalONemp
FOREACHROW
DECLARE
vsalNUMBER;
BEGIN
vsal:=NVL(:NEW.sal,0)-NVL(:OLD.sal,0);
IFvsal<=0THEN
RAISE_APPLICATION_ERROR(-20001,IncreasedSalaryisnotzeroandlittlerthanzero);
ENDIF;
END;
/
Q.编写一个数据库触发器,它同意用户只在上午9.00到下战书5.00之间实行DML义务。
A.
CREATEORREPLACETRIGGERoperate_time_limited
BEFOREINSERTORUPDATEORDELETEONemp
--FOREACHROW
DECLARE
vtimeNUMBER;
BEGIN
vtime:=TO_NUMBER(TO_CHAR(SYSDATE,HH24));
IFvtimeNOTBETWEEN9AND17THEN
RAISE_APPLICATION_ERROR(-20444,Sorry!NotExcept9AMand5PM.);
ENDIF;
END;
/
Q.编写一个数据为触发器以反省某个构造中不克不及有两个总裁。
A.
CREATEORREPLACETRIGGERcheck_president
BEFOREINSERTORUPDATEONemp
FOREACHROW
WHEN(UPPER(NEW.job)=PRESIDENT)
DECLARE
vCountNUMBER;
BEGIN
SELECTCOUNT(job)INTOvCount
FROMemp
WHEREUPPER(job)=PRESIDENT;--把总统的个数统计出来,当为0时,变量值为0

IFvCount>0THEN
RAISE_APPLICATION_ERROR(-20444,Sorry!CanthavetwoPresident.);
ENDIF;
END;
/
Q.编写一个数据库触发器,当任什么时候候某个部门从"dept"中删除时,该触发器将从"emp"表中删除该部门的一切雇员。
A.
CREATEORREPLACETRIGGERdel_emp_deptno
BEFOREDELETEONdept
FOREACHROW
BEGIN
DELETEFROMempWHEREdeptno=:OLD.deptno;
END;
/
----8i下经由过程。材料来自ACCP


这一切听起来不错,无疑DBaaS具有很多相对于RDBMS的优势。然而MySQL学习教程,DBaaS也有其局限性,云服务中固有的局限性就是之一。当客户开始将数据放入云端时,他们会遭遇到无法控制的网络性能问题。

爱飞 发表于 2015-1-17 21:54:14

习惯敲命令行的朋友可能会爽一些。但是功能有限。适合机器跑不动SQLServerManagementStudio的朋友使用。

柔情似水 发表于 2015-1-21 08:57:45

varchar(max)\\\\nvarchar(max)类型的引入大大的提高了编程的效率,可以使用字符串函数对CLOB类型进行操作,这是一个亮点。

兰色精灵 发表于 2015-1-30 12:59:47

也可谈一下你是怎么优化存储过程的?

再现理想 发表于 2015-2-6 11:56:35

Mirror可以算是SQLServer的Dataguard了。但是能不能被大伙用起来就不知道了。

山那边是海 发表于 2015-2-16 02:57:58

两个月啃那本sqlserver2005技术内部-存储引擎,花了几个月啃四本书

分手快乐 发表于 2015-3-4 23:15:12

在select语句中可以使用groupby子句将行划分成较小的组,然后,使用聚组函数返回每一个组的汇总信息,另外,可以使用having子句限制返回的结果集。

老尸 发表于 2015-3-11 21:21:31

而写到本地,我又考虑到效率问题.大家来讨论讨论吧,分数不打紧,就给10分,十全十美,没啥对错,各抒己见,但是要有说服力的哦~

莫相离 发表于 2015-3-19 14:02:40

多走走一此相关论坛,多看一些实例开发,多交流0经验,没什么的,我也是刚学没多久!加油

简单生活 发表于 2015-3-28 06:43:01

连做梦都在想页面结构是怎么样的,绝非虚言
页: [1]
查看完整版本: MYSQL网页编程之PL/SQL初学者必读:几十个有用的PL/SQL...