技术心得一、SQL查询:1、”列出同部门中工资高于1000的员工数量超过2人的部门,显示部门名字、地区名称”.查询语句如下:selectdistinctdept.department_name,loc.cityfromemployeesemp,departmentsdept,locationslocwhereemp.department_id=dept.department_idanddept.location_id=loc.location_idandEXISTS(select1fromemployeesemp2whereemp2.department_id=emp.department_idandemp2.salary>1000groupbyemp2.department_idhavingcount(emp2.department_id)>2)通常我们只需要对记录逐行的筛选,对于分组数据我们只能使用分组语句avg、max等,也就是说如果你想在select中得到这个属性那么“它们“也必须出现在groupby中或者你只想得到一个统计数据.回顾上面的例子,我们也可以用以下语句完成:selectdept.department_name,loc.city,count(*)fromemployeesemp,departmentsdept,locationslocwhereemp.department_id=dept.department_idanddept.location_id=loc.location_idandemp.salary>1000groupbydept.department_name,loc.cityhavingcount(*)>2对于groupby来说每一条emp.department_id必对应唯一dept.department_id、dept.department_name因此不论groupbydepartment_id还是groupbydepartment_name,loc.city达到的效果是一样的2、用一条语句查询出scott.emp表中每个部门工资前三位的数据:selectdepartment_id,max(salary)max_salary,max(decode(rank,2,salary,salary))mid_salary,min(salary)min_salaryfrom(selectdepartment_id,salary,rankfrom(selectemp.department_id,emp.employee_id,emp.salary,row_number()over(partitionbyemp.department_idorderbyemp.salary)asrankfromemployeesemp)EwhereE.rank<=3)groupbydepartment_idrownumber()over(patitionbycolumn1orderbycolumn2),表示以column1分组对column2排序,row_number可用于筛选重复项.---本文来源于网络,仅供参考,勿照抄,如有侵权请联系删除---3、哪些员工跟Den(FIRST_NAME)、Rephaely(Last_Name)不在同一个部门.此处可能存在没有部门的员工,应该用NoExists筛选deptno与该员工不等的记录.若要求空值可使用NOEXISTS若不要求空值可用EXISTS,尽量用EXISTS取代IN、ANY、ALL等操作(可提高性能),注意空值的处理!!!4、在多表连接查询中,子查询最多只可嵌套一层否则Oracle无法识别5、forhandlein:游标二、PL/SQl存储过程1、游标的使用:显式游标的使用分为四步,声明、打开、循环、关闭.打开游标:就是执行游标所对应的SELECT语句,将其查询结果放入工作区,并且指针指向工作区的首部,标识结果集合。如果游标查询语句中带有FORUPDATE选项,OPEN语句还将锁定数据库表中游标结果集合对应的数据行。如下所示:DECLARECURSORc4(dept_idNUMBER,j_idVARCHAR2)ISSELECTfirst_namef_name,hire_dateFROMemployeesWHEREdepartment_id=dept_idANDjob_id=j_id;--声明游标定义记录变量,比声明记录类型变量要方便,不容易出错v_emp_recordc4%ROWTYPE;BEGIN--OPENc4(90,'AD_VP');/*LOOPFETCHc4INTOv_emp_record;IFc4%FOUNDTHENDBMS_OUTPUT.PUT_LINE(v_emp_record.f_name||'的雇佣日期是'||v_emp_record.hire_date);ELSEDBMS_OUTPUT.PUT_LINE('已经处理完结果集了');EXIT;ENDIF;ENDLOOP;*//*CLOSEc4;---关闭游标*/FORc1INc4(90,'AD_VP')LOOPv_emp_record.f_name:=c1.f_name;v_emp_record.hire_date:=c1.hire_date;DBMS_OUTPUT.put_line(c1.f_name||'的雇佣日期是'||c1.hire_date);ENDLOOP;END;以FORc1INc_cursor使用游标,c1会自动遍历每行记录,不用像显式游标一样打开游标后在循环中使用FETCH将表征多行记录的游标的值传递出来,FOR语句相当于OPEN与LOOP、FETCH的综合使用,且不必人为的关闭.2、隐式游标的处理:显式游标主要是用于对查询语句的处理,尤其是在查询结果为多条记录的情况下;而对于非查询语句,如修改、删除操作,则由ORACLE系统自动地为这些操作设置游标并创建其工作区.隐式游标的名字为SQL,这是由ORACLE系统定义的。对于隐式游标的操作,如定义、打开、取值及关闭操作,都由ORACLE系统自动地完成...