--某个公司面试的SQL试题
--下面是表结构和相应的内部数据
DROP TABLE USER_INFO
GO
CREATE TABLE USER_INFO
(
EMPID CHAR(10) PRIMARY KEY ,
EMPFNAME CHAR(20),
EMPLNAME CHAR(20),
INST_NO CHAR(10),
)
GO
DROP TABLE HSALARY 
GO
CREATE TABLE HSALARY
(
EMPID CHAR(10),
INST_NO CHAR(10),
SALARY NUMERIC(15,2)
)
GO
DROP TABLE LSALARY 
GO
CREATE TABLE LSALARY
(
EMPID CHAR(10),
INST_NO CHAR(10),
SALARY NUMERIC(15,2)
)
GO
INSERT INTO USER_INFO VALUES('E1','F1','L1','1001')
INSERT INTO USER_INFO VALUES('E2','F2','L2','1002')
INSERT INTO USER_INFO VALUES('E3','F3','L3','1003')
INSERT INTO USER_INFO VALUES('E4','F4','L4','1004')
INSERT INTO USER_INFO VALUES('E5','F5','L5','1005')
INSERT INTO USER_INFO VALUES('E6','F6','L6','1006')
GO
INSERT INTO HSALARY VALUES('E1','1001',8500)
INSERT INTO HSALARY VALUES('E2','1002',7500)
INSERT INTO HSALARY VALUES('E3','1003',6500)
INSERT INTO LSALARY VALUES('E3','1003',6500)
INSERT INTO lSALARY VALUES('E4','1004',5000)
INSERT INTO lSALARY VALUES('E5','1005',4000)
--1 取得下列用户的工资信息,选取字段:EMPID,EMPFNAME,EMPLNAME,SALARY
SELECT A.EMPID,A.EMPFNAME,A.EMPLNAME,B.SALARY FROM USER_INFO A,HSALARY B WHERE (LTRIM(RTRIM(A.EMPID))=LTRIM(RTRIM(B.EMPID))) AND (LTRIM(RTRIM(A.EMPID)) IN('E1','E3'))
UNION 
SELECT A.EMPID,A.EMPFNAME,A.EMPLNAME,B.SALARY FROM USER_INFO A,LSALARY B WHERE (LTRIM(RTRIM(A.EMPID))=LTRIM(RTRIM(B.EMPID))) AND (LTRIM(RTRIM(A.EMPID)) IN('E5','E3'))
--或者使用下面列出的函数来进行操作
SELECT A.EMPID,A.EMPFNAME,A.EMPLNAME,A.INST_NO,DBO.GETSALARY(A.EMPID) FROM USER_INFO A WHERE A.EMPID IN('E1','E3','E5')
--2 取得所有用户的信息
DROP FUNCTION GETSALARY
CREATE FUNCTION GETSALARY(@EMPID CHAR(10))
RETURNS NUMERIC(15,2)
AS
BEGIN
DECLARE @RET NUMERIC(15,2)
DECLARE @RC INT
SET @RC=0
SET @RET=0.00
SELECT @RC=COUNT(*) FROM HSALARY WHERE LTRIM(RTRIM(EMPID))=LTRIM(RTRIM(@EMPID))
IF @RC>0 
SELECT TOP 1 @RET=SALARY FROM HSALARY WHERE LTRIM(RTRIM(EMPID))=LTRIM(RTRIM(@EMPID))
ELSE
BEGIN
SELECT @RC=COUNT(*) FROM LSALARY WHERE LTRIM(RTRIM(EMPID))=LTRIM(RTRIM(@EMPID))
IF @RC>0 
SELECT TOP 1 @RET=SALARY FROM LSALARY WHERE LTRIM(RTRIM(EMPID))=LTRIM(RTRIM(@EMPID))
END
RETURN @RET
END
SELECT A.*,DBO.GETSALARY(A.EMPID) FROM USER_INFO A
--3 USER_INFO 表是否符合第三范式
--4 谈谈如何限制普通用户访问SALARY字段
--给管理员或者应用程序设置帐户,允许他们进行读写访问,给普通用户设置另外的帐户,只允许他们读数据库中的某些表
--GRANT,DENY
--其他的考题
--线程与进程的关系区别
--堆栈与队列的关系与区别
--写一个链表的结构
--记不起来了