数据库面试题--emp_employee、department

一、按部门名称查询出员工的人数大于等于100的语句.(员工:emp_employee, 部门名称: department,员工姓名chnalias.)
SELECT departrnent FROM emp_employee GROUP BY departrnent HAVING COUNT(*)>=100
二、把员工的姓名、性别和年龄显示出来。(员工表emp_employee, 员工姓名:chnalias,年龄age,性别:gender。性别表:pub_gendar_info,性别名称:smpalias,与员工表的性别关
SELECT e.chnalias,g.smpalias,e.age FROM emp_employee e INNERJOIN pub_gendar gONe.gendar = g.smpalias
三、当部门表的名称为空时,用0来代替。(部门表org_department名称smpalias)
SELECT (CASE WHEN smpalias=’null’ THEN ’0′ ELSE smpalias END) AS ‘部门名称’ FROM org_departmen
Select replace(smpalias,’null’,’0’) fromorg_department
四、删除员工表中的姓名重复的数据,只保留重复数据中的一条数据。(员工表emp_employee,员工姓名:chnalias)
DELETE FROM emp_employee WHERE id NOT IN ( SELECT MAX(id) AS id FROMemp_employee GROUP BY chnalias )
五、有三个部门:1人力资源部,2信息中心,3.安全监察部分别把这个三个部门的人员统计出来。要求用sql语句一行来实现(员工表 emp_employee,员工姓名:chnalias,员工表对应的部门id:department.。部门表:org_departmen。部门表的 字段:部门名称smpalias,部门主键:id)部门表的id=员工表的department
显示的结果应该是:
人力资源部 信息中心 安全监察部
10 20 30
SELECT SUM (f.s1) AS ‘人力资源部’,SUM (f.s2)AS ‘信息中心’, SUM (f.s3)AS ‘信息中心’
from
(
SELECT(CASE WHEN d.smpalias=’人力资源部’ THENSUM(e.Departid) END) AS s1,
(CASE WHEN d.smpalias=’信息中心’ THEN SUM(e.Departid) END)AS s2,
(CASE WHEN d.smpalias=’安全监察部’ THEN SUM(e.Departid) END)AS s3
FROM emp_employee e INNER JOIN org_departmen d ONe.departId=d.id
GROUP BY d.smpalias ) f
六、查询出差表中的每个员工最近的出差时间和员工姓名(出差表emp_travel,员工姓名chnalias,出差时间godate)
SELECT chnalias,godate FROM emp_travel ORDERBY godate DESC
七、请写一个存储过程,把emp_employee表中的chnalias这个字段的名称更新为’您好’。
CREATE PROC proc_updateemp
AS
UPDATE FROM emp_employee SET chnalias = ‘您好’
GO
EXEC proc_updateemp

八、请写一个函数,用来实现把一个字段的内容横向显示出来。(表pub_codeitem_inf,代码组字段groupcode,名称字段:smpalias.每行内容用逗号分开)
create function dbo.f_str(@id int) return varchar(100)
as
begin
declare @str varchar(1000)
set @str=”;
select @str=@str+’,'+cast(smpalias as varchar) frompub_codeitem_inf wheregroupcode=@id
set @str=right(@str,len(@str)-1)
return @str
end
go
–调用函数
select groupcode,smplias=dbo.f_str(groupcode) from pub_codeitem_inf groupbygroupcode
九、请写一个游标用来把表中的数据显示出来(表emp_employee,显示姓名chnalias和单位company)
Create proc employee
@company varchar(50)=’’
@chnalias varchar(50)=’’
as
declare @curList
set @curList= cursor for
select chnalias,company fromemp_employee
open @curList
fetch next from @curList into @chnalias,@company
while(@@fetch status=0)
begin
print @chnalias+@company
fetch next from @curList into @chnalias,@company
end
close @curList
deallocate @curList
十、请用sql语句写一个从1减到100的语句出来。
Declare @star int ,@sum int
Select @star =1,@sum=0
While(@star<=100)
Begin
Set @sum=@sum – @star
Set @star=@star + 1
End
Select @sum

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这段代码看起来没有明显的语法错误,但是在运行时可能会出现以下两个问题: 1. 如果在查询结果中不存在 empno 为 7876 的记录,则会抛出 NO_DATA_FOUND 异常。为了避免这个问题,您可以在查询之前添加一个异常处理块。 2. 如果查询返回多行记录,则会抛出 TOO_MANY_ROWS 异常。为了避免这个问题,您可以使用 WHERE 子句限制结果集,或者使用子查询来获取单个记录。 下面是一个更完整的示例代码,包含异常处理和结果集限制,可以在 Oracle 数据库中运行: ``` DECLARE TYPE v_emp_dname IS RECORD ( v_emp emp%ROWTYPE, v_dept_dname dept.dname%TYPE ); v_emp_dept v_emp_dname; BEGIN BEGIN SELECT e.*, d.dname INTO v_emp_dept FROM emp e LEFT JOIN dept d ON e.deptno = d.deptno WHERE e.empno = 7876 AND ROWNUM = 1; EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE('No record found for empno 7876'); WHEN TOO_MANY_ROWS THEN DBMS_OUTPUT.PUT_LINE('Too many records found for empno 7876'); END; IF v_emp_dept.v_emp.empno IS NOT NULL THEN DBMS_OUTPUT.PUT_LINE(v_emp_dept.v_emp.empno || ' ' || v_emp_dept.v_dept_dname); END IF; END; ``` 在上面的示例中,我们使用了一个嵌套的异常处理块来处理查询可能出现的异常。如果查询返回零行记录,则会抛出 NO_DATA_FOUND 异常,并输出一条错误消息。如果查询返回多行记录,则会抛出 TOO_MANY_ROWS 异常,并输出一条错误消息。如果查询返回一个记录,则会将其存储在 v_emp_dept 变量中,并输出 empno 和 dname 字段的值。请注意,我们还使用了 ROWNUM = 1 来限制查询结果集,以确保只返回一个记录。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值