SqlServer 常见SQL笔试题之语句操作题详解

by:授客
QQ1033553122

CREATE
DATABASE handWriting

ON
PRIMARY

(

name = 'bishi',

fileName = 'E:\数据库\bishi.mbf',

size = 5MB,

maxSize = 30MB,

fileGrowth = 10%

)

LOG
ON

(

name = 'bishilog',

fileName = 'E:\数据库\bishilog.ldf',

size = 5MB,

fileGrowth = 10%

)

1、

employee

wage工资(编号，工资金额)(ID，amount)

attend出勤(工号，工资编号，出勤率)(num，ID，attendance)

--写一个SQL语句，查询工资金额为8000的职工工号和姓名。

SELECT
name,employee.num
FROM  employee, wage,
attend

WHERE
employee.num = attend.num
and attend.ID =
wage.ID and wage.amount
= 8000

--写一个SQL语句，查询职工张三的出勤率

SELECT
attendance
FROM  attend, employee

WHERE
attend.num = employee.num
AND employee.name =
'张三'

--WHERE num = (SELECT  num FROM  employee WHERE
employee.name = '张三')

--写一个SQL语句，查询3次出勤率为0的职工姓名和工号【常见题目】

SELECT
name,
num FROM  employee

WHERE
EXISTS(

SELECT
num
FROM  attend

WHERE
employee.num = attend.num
and attendance = 0

GROUP
BY num HAVING COUNT(*)
= 3)

--写一个SQL语句，查询出勤率为10并且工资金额小于2500的职工信息。[常见题目]

SELECT
*
FROM  employee,(

SELECT
*
FROM  attend, wage

WHERE
attendance = 10 AND attend.ID
= wage.ID and amount
<</span> 2500) A

WHERE
employee.num = A.num

，这种方法不可行，字段太多，会同名，要全部写出来。。

SELECT
*
FROM  employee

WHERE
num IN(

SELECT
num
FROM  attend

WHERE
attendance = 10 and ID IN(

SELECT
ID
FROM  wage

WHERE
amount <</span> 2500))

2、

S
(S#,SN,SD,SA) S#,SN,SD,SA

C
(C#,CN ) C#,CN

SC
( S#,C#,G ) S#,C#,G

--

SELECT
sn, sd FROM
s

WHERE
EXISTS(

SELECT
*
FROM  c

WHERE
EXISTS(

SELECT
*
FROM  sc

WHERE
s.s# = sc.s#
and c.c# =
sc.c#))

* FROM
C，把结果放入虚表中，显然虚表中有数据，外层EXISTS

SELECT sn, sd

FROM s

WHERE NOT EXISTS

(

SELECT * FROM c

WHERE NOT EXISTS

(

SELECT * FROM sc

WHERE s.s# = sc.s# and sc.c# = c.c#

)

)

--以下子查询即为查找他没选修的课程

SELECT * FROM c

WHERE NOT EXISTS

(

SELECT * FROM sc

WHERE s.s# = sc.s# and sc.c# = c.c#

)

--查询选修了课程的学员人数【常见题目】

SELECT
学员人数=

COUNT(DISTINCT
s#) FROM  SC

--查询选修课程超过5门的学员学号和所属单位【常见题目】

(HAVING提出要求，记录个数用count实现)；

SELECT
sn, sd FROM
S

WHERE
s# IN(

SELECT
s#
FROM  SC

GROUP
BY s#

HAVING
COUNT(DISTINCT
C#)>5)

by，不带having语句，那么针对每个分组仅会产生一条记录，如果使用having语句则会产生1到n条记录，每条记录都必须满足having给定的条件。

--使用标准SQL嵌套语句查询选修课程名称为’税收基础’的学员学号和姓名

SELECT
s#,sn FROM
s

WHERE
s# IN(

SELECT
s#
FROM  sc WHERE c# IN(

SELECT
c#
FROM  c

WHERE
cn = '税收基础'))

--

SELECT
s#,sd FROM
s

WHERE
s# IN(

SELECT
s#
FROM  sc WHERE c# IN(

SELECT
c#
FROM  c

WHERE
c# = '2'))

--

SELECT
s#,sd FROM
s

WHERE
s# IN(

SELECT
s#
FROM  sc WHERE c# IN(

SELECT
c#
FROM  c

WHERE
c# <> '5'))

--用一条SQL语句查询出每门课都大于80分的学生姓名【常见题目】

SELECT
sn
FROM  s

WHERE
s# IN(

SELECT
x.s# FROM
sc
x

WHERE
NOT EXISTS(

SELECT
*
FROM  sc y

WHERE
y.s# = x.s#
AND g <</span> 80))

3、

S1 (SNO,SNAME)

C1 (CNO,CNAME,CTEACHER)

--3.1.

SELECT
SNAME
FROM  S1,C1,
SC1

WHERE
S1.SNO = SC1.SNO

AND S1.SNO =
C1.CNO

AND C1.CTEACHER <> '李明'

SELECT
SNAME
FROM  S1

WHERE
SNO IN(

SELECT  SNO FROM  SC1

WHERE CNO IN(

SELECT  CNO FROM  C1

WHERE CTEACHER <> '李明'))

[错误做法]

SELECT
SNAME
FROM  S1

WHERE
NOT EXISTS(

SELECT  * FROM
C1

WHERE NOT EXISTS(

SELECT  * FROM
SC1

WHERE CTEACHER = '李明'

AND S1.SNO =
SC1.SNO AND C1.CNO
= SC1.CNO ))

[正解如下]：

SELECT  SNAME FROM  S1

WHERE NOT EXISTS(

SELECT  * FROM
C1

WHERE EXISTS(

SELECT  * FROM
SC1

WHERE CTEACHER = '李明' AND
S1.SNO = SC1.SNO
AND C1.CNO =
SC1.CNO ))

--查找被李明老师讲且被选修课程

SELECT  * FROM
C1

WHERE EXISTS(

SELECT  * FROM
SC1

WHERE CTEACHER = '李明' AND
S1.SNO = SC1.SNO
AND C1.CNO =
SC1.CNO ))

--3.2.

BY

SELECT
S1.SNAME FROM
S1

WHERE
EXISTS(

SELECT
*
FROM  SC1 WHERE SC1.SNO
= S1.SNO AND

GROUP
BY SC1.SNO HAVING
COUNT(*) >=
2);

SELECT
S1.SNAME,
A.AVGSCORE FROM  S1,

(SELECT

AVGSCORE FROM  SC1

WHERE
60

GROUP
BY SC1.SNO HAVING
COUNT(*) >=
2) A

WHERE
S1.SNO = A.SNO

--3.3.

SELECT
SNAME

FROM  S1,(

SELECT
SNO
FROM  SC1

WHERE
CNO = 1

INTERSECT

SELECT
SNO
FROM  SC1

WHERE
CNO = 2

)A

WHERE
S1.SNO = A.SNO

SELECT
SNAME
FROM  S1

WHERE
SNO IN(

SELECT
SNO
FROM  SC1

WHERE
CNO = 1 OR CNO =
2

GROUP
BY(SNO)
HAVING COUNT(*)
>= 2)--注意这里要是只写等于，那么要是还选了其他课程的就

--3.4

SELECT
DISTINCT(X.SNO)
FROM  SC1 X --注意这里一定要加个DISTINCT

WHERE
X.CNO = 1 AND

SELECT
FROM  SC1 Y

WHERE
Y.SNO = X.SNO
AND Y.CNO =
2);

--3.5

SELECT
A.SNO,
SCORE1, SCORE2 FROM  (

SELECT

WHERE
CNO = 1)A,

(SELECT

WHERE
CNO = 2)B

WHERE
A.SNO = B.SNO
AND A.SCORE1 >
B.SCORE2

4、

BM
DUPCOUNT

001

002

SELECT
SNO,COUNT(SNO)- 1
REPEAT FROM  SC1

GROUP
BY SNO HAVING COUNT(*)
> 1

5、

T_CARD

CNO

T_BOOKS

BNO

T_BORROW

--5.1．找出借书超过5本的读者,输出借书卡号及所借图书册数。

SELECT
NAME, CNO, QUANTITY FROM CARD,
T_BOOKS, T_BORROW

WHERE
CARD.CNO=T_BORROW.CNO AND
T_BOOKS.BNO = T_BORROW.BNO

GROUP
BY NAME HAVING COUNT(*)>5

--5.2．查询借阅了"水浒"一书的读者，输出姓名及班级。

SELECT
NAME,
CLASS FROM  T_CARD

WHERE
CNO IN (

SELECT
CNO
FROM  T_BORROW

WHERE
BNO IN (

SELECT
BNO
FROM  T_BOOKS

WHERE
BNAME = '水浒'))

--5.3．查询过期未还图书，输出借阅者（卡号）、书号及还书日期。

SELECT
*
FROM  T_BORROW

WHERE
REDATE <</span> GETDATE();

--5.4．查询书名包括"网络"关键词的图书，输出书号、书名、作者。

SELECT
BNO, BNAME, AUTHOR
FROM  T_BOOKS

WHERE
BNAME LIKE '%网络%';

--5.5．查询现有图书中价格最高的图书，输出书名及作者。

SELECT
TOP
1 WITH TIES BNAME,
AUTHOR FROM  T_BOOKS ORDER BY PRICE
DESC;

--或者

SELECT
BNAME, AUTHOR FROM
T_BOOKS

WHERE
PRICE = (SELECT
MAX(PRICE)
FROM  T_BOOKS)

--5.6 查询当前借了"计算方法"但没有借"计算方法导论"的读者，输出其借书卡号，并按卡号降序排序输出。

SELECT  CNO FROM  T_BORROW

WHERE BNO IN(

SELECT  A.BNO FROM  T_BOOKS A

WHERE  A.BNAME LIKE '计算方法'AND A.BNO NOT IN(

SELECT  B.BNO FROM  T_BOOKS B

WHERE A.BNAME = '计算方法导论'))

ORDER BY CNO DESC;

SELECT  A.CNO FROM  T_BORROW A, T_BOOKS B

WHERE A.BNO = B.BNO AND B.BNAME = '计算方法'

AND NOT EXISTS(

SELECT  * FROM  T_BORROW A1, T_BOOKS B1

WHERE A.CNO = A1.CNO AND B1.BNO = A1.BNO AND B1.BNAME = '计算方法导论')

ORDER BY CNO DESC;

--5.7 将"1"班同学所借图书的还期都延长一周。

UPDATE T_BORROW SET REDATE = DATEADD(DAY,7,REDATE)--注意函数的用法

WHERE CNO IN (

SELECT  CNO FROM  T_CARD

WHERE CLASS = 1);

--5.8 从BOOKS表中删除当前无人借阅的图书记录。

DELETE FROM  T_BOOKS WHERE NOT EXISTS(

SELECT  * FROM  T_BORROW

WHERE T_BOOKS.BNO = T_BORROW.BNO

);

--5.9.如果经常按书名查询图书信息，请建立合适的索引。

CREATE INDEX INDEX_A ON T_BOOKS(BNAME);

--5.10 在BORROW表上建立一个触发器，完成如下功能：如果读者借阅的书名是"数据库技术及应用"，--就将该读者的借阅记录保存在BORROW_SAVE表中（注ORROW_SAVE表结构同BORROW表）。

CREATE TRIGGER TRI_NAME  ON T_BORROW

FOR INSERT,UPDATE

AS

DECLARE

@booknum INT

SELECT  @booknum = BNO FROM  INSERTED  --注意这里赋值【SET @变量名=值或SELECT   @变量名= 值 FROM  表

IF @booknum = (SELECT  BNO FROM  T_BOOKS

WHERE BNAME = '数据库技术及应用')

BEGIN

--INSERT INTO  BORROW_SVAE SELECT  * FROM  INSERTED --注意这里这种方式下，表BORROW_SAVE一定要先存在，不然执行的时候会提示对象名无效

SELECT  * INTO  BORROW_SVAE FROM  INSERTED

END;

--检测

INSERT INTO  T_CARD VAlUES(3,'JJ',1);

INSERT INTO  T_BORROW VALUES(3,5, '2008-12-01');

SELECT  * FROM  BORROW_SVAE;

--稍微改动了下

CREATE TRIGGER TR_SAVE ON T_BORROW

FOR INSERT,UPDATE

AS

IF @@ROWCOUNT>0

SELECT  * INTO  BORROW_SAVE

FROM  INSERTED i,T_BOOKS b

WHERE i.BNO=b.BNO

AND b.BNAME='数据库技术及应用'

--检测

DELETE FROM  T_BORROW WHERE BNO = 5;

INSERT INTO  T_BORROW VALUES(3,5, '2008-12-01');

--提示数据库中已存在名为'BORROW_SVAE' 的对象。

--改正

DROP TRIGGER TR_SAVE

DROP TRIGGER TRI_NAME

CREATE TRIGGER TR_SAVE ON T_BORROW

FOR INSERT,UPDATE

AS

IF @@ROWCOUNT>0

SELECT  * INTO  BORROW_SAVE

FROM  INSERTED i,T_BOOKS b

WHERE i.BNO = b.BNO

AND b.BNAME='数据库技术及应用'

--检测

DELETE FROM  T_BORROW WHERE BNO = 5;

INSERT INTO  T_BORROW VALUES(3,5, '2008-12-01');

--提示各表中的列名必须唯一。在表'BORROW_SAVE' 中多次指定了列名'BNO'。

--改正

DROP TRIGGER TR_SAVE

CREATE TRIGGER TR_SAVE ON T_BORROW

FOR INSERT,UPDATE

AS

IF @@ROWCOUNT>0

SELECT  i.CNO,i.BNO,I.REDATE INTO  BORROW_SAVE

FROM  INSERTED i,T_BOOKS b

WHERE i.BNO = b.BNO

AND b.BNAME='数据库技术及应用'

--检测

DELETE FROM  T_BORROW WHERE BNO = 5;

INSERT INTO  T_BORROW VALUES(3,5, '2008-12-01');

SELECT  * FROM  BORROW_SVAE;

--5.10．建立一个视图，显示1.班学生的借书信息（只要求显示姓名和书名）。

CREATE VIEW V_VIEW

AS

SELECT NAME, BNAME FROM T_BORROW, T_CARD

WHERE T_BORROW.CNO = T_CARD.CNO AND T_CARD.CLASS = 1

--检测

SELECT * FROM V_VIEW

--5.11查询当前同时借有"计算方法"和"组合数学"两本书的读者，输出其借书卡号，并按卡号升序排序输出。

--法一.分别查出这两个结果集，然后INTERCEPT取交集

SELECT  CNO FROM  T_BORROW

WHERE BNO IN (SELECT  BNO FROM  T_BOOKS--注意这里只能用IN

WHERE BNAME = '计算方法')

INTERSECT

SELECT  CNO FROM  T_BORROW

WHERE BNO IN (SELECT  BNO FROM  T_BOOKS

WHERE BNAME = '组合数学')

ORDER BY CNO DESC

--法二.查出一个结果集，然后分组，然后记录大于等于2

SELECT  CNO FROM  T_BORROW

WHERE BNO IN (SELECT  BNO FROM  T_BOOKS

WHERE BNAME = '计算方法' OR  BNAME = '组合数学')

GROUP BY CNO HAVING COUNT(*)>=2

ORDER BY CNO DESC

--5.12假定在建BOOKS表时没有定义主码，写出为BOOKS表追加定义主码的语句。

ALTER TABLE T_BOOKS

PRIMARY KEY CLUSTERED(BNO)

--5.15．对CARD表做如下修改：

--  a. 将NAME最大列宽增加到个字符（假定原为个字符）。

ALTER TABLE T_CARD

ALTER COLUMN NAME VARCHAR(10)--注意这里没有SET

--  b. 为该表增加列NAME（系名），可变长，最大个字符。

ALTER TABLE T_CARD

--检测结果

SELECT  * FROM  T_CARD

EXEC SP_HELP T_CARD--查看表信息

6、

1        2005001  张三 0001      数学   69

2        2005002  李四 0001      数学   89

3        2005001  张三 0001      数学   69

DELETE FROM  S2

WHERE 自动编号 NOT IN(

SELECT  MIN(自动编号) FROM  S2 GROUP BY 学号,姓名,课程编号,课程名称,分数)

SELECT  * FROM  S2;

7、

SELECT  * INTO  b FROM  a WHERE 1<>1

INSERT INTO  a(a, b, c) SELECT  d,e,f FROM  b;

8、

UPDATE B SET VALUE =(

SELECT VALUE FROM A

WHERE B.KEYK = A.KEYK)

--结果：B中KEYK不在A中的，value就变成了NULL-->原因没对B中的key限制,非常容易忽略

--改正：删除后重新插入上述数据

DELETE FROM B;

UPDATE B SET VALUE =(

SELECT VALUE FROM A

WHERE B.KEYK = A.KEYK)

WHERE B.KEYK IN (

SELECT KEYK FROM A WHERE A.KEYK = B.KEYK)

9、

courseid coursename score

1           java        70

2           oracle      90

3           xml         40

4           jsp             30

5           servlet     80

courseid coursename score mark

---------------------------------------------------

1          java         70    pass

2         oracle       90    pass

3          xml         40    fail

4          jsp          30   fail

5 servlet 80 pass

SELECT COURSEID, COURSENAME, SCORE,

(CASE WHEN SCORE > 60 THEN 'PASS' ELSE 'FAIL' END) AS MARK

FROM T_B

oracle中做法如下(未测试)

select courseid, coursename ,score ,decode(

sign(score-60),-1,'fail','pass') as mark from course

10、

T1

NameID  CourseID    Score

1           1       90

1           2       85

2           1       75

2           2       95

T2

ID  Course

1   数学

2   语文

T3

ID  Name

1   张三

2   李四

Name         Course        Score

——–           ——–           ——–

SELECT NAME,COURSE,SCORE FROM T1, T2, T3

WHERE T1.NAMEID = T3.ID AND T1.COURSEID = T3.ID

GROUP BY NAME,COURSE,SCORE;

## SQLServer 常见SQL笔试题之语句操作题详解的更多相关文章

1. PHP笔试题（11道题）详解

题目一 <?php echo -10%3; ?> 答案:-1. 考查:优先级. 因为-的优先级比%求余的优先级低, 也就是-(10%3). 2 题目二: print (int)pow(2, ...

2. [SQL]数据分析SQL笔试题

SQL笔试题 1.请简单写出left join和join的用法区别(可举例说明): 2.求出订单表(order表)中每个客户(custid)的最近一次购买日期(要求:按custid降序排列,trans ...

3. SQL笔试题：下面是学生表（student）的结构说明

SQL笔试题:下面是学生表(student)的结构说明 SQL笔试题:下面是学生表(student)的结构说明 字段名称 字段解释 字段类型 字段长度 约束 s_id 学号 字符 10 PK s_na ...

4. SQL Server 表的管理_关于数据增删查改的操作的详解（案例代码）

SQL Server 表的管理_关于数据增删查改的操作的详解(案例代码)-DML 1.SQL INSERT INTO 语句(在表中插入) INSERT INTO 语句用于向表中插入新记录. SQL I ...

5. SQL Server 表的管理_关于事务操作的详解（案例代码）

SQL Server 表的管理_关于事务操作的详解(案例代码) 1.概念 事务(transaction): 是将多个修改语句组合在一起的方法,这个方法中的所有语句只有全部执行才能正确完成功能.即要么全 ...

6. SQL Server 表的管理_关于表的操作增删查改的操作的详解（案例代码）

SQL Server 表的管理_关于表的操作增删查改的操作的详解(案例代码) 概述: 表由行和列组成,每个表都必须有个表名. SQL CREATE TABLE 语法 CREATE TABLE tabl ...

7. 关于SQL的几道小题详解

关于SQL的几道小题详解 当我们拿到题目的时候,并不是急于作答,那样会得不偿失的,而是分析思路,采用什么方法,达到什么目的,还要思考有没有简单的方法或者通用的方法等等,这样才会达到以一当十的效果,这样 ...

8. MySQL 语句执行过程详解

MySQL 原理篇 MySQL 索引机制 MySQL 体系结构及存储引擎 MySQL 语句执行过程详解 MySQL 执行计划详解 MySQL InnoDB 缓冲池 MySQL InnoDB 事务 My ...

9. Java8 Stream中间操作使用详解

前面两篇简单的介绍了Stream以及如何创建Stream,本篇就给大家说说stream有哪些用途,以及具体怎样使用. 再次介绍Stream Stream 使用一种类似用于SQL 语句从数据库查询数据的 ...

## 随机推荐

1. Dynamic CRM 2013学习笔记（二十七）无代码 复制/克隆方法

前面介绍过二种复制/克隆方法:<Dynamic CRM 2013学习笔记(十四)复制/克隆记录> 和<Dynamic CRM 2013学习笔记(二十五)JS调用web service ...

2. BZOJ2301 莫比乌斯反演

题意:a<=x<=b,c<=y<=d,求满足gcd(x,y)=k的数对(x,y)的数量         ((x,y)和(y,x)不算同一个) 比hdu1695多加了个下界,还有 ...

3. Shell练习 验证号码

原文: https://leetcode.com/problems/valid-phone-numbers/ Given a text file file.txt that contains list ...

4. ubuntu 13.04下sublime text 3使用中文输入法

主要思路参考 http://blog.yanwen.org/archives/1955.html libsublime-imfix.so 这个库自己编译和从他这下载的 md5一样.可以不用编译了.直接 ...

5. EventLog组件

1.使用EventLog组件读写事件日志 SourceExists方法  确定事件源是否已在本地计算机上注册 DeleteEventSource方法  用于从事件日志中移除应用程序的事件源注册 pri ...

6. c++静态成员与静态函数

1 静态成员的定义 1 静态变量 c++在类里面进行的仅是引用性声明,不会为之分配内存,要求必须单独对静态数据成员进行定义性的声明.形式为: 类型 类名::静态数据成员名: 此时的定义需要再加关键字s ...

7. Markdowm入门

今天介绍一种非常好用的小巧性标记语言--Markdown,熟悉它的语法规则,这将会节省你很多编辑文本文档格式的时间,提高你的工作效率和学习效率． 一.什么是Markdown Markdown是一种可以 ...

8. HTTP认证方式与https简介

HTTP认证与https简介 HTTP请求报头: Authorization [ˌɔ:θəraɪˈzeɪʃn] HTTP响应报头: WWW-Authenticate [ɔ:ˈθentɪkeɪt] HT ...

9. DevExpress winform 友好皮肤

DevExpress设置默认皮肤及各种皮肤样式   DevExpress设置默认皮肤及各种皮肤样式 设置默认皮肤代码: 在程序入口Program.cs里添加如下代码 引用using DevExpres ...

10. CentOS，crontab的学习、使用、问题解决记录

参考:http://blog.csdn.net/luanwpp/article/details/7490871 参考: http://mp.weixin.qq.com/s?src=11&tim ...