SQL数据库试题(笔试题)

更新时间:2024-06-13 11:45:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

28.

数据库:抽出部门,平均工资,要求按部门的字符串顺序排序,不能含有\resource\部门,

employee结构如下:employee_id, employee_name, depart_id,depart_name,wage 答:

select depart_name, avg(wage) from employee

where depart_name <> 'human resource' group by depart_name order by depart_name

-------------------------------------------------------------------------- 29.

给定如下SQL数据库:Test(num INT(4)) 请用一条SQL语句返回num的最小值,但不许使用统计功能,如MIN,MAX等 答:

select top 1 num from Test

order by num

-------------------------------------------------------------------------- 33.一个数据库中有两个表:

一张表为Customer,含字段ID,Name; 一张表为Order,含字段ID,CustomerID(连向Customer中ID的外键),Revenue; 写出求每个Customer的Revenue总和的SQL语句。 建表 create table customer (

ID int primary key,Name char(10) ) go

create table [order] (

ID int primary key,CustomerID int foreign key references customer(id) , Revenue float ) go --查询

select Customer.ID, sum( isnull([Order].Revenue,0) ) from customer full join [order]

on( [order].customerid=customer.id ) group by customer.id

select customer.id,sum(order.revener) from order,customer where customer.id=customerid group by customer.id

select customer.id, sum(order.revener ) from customer full join order

on( order.customerid=customer.id ) group by customer.id

5数据库(10)

a tabel called “performance”contain :name and score,please 用SQL语言表述

如何选出score最high的一个(仅有一个)

仅选出分数,Select max(score) from performance

仅选出名字,即选出名字,又选出分数:select top 1 score ,name from per order by score

select name1,score from per where score in/=(select max(score) from per) .....

4 有关系 s(sno,sname) c(cno,cname) sc(sno,cno,grade) 1 问上课程 \的学生no

select count(*) from c,sc where c.cname='db' and c.cno=sc.cno

select count(*) from sc where cno=(select cno from c where c.cname='db')

2 成绩最高的学生号

select sno from sc where grade=(select max(grade) from sc ) 3 每科大于90分的人数

select c.cname,count(*) from c,sc where c.cno=sc.cno and sc.grade>90 group by c.cname

select c.cname,count(*) from c join sc on c.cno=sc.cno and sc.grade>90 group by c.cname

数据库笔试题 *

建表: dept:

deptno(primary key),dname,loc emp:

empno(primary key),ename,job,mgr,sal,deptno */

1 列出emp表中各部门的部门号,最高工资,最低工资

select max(sal) as 最高工资,min(sal) as 最低工资,deptno from emp group by deptno;

2 列出emp表中各部门job为'CLERK'的员工的最低工资,最高工资

select max(sal) as 最高工资,min(sal) as 最低工资,deptno as 部门号 from emp where job = 'CLERK' group by deptno;

3 对于emp中最低工资小于1000的部门,列出job为'CLERK'的员工的部门号,最低工资,最高工资

select max(sal) as 最高工资,min(sal) as 最低工资,deptno as 部门号 from emp as b

where job='CLERK' and 1000>(select min(sal) from emp as a where a.deptno=b.deptno) group by b.deptno

4 根据部门号由高而低,工资有低而高列出每个员工的姓名,部门号,工资

select deptno as 部门号,ename as 姓名,sal as 工资 from emp order by deptno desc,sal asc 5 写出对上题的另一解决方法 (请补充)

6 列出'张三'所在部门中每个员工的姓名与部门号

select ename,deptno from emp where deptno = (select deptno from emp where ename = '张三')

7 列出每个员工的姓名,工作,部门号,部门名

select ename,job,emp.deptno,dept.dname from emp,dept where emp.deptno=dept.deptno

8 列出emp中工作为'CLERK'的员工的姓名,工作,部门号,部门名 select ename,job,dept.deptno,dname from emp,dept where dept.deptno=emp.deptno and job='CLERK'

9 对于emp中有管理者的员工,列出姓名,管理者姓名(管理者外键为mgr)

select a.ename as 姓名,b.ename as 管理者 from emp as a,emp as b where a.mgr is not null and a.mgr=b.empno

10 对于dept表中,列出所有部门名,部门号,同时列出各部门工作为'CLERK'的员工名与工作

select dname as 部门名,dept.deptno as 部门号,ename as 员工名,job as 工作 from dept,emp

where dept.deptno *= emp.deptno and job = 'CLERK'

11 对于工资高于本部门平均水平的员工,列出部门号,姓名,工资,按部门号排序 select a.deptno as 部门号,a.ename as 姓名,a.sal as 工资 from emp as a where a.sal>(select avg(sal) from emp as b where a.deptno=b.deptno) order by a.deptno

12 对于emp,列出各个部门中平均工资高于本部门平均水平的员工数和部门号,按部门号排序

select count(a.sal) as 员工数,a.deptno as 部门号 from emp as a

where a.sal>(select avg(sal) from emp as b where a.deptno=b.deptno) group by a.deptno order by a.deptno

13 对于emp中工资高于本部门平均水平,人数多与1人的,列出部门号,人数,按部门号排序

select count(a.empno) as 员工数,a.deptno as 部门号,avg(sal) as 平均工资 from emp as a

where (select count(c.empno) from emp as c where c.deptno=a.deptno

and c.sal>(select avg(sal) from emp as b where c.deptno=b.deptno))>1 group by a.deptno order by a.deptno

14 对于emp中低于自己工资至少5人的员工,列出其部门号,姓名,工资,以及工资少于自己的人数

select a.deptno,a.ename,a.sal,(select count(b.ename) from emp as b where b.sal

where (select count(b.ename) from emp as b where b.sal5 数据库笔试题及答案 第一套

一.选择题

1. 下面叙述正确的是CCBAD ______。 A、算法的执行效率与数据的存储结构无关

B、算法的空间复杂度是指算法程序中指令(或语句)的条数 C、算法的有穷性是指算法必须能在执行有限个步骤之后终止 D、以上三种描述都不对

2. 以下数据结构中不属于线性数据结构的是______。A、队列B、线性表C、二叉树D、栈

3. 在一棵二叉树上第5层的结点数最多是______。A、8 B、16 C、32 D、15 4. 下面描述中,符合结构化程序设计风格的是______。

A、使用顺序、选择和重复(循环)三种基本控制结构表示程序的控制逻辑 B、模块只有一个入口,可以有多个出口

C、注重提高程序的执行效率 D、不使用goto语句 5. 下面概念中,不属于面向对象方法的是______。 A、对象 B、继承 C、类 D、过程调用

6. 在结构化方法中,用数据流程图(DFD)作为描述工具的软件开发阶段是___ BDBCA ___。

A、可行性分析 B、需求分析 C、详细设计 D、程序编码 7. 在软件开发中,下面任务不属于设计阶段的是______。

A、数据结构设计 B、给出系统模块结构 C、定义模块算法 D、定义需求并建立系统模型

8. 数据库系统的核心是______。

A、数据模型 B、数据库管理系统 C、软件工具 D、数据库 9. 下列叙述中正确的是______。

A、数据库是一个独立的系统,不需要操作系统的支持 B、数据库设计是指设计数据库管理系统

C、数据库技术的根本目标是要解决数据共享的问题

D、数据库系统中,数据的物理结构必须与逻辑结构一致

10. 下列模式中,能够给出数据库物理存储结构与物理存取方法的是______。 A、内模式 B、外模式 C、概念模式 D、逻辑模式 11. Visual FoxPro数据库文件是__ DCBAA ____。 A、存放用户数据的文件 B、管理数据库对象的系统文件

C、存放用户数据和系统的文件 D、前三种说法都对 12. SQL语句中修改表结构的命令是______。

A、MODIFY TABLE B、MODIFY STRUCTURE C、ALTER TABLE D、ALTER STRUCTURE

13. 如果要创建一个数据组分组报表,第一个分组表达式是\部门\,第二个分组表达式是\性别\,第三个分组表达式是\基本工资\,当前索引的索引表达式应当是______。

A、部门+性别+基本工资 B、部门+性别+STR(基本工资)

C、STR(基本工资)+性别+部门 D、性别+部门+STR(基本工资)

14. 把一个项目编译成一个应用程序时,下面的叙述正确的是______。 A、所有的项目文件将组合为一个单一的应用程序文件

B、所有项目的包含文件将组合为一个单一的应用程序文件 C、所有项目排除的文件将组合为一个单一的应用程序文件 D、由用户选定的项目文件将组合为一个单一的应用程序文件

15. 数据库DB、数据库系统DBS、数据库管理系统DBMS三者之间的关系是______。

A、DBS包括DB和DBMS B、DBMS包括DB和DBS

C、DB包括DBS和DBMS D、DBS就是DB,也就是DBMS

16. 在\选项\对话框的\文件位置\选项卡中可以设置_ BAABA _____。 A、表单的默认大小 B、默认目录

C、日期和时间的显示格式 D、程序代码的颜色

17. 要控制两个表中数据的完整性和一致性可以设置\参照完整性\,要求这两个表______。

A、是同一个数据库中的两个表 B、不同数据库中的两个表 C、两个自由表 D、一个是数据库表另一个是自由表 18. 定位第一条记录上的命令是______。

A、GO TOP B、GO BOTTOM C、GO 6 D、SKIP

19. 在关系模型中,实现\关系中不允许出现相同的元组\的约束是通过______。 A、候选键 B、主键 C、外键 D、超键

20. 设当前数据库有10条记录(记录未进行任何索引),在下列三种情况下,当前记录号为1时;EOF()为真时;BOF()为真时,命令?RECN()的结果分别是______。 A、1,11,1 B、1,10,1 C、1,11,0 D、1,10,0

21. 下列表达式中结果不是日期型的是__ CCBBA ____。

A、CTOD(\、{^99/10/01}+365 C、VAL(\D、DATE()

22. 只有满足联接条件的记录才包含在查询结果中,这种联接为______。 A、左联接 B、右联接 C、内部联接 D、完全联接 23. 索引字段值不唯一,应该选择的索引类型为______。 A、主索引 B、普通索引 C、候选索引 D、唯一索引 24. 执行SELECT 0选择工作区的结果是______。 A、选择了0号工作区 B、选择了空闲的最小号工作区 C、关闭选择的工作区 D、选择已打开的工作区 25. 从数据库中删除表的命令是______。

A、DROP TABLE B、ALTER TABLE C、DELETE TABLE D、USE

26. DELETE FROM S WHERE 年龄>60语句的功能是_ BBCCB _____。 A、从S表中彻底删除年龄大于60岁的记录 B、S表中年龄大于60岁的记录被加上删除标记

C、删除S表 D、删除S表的年龄列 27. SELECT-SQL语句是______。

A、选择工作区语句 B、数据查询语句 C、选择标准语句 D、数据修改语句

28. SQL语言是______语言。A、层次数据库 B、网络数据库 C、关系数据库 D、非数据库

29. 在SQL中,删除视图用______。

A、DROP SCHEMA命令 B、CREATE TABLE命令 C、DROP VIEW命令 D、DROP INDEX命令

30. 以下属于非容器类控件的是______。A、Form B、Label C、page D、Container

31. 将查询结果放在数组中应使用__d____短语。

A、INTO CURSOR B、TO ARRAY C、INTO TABLE D、INTO ARRAY 32. 在命令窗口执行SQL命令时,若命令要占用多行,续行符是__d____。 A、冒号(:) B、分号(;) C、逗号(,) D、连字符(-) 33. 设有图书管理数据库:

图书(总编号C(6),分类号C(8),书名C(16),作者C(6),出版单位C(20),单价N(6,2))

读者(借书证号C(4),单位C(8),姓名C(6),性别C(2),职称C(6),地址C(20)) 借阅(借书证号C(4),总编号C(6),借书日期D(8))

对于图书管理数据库,查询0001号借书证的读者姓名和所借图书的书名。 SQL语句正确的是______。

SELECT 姓名,书名 FROM 借阅,图书,读者 WHERE; 借阅.借书证号=\ ______ ____a__

A、图书.总编号=借阅.总编号 AND; 读者.借书证号=借阅.借书证号

B、图书.分类号=借阅.分类号 AND; 读者.借书证号=借阅.借书证号

C、读者.总编号=借阅.总编号 AND; 读者.借书证号=借阅.借书证号

D、图书.总编号=借阅.总编号 AND; 读者.书名=借阅.书名 34. 设有图书管理数据库:

图书(总编号C(6),分类号C(8),书名C(16),作者C(6),出版单位C(20),单价N(6,2))

读者(借书证号C(4),单位C(8),姓名C(6),性别C(2),职称C(6),地址C(20)) 借阅(借书证号C(4),总编号C(6),借书日期D(8))

对于图书管理数据库,分别求出各个单位当前借阅图书的读者人次。下面的SQL语句正确的是______。

SELECT 单位,______ FROM 借阅,读者 WHERE; 借阅.借书证号=读者.借书证号 a______ A、COUNT(借阅.借书证号) GROUP BY 单位 B、SUM(借阅.借书证号) GROUP BY 单位

C、COUNT(借阅.借书证号) ORDER BY 单位 D、COUNT(借阅.借书证号) HAVING 单位

35. 设有图书管理数据库:

图书(总编号C(6),分类号C(8),书名C(16),作者C(6),出版单位C(20),单价N(6,2))

读者(借书证号C(4),单位C(8),姓名C(6),性别C(2),职称C(6),地址C(20))

借阅(借书证号C(4),总编号C(6),借书日期D(8))

对于图书管理数据库,检索借阅了《现代网络技术基础》一书的借书证号。下面SQL语句正确的是______。

SELECT 借书证号 FROM 借阅 WHERE 总编号=; ______b

A、(SELECT 借书证号 FROM 图书 WHERE 书名=\现代网络技术基础\ B、(SELECT 总编号 FROM 图书 WHERE 书名=\现代网络技术基础\ C、(SELECT 借书证号 FROM 借阅 WHERE 书名=\现代网络技术基础\ D、(SELECT 总编号 FROM 借阅 WHERE 书名=\现代网络技术基础\ 二、填空题

36. 算法的复杂度主要包括______复杂度和空间复杂度。

37. 数据的逻辑结构在计算机存储空间中的存放形式称为数据的______。

38. 若按功能划分,软件测试的方法通常分为白盒测试方法和______测试方法。 39. 如果一个工人可管理多个设施,而一个设施只被一个工人管理,则实体\工人\与实体\设备\之间存在______联系。

40. 关系数据库管理系统能实现的专门关系运算包括选择、连接和______。 41. 命令?LEN(\的结果是______。

42.SQL SELECT语句为了将查询结果存放到临时表中应该使用______短语。 43. 多栏报表的栏目数可以通过______来设置。

44. 在打开项目管理器之后再打开\应用程序生成器\,可以通过按ALT+F2键,快捷菜单和\工具\菜单中的______。

45. 数据库系统的核心是______。

46. 查询设计器中的\联接\选项卡,可以控制______选择。 47. 设有图书管理数据库:

图书(总编号C(6),分类号C(8),书名C(16),作者C(6),出版单位C(20),单价N(6,2))

读者(借书证号C(4),单位C(8),姓名C(6),性别C(2),职称C(6),地址C(20)) 借阅(借书证号C(4),总编号C(6),借书日期D(8))

用SQL的CREATE命令建立借阅表(字段顺序要相同),请对下面的SQL语句填空:

______

48. 设有图书管理数据库:

图书(总编号C(6),分类号C(8),书名C(16),作者C(6),出版单位C(20),单价N(6,2))

读者(借书证号C(4),单位C(8),姓名C(6),性别C(2),职称C(6),地址C(20)) 借阅(借书证号C(4),总编号C(6),借书日期D(8))

对图书管理数据库,查询由\清华大学出版社\或\电子工业出版社\出版,并且单价不超出20元的书名。请对下面的SQL语句填空: SELECT 书名,出版单位,单价 FROM 图书; WHERE_______ AND; _______

49. 设有图书管理数据库:

图书(总编号C(6),分类号C(8),书名C(16),作者C(6),出版单位C(20),单价N(6,2))

读者(借书证号C(4),单位C(8),姓名C(6),性别C(2),职称C(6),地址C(20)) 借阅(借书证号C(4),总编号C(6),借书日期D(8))

对图书管理数据库,求共借出多少种图书。请对下面的SQL语句填空:

SELECT _______ FROM 借阅 第一套题答案 选择题

1-5 CCBAD 6-10 BDBCA 11-15 DCBAA 16-20 BAABA 21-25 CCBBA 26-30 BBCCB 31-35 DDAAB 填空题

36.时间 37.模式或逻辑模式 38.黑盒 39. 一对多 或 1对多 或 一对n 或 1:N 或 1:n 或 1:n 或 1:N 或 一对m 或 1:M 或 1:m 或 1:m 或 1:N 40. 投影 41.15 42. Into cursor 或 Into cursor cursorname 43. 页面设置 或 列数 44. 应用程序生成器 45. 数据库管理系统 或 DBMS 46. 联接类型 或 联接条件 47. CREATE TABLE 借阅 (借书证号 C(4),总编号 C(6),借书日期 D(8)) 或 CREA TABL 借阅 (借书证号 C(4),总编号 C(6),借书日期D(8)) 或 CREATE TABLE 借阅 (借书证号 C(4),总编号 C(6),借书日期 D) 或 CREA TABL 借阅 (借书证号 C(4),总编号 C(6),借书日期 D) 48. 单价<=20 或 (出版单位=\清华大学出版社\出版单位=\电子工业出版社\或 (出版单位=\电子工业出版社\OR 出版单位=\清华大学出版社\或 (出版单位='清华大学出版社' OR 出版单位='电子工业出版社') 与 (出版单位=\清华大学出版社\出版单位=\电子工业出版社\或 (出版单位='清华大学出版社‘) 49. COUNT(DISTINCT 总编号) 或

COUN(DISTINCT 总编号) 或 COUNT(DIST 总编号) 或 COUN(DIST 总编号) 第二套题 一、选择题

1. 以下数据结构中不属于线性数据结构的是______。 A、队列 B、线性表 C、二叉树 D、栈

2. 在结构化方法中,用数据流程图(DFD)作为描述工具的软件开发阶段是______。

A、可行性分析 B、需求分析 C、详细设计 D、程序编码 3. 结构化程序设计主要强调的是______。

A、程序的规模 B、程序的易读性 C、程序的执行效率 D、程序的可移植性 4. 在软件生命周期中,能准确地确定软件系统必须做什么和必须具备哪些功能的阶段是______。

A、概要设计 B、详细设计 C、可行性分析 D、需求分析

5. 下列关于栈的叙述中正确的是______。A、在栈中只能插入数据 B、在栈中只能删除数据

C、栈是先进先出的线性表 D、栈是先进后出的线性表 6. 下面不属于软件设计原则的是______。A、抽象 B、模块化 C、自底向上 D、信息隐蔽

7. 对长度为N的线性表进行顺序查找,在最坏情况下所需要的比较次数为______。

A、N+1 B、N C、(N+1)/2 D、N/2

8. 视图设计一般有3种设计次序,下列不属于视图设计的是______。 A、自顶向下 B、由外向内 C、由内向外 D、自底向上

9. 下列有关数据库的描述,正确的是______。A、数据库是一个DBF文件 B、数据库是一个关系

C、数据库是一个结构化的数据集合 D、数据库是一组文件 10. 下列说法中,不属于数据模型所描述的内容的是______。 A、数据结构 B、数据操作 C、数据查询 D、数据约束

11. 在下面的Visual FoxPro表达式中,运算结果是逻辑真的是______。

A、EMPTY(.NULL.) B、LIKE('acd','ac?') C、AT('a','123abc') D、EMPTY(SPACE(2))

12. 表达式VAL(SUBS(\奔腾586\的结果是______。

A、13.00 B、14.00 C、45.00 D、65.00

13. 以下关于自由表的叙述,正确的是______。

A、全部是用以前版本的FOXPRO(FOXBASE)建立的表

B、可以用Visual FoxPro建立,但是不能把它添加到数据库中

C、自由表可以添加到数据库中,数据库表也可以从数据库中移出成为自由表 D、自由表可以添加到数据库中,但数据库表不可从数据库中移出成为自由表 14. 下面关于数据环境和数据环境中两个表之间的关系的陈述中,______是正确的。 A、数据环境是对象,关系不是对象 B、数据环境不是对象,关系是对象

C、数据环境是对象,关系是数据环境中的对象 D、数据环境和关系均不是对象 15. 在\报表设计器\中,可以使用的控件是______。 A、标签、域控件和线条 B、标签、域控件和列表框 C、标签、文本框和列表框 D、布局和数据源

16.用二维表数据来表示实体及实体之间联系的数据模型称为______。 A、实体--联系模型 B、层次模型 C、网状模型 D、关系模型 17. 用来指明复选框的当前选中状态的属性是______。A、Selected B、Caption C、Value D、ControlSource

18. 使用菜单操作方法打开一个在当前目录下已经存在的查询文件zgjk.qpr后,在命令窗口生成的命令是____。

A、OPEN QUERY zgjk.qpr B、MODIFY QUERY zgjk.qpr C、DO QUERY zgjk.qpr D、CREATE QUERY zgjk.qpr 19. 可以伴随着表的打开而自动打开的索引是______。

A、单一索引文件(IDX) B、复合索引文件(CDX)C、结构化复合索引文件 D、非结构化复合索引文件

20. 在数据库设计器中,建立两个表之间的一对多联系是通过以下索引实现的______。

A、\一方\表的主索引或候选索引,\多方\表的普通索引 B、\一方\表的主索引,\多方\表的普通索引或候选索引 C、\一方\表的普通索引,\多方\表的主索引或候选索引 D、\一方\表的普通索引,\多方\表的候选索引或普通索引 21. 下列函数中函数值为字符型的是______。 A、DATE() B、TIME() C、YEAR() D、DATETIME()

22. 下面对控件的描述正确的是______。

A、用户可以在组合框中进行多重选择 B、用户可以在列表框中进行多重选择 C、用户可以在一个选项组中选中多个选项按钮 D、用户对一个表单内的一组复选框只能选中其中一个

23. 确定列表框内的某个条目是否被选定应使用的属性是______。 A、Value B、ColumnCount C、ListCount D、Selected

24. 设有关系R1和R2,经过关系运算得到结果S,则S是______。 A、一个关系 B、一个表单 C、一个数据库 D、一个数组

25. DBAS指的是______。A、数据库管理系统B、数据库系统C、数据库应用系统 D、数据库服务系统

26. 设X=\,Y=\,则下列表达式中值为.T.的是______。A、X=Y B、X==Y C、X$Y D、AT(X,Y)=0

27. 在表结构中,逻辑型、日期型、备注型字段的宽度分别固定为______。 A、3,8,10 B、1,6,4 C、1,8,任意 D、1,8,4 28. 在标准SQL中,建立视图的命令是______。

A、CREATE SCHEMA命令 B、CREATE TABLE命令 C、CREATE VIEW命令 D、CREATE INDEX命令

29. 有关SCAN循环结构,叙述正确的是______。 A、SCAN循环结构中的LOOP语句,可将程序流程直接指向循环开始语句SCAN,首先判断EOF()函数的真假

B、在使用SCAN循环结构时,必须打开某一个数据库 C、SCAN循环结构的循环体中必须写有SKIP语句

D、SCAN循环结构,如果省略了子句\\FOR和WHILE条件子句,则直接退出循环

30. 设有图书管理数据库:

图书(总编号C(6),分类号C(8),书名C(16),作者C(6),出版单位C(20),单价N(6,2))

读者(借书证号C(4),单位C(8),姓名C(6),性别C(2),职称C(6),地址C(20)) 借阅(借书证号C(4),总编号C(6),借书日期D(8))

对于图书管理数据库,要查询所藏图书中,各个出版社的图书最高单价、平均单价和册数,下面SQL语句正确的是______。

SELECT 出版单位,______,______,______; FROM 图书管理!图书 ______ 出版单位

A、MIN(单价) AVGAGE(单价) COUNT(*) GROUP BY B、MAX(单价) AVG(单价) COUNT(*) ORDER BY

C、MAX(单价) AVG(单价) SUM(*) ORDER BY D、MAX(单价) AVG(单价) COUNT(*) GROUP BY

31. 设有图书管理数据库:

图书(总编号C(6),分类号C(8),书名C(16),作者C(6),出版单位C(20),单价N(6,2))

读者(借书证号C(4),单位C(8),姓名C(6),性别C(2),职称C(6),地址C(20)) 借阅(借书证号C(4),总编号C(6),借书日期D(8))

对于图书管理数据库,求CIE单位借阅图书的读者的人数。 下面SQL语句正确的是______。

SELECT ______ FROM 借阅 WHERE; 借书证号 _______

A、COUNT (DISTINCT 借书证号)

IN (SELECT 借书证号 FROM 读者 WHERE 单位=\ B、COUNT (DISTINCT 借书证号)

IN (SELECT 借书证号 FROM 借阅 WHERE 单位=\ C、SUM (DISTINCT 借书证号)

IN (SELECT 借书证号 FROM 读者 WHERE 单位=\ D、SUM (DISTINCT 借书证号)

IN (SELECT 借书证号 FOR 借阅 WHERE 单位=\

32. 查询订购单号(字符型,长度为4)尾字符是\的错误命令是______。 A、SELECT * FROM 订单 WHERE SUBSTR(订购单号,4)=\ B、SELECT * FROM 订单 WHERE SUBSTR(订购单号,4,1)=\ C、SELECT * FROM 订单 WHERE \订购单号

D、SELECT * FROM 订单 WHERE RIGHT(订购单号,1)=\

33. 在关系模型中,为了实现\关系中不允许出现相同元组\的约束应使用______。

A、临时关键字 B、主关键字 C、外部关键字 D、索引关键字

34. 根据\职工\项目文件生成emp_sys.exe应用程序的命令是______。

A、BUILD EXE emp_sys FROM 职工 B、BUILD APP emp_sys.exe FROM 职工

C、LIKE EXE emp_sys FROM 职工 D、LIKE APP emp_sys.exe FROM 职工

35. 当前盘当前目录下有数据库:学院.dbc,其中有\教师\表和\学院\表。 \教师\表: \学院\表: 有SQL语句:

SELECT DISTINCT 系号 FROM 教师 WHERE 工资>=; ALL (SELECT 工资 FROM 教师 WHERE 系号=\ 与如上语句等价的SQL语句是______。

A、SELECT DISTINCT 系号 FROM 教师 WHERE工资>=; (SELECT MAX(工资) FROM 教师 WHERE 系号=\

B、SELECT DISTINCT 系号 FROM 教师 WHERE 工资>=; (SELECT MIN(工资) FROM 教师 WHERE 系号=\

C、SELECT DISTINCT 系号 FROM 教师 WHERE 工资>=; ANY(SELECT 工资 FROM 教师 WHERE 系号=\

D、SELECT DISTINCT 系号 FROM 教师 WHERE 工资>=; SOME (SELECT 工资 FROM 教师 WHERE 系号=\ 二、填空题

36. 若按功能划分,软件测试的方法通常分为白盒测试方法和______测试方法。 37. 数据库系统的三级模式分别为______模式、内部级模式与外部级模式。 38. 在最坏情况下,冒泡排序的时间复杂度为______。

39. 在面向对象方法中,信息隐蔽是通过对象的______性来实现的。

40. 关系模型的数据操纵即是建立在关系上的数据操纵,一般有______、增加、删除和修改四种操作。

41.要把帮助文件设置为复制到硬盘上的Foxhelp.chm文件,需要在\选项\对话框的______选项卡上设置。

42. TIME( )的返回值的数据类型是______类型。

43. 在定义字段有效性规则中,在规则框中输入的表达式中类型是________。 44. 设计报表通常包括两部分内容:______和布局。

45. ______是指只有满足联接条件的记录才包含在查询结果中。 46. 设有图书管理数据库:

图书(总编号C(6),分类号C(8),书名C(16),作者C(6),出版单位C(20),单价N(6,2))

读者(借书证号C(4),单位C(8),姓名C(6),性别C(2),职称C(6),地址C(20)) 借阅(借书证号C(4),总编号C(6),借书日期D(8))

检索书价在15元至25元(含15元和25元)之间的图书的书名、作者、书价和分类号,结果按分类号升序排序。

SELECT 书名,作者,单价,分类号 FROM 图书; WHERE______; ORDER BY______;

47. 设有如下关系表R、S和T:

R(BH,XM,XB,DWH) S(SWH,DWM)

T(BH,XM,XB,DWH)

实现R∪T的SQL语句是_______。 48. 设有如下关系表R:

R(NO,NAME,SEX,AGE,CLASS) 主关键字是NO

其中NO为学号,NAME为姓名,SEX为性别,AGE为年龄,CLASS为班号。写出实现下列功能的SQL语句。

插入\班学号为30,姓名为\郑和\的学生记录;_______。 49. 设有如下关系表R:

R(NO,NAME,SEX,AGE,CLASS) 主关键字是NO

其中NO为学号(数值型),NAME为姓名,SEX为性别,AGE为年龄,CLASS为班号。写出实现下列功能的SQL语句。 删除学号为20的学生记录;______。 第二套题答案

1-5 CBBDD 6-10 CBBCC 11-15 DDCCA 16-20 DCBCA 21-25 BBDAC 26-30 CDCBD 31-35 ACBBA

36.黑盒 37.概念或概念级 38.n(n-1)/2 39.封装 40.查询 41.文件位置 42.字符 或 C 43.逻辑表达式 44.数据源 45.内部联接

46. 单价 BETWEEN 15 AND 25 或 单价 BETW 15 AND 25 或 单价 BETWE 15 AND 25 或 单价>=15 and 单价<=25 或 单价>=15 and 单价=<25 或 单价=>15 and 单价<=25 或 单价=>15 and 单价=<25 与 分类号 ASC 或 分类号

47. SELECT * FROM R UNION SELECT * FROM T 或 SELE * FROM R UNIO SELE * FROM T 或 SELECT * FROM R UNIO SELECT * FROM T 或 SELE * FROM R UNION SELE * FROM T

48. INSERT INTO R(NO,NAME,CLASS) VALUES(30,\郑和\或 INSE INTO R(NO,NAME,CLASS) VALUES(30,\郑和\

49. DELETE FROM R WHERE NO=20 或 DELE FROM R WHERE NO=20 或 DELE FROM R WHER NO=20 或 DELETE FROM R WHER NO=20

12:存在表T(a,b,c,d),要根据字段c排序后取第21—30条记录显示,请给出sql create table t(a number(,b number(,c number(,d number(); /

begin

for i in 1 .. 300 loop

insert into t values(mod(i,2),i/2,dbms_random.value(1,300),i/4); end loop; end; /

select * from (select c.*,rownum as rn from (select * from t order by c desc) c) where rn between 21 and 30; /

select * from (select * from test order by c desc) x where rownum < 30 minus

select * from (select * from test order by c desc) y where rownum < 20 order by 3 desc

SQL Server 2005 笔试题

How can I list all California authors regardless of whether they have written a book?

In database pubs, have a table authors and titleauthor , table authors has a column state, and titleauhtor have books each author written. CA behalf of california in table authors. */

参考答案:

select a.au_fname ,a.au_lname, b.title_id from authors a

left outer join titleauthor as b on a.au_id = b.au_id where a.state = 'CA'

/**//* Question 7

How can I get a list of the stores that have bought both 'bussiness' and 'mod_cook' type books?

In database pubs, use three table stores,sales and titles to implement this requestment.

Now I want to get the result as below:

stor_id stor_name

------- ---------------------------------------- ... 7896 Fricative Bookshop......... */

-- score : 0

select st.stor_id,st.stor_name from dbo.stores st

join dbo.sales sl on st.stor_id = sl.stor_id

join dbo.titles tl on sl.title_id = tl.title_id and (tl.type = 'business' and tl.type = 'trad_cook')

-- score : 0

select distinct a.stor_id , a.stor_name from stores a

inner join sales b on(a.stor_id = b.stor_id)

inner join titles c on(b.title_id = c.title_id and c.type = 'bussiness' or c.type = 'mod_cook')

select sal.stor_id, stor_name from sales sal

join stores sto on sal.stor_id = sto.stor_id join titles til on sal.title_id = til.title_id where til.[type] = 'bussiness' or til.[type] ='mod_cook' select distinct stores.stor_id,stor_name from stores inner join sales on stores.stor_id = sales.stor_id inner join titles on sales.title_id = titles.title_id where type in ('business','mod_cook') -- another one , score: 0 begin tran Question7 select stor_id, stor_name from stores where stor_id in ( select stor_id from sales where title_id in ( select title_id from titles where type = 'business' or type = 'mod_cook' )) commit tran Question7 -- score: 6 with Stor_TilteType(stor_id,stor_name,title_type) as (select st.stor_id,st.stor_name,ti.type from stores st join sales sa on st.stor_id=sa.stor_id join titles ti on sa.title_id=ti.title_id ) select distinct stor_id,stor_name from Stor_TilteType where title_type='business' and stor_id in(select stor_id from Stor_TilteType where title_type='mod_cook'

) -- score: 8 select distinct stores.stor_id, stor_name from stores inner join sales on stores.stor_id = sales.stor_id inner join titles on sales.title_id = titles.title_id and titles.type = 'business' intersect select distinct stores.stor_id, stor_name from stores inner join sales on stores.stor_id = sales.stor_id inner join titles on sales.title_id = titles.title_id and titles.type = 'mod_cook' -- score: 10 select distinct st.stor_id,st.stor_name from stores st inner join sales ss1 on ss1.stor_id = st.stor_id inner join titles tit1 on ss1.title_id = tit1.title_id where tit1.[type] ='business' and exists ( select * from sales ss2 inner join titles tit2 on ss2.title_id = tit2.title_id where st.stor_id = ss2.stor_id and tit2.[type] ='mod_cook') -- 参考答案 select s.stor_id, st.stor_name from sales s join titles t on s.title_id = t.title_id and t.type in ('mod_cook', 'business') join stores st on s.stor_id = st.stor_id group by s.stor_id, st.stor_name having count(distinct t.type) = 2 select stor_id, stor_name from stores where exists ( select * from sales join titles on sales.title_id = titles.title_id where titles.[type] = 'business' and stores.stor_id = sales.stor_id) and exists ( select * from sales join titles on sales.title_id = titles.title_id where titles.[type] = 'mod_cook' and stores.stor_id = sales.stor_id) /**//* Question 8 How can I list non-contignous data?

In database pubs, I create a table test using statement as below, and I insert several row as below

create table test

( id int primary key ) go

insert into test values (1 ) insert into test values (2 ) insert into test values (3 ) insert into test values (4 ) insert into test values (5 ) insert into test values (6 ) insert into test values (8 ) insert into test values (9 ) insert into test values (11) insert into test values (12) insert into test values (13) insert into test values (14) insert into test values (18) insert into test values (19) go

Now I want to list the result of the non-contignous row as below,how can I do it?

Missing after Missing before ------------- -------------- 6 8 9 11... */

---- 参考答案

select max(a.id) as \min(b.id) as \from test a ,test b where a.id

having min(b.id)-max(a.id)>1

How can I list all book with prices greather than the average price of books of the same type?

In database pubs, have a table named titles , its column named price mean the price of the book,

and another named type mean the type of books. Now I want to get the result as below:

type title price

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

business The Busy Executive's Database Guide

19.9900............/--(1) Select type,price,title from titles Where Price > (select avg(price) from titles) 这样取得的是所有书的平均价格,而不是某一类书的平均价格。 --(2) with avgprice(type,price) as ( select type,avg(price) as price from titles t2 group by type) select distinct titles.type,titles.title,titles.price from titles inner join avgprice on (titles.type = avgprice.type and titles.price> avgprice.price) 使用CTE也可以实现,但如果取出的数据量很大会影响性能。为什么要用distinct呢? --(3) select a.type, a.title, a.price from titles a where a.price > ( select avg (isnull (price, 0)) -- 有价格为null的情况,算平均值时应该算上价格为null的书本 from titles b where a.type = b.type) 因为没有具体提及统计的需求,但这样严谨的作风非常值得大家学习。 参考答案: select t.type, t.title, t.price from titles t where t.price > (select avg(price) from titles tt where tt.type = t.type) 题目内容如下 * 一表TB Id 字段为编号,递增不一定连续. M 字段为区段路费,比如从家到哈尔滨是60元,从哈尔滨到长春是70元,数值类型. S 字段站点名称. 现有500元钱,从家先经哈尔滨出发,能走多远? (例:60+70+80+50+90+75=425 60+70+80+50+90+75+80=505 所以答案应该是6武汉) Id M S 1 60 哈尔滨 2 70 长春 3 80 沈阳 4 50 北京 5 90 郑州 6 75 武汉 7 80 长沙 8 90 广东 要求,请用一句SQL语句实现 */

--创建表

Create Table TB (

Id Int Identity(1, 1) Not Null, M Int,

S varchar(50) )

--测试数据

Insert Into TB Values(60, '哈尔滨') Insert Into TB Values(70,'长春') Insert Into TB Values(80,'沈阳') Insert Into TB Values(50,'北京') Insert Into TB Values(90,'郑州') Insert Into TB Values(75,'武汉') Insert Into TB Values(80,'长沙') Insert Into TB Values(90,'广东')

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

实现方法两种 1.

SELECT TOP 1 B.id, b.s, sum(A.m) s_sum FROM TB A, TB B

WHERE A.ID <= B.ID GROUP BY b.id, b.s

HAVING sum(a.m) <= 500 ORDER BY b.id DESC 2.

SELECT TOP 1 ID, S, M_SUM FROM (SELECT *,

(SELECT SUM(M) FROM TB

WHERE ID >= 1

AND ID <= A.ID) AS M_SUM FROM TB A) B WHERE M_SUM <= 500 ORDER BY ID DESC

SQL面试题 (二)

有一张工资表,包含三列:员工编号(ID),部门编号(GROUPS),工资(SALARY) 1. .找到每个部门工资最高的人(包括并列第一) 2. 找到每个部门工资最高的人(只选一个) SQL语句如下:

DECLARE @G TABLE(ID INT,GROUPS NVARCHAR(20),SALARY MONEY)

INSERT INTO @G SELECT 1,1,1000

UNION ALL SELECT 2,1,1000 UNION ALL SELECT 3,1,800 UNION ALL SELECT 4,2,2000 -- 1

SELECT * FROM @G G

WHERE NOT EXISTS(SELECT 1 FROM @G WHERE GROUPS=G.GROUPS AND SALARY>G.SALARY)

SELECT G.* FROM @G G INNER JOIN (

SELECT GROUPS,MAX(SALARY) AS SALARY FROM @G

GROUP BY GROUPS )T

ON G.GROUPS=T.GROUPS AND G.SALARY=T.SALARY

select * from 工资表 as a where a.工资=(select max(b.工资) from 工资表 as b where a.部门编号=b.部门编号) -- 2

SELECT MIN(G.ID),G.GROUPS,G.SALARY FROM @G G INNER JOIN (

SELECT GROUPS,MAX(SALARY) AS SALARY FROM @G

GROUP BY GROUPS )T

ON G.GROUPS=T.GROUPS AND G.SALARY=T.SALARY GROUP BY G.GROUPS,G.SALARY

select * from 工资表 as a where a.工资=(select max(b.工资) from 工资表 as b where a.部门编号=b.部门编号) and

a.员工编号=(select max(c.员工编号) from 工资表 as c where a.部门编号=c.部门编号)

select min(员工编号)as 员工编号,部门编号,工资 from 工资表 as a where a.工资=(select max(b.工资) from 工资表 as b where a.部门编号=b.部门编号)group by 部门编号,工资

一定有更好的方法,请不吝赐教。

SQL面试题 (一)

有一个张员工工资表(SALARY),表有三列:员工编号(ID),工资(SALARY) 1.查询id重复记录

select * from 工资表 as a where ((select count(*) from 工资表 as b where a.员工编号=b.员工编号)>1)

SELECT * FROM 工资表

WHERE 员工编号 IN (

SELECT 员工编号 FROM 工资表

GROUP BY 员工编号 HAVING COUNT(*)>1 )

2.删除id重复记录,只保留第一条(说明,不需要考虑表中存在完全相同纪录的情况) SQL语句如下:

CREATE TABLE SALARY( ID INT NOT NULL,

SALARY MONEY NOT NULL )

INSERT INTO SALARY SELECT 1,1000

UNION ALL SELECT 1,800 UNION ALL SELECT 2,1200 UNION ALL SELECT 3,1100 UNION ALL SELECT 3,1200 UNION ALL SELECT 3,1300 SELECT * FROM SALARY -- 1

SELECT *

FROM SALARY WHERE ID IN (

SELECT ID FROM SALARY GROUP BY ID

HAVING COUNT(*)>1 ) -- 2

DELETE T

FROM SALARY T

WHERE EXISTS(SELECT 1 FROM SALARY WHERE T.ID=ID AND SALARY>T.SALARY)

四、设计题(本大题共2小题,每小题10分,共20分)

2、学生表:Student 学生表 (学号,姓名,性别,年龄,组织部门) Course 课程表 (编号,课程名称)

Sc 选课表 (学号,课程编号,成绩)

表结构如下:

(1).写一个SQL语句,查询选修了’计算机原理’的学生学号和姓名 (2).写一个SQL语句,查询’周星驰’同学选修了的课程名字 (3).写一个SQL语句,查询选修了5门课程的学生学号和姓名 select sno,sname from student where sno in (

select sno from sc

where cno = (

select cno from course

where cname='计算机原理' ) ) (2)

select cname from course where cno in (

select cno from sc

where sno = (

select sno from student

where sname='周星驰' )

) (3)

select sno,sname From student Where sno in (

select sno from sc

group by sno having count(sno)=5 )

(1)一道凊华同方的SQL面试题 已知一个表的结构为: 姓名 科目 成绩 张三 语文 20 张三 数学 30 张三 英语 50 李四 语文 70

李四 数学 60 李四 英语 90

怎样通过select语句把他变成以下结构: 姓名 语文 数学 英语 张三 20 30 50 李四 70 60 90

在Mysql上测试通过: use test;

drop table if exists studentscore;

create table studentscore (id int auto_increment primary key,姓名 varchar (20),科目 varchar (20),成绩 varchar (20) ) default charset=utf8;

INSERT INTO studentscore (id, 姓名, 科目, 成绩) VALUES

(1, \张三\语文\INSERT INTO studentscore (id, 姓名, 科目, 成绩) VALUES

(2, \张三\数学\INSERT INTO studentscore (id, 姓名, 科目, 成绩) VALUES

(3, \张三\英语\INSERT INTO studentscore (id, 姓名, 科目, 成绩) VALUES

(4, \李四\语文\INSERT INTO studentscore (id, 姓名, 科目, 成绩) VALUES

(5, \李四\数学\INSERT INTO studentscore (id, 姓名, 科目, 成绩) VALUES

(6, \李四\英语\

create view teststudent as

select A.姓名,A.成绩 as 语文,B.成绩 as 数学,C.成绩 as 英语 from studentscore A,studentscore B,studentscore C where A.姓名=B.姓名 and B.姓名=C.姓名 and A.科目='语文' and B.科目='数学' and C.科目='英语'; (2)

金蝶的一道SQL笔试题,上个周六的时候去金蝶面试,出了这样一道SQL题,共享之

给下面这样的一个表记录:

------------------------------------ 购物人 商品名称 数量 A 甲 2 B 乙 4 C 丙 1 A 丁 2 B 丙 5

给出所有购入商品为两种或两种以上的购物人记录

use test;

drop table if exists product;

create table product ( id int auto_increment primary key, 购物人 varchar (20), 商品名称 varchar (20), 数量 varchar (20) );

insert into product (id, 购物人, 商品名称, 数量) values (1,' A','甲','2'); insert into product (id, 购物人, 商品名称, 数量) values (2,' B','乙','4'); insert into product (id, 购物人, 商品名称, 数量) values (3,' C','丙','1'); insert into product (id, 购物人, 商品名称, 数量) values (4,' A','丁','2'); insert into product (id, 购物人, 商品名称, 数量) values (5,' B','丙','5');

select * from product group by 购物人 having count(商品名称)>=2;错误,因为结果是这样的:

A 甲 2 B 乙 4

select * from product where 购物人 in (select 购物人 from product group by 购物人 having count(商品名称)>=2) 正确 A 甲 2 B 乙 4 A 丁 2 B 丙 5

sql 语言实现查找成绩排名10到20的学生 sql语句实现:

查询成绩表中10名至20名的学生

方法

select top 11 * from score where sno not in (select top 9 sno from score order by sc desc)order by sc desc

补充说明:score, sc, sno 分别为成绩表,成绩和学号。

这道冥思苦想了N久的题目原来只用一个top就搞定了,真是狂汗,看来还要看书。

用一句SQL取出第 m 条到第 n 条记录的方法

从Table 表中取出第 m 条到第 n 条的记录:(Not In 版本)

SELECT TOP n-m+1 * FROM Table

WHERE (id NOT IN (SELECT TOP m-1 id FROM Table ))

--从TABLE表中取出第m到n条记录 (Exists版本)

SELECT TOP n-m+1 * FROM TABLE AS a WHERE Not Exists

(Select * From (Select Top m-1 * From TABLE order by id) b Where b.id=a.id )

Order by id

--m为上标,n为下标,例如取出第8到12条记录,m=8,n=12,Table为表名

Select Top n-m+1 * From Table Where Id>(Select Max(Id) From

(Select Top m-1 Id From Table Order By Id Asc) Temp) Order By Id Asc

直接取得数据库中的分页记录 前提是表中必须有主键

取得第M条记录之后的N条记录: SELECT TOP N * FROM [TABLE]

WHERE (ID NOT IN (SELECT TOP M id FROM [TABLE]

ORDER BY [ORDER])) ORDER BY [ORDER]

Oracle中的实现,取得第M到N条记录: SELECT * FROM (

SELECT * , ROWNUM AS CON FROM (

SELECT * FROM [TABLE] ORDER BY [ORDER] )

WHERE ROWNUM <= N )

WHERE CON >= M;

查询表中连续的某几条记录

不要传任何列的条件参数,查询表中连续的某几条记录 如:表A,id列为主键 id name sex age

------------------------- 1 luoyi male 21 2 yaya female 20 3 lili female 22 4 wuyong male 25 .......................

这个表的记录还有很多,如果我想取第二、第三条记录,不为别的,我就想要这两条,这不仅在编程中会用到,而且在一些公司面试时也有类似考题(呵呵,我没有遇到过),在oracle和mssqlserver中SQL代码分别为:

二、ms sql server

在server中没有minus,只能用类似于oracle的第二种方法

select * from (select top 3 * from A) as b where b.id not in(select top 1 id from A)

三、绘制出来的结果为: id name sex age

-------------------------------- 2 yaya female 20 3 lili female 22

特点:一次查询,数据库只返回一页的数据。而不是取出所有的数据。 说明:

pagesize: 每页显示记录数 cureentpage:当前页数

select * from ( select TOP pagesize * FROM ( SELECT TOP

pagesize*cureentpage * from user_table ORDER BY id ASC ) as aSysTable ORDER BY id DESC ) as bSysTable ORDER BY id ASC

例子说明:

假如数据库表如下:

user_table:

id:主键,自增 username:字符 password:字符

假设有80条记录,每页显示10条记录,id 从1到80

现在按照id升序排列取出第三页的数据应该为:所取得记录的id 应该为 21到30。

这时该语句应该为:

select * from ( select TOP 10 * FROM ( SELECT TOP 30 * from user_table ORDER BY id ASC ) as aSysTable ORDER BY id DESC ) as bSysTable ORDER BY id ASC

原理如下:

先按照id从小到大升序取出30条记录(3*10),也就是:id 在 1-30 之间的记录 (SELECT TOP 30 * from user_table ORDER BY id ASC)

然后按照ID降序排列这30条记录,得到记录为id 在:从30到 1

然后在这些30条记录中取出前10条记录:取得的记录为:id 在30-21之间。这就是我们需要的数据,但这时是按照降序排列的,不符合要求。

最后在重新排序得到最终我们需要的数据。id在21-30之间。 随机取出若干条记录的SQL语句 随机取出若干条记录的SQL语句

Sql server:

select top 20 * from 表 order by newid()

高效SQL——合并多个字段值或多条记录

高效SQL——从无主键表中合并字段值 create table #T1 (

A varchar(10), B varchar(20) )

insert into #T1 values ('aa','1')

insert into #T1 values ('aa','9a') insert into #T1 values ('bb','1') insert into #T1 values ('bb','10') insert into #T1 values ('bb','16') insert into #T1 values ('aa','16') insert into #T1 values ('aa','17') insert into #T1 values ('aa','30') insert into #T1 values ('bb','6df') insert into #T1 values ('aa','5') insert into #T1 values ('aa','8') insert into #T1 values ('aa','ed')

所要的结果:

aa 1,9a,16,17,30,5,8,ed bb 1,10,16,6df

解决方法: 程序代码

declare @c varchar(1024) set @c=''

declare @x char(10),@y char(10)

set @x='' set @y=''

select @y=@x,@x=x.a,@c=@c + (case @x when @y then ',' else ';' + x.a + ':' end)

+x.d from (select b as d,a from #t1) as x order by x.a

set @c=substring(@c,2,len(@c)-1) select @c

为什么说是高效呢?

因为摒弃了游标和函数的途径,而采用变量的方式来保存值 也就是说避免了游标和函数自身的缺点 如果是简单地把字段值合并的sql语句: 程序代码

select c1||c2||c3 as name from table

中间可以添加字符常量和数字,如

select c1||'test'||c2||c3 as name from table

select c1||2||c2||c3 as name from table

如何用一条SQL语句,将多条记录(一个字段)合并为一个? 例如:

table字段为:tableID(nchar)

查询结果为不确定的多条:

tableID T1 T2 T3 T4 …… 如题:

A、B两个表拥有一样的表结构,都以id为主键,如何将A表中存在而B表中不存在的记录插入到B表中。

表结构如下:

create table A(

id int primary key, name varchar(20), password varchar(20)

A表记录:

ID NAME PASSWORD ------------------ 1 2 3 4 5

B表记录:

ID NAME PASSWORD ------------------ Tom 1234 Mary 1234 Lucy 1234 Billy 1234 Henry 1234

1 Tom 1234 2 Mary 1234 3 Lucy 1234

SQL语句一(通过not in实现):

insert into B select * from A where id not in(select id from B) Sql语句二(通过not exists实现):

insert into B select * from A a not exists(select * from B b where a.id=b.id) 若两表的记录不同,如下: A表记录:

ID NAME PASSWORD ------------------ 1 2 3 4 5

Tom 1234 Mary 1234 Lucy 1234 Billy 2548 Henry 1234

B表记录:

ID NAME PASSWORD ------------------ 1 2 3 4 5

Jojoy 1234 Mary 1234 Lucy 1234 Billy 1234 Henry 1234

找出两表中的不同记录,以下两条SQL语句都能实现。

select * from b where name not in(select name from a) or password not in(select password from a)

select * from b where not exists(select * from a where a.name=b.name and a.password=b.password)

select * from b where not exists(select * from a where a.name=b.name and a.password=b.password)

SQLServer不同行列相减实例解析

昨天技术主管面试新人时出了道数据库编程题,自己也是新人,所以顺便拿过来研究一下,题目如下:

数据库表TEST,表结构及数据如下: CREATE TABLE TEST(

ID char(10)PRIMARY KEY, NAME char(10), AMOUNT numeric(9) )

ID NAME AMOUNT ----------------------------- 101 dr 100 102 cr 200 101 cr 50 102 dr 150 101 dr 300 103 dr 300 103 cr 300 104 cr 345 104 dr 355 104 dr 225 105 dr 225 105 cr 500

用一条SQL语句得出以下查询结果(要求SQL的查询性能和效率为最高): ID AMOUNT -------------------- 101 350 102 -50 103 0 104 235 105 -275

要得出以上结果,先得分析一下,可以看出是将ID相同并且NAME为dr的AMOUNT减去NAME为cr的AMOUNT得出。

在不考虑效率的情况下,可使用以下SQL语句:

select id,amount=(select sum(amount) from test where name='dr' and id=t.id)

-(select sum(amount) from test where name='cr'and id=t.id)

from test t group by id

但这条语句还是有问题,例如:当去掉 ID NAME AMOUNT ---------------------------- 105 cr 500

这条记录后,查询结果如下: ID AMOUNT -------------------- 101 350 102 -50 103 0 104 235 105 NULL

出现了一条空值,因为ID='105'的记录只有一条,没有与之相匹配的记录。 再看下面的语句:

select id, sum((case name WHEN 'dr' THEN 1 ELSE -1 END)*amount) as amount

from test group by id

select id, sum(case name WHEN 'dr' THEN amount ELSE -amount END) as amount

from test group by id

这两条语句的效率和查询结果等同,也是我们所要的SQL语句。其实要获得高效率的SQL语句,解题的思路很重要,这里运用SQLServer的CASE函数实现将AMOUNT字段的值根据NAME的不同赋不同的值(加个负号),再用sum函数实现数据的相减。

让我们再看一个复杂点的不同行列相减实例

表t_a中数据:

zh zhlb xh fkcode jdflag je

--------- -------- ------- -------- ------ ---------- 1002 F 1 RMB 1 400.0000 1002 F 2 ## 0 200.0000 1003 F 1 RMB 1 200.0000 1003 F 2 MD 1 200.0000 1003 F 3 MD 1 200.0000 1003 F 4 ## 0 200.0000 1003 F 5 ## 0 200.0000 1003 F 6 ## 0 120.0000 1004 F 1 RMB 1 250.0000 1004 F 2 AC 1 250.0000 1004 F 3 MD 1 200.0000 1004 F 4 ## 0 100.0000 1004 F 5 ## 0 50.0000

根据要求得出如下数据:

zh zhlb fkcode je ------- ---- ---------- --------- 1002 F RMB 200.0000 1003 F RMB 80.0000 1004 F AC 250.0000 1004 F MD 50.0000 1004 F RMB 250.0000

要求:

1. zh,zhlb相同的数据中,把jdflag为1的数据的je减jdflag为0的je

2. fkcode中MD的先减,RMB的后减

表t_a:

if exists( SELECT * FROM sysobjects WHERE xtype = 'u' and name = 't_a' ) drop table t_a

create table t_a (zh decimal,zhlb char(1),xh integer,fkcode char(10), jdflag char(1), je money default 0) insert t_a

select 1002 ,'F',1,'RMB','1',400.0000 union all select 1002 ,'F',2,'##','0', 200.0000 union all select 1003 ,'F',1,'RMB','1',200.0000 union all select 1003 ,'F',2,'MD','1', 200.0000 union all select 1003 ,'F',3,'MD','1', 200.0000 union all select 1003 ,'F',4,'##','0', 200.0000 union all select 1003 ,'F',5,'##','0', 200.0000 union all select 1003 ,'F',6,'##','0', 120.0000 union all select 1004 ,'F',1,'RMB','1',250.0000 union all select 1004 ,'F',2,'AC','1', 250.0000 union all select 1004 ,'F',3,'MD','1', 200.0000 union all select 1004 ,'F',4,'##','0', 100.0000 union all select 1004 ,'F',5,'##','0', 50.0000

这里字段较多,要求也复杂些,下面有两种解法: 解一:

if exists(select 1 from sysobjects where id=object_id(N'v_a') and xtype='V') drop view v_a go

create view v_a as

select zh,zhlb,fkcode,newcode=case fkcode when 'MD' then 1 when 'AC' then 2 when 'RMB' then 3 else 0 end,je=sum(case jdflag when 1 then je else -je end) from t_a

group by zh,zhlb,fkcode go

select t.* from (select a.zh, a.zhlb, a.fkcode,

je=case when (select sum(je) from v_a c where

c.newcode

where a.je>0 and fkcode<>'##' ) t

where je>0

order by t.zh,t.zhlb,t.fkcode

drop view v_a 解二:

select a.zh,a.zhlb,fkcode,jd1=isnull(a.je,0),jd0=isnull(b.je,0) into #1 from

(select zh,zhlb,fkcode,je=sum(je) from t_a where jdflag=1 group by zh,zhlb,fkcode)a left join

(select zh,zhlb,je=sum(je) from t_a where jdflag=0 group by zh,zhlb) b

on a.zh=b.zh and a.zhlb=b.zhlb

解法一利用视图,写法相对简单点,但是我的水平很次啊,要我写还真不一定能写出来,大家一起研究一下吧。 考题:现有两张表,以下为表结构

create table dep(

depid int identity primary key, --部门号 depname varchar(20) -- 部门名称 )

create table emp(

empid int identity primary key, --员工号 empname varchar(20), --员工姓名 salary money, --工资 depid int --部门号 ) 问题:

1、请用一条sql语句查询出各部门的平均工资。结果显示为如下形式:

部门号 平均工资 -------------------------- 1 2500.4521 2 2845.0121 这个比较简单,不过有几种方式。

正解1:

select depid 部门号, avg(salary) 平均工资 from emp

group by depid

正解2:

select t1.depid 部门号,avg(t2.salary) 平均工资 from dep t1

inner join emp t2 on t1.depid=t2.depid group by t1.depid

正解3:

select 部门号=depid,平均工资=avg(salary) from emp group by depid 2、请列出工资大于本部门平均工资的员工姓名和部门号以及统计此部门的人数。结果显示为如下形式:

EMPNAME DEPID 部门人数 --------------------------------- ZHANGSAN 1 15 LISI 2 10

这个有点难度,我试了半天都没解决。 正解1:

SELECT T1.empname,T1.depid,T2.部门人数 FROM dbo.emp T1 INNER JOIN

(select t1.depid, avg(t2.salary) AS salary, COUNT(empid) AS 部门人数 from dep t1

inner join dbo.emp t2 on t1.depid=t2.depid group by t1.depid) T2 ON T1.depid=T2.depid WHERE T1.salary>T2.salary

正解2:

select empname,emp.depid,s 部门人数 from emp Inner Join (select depid,avg(salary) a,count(1) s from emp group by depid) b on emp.depid=b.depid and salary>a 第二条sql语句相对简单些。。。。

Select empname,emp.depid,(select count(*) from emp as m where m.depid=emp.depid)as 部门人数 from emp where salary>(select avg(salary) from emp as s where emp.depid=s.depid)

sql server常用函数(面试必背!) 1,统计函数 avg, count, max, min, sum

多数聚会不统计值为null的行。可以与distinct一起使用去掉重复的行。可以与group by 来分组

2, 数学函数

SQRT

ceiling(n) 返回大于或者等于n的最小整数 floor(n), 返回小于或者是等于n的最大整数 round(m,n), 四舍五入,n是保留小数的位数 abs(n)

sign(n), 当n>0, 返回1,n=0,返回0,n<0, 返回-1 PI(), 3.1415....

rand(),rand(n), 返回0-1之间的一个随机数 3,字符串函数

ascii(), 将字符转换为ASCII码, ASCII('abc') = 97 char(), ASCII 码 转换为 字符 low(),upper()

str(a,b,c)转换数字为字符串。 a,是要转换的字符串。b是转换以后的长度,c是小数位数。str(123.456,8,2) = 123.46 ltrim(), rtrim() 去空格

left(n), right(n), substring(str, start,length) 截取字符串

charindex(子串,母串),查找是否包含。 返回第一次出现的位置,没有返回0 patindex('%pattern%', expression) 功能同上,可是使用通配符 replicate('char', rep_time), 重复字符串 reverse(char),颠倒字符串

replace(str, strold, strnew) 替换字符串 space(n), 产生n个空行

stuff(), SELECT STUFF('abcdef', 2, 3, 'ijklmn') ='aijklmnef', 2是开始位置,3是要从原来串中删除的字符长度,ijlmn是要插入的字符串。 3,类型转换函数:

cast, cast( expression as data_type), Example:

SELECT SUBSTRING(title, 1, 30) AS Title, ytd_sales FROM titles WHERE CAST(ytd_sales AS char(20)) LIKE '3%' convert(data_type, expression) 4,日期函数

day(), month(), year()

dateadd(datepart, number, date), datapart指定对那一部分加,number知道加多少,date指定在谁的基础上加。datepart的取值包括,year,quarter,

month,dayofyear,day,week,hour,minute,second,比如明天dateadd(day,1, getdate())

datediff(datepart,date1,date2). datapart和上面一样。整个函数结果是date2 - date1

datename(datepart, date) 取那一部分,返回字符串。 datepart(datepart, date) 取一部分,返回整数。 getdate()当前时间 5,系统函数

col_length('tablename','colname')

col_name, SELECT COL_NAME(OBJECT_ID('Employees'), 1) = EmployeeID datalength, example: datalenght('abc') =3, datalength(pub_name) --列名 db_id

在面试过程中多次碰到两道SQL查询的题目,一是查询A(ID,Name)表中第31至40条记录,ID作为主键可能是不是连续增长的列,大家写写看了 ! 答案:

select top 10 * from A where ID not in (select top 30 ID from A) 或者

select top 10 * from A where id > (select max(id) from (select top 30 id from A)as A)

面试必须要知道的SQL语法,语句

前言:书里有的、书里没的,统统在此可以一浏。

asc 按升序排列 desc 按降序排列

下列语句部分是Mssql语句,不可以在access中使用。

SQL分类:

DDL—数据定义语言(Create,Alter,Drop,DECLARE) DML—数据操纵语言(Select,Delete,Update,Insert)

DCL—数据控制语言(GRANT,REVOKE,COMMIT,ROLLBACK)

首先,简要介绍基础语句: 1、说明:创建数据库

Create DATABASE database-name 2、说明:删除数据库 drop database dbname 3、说明:备份sql server --- 创建 备份数据的 device

USE master

EXEC sp_addumpdevice 'disk', 'testBack', 'c:\\mssql7backup\\MyNwind_1.dat' --- 开始 备份

BACKUP DATABASE pubs TO testBack 4、说明:创建新表

create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..)

根据已有的表创建新表:

A:create table tab_new like tab_old (使用旧表创建新表)

B:create table tab_new as select col1,col2… from tab_old definition only 5、说明:删除新表drop table tabname 6、说明:增加一个列

Alter table tabname add column col type

注:列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。

7、说明:添加主键: Alter table tabname add primary key(col) 说明:删除主键: Alter table tabname drop primary key(col)

8、说明:创建索引:create [unique] index idxname on tabname(col….) 删除索引:drop index idxname

注:索引是不可更改的,想更改必须删除重新建。

9、说明:创建视图:create view viewname as select statement 删除视图:drop view viewname 10、说明:几个简单的基本的sql语句 选择:select * from table1 where 范围

插入:insert into table1(field1,field2) values(value1,value2) 删除:delete from table1 where 范围

更新:update table1 set field1=value1 where 范围

查找:select * from table1 where field1 like ’%value1%’ ---like的语法很精妙,查资料!

排序:select * from table1 order by field1,field2 [desc] 总数:select count as totalcount from table1

求和:select sum(field1) as sumvalue from table1 平均:select avg(field1) as avgvalue from table1 最大:select max(field1) as maxvalue from table1 最小:select min(field1) as minvalue from table1 11、说明:几个高级查询运算词 A: UNION 运算符

UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表。当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。两种情况下,派生表的每一行不是来自 TABLE1 就是来自 TABLE2。 B: EXCEPT 运算符

EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。当 ALL 随 EXCEPT 一起使用时 (EXCEPT ALL),不消除重复行。

C: INTERSECT 运算符

INTERSECT 运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有重复

本文来源:https://www.bwwdw.com/article/lh66.html

Top