admin管理员组

文章数量:1530518

2024年7月12日发(作者:)

28.

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

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 , sum( isnull([Order].Revenue,0) )

from customer full join [order] on( [order].customerid= )

group by

1 / 41

select ,sum(r) from order,customer where

=customerid group by

select , sum(r ) from customer full join order

on( erid= ) group by

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 问上课程 "db"的学生no

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

select count(*) from sc where cno=(select cno from c where

='db')

2 成绩最高的学生号

select sno from sc where grade=(select max(grade) from sc )

3 每科大于90分的人数

select ,count(*) from c,sc where = and >90

group by

select ,count(*) from c join sc on = and

>90 group by

数据库笔试题

*

建表:

dept:

deptno(primary key),dname,loc

emp:

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

*/

2 / 41

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

=) group by

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,, from emp,dept where

=

8 列出emp中工作为'CLERK'的员工的姓名,工作,部门号,部门名

select ename,job,,dname from emp,dept where

= and job='CLERK'

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

select as 姓名, as 管理者 from emp as a,emp as b where

is not null and =

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

工名与工作

select dname as 部门名, as 部门号,ename as 员工名,job as 工作

from dept,emp

where *= and job = 'CLERK'

11 对于工资高于本部门平均水平的员工,列出部门号,姓名,工资,按部门号排序

select as 部门号, as 姓名, as 工资 from emp as a

where >(select avg(sal) from emp as b where =)

order by

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

部门号排序

3 / 41

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

where >(select avg(sal) from emp as b where =)

group by order by

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

按部门号排序

select count() as 员工数, as 部门号,avg(sal) as 平均工资

from emp as a

where (select count() from emp as c where =

and >(select avg(sal) from emp as b where =))>1

group by order by

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

工资少于自己的人数

select ,,,(select count() from emp as b

where <) as 人数 from emp as a

where (select count() from emp as b where <)>5

数据库笔试题及答案

第一套

一.选择题

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、数据库设计是指设计数据库管理系统

4 / 41

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("2000/10/01") B、{^99/10/01}+365 C、VAL("2000/10/01")

D、DATE()

22. 只有满足联接条件的记录才包含在查询结果中,这种联接为______。

A、左联接 B、右联接 C、内部联接 D、完全联接

23. 索引字段值不唯一,应该选择的索引类型为______。

5 / 41

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;

借阅.借书证号="0001" AND;

______

____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))

6 / 41

借阅(借书证号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("THIS IS MY BOOK")的结果是______。

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. 设有图书管理数据库:

7 / 41

图书(总编号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 出版单位="清华

大学出版社") 或 (出版单位='清华大学出版社' 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、需求分析

8 / 41

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",5,1))*Len("visual foxpro")的结果是

______。

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. 使用菜单操作方法打开一个在当前目录下已经存在的查询文件

后,在命令窗口生成的命令是____。

A、OPEN QUERY B、MODIFY QUERY

C、DO QUERY D、CREATE QUERY

19. 可以伴随着表的打开而自动打开的索引是______。

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

非结构化复合索引文件

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

______。

9 / 41

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="ABC",Y="ABCD",则下列表达式中值为.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))

10 / 41

读者(借书证号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 单位="CIE")

B、COUNT (DISTINCT 借书证号)

IN (SELECT 借书证号 FROM 借阅 WHERE 单位="CIE")

C、SUM (DISTINCT 借书证号)

IN (SELECT 借书证号 FROM 读者 WHERE 单位="CIE")

D、SUM (DISTINCT 借书证号)

IN (SELECT 借书证号 FOR 借阅 WHERE 单位="CIE")

32. 查询订购单号(字符型,长度为4)尾字符是"1"的错误命令是______。

A、SELECT * FROM 订单 WHERE SUBSTR(订购单号,4)="1"

B、SELECT * FROM 订单 WHERE SUBSTR(订购单号,4,1)="1"

C、SELECT * FROM 订单 WHERE "1"$订购单号

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

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

______。

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

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

A、BUILD EXE emp_sys FROM 职工 B、BUILD APP emp_ FROM

职工

C、LIKE EXE emp_sys FROM 职工 D、LIKE APP emp_ FROM 职

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

"教师"表:

"学院"表:

有SQL语句:

SELECT DISTINCT 系号 FROM 教师 WHERE 工资>=;

ALL (SELECT 工资 FROM 教师 WHERE 系号="02")

与如上语句等价的SQL语句是______。

A、SELECT DISTINCT 系号 FROM 教师 WHERE工资>=;

(SELECT MAX(工资) FROM 教师 WHERE 系号="02")

B、SELECT DISTINCT 系号 FROM 教师 WHERE 工资>=;

(SELECT MIN(工资) FROM 教师 WHERE 系号="02")

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

ANY(SELECT 工资 FROM 教师 WHERE 系号="02")

D、SELECT DISTINCT 系号 FROM 教师 WHERE 工资>=;

SOME (SELECT 工资 FROM 教师 WHERE 系号="02")

二、填空题

36. 若按功能划分,软件测试的方法通常分为白盒测试方法和______测试方

法。

37. 数据库系统的三级模式分别为______模式、内部级模式与外部级模式。

11 / 41

38. 在最坏情况下,冒泡排序的时间复杂度为______。

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

40. 关系模型的数据操纵即是建立在关系上的数据操纵,一般有______、增

加、删除和修改四种操作。

41.要把帮助文件设置为复制到硬盘上的文件,需要在"选项"对

话框的______选项卡上设置。

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语句。

插入"95031"班学号为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 单价

12 / 41

=<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,"郑和","95031") 或

INSE INTO R(NO,NAME,CLASS) VALUES(30,"郑和","95031")

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_(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

题目内容如下

*

一表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 武汉

13 / 41

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.s, sum(A.m)

FROM TB

TB

WHERE <=

GROUP BY

HAVING sum(a.m) <=

ORDER BY

2.

SELECT TOP 1 ID, S,

FROM (SELECT

(SELECT

FROM

WHERE ID >=

AND ID <= ) AS

FROM TB A)

WHERE M_SUM <=

ORDER BY ID

SQL面试题 (二)

14 / 41

s_sum

A,

B

,

b.s

500

DESC

M_SUM

*,

SUM(M)

TB

1

M_SUM

B

500

DESC

有一张工资表,包含三列:员工编号(ID),部门编号(GROUPS),工资(SALARY)

1. .找到每个部门工资最高的人(包括并列第一)

2. 找到每个部门工资最高的人(只选一个)

SQL语句如下:

* from 工资表 as a where a.工资=(select max(b.工资) from 工资表

as b where a.部门编号=b.部门编号)

-- 2

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

15 / 41

WHERE EXISTS(SELECT 1 FROM SALARY WHERE =ID AND

SALARY>)

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

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

Course 课程表 (编号,课程名称)

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

表结构如下:

(1).写一个SQL语句,查询选修了’计算机原理’的学生学号和姓名

(2).写一个SQL语句,查询’周星驰’同学选修了的课程名字

(3).写一个SQL语句,查询选修了5门课程的学生学号和姓名

(1)

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;

16 / 41

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

17 / 41

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 = )

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

18 / 41

(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 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:字符

19 / 41

假设有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 server:

select top 20 * from 表 order by newid()

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

的记录插入到B表中。

表结构如下:

create table A(id int primary key,name varchar(20),password varchar(20))

A表记录:

ID NAME PASSWORD

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

1 Tom 1234

2 Mary 1234

3 Lucy 1234

4 Billy 1234

5 Henry 1234

20 / 41

B表记录:

ID NAME PASSWORD

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

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 NAME PASSWORD

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

1 Tom 1234

2 Mary 1234

3 Lucy 1234

4 Billy 2548

5 Henry 1234

21 / 41

B表记录:

ID NAME PASSWORD

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

1 Jojoy 1234

2 Mary 1234

3 Lucy 1234

4 Billy 1234

5 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 =

and rd=rd)

select * from b where not exists(select * from a where =

and rd=rd)

SQLServer不同行列相减实例解析

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

一下,题目如下:

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

22 / 41

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

23 / 41

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

AMOUNT减去NAME为cr的AMOUNT得出。

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

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

id=)-(select sum(amount) from test where name='cr'and 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

24 / 41

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函数实

现数据的相减。

考题:现有两张表,以下为表结构

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 部门号,avg() 平均工资from dep t1 inner join emp

t2 on = group by

25 / 41

正解3:

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

2、请列出工资大于本部门平均工资的员工姓名和部门号以及统计此部门的人数。结

果显示为如下形式:

EMPNAME DEPID 部门人数

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

ZHANGSAN 1 15

LISI 2 10

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

正解1:

SELECT e,,T2.部门人数FROM T1 INNER

JOIN (select , avg() AS salary, COUNT(empid) AS 部门人

数from dep t1 inner join t2 on = group by

) T2 ON = WHERE >

正解2:

select empname,,s 部门人数 from emp Inner Join (select

depid,avg(salary) a,count(1) s from emp group by depid) b on

= and salary>a

第二条sql语句相对简单些。。。。

Select empname,,(select count(*) from emp as m where

=)as 部门人数 from emp where salary>(select

avg(salary) from emp as s where =)

sql server常用函数(面试必背!)

1,统计函数 avg, count, max, min, sum

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

26 / 41

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(),

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()当前时间

27 / 41

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:mssql7backupMyNwind_'

--- 开始 备份

BACKUP DATABASE pubs TO testBack

4、说明:创建新表

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

28 / 41

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 中都有的行并消除所有重复行

而派生出一个结果表。当 ALL 随 INTERSECT 一起使用时 (INTERSECT ALL),不

消除重复行。

注:使用运算词的几个查询结果行必须是一致的。

12、说明:使用外连接

A、left outer join:

29 / 41

左外连接(左连接):结果集几包括连接表的匹配行,也包括左连接表的所有行。

sql: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a =

b.c

B:right outer join:

右外连接(右连接):结果集既包括连接表的匹配连接行,也包括右连接表的所有行。

C:full outer join:

全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。

其次,大家来看一些不错的sql语句

1、说明:复制表(只复制结构,源表名:a 新表名:b) (Access可用)

法一:select * into b from a where 1<>1

法二:select top 0 * into b from a

2、说明:拷贝表(拷贝数据,源表名:a 目标表名:b) (Access可用)

insert into b(a, b, c) select d,e,f from b;

3、说明:跨数据库之间表的拷贝(具体数据使用绝对路径) (Access可用)

insert into b(a, b, c) select d,e,f from b in ‘具体数据库’ where 条件

例子:..from b in '"&h(".")&"" &"' where..

4、说明:子查询(表名1:a 表名2:b)

select a,b,c from a where a IN (select d from b ) 或者: select a,b,c from a

where a IN (1,2,3)

5、说明:显示文章、提交人和最后回复时间

select ,me,e from table a,(select max(adddate)

adddate from table where =) b

6、说明:外连接查询(表名1:a 表名2:b)

select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c

7、说明:在线视图查询(表名1:a )

select * from (Select a,b,c FROM a) T where t.a > 1;

8、说明:between的用法,between限制查询数据范围时包括了边界值,not

between不包括

select * from table1 where time between time1 and time2

select a,b,c, from table1 where a not between 数值1 and 数值2

9、说明:in 的使用方法

select * from table1 where a [not] in (‘值1’,’值2’,’值4’,’值6’)

10、说明:两张关联表,删除主表中已经在副表中没有的信息

delete from table1 where not exists ( select * from table2 where

1=1 )

30 / 41

11、说明:四表联查问题:

select * from a left inner join b on a.a=b.b right inner join c on a.a=c.c

inner join d on a.a=d.d where .....

12、说明:日程安排提前五分钟提醒

sql: select * from 日程安排 where datediff('minute',f开始时间,getdate())>5

13、说明:一条sql 语句搞定数据库分页

select top 10 b.* from (select top 20 主键字段,排序字段 from 表名 order by

排序字段 desc) a,表名 b where b.主键字段 = a.主键字段 order by a.排序字段

14、说明:前10条记录

select top 10 * form table1 where 范围

15、说明:选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这

样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等.)

select a,b,c from tablename ta where a=(select max(a) from tablename

tb where tb.b=ta.b)

16、说明:包括所有在 TableA 中但不在 TableB和TableC 中的行并消除所有重

复行而派生出一个结果表

(select a from tableA ) except (select a from tableB) except (select a

from tableC)

17、说明:随机取出10条数据

select top 10 * from tablename order by newid()

18、说明:随机选择记录

select newid()

19、说明:删除重复记录

Delete from tablename where id not in (select max(id) from tablename

group by col1,col2,...)

20、说明:列出数据库里所有的表名

select name from sysobjects where type='U'

21、说明:列出表里的所有的

select name from syscolumns where id=object_id('TableName')

22、说明:列示type、vender、pcs字段,以type字段排列,case可以方便地实

现多重选择,类似select 中的case。

select type,sum(case vender when 'A' then pcs else 0 end),sum(case

vender when 'C' then pcs else 0 end),sum(case vender when 'B' then pcs

else 0 end) FROM tablename group by type

显示结果:

31 / 41

type vender pcs

电脑 A 1

电脑 A 1

光盘 B 2

光盘 A 2

手机 B 3

手机 C 3

23、说明:初始化表table1

TRUNCATE TABLE table1

24、说明:选择从10到15的记录

select top 5 * from (select top 15 * from table order by id asc) table_别名

order by id desc

sql server:select top n * from 表名 order by newid()

问题:一个select 语句,为按某列排序的数据增加一个标志列,要求如下:

原表数据(按b升序):

a b

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

qwe 1

dsfg 2

小计1 18

ger 19

kuyre 20

we34 23

小计2 25

db 26

tyuq 29

小计3 35

添加标志列 C 后(注意a列中的 小计 及其对应B列的值):

a b c

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

qwe 1 18

dsfg 2 18

小计1 18 18

ger 19 25

kuyre 20 25

we34 23 25

小计2 25 25

db 26 35

tyuq 29 35

小计3 35 35

32 / 41

--创建表

create table (id int identity(1,1),a nvarchar(10),b int)

--插入数据

insert into one

select 'qwe', 1 union all

select 'dsfg ', 2 union all

select N'小计1', 18 union all

select 'ger', 19 union all

select 'kuyre', 20 union all

select 'we34', 23 union all

select N'小计2', 25 union all

select 'db', 26 union all

select 'tyuq', 29 union all

select N'小计3', 35

--方法1

select a,b,min(c) as c from (select one.a,one.b,(case when

one.b<=tem.b then tem.c end) as c from one,(select a,b,(case when a

like N'小计%' then b end) as c from one) tem)bb

where c is not null group by a,b

--方法2

select C.*,(select top 1 b from one A where A.a like '小计%' and A.b-

C.b>=0 ) C from one C order by C.b

--删除测试表

drop table one

SQL SERVER中如何取汉字的长度

代码如下:

select len('浙江宁波')

显示结果:4

select datalength('浙江宁波')

显示结果:8

数据库sql面试题

1:找出公司里收入最高的前三名员工:

select rownum, last_name, salary from (select last_name, salaryfrom

33 / 41

s_emporder by salary desc) where rownum<=3;

注意:请大家分析一下一下语句为什么不对:

select rownum, last_name, salaryfrom s_emp where rownum<=3order

by salary desc;

2: 找出表中的某一行或某几行的数据:(1):找出表中第三行数据:

用以下方法是不行的,因为rownum后面至可以用<或<=号,不可以用=,>号和其

它的比较符号。

select * from s_empwhere rownum=3;

no rows selected

SQL> select * from s_empwhere rownum between 3 and 5;

no rows selected

正确的方法如下:

SQL> select last_name, salaryfrom (select rownum a, b.*from s_emp

b)where a=3

SQL> /

LAST_NAME SALARY

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

Nagayama 2660

(2):找出第三行到第五行之间的数据:

SQL> select last_name, salaryfrom (select rownum a, b.* from s_emp b)

where a between 3 and 5

3:找出那些工资高于他们所在部门的平均工资的员工。

(1):第一种方法:

SQL> select last_name, dept_id, salary from s_emp awhere

salary>(select avg(salary)from s_empwhere dept_id=_id);

(2):第二种方法:

SQL>

34 / 41

select _name, , _id, from s_emp a, (select

dept_id, avg(salary) avgsalfrom s_empgroup by dept_id) bwhere

_id=_idand >

4:找出那些工资高于他们所在部门的manager的工资的员工。

SQL>select id, last_name, salary, manager_idfrom s_emp awhere

salary>(select salaryfrom s_empwhere id=r_id)

5:找出部门工资排名第二,三的员工

select name,salary,deptno from (select concat(last_name,first_name)

name,salary,department_id deptno,rank() over (partition by

department_id order by salary desc) rnkfrom employees) where rnk=2 or

rnk=3

left join使用精华:)

create table tt(id int identity(1,1),name varchar(10))

insert tt

select 'a' union all

select 'b' union all

select 'c'

create table tt1(id int identity(1,1),name varchar(10))

insert tt1

select 'a' union all

select 'b' union all

select 'c'

--结果:

select * from tt left join tt1 on = --提取id相等的

id name id name

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

1 a 1 a

2 b 2 b

3 c 3 c

--结果1:

select * from tt left join tt1 on =

where =1 --用的是where,可以看出用where 和 and 的区别了:)

35 / 41

id name id name

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

1 a 1 a

--结果2:left join 就是查询tt表中所有记录,如果有返回对应值,没有为NULL

select * from tt left join tt1 on =

and =1 --用的是and,且是主表=1

id name id name

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

1 a 1 a

2 b NULL NULL

3 c NULL NULL

--结果3:这个返回跟上面一样的结果

select * from tt left join tt1 on =

and =1 --用的是and,且是从表=1

id name id name

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

1 a 1 a

2 b NULL NULL

3 c NULL NULL

--结果4:

select * from tt left join tt1 on =1 --关键是去掉了id相等这个条件

id name id name

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

1 a 1 a

1 a 2 b

1 a 3 c

2 b NULL NULL

3 c NULL NULL

--对结果4,很多人不了解,看zjcxc(邹建) 的解释

left join 嘛, 无非是左边表为基础, 扫描右边表匹配的记录

先是左边表的第1条记录

1 a

按条件 =1, 来扫描右边表的记录

对于右边表的每条记录, 显然 =1 这个条件都是成立的, 所以第1条记录匹配后

的结果是:

1 a 1 a

1 a 2 b

1 a 3 c

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

然后再扫描第2条记录

2 b

36 / 41

对于条件 =1, 在边表中没有与之匹配的记录, 所以右边表为NULL

因此第2条记录匹配的结果为

2 b NULL NULL

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

第3条记录与第2条记录一样, 匹配的结果是

3 c NULL NULL

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

因此最终结果是5条记录

1 a 1 a

1 a 2 b

1 a 3 c

2 b null null

3 c null null

---再看:

select * from tt left join tt1 on =1 --是从表=1

id name id name

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

1 a 1 a

2 b 1 a

3 c 1 a

--解释:上面的结果是这样取的,先取主表1 a,联立从表tt2,正好

其第一条数据id=1,满足条件,所以输出:

1 a 1 a

然后再是从表第二条数据 2 b,id!=1,出输出,同理3 c也不满足条件,

再主表 2 b,联立从表第一条数据1 a,满足条件,输出,

以后依次类推...............

--最主要的就是在连接里的 and 和 where 是有本质区别。

1.

select * from a left join b on = where =1

2.

select * from a left join b on = and =1

where里的条件是对连接后的结果集进行筛选,而on里的条件是关联时进行比较用

--再看一下更加详细的解释:

1、首先列出笛卡尔乘积

1 a 1 a

1 a 2 b

1 a 3 c

2 b 1 a

2 b 2 b

37 / 41

2 b 3 c

3 c 1 a

3 c 2 b

3 c 3 c

2、对每个左边的纪录,看有没有符合on条件的,如果有,保留符合条件的,去掉

不符合条件的,如果没有,

保留左边和右边是null的一条纪录

1 a 1 a

1 a 2 b

1 a 3 c --左边1的都符合都保留

2 b null null --左边2的都不符合,变成一条右边null的纪录

3 c null null --左边3的都不符合,变成一条右边null的纪录

3、再去掉where条件不符合的,就是结果(这里的例子没有where条件,所以结

果不变,大家自己可以加条件测试下)

1 a 1 a

1 a 2 b

1 a 3 c

2 b null null

3 c null null

对于left join的on条件:

用左边的记录去匹配右边的每条记录,匹配条件就是on里的条件,若右边有满足条

件的记录,则取出来,

若没有匹配的记录,则给个null值,对于其后的where条件,

是对整个left join后产生的结果集进行筛选,所以条件放在on里和where里是完

全不同的意思,切记!!!

周五的下午面试了一位来自华为的高手,此高手称精通排序算法。我一听说某人

精通某项,就忍不住兴奋,喜欢抓住别人最精通的这一项追根究底。一方面来说,问

你最精通的东西,不能算考官故意刁难你;另一方面来说,面试别人往往成为自己变

相请教高手的途径。

问之:相对于《数据结构》课本上提供的快速排序算法,有没有可以优化的余

地?

本来我的原意是想听到他说将递归算法修改为非递归算法,可是聊了一些方面也没

提高这个。虽然对这个问题的答案有些失望,总的来说这个高手思维积极、善于思

考,仍是非常不错的。

面试完成后,我到网上查了查快速排序的一些资料,发现快速排序算法可优化

的地方很多,其实我自己也是半桶水。

38 / 41

快速排序的优化方法包括:

1、将递归算法修改为非递归算法;

2、需要排序的元素个数如果少于8个,则使用插入排序代替快速排序;

3、使用仿函数(函数对象),而不是函数指针:模版库会将比较函数展开,从而避

免函数调用带来的开销;

4、使用多线程:快速排序是分而治之的思想,每个独立的段可以并行进行排序。因

此可以利用计算机的并行处理能力来提高排序的性能;

SQL基础知识

1.

SELECT 姓名

SELECT

FROM 职员档案表

WHERE

年龄>25

SELECT 姓名 FROM 职员档案表 AS DA WHERE DA.年龄=18

SELECT 姓名 FROM 职员档案表 AS DA WHERE DA.年龄>16 AND DA.年龄

<35

SELECT 姓名 FROM 职员档案表 AS DA WHERE DA.年龄 BETWEEN 16 AND

35

SELECT 姓名 FROM 职员档案表 AS DA WHERE DA.部门=”技术部” OR DA. 部

门=”信息部”

SELECT 姓名 FROM 职员档案表 AS DA WHERE DA.部门 IN(”技术部”,”信息部”)

MS SQL 通配符

SELECT * FROM 职员档案表 AS DA WHERE 姓名 LIKE ‘李%’ //”%”表示任意字

SELECT * FROM 职员档案表 AS DA WHERE 编号 LIKE ‘02_’ //”_表示任意一个

ORDER BY 排

SELECT * FROM 职员档案表 AS DA ORDER BY DA.年龄>18 DESC //DESC 降

SELECT * FROM 职员档案表 AS DA ORDER BY DA.部门,DA.薪金DESC //先将

相同部门列在一起,然后按薪金降序排列

39 / 41

DISTINCT 和 ALL 和聚合函数

SELECT 所在城市 AS 城市DISTINCT FROM职员档案表 //DISTINCT只能使用

一次,视为首词

SELECT AVG(ALL薪金) AS ‘平均工资’ FROM 职员档案表 //显示:2633.33 ALL

默认可选

SELECT AVG(DISTINCT薪金) AS ‘平均工资’ FROM 职员档案表 //显

示:1676.20 因为DISTINCT会忽略掉相同工资中的其它项

职员档案表

职员档案表

职员档案表

职员档案表

SELECT COUNT(编号) AS ‘总人数’ FROM

SELECT COUNT(*) AS ‘记录数’ FROM

SELECT MAX(年龄) AS ‘最大年龄’ FROM

SELECT MIN(薪金) AS ‘最低工资’ FROM

GROUP BY : 按某字段对数据进行分组汇总(显示)

SELECT 部门,COUNT(编号) AS 人数总数,AVG(年龄) AS 平均年龄,SUM(薪金)

AS 薪金总数 FROM 职员档案表GROUP BY部门 //注意, ”部门”是分组字段,其它都

使用了聚合函数,而GROUP BY后面只能使用使用分组字段

SELECT 部门,COUNT(编号) AS 人数总数,AVG(年龄) AS 平均年龄,SUM(薪金)

AS 薪金总数 FROM 职员档案表GROUP BY部门HAVING部门=技术部

//HAVING

INNER

JOIN

能在

ON

GROUP

: 内

BY

后面

SELECT DA.编号,DA.姓名,DA.部门 FROM 职员档案表 AS DA INNER JOIN部门

信息表AS BM ON DA.部门=BM.编号

SELECT * FROM(职员档案表 AS DA INNER JOIN部门信息表 AS BM ON DA.部

门=BM.编号) INNER JOIN负责人信息表 AS FZR ON DA.编号=FZR.编号

2. INSERT命令

INSERT INTO职员档案表 VALUES (0011,’王五’,25,’信息部’,2500)

3. UPDATE命令

UPDATE职员档案表 AS DA SET DA.部门=’销售部’ WHERE DA.年龄<35

UPDATE职员档案表 AS DA SET DA.薪金*1.1

4.

DELETE

DELETE FROM

DELETE

FROM 职员

档案

职员档案表 AS DA WHERE DA.姓名=’王五’

40 / 41

DELETE FROM 职员档案表 AS DA INNER JOIN 部门信息表 AS BM ON DA.部门

=BM.编号WHEREDA.姓名=’王五’ //删除与此人相关的其它的表的信息

5. BACKUP命令

BACKUP DATABASE职员档案表 TO DISK=’c:’

6. RESTORE命令

RESTORE DATABASE职员档案表FROM DISK=’c:’

一道面试题目7 删除重复纪录

假设我有一个表table

key id name

1 | 1001 | 张飞

2 | 1001 | 张飞

3 | 1002 | 关羽

4 | 1003 | 刘备

5 | 1004 | 马超

6 | 1004 | 马超

7 | 1005 | 曹操

很明显,张飞的记录重复了,我要删除任意一条重复的纪录该如何操作?如果我想指

定删除按照key排序的第二条重复纪录我该如何写sql?我的意思是我要删除key为

2和6的这两条记录,因为他们是第二次出现的。当然了,最首要实现的是能删除一

条重复的,不管怎么删,只要能让我保证数据的唯一性就行。如果id相同就可以判

定两条记录重复了,name是否相同并不重要。

这条语句是否正确?

delete from table where key not in(select key = min(key) from

table group by name)

41 / 41

本文标签: 数据库数据部门记录语句