SQL考核

一、需求"员工需要上传资料到系统,并且为文档进行了分类展示"注按照需求绘画ER图(可不画),理清实体关系对象,(上传功能暂忽略)

答:


E-R图.jpg


二、根据ER创建表结构,注意主键,外键等约束

答:

/*
Navicat SQL Server Data Transfer

Source Server         : SQL2000
Source Server Version : 80000
Source Host           : 127.0.0.1:1433
Source Database       : document
Source Schema         : dbo

Target Server Type    : SQL Server
Target Server Version : 80000
File Encoding         : 65001

Date: 2014-05-13 14:35:13
*/


-- ----------------------------
-- Table structure for docClass
-- ----------------------------
DROP TABLE [dbo].[docClass]
GO
CREATE TABLE [dbo].[docClass] (
[classId] int NOT NULL ,
[className] varchar(100) NOT NULL ,
[createTime] varchar(40) NOT NULL ,
[path] text NULL ,
[programId] varchar(100) NULL 
)


GO

-- ----------------------------
-- Records of docClass
-- ----------------------------
INSERT INTO [dbo].[docClass] ([classId], [className], [createTime], [path], [programId]) VALUES (N'1', N'A', N'2014-1-2', N'/', N'001')
GO
GO
INSERT INTO [dbo].[docClass] ([classId], [className], [createTime], [path], [programId]) VALUES (N'2', N'A1', N'2014-1-3', N'/A/', N'001001')
GO
GO
INSERT INTO [dbo].[docClass] ([classId], [className], [createTime], [path], [programId]) VALUES (N'3', N'A1.1', N'2014-2-1', N'/A/A1/', N'001001001')
GO
GO
INSERT INTO [dbo].[docClass] ([classId], [className], [createTime], [path], [programId]) VALUES (N'4', N'A1.2', N'2014-3-1', N'/A/A1/', N'001001002')
GO
GO
INSERT INTO [dbo].[docClass] ([classId], [className], [createTime], [path], [programId]) VALUES (N'5', N'B1', N'2014-3-2', N'/A/', N'001002')
GO
GO
INSERT INTO [dbo].[docClass] ([classId], [className], [createTime], [path], [programId]) VALUES (N'6', N'B1.1', N'2014-3-26', N'/A/B1/', N'001002001')
GO
GO
INSERT INTO [dbo].[docClass] ([classId], [className], [createTime], [path], [programId]) VALUES (N'7', N'B2.2', N'2014-4-1', N'/A/B2/', N'001002002')
GO
GO

-- ----------------------------
-- Table structure for document
-- ----------------------------
DROP TABLE [dbo].[document]
GO
CREATE TABLE [dbo].[document] (
[docId] int NOT NULL ,
[userId] int NOT NULL ,
[classId] int NOT NULL ,
[uploadDate] datetime NULL 
)


GO

-- ----------------------------
-- Records of document
-- ----------------------------
INSERT INTO [dbo].[document] ([docId], [userId], [classId], [uploadDate]) VALUES (N'1', N'5', N'4', N'2008-01-09 05:06:00.000')
GO
GO
INSERT INTO [dbo].[document] ([docId], [userId], [classId], [uploadDate]) VALUES (N'2', N'4', N'2', N'2008-01-07 23:43:00.000')
GO
GO
INSERT INTO [dbo].[document] ([docId], [userId], [classId], [uploadDate]) VALUES (N'3', N'3', N'6', N'2008-01-01 13:04:00.000')
GO
GO
INSERT INTO [dbo].[document] ([docId], [userId], [classId], [uploadDate]) VALUES (N'4', N'5', N'3', N'2008-01-18 00:00:00.000')
GO
GO
INSERT INTO [dbo].[document] ([docId], [userId], [classId], [uploadDate]) VALUES (N'5', N'2', N'7', N'2008-01-19 00:00:00.000')
GO
GO
INSERT INTO [dbo].[document] ([docId], [userId], [classId], [uploadDate]) VALUES (N'6', N'2', N'3', N'2008-01-22 00:00:00.000')
GO
GO
INSERT INTO [dbo].[document] ([docId], [userId], [classId], [uploadDate]) VALUES (N'7', N'1', N'2', N'2007-01-23 00:00:00.000')
GO
GO
INSERT INTO [dbo].[document] ([docId], [userId], [classId], [uploadDate]) VALUES (N'8', N'1', N'5', N'2005-01-12 00:00:00.000')
GO
GO
INSERT INTO [dbo].[document] ([docId], [userId], [classId], [uploadDate]) VALUES (N'9', N'2', N'1', N'1997-01-20 00:00:00.000')
GO
GO
INSERT INTO [dbo].[document] ([docId], [userId], [classId], [uploadDate]) VALUES (N'10', N'3', N'7', N'1996-01-21 00:00:00.000')
GO
GO
INSERT INTO [dbo].[document] ([docId], [userId], [classId], [uploadDate]) VALUES (N'11', N'4', N'6', N'1995-01-01 00:00:00.000')
GO
GO
INSERT INTO [dbo].[document] ([docId], [userId], [classId], [uploadDate]) VALUES (N'12', N'2', N'2', N'1995-01-01 00:00:00.000')
GO
GO

-- ----------------------------
-- Table structure for users
-- ----------------------------
DROP TABLE [dbo].[users]
GO
CREATE TABLE [dbo].[users] (
[userId] int NOT NULL ,
[userName] char(50) NOT NULL ,
[QuanXian] binary(1) NULL 
)


GO

-- ----------------------------
-- Records of users
-- ----------------------------
INSERT INTO [dbo].[users] ([userId], [userName], [QuanXian]) VALUES (N'1', N'user1                                             ', 0x01)
GO
GO
INSERT INTO [dbo].[users] ([userId], [userName], [QuanXian]) VALUES (N'2', N'user2                                             ', 0x01)
GO
GO
INSERT INTO [dbo].[users] ([userId], [userName], [QuanXian]) VALUES (N'3', N'user3                                             ', 0x01)
GO
GO
INSERT INTO [dbo].[users] ([userId], [userName], [QuanXian]) VALUES (N'4', N'user4                                             ', 0x01)
GO
GO
INSERT INTO [dbo].[users] ([userId], [userName], [QuanXian]) VALUES (N'5', N'user5                                             ', 0x01)
GO
GO

-- ----------------------------
-- Procedure structure for dir_path
-- ----------------------------
DROP PROCEDURE [dbo].[dir_path]
GO
CREATE PROCEDURE [dbo].[dir_path]
  -- @dir_id varchar,
  @dir_name varchar(100)
AS
BEGIN
	DECLARE @dir_id VARCHAR(100)
	DECLARE @path VARCHAR(100)
	SET @path = '';
  SELECT @dir_id = programId FROM docClass
	WHERE className=@dir_name
	loop:
	IF(@dir_id='001')
		SET @path = 'A' + @path
	ELSE
		BEGIN
			-- 递归
			SELECT @dir_name = className FROM docClass
			WHERE programId = @dir_id
			SET @path = '->' + @dir_name + @path
			SET @dir_id = LEFT(@dir_id, LEN(@dir_id)-3)
			GOTO loop
		END
	PRINT @path
END
GO

-- ----------------------------
-- Procedure structure for Factorial_ap
-- ----------------------------
DROP PROCEDURE [dbo].[Factorial_ap]
GO
CREATE PROCEDURE [dbo].[Factorial_ap]
(
@Number Integer,
@RetVal Integer OUTPUT
)
AS
DECLARE @In Integer
DECLARE @Out Integer
IF @Number != 1
BEGIN
SELECT @In = @Number - 1
EXEC Factorial_ap @In, @Out OUTPUT
SELECT @RetVal = @Number * @Out
END
ELSE
BEGIN
SELECT @RetVal = 1
END
RETURN

GO

-- ----------------------------
-- Indexes structure for table docClass
-- ----------------------------
CREATE INDEX [_WA_Sys_className_79A81403] ON [dbo].[docClass]
([className] ASC) 
GO
CREATE INDEX [_WA_Sys_programId_79A81403] ON [dbo].[docClass]
([programId] ASC) 
GO

-- ----------------------------
-- Primary Key structure for table docClass
-- ----------------------------
ALTER TABLE [dbo].[docClass] ADD PRIMARY KEY ([classId])
GO

-- ----------------------------
-- Indexes structure for table document
-- ----------------------------
CREATE INDEX [_WA_Sys_userId_77BFCB91] ON [dbo].[document]
([userId] ASC) 
GO
CREATE INDEX [_WA_Sys_classId_77BFCB91] ON [dbo].[document]
([classId] ASC) 
GO

-- ----------------------------
-- Primary Key structure for table document
-- ----------------------------
ALTER TABLE [dbo].[document] ADD PRIMARY KEY ([docId])
GO

-- ----------------------------
-- Indexes structure for table users
-- ----------------------------
CREATE INDEX [_WA_Sys_userName_75D7831F] ON [dbo].[users]
([userName] ASC) 
GO

-- ----------------------------
-- Primary Key structure for table users
-- ----------------------------
ALTER TABLE [dbo].[users] ADD PRIMARY KEY ([userId])
GO

-- ----------------------------
-- Uniques structure for table users
-- ----------------------------
ALTER TABLE [dbo].[users] ADD UNIQUE ([userName] ASC)
GO

-- ----------------------------
-- Foreign Key structure for table [dbo].[document]
-- ----------------------------
ALTER TABLE [dbo].[document] ADD FOREIGN KEY ([classId]) REFERENCES [dbo].[docClass] ([classId]) ON DELETE NO ACTION ON UPDATE NO ACTION
GO
ALTER TABLE [dbo].[document] ADD FOREIGN KEY ([userId]) REFERENCES [dbo].[users] ([userId]) ON DELETE NO ACTION ON UPDATE NO ACTION
GO


三、录入测试数据目录和文档(要求分类树有至少3个层级),查询内容为:某个指定节点ID下上传文件列表(包含子节点),并按照创建时间排序展示

答:

SELECT docId, userName, className, path, uploadDate
FROM (document JOIN users ON document.userId=users.userId) JOIN docClass on document.classId = docClass.classId
WHERE programId LIKE 
(SELECT programId FROM docClass
WHERE className = 'A') + '%'
ORDER BY uploadDate


四、统计查询“每个用户各上传了多少个文件”

答:

SELECT users.userName, COUNT(docId) AS amount 
FROM document JOIN users ON document.userId = users.userId
GROUP BY users.userName


五、创建存储过程如:传入当前目录Id,传入某一目录Id,返回该目录路径完整路径

如传入 A1.2的ID返回结果为A->A1->A1.2

目录结构如下:

  A

  |-A1

  | |-A1.1

  | |-A1.2

  |-B1

    |-B1.1

    |-B2.2

   

答:

思路:

dig(@dir_id)

{

if(@dir_id == '001') print "A"

else 

{

@dir_id = left(@dir_id,len(@dir_id)-3)

dig(@dir_id);

select className from docClass

where programId = programId 

print "->" + className;

}

}


实现:

ALTER PROCEDURE [dbo].[dir_path]

  -- @dir_id varchar,

  @dir_name varchar(100)

AS

BEGIN

DECLARE @dir_id VARCHAR(100)

DECLARE @path VARCHAR(100)

SET @path = '';

  SELECT @dir_id = programId FROM docClass

WHERE className=@dir_name


-- 避免查找不存在目录导致死循环

if(@dir_id LIKE '001%')

BEGIN

loop:

IF(@dir_id='001')

SET @path = 'A' + @path

ELSE

BEGIN

-- 递归

SELECT @dir_name = className FROM docClass

WHERE programId = @dir_id

SET @path = '->' + @dir_name + @path

SET @dir_id = LEFT(@dir_id, LEN(@dir_id)-3)

GOTO loop

END

END


ELSE

SET @path = '查无此目录'

PRINT @path

END


执行:

EXEC dir_path @dir_name='A1.2'


上一篇:MongoDB基本知识

下一篇:SQL语言