SQL的练习,求答案!!!

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL的练习,求答案!!!相关的知识,希望对你有一定的参考价值。

例1 从员工表中查询员工姓名和工资
例2 查询所有的供应商信息
例3 查询顾客表的前面七行
例4查询顾客表前面5%的行
例5 从员工表中查询不相同的部门号
例6 查询员工增加15%的工资后的工资数
例7 从员工表中查询员工的周岁年龄,并在年龄前加说明字符串‘员工的周岁年龄是:’
例8 从员工表中查询员工姓名和工资,用三种方式加别名
例9 查询客户表中客户的个数
例10 查询员工的最高和最低工资
例11 把供应商表的供应商名称和联系人送到另一个表中
例12 查询员工'李立三'的工资
例13 查询工资大于3500有哪些员工
例14 查询工资大于3500的男员工有哪些
例15 *查询符合某个范围内的数据*/查询库存量在1000-3000的商品
例16/*查询中使用关键字IN,*/ 查询员工号13、17得到的订单

例17 查询工资在3000-4000的员工姓名和工资
例18查询库存量在1000-3000的商品名称
例19 在Sell_order中,查询员工编号为2、4和9的员工接受订单信息。
例 20 查询中使用关键字IN,查询2、4和9号以外的其他员工得到的订单
例5.21 查询中使用关键字LIKE*,查询姓吴的员工
例5.22 查询中使用关键字LIKE查询姓黄和姓刘的员工
例5.23 查询中使用关键字LIKE, 查询姓赵并且姓名为两个字的员工
例5.24 查询中使用关键字LIKE, 查询不姓王的员工
例5.25 使用null或not null查询没有订单的员工号
我是初学者!也有自己做,但是很迷茫!

有一些类似的题看看吧 一定有帮助
实验一
练习1、请查询表DEPT中所有部门的情况。
select * from dept;

练习2、查询表DEPT中的部门号、部门名称两个字段的所有信息。
select deptno,dname from dept;

练习3、请从表EMP中查询10号部门工作的雇员姓名和工资。
select ename,sal from emp where deptno=10;

练习4、请从表EMP中查找工种是职员CLERK或经理MANAGER的雇员姓名、工资。
select ename,sal from emp where job='CLERK' or job='MANAGER';

练习5、请在EMP表中查找部门号在10-30之间的雇员的姓名、部门号、工资、工作。
select ename,deptno,sal,job from emp where deptno between 10 and 30;

练习6、请从表EMP中查找姓名以J开头所有雇员的姓名、工资、职位。
select ename,sal,job from emp where ename like 'J%';

练习7、请从表EMP中查找工资低于2000的雇员的姓名、工作、工资,并按工资降序排列。
select ename,job,sal from emp where sal<=2000 order by sal desc;

练习8、请从表中查询工作是CLERK的所有人的姓名、工资、部门号、部门名称以及部门地址的信息。
select ename,sal,emp.deptno,dname,loc from emp,dept where emp.deptno=dept.deptno and job=’CLERK’;

练习9、查询表EMP中所有的工资大于等于2000的雇员姓名和他的经理的名字。
select a.ename,b.ename from emp a,emp b where a.mgr=b.empno(+) and a.sal>=2000;

练习10、在表EMP中查询所有工资高于JONES的所有雇员姓名、工作和工资。
select ename,job,sal from emp where sal>(select sal from emp where ename=’JONES’);

练习11、列出没有对应部门表信息的所有雇员的姓名、工作以及部门号。
select ename,job,deptno from emp where deptno not in (select deptno from dept);

练习12、查找工资在1000~3000之间的雇员所在部门的所有人员信息
select * from emp where deptno in (select distinct deptno from emp where sal between 1000 and 3000);

练习13、雇员中谁的工资最高。
select ename from emp where sal=(select max(sal) from emp);
select ename from (select * from emp order by sal desc) where rownum<=1;

*练习14、雇员中谁的工资第二高(考虑并列第一的情况,如何处理)。
select ename,sal from (select ename ,sal from emp where sal<(select max(sal) from emp) order by sal desc) where rownum<=1;
实验二
1. 查询所有雇员的姓名、SAL与COMM之和。
select ename,sal+nvl(comm,0) “sal-and-comm” from emp;

2. 查询所有81年7月1日以前来的员工姓名、工资、所属部门的名字
select ename,sal,dname from emp,dept where emp.deptno=dept.deptno and hiredate<=to_date(‘1981-07-01’,’yyyy-mm-dd’);

3. 查询各部门中81年1月1日以后来的员工数
select deptno,count(*) from emp where hiredate>=to_date(‘1981-01-01’,’yyyy-mm-dd’) group by deptno;

4. 查询所有在CHICAGO工作的经理MANAGER和销售员SALESMAN的姓名、工资
select ename,sal from emp where (job=’MANAGER’ or job=’SALES’) and deptno in (select deptno from dept where loc=’CHICAGO’);

5. 查询列出来公司就职时间超过24年的员工名单
select ename from emp where hiredate<=add_months(sysdate,-288);

6. 查询于81年来公司所有员工的总收入(SAL和COMM)
select sum(sal+nvl(comm,0)) from emp where to_char(hiredate,’yyyy’)=’1981’;

7. 查询显示每个雇员加入公司的准确时间,按××××年××月××日 时分秒显示。
select ename,to_char(hiredate,'yyyy-mm-dd hh24:mi:ss') from emp;

8. 查询公司中按年份月份统计各地的录用职工数量
select to_char(hiredate,'yyyy-mm'),loc,count(*) from emp,dept
where emp.deptno=dept.deptno group by to_char(hiredate,'yyyy-mm'),loc;

9. 查询列出各部门的部门名和部门经理名字
select dname,ename from emp,dept where emp.deptno=dept.deptno and job=’MANAGER’;

10. 查询部门平均工资最高的部门名称和最低的部门名称
select dname from dept where deptno=(select deptno from (select deptno from emp group by deptno order by avg(sal) ) where rownum<=1)
union all select dname from dept where deptno=(select deptno from (select deptno from emp group by deptno order by avg(sal) desc ) where rownum<=1);

11. *查询与雇员号为7521员工的最接近的在其后进入公司的员工姓名
select ename from (select ename from
(select ename from emp where hiredate>(select hiredate from emp where empno=7521) order by hiredate ) where rownum<=1)
参考技术A /*创建Moonfox_db数据库*/
use master
if exists(select * from sysdatabases where name='Moonfox_db')
drop database Moonfox_db
create database Moonfox_db
on
(
name='Moonfox_db_data',
filename='D:\Visual Studio 2008 & Sql server 2005\Sql server\Moonfox_db.mdf',
size=10,
filegrowth=2MB
)
log on
(
name='Moonfox_db_log',
filename='D:\Visual Studio 2008 & Sql server 2005\Sql server\Moonfox_db.ldf',
size=5,
filegrowth=20%
)/*创建Department表*/
use Moonfox_db
if exists(select * from sysobjects where name='Department')
drop table Department
create table Department
(
DID int identity (1,1)primary key,--部门编号,主键
Dname nvarchar(20),--部门名称
Address nvarchar(50),--部门地址
Photo decimal(12,0),--电话
)/*创建Employee表*/
use Moonfox_db
if exists(select * from sysobjects where name='Employee')
drop table Employee
create table Employee
(
EID int identity (1,1)primary key,--职工编号,主键
Ename varchar(10),--职工名
Gender nchar(2) check(Gender='男' or Gender='女'),--性别,添加限制
Position nvarchar(10) check(Position='员工' or Position='组长' or Position='经理'),--职务,添加限制
Address nvarchar(50),--家庭地址
DID int,--部门编号,外键
foreign key(DID) references Department(DID)--外键约束
)
/*创建Care表*/
use Moonfox_db
if exists(select * from sysobjects where name='Care')
drop table Care
create table Care
(
CID int identity (1,1)primary key,--保健卡编号,主键
EID int,--职工号,外键
foreign key(EID) references Employee(EID),--外键约束
CheckDate datetime,--检查身体日期
PhysicalCondition nvarchar(4) check(PhysicalCondition='一般' or PhysicalCondition='差' or PhysicalCondition='好'),--健康状况
)
/*创建Care表约束*/
alter table Care
add
constraint DF_CheckDate default(getdate()) for CheckDate--缺省,默认净时间为当前计算机时间 路径自己修改,试图自己做,选择语句自己写。我该睡觉了,抱歉,你试着在sql server中运行下,我等着休息,也不知道写的有没有错误,没时间帮你写省下的了。不急着用的话我明天帮你写吧。
参考技术B = = 够恶心的.... 参考技术C 我擦,你自己去csdn找啊,oracle课后习题答案。本回答被提问者采纳 参考技术D 表名和表段呢……

SQL强化练习

SQL语句强化练习题及答案

 

一、简单查询

1、列出全部学生的信息。

SELECT * FROM 学生

2、列出软件专业全部学生的学号及姓名。

SELECT 学号,姓名 FROM 学生 WHERE 专业="软件"

3、列出所有必修课的课号。

SELECT DISTINCT 课号 FROM 必修课

4、求1号课成绩大于80分的学生的学号及成绩,并按成绩由高到低列出。

SELECT 学号,成绩 FROM 选课 WHERE 课号="1" AND 成绩>80 ORDER BY 成绩 DESC

5、列出非软件专业学生的名单。

方法一:SELECT 姓名 FROM 学生 WHERE 专业<>"软件"

方法二:SELECT 姓名 FROM 学生 WHERE NOT 专业="软件"

方法三:SELECT 姓名 FROM 学生 WHERE 专业!="软件"

6、查询成绩在70~80分之间的学生选课得分情况

方法一:SELECT * FROM 选课 WHERE 成绩>=70 AND 成绩<=80

方法二:SELECT * FROM 选课 WHERE 成绩 BETWEEN 70 AND 80

不在此范围内的查询:(注意写出和以下语句等价的语句)

SELECT * FROM 选课 WHERE 成绩 NOT BETWEEN 70 AND 80

7、列出选修1号课或3号课的全体学生的学号和成绩。

方法一:SELECT 学号,成绩 FROM 选课 WHERE 课号="1" OR 课号="3"

方法二:SELECT 学号,成绩 FROM 选课 WHERE 课号 IN ("1","3")

相反条件查询:SELECT 学号,成绩 FROM 选课 WHERE 课号 NOT IN ("1","3")

8、列出所有98级学生的学生成绩情况。

SELECT * FROM 选课 WHERE 学号 LIKE "98%"

SELECT * FROM 选课 WHERE 学号 LIKE "98_ _ _ _"

相反条件查询:SELECT * FROM 选课 WHERE 学号 NOT LIKE "98%"

9、列出成绩为空值(或不为空值)的学生的学号和课号。

答案一:SELECT 学号,课号 FROM 选课 WHERE 成绩 IS NULL

答案二:SELECT 学号,课号 FROM 选课 WHERE 成绩 IS NOT NULL

10、求出所有学生的总成绩。

SELECT SUM(成绩) AS 总成绩 FROM 选课

11、列出每个学生的平均成绩。

SELECT 学号,AVG(成绩) AS 平均成绩 FROM 选课 GROUP BY 学号

12、列出各科的平均成绩、最高成绩、最低成绩和选课人数。

SELECT 课号,AVG(成绩) AS 平均成绩,MAX(成绩) AS 最高分,;

MIN(成绩) AS 最低分,COUNT(学号) AS 选课人数 FROM 选课 GROUP BY 课号

二、连接查询

(一)简单连接

1、列出选修1号课的学生姓名及成绩。

SELECT 姓名,成绩 FROM 学生,选课 WHERE 学生.学号=选课.学号 AND 课号="1"

2、列出选修1号课的学生的学号、姓名及成绩。

SELECT 学生.学号,姓名,成绩 FROM 学生 S,选课 X WHERE S.学号=X.学号 AND 课号="1"

3、求出总分大于150的学生的学号、姓名及总成绩。

SELECT 学生.学号,姓名,SUM(成绩) AS 总成绩 FROM 学生,选课;

WHERE 学生.学号=选课.学号 GROUP BY 选课.学号 HAVING SUM(成绩)>150

(二)自连接查询

1、列出那些专业相同的学生相应的姓名及专业信息。

SELECT a.姓名,b.姓名,专业 FROM 学生 a,学生 b WHERE a.学号<>b.学号 AND a.专业=b.专业

2、求至少选修1号课和2号课的学生的学号。

SELECT X.学号 FROM 选课 X,选课 Y WHERE X.学号=Y.学号 AND X.课号="1" AND Y.课号="2"

3、有以下表rate.dbf

    币种1代码 C(2)、币种2代码 C(2)、买入价 N(8,4)、卖出价 N(8,4)

外汇汇率.dbf

    币种1 C(4)、币种2 C(4)、买入价 N(8,4)、卖出价 N(8,4)

外汇代码.dbf

    外汇名称 C(10)、外汇代码 C(10)

要求:将所有“外汇汇率”表中的数据插入rate表中并且顺序不变,由于“外汇汇率”中的币种1和币种2存放的是外币名称,而rate表中的币种1代码和币种2代码应该存放外币代码,所以插入时要做相应的改动,外币名称与外向代码的对应关系存储在“外汇代码”表中。

SELECT A.外币代码 AS 币种1代码,B.外币代码 AS 币种2代码,;

买入价,卖出价 FROM 外汇代码 A,外汇汇率,外汇代码 B;

WHERE A.外币名称=外汇汇率.币种1 AND B.外币名称=外汇汇率.币种2 INTO TABLE rate

4、假定有“雇员”表(雇员号 C(2),雇员姓名 C(6),经理号 C(2)),根据雇员关系列出上一级经理及其所领导的职员清单。(教案中的例题)

SELECT "领导",S.雇员姓名,"雇员",E.雇员姓名 FROM 雇员 S,雇员 E WHERE S.雇员号=E.经理

(三)超连接

1、列出选修1号课的学生姓名及成绩。

方法一:(使用简单连接查询格式)

SELECT 姓名,成绩 FROM 学生,选课 WHERE 学生.学号=选课.学号 AND 课号="1"

方法二:(使用内部连接格式)

SELECT 姓名,成绩 FROM 学生 INNER JOIN 选课 ON 学生.学号=选课.学号 WHERE 课号="1"

方法三:内部连接的INNER短语可以省略。(与方法二等价)

SELECT 姓名,成绩 FROM 学生 JOIN 选课 ON 学生.学号=选课.学号 WHERE 课号="1"

2、查询订货管理数据库中数据的仓库号、城市、供应商名和地址信息。

方法一:使用简单连接格式。

SELECT 仓库.仓库号,城市,供应商名,地址 FROM 供应商,订购单,职工,仓库;

WHERE 供应商.供应商号=订购单.供应商号 AND订购单.职工号=职工.职工号 ;

AND 职工.仓库号=仓库.仓库号

方法二:使用超连接的内部连接格式。(注意连接条件的顺序)

SELECT 仓库.仓库号,城市,供应商名,地址 FROM 供应商 JOIN 订购单 JOIN 职工 JOIN 仓库 ;

ON 职工.仓库号=仓库.仓库号 ON 订购单.职工号=职工.职工号 ON 供应商.供应商号=订购单.供应商号

3、查询没有选修任何课程的学生姓名。

方法一:使用嵌套查询

SELECT 姓名 FROM 学生 WHERE 学号 NOT IN (SELECT 学号 FROM 选课)

方法二:使用超连接的右连接。

SELECT 姓名 FROM 选课 RIGHT JOIN 学生 ON 选课.学号=学生.学号 WHERE 选课.学号<>学生.学号

方法三:使用超连接的左连接。(注意表名顺序和方法二的不同)

SELECT 姓名 FROM 学生 LEFT JOIN 选课 ON 选课.学号=学生.学号 WHERE 选课.学号<>学生.学号

三、嵌套查询

(一)普通嵌套与谓词EXISTS

1、列出选修汇编语言课的学生的学号。

方法一:

SELECT 学号 FROM 选课 WHERE 课号=(SELECT 课号 FROM 课程 WHERE 课名="汇编语言")

方法二:使用谓词EXISTS。注意和方法一格式上的不同。

SELECT 学号 FROM 选课 WHERE EXIST (SELECT * FROM 课程 ;

WHERE 课名="汇编语言" AND 选课.课号=课程.课号)

2、求软件专业所有必修课的课程信息。

方法一:

SELECT * FROM 课程 WHERE 课号 IN; (SELECT 课号 FROM 必修课 WHERE 必修专业="软件")

方法二:

SELECT * FROM 课程 WHERE EXIST (SELECT * FROM 必修课 WHERE 必修专业="软件" ;

AND 课程.课号=必修课.课号)

(二)量词ANY、SOME、ALL

1、求选修2号课的学生中,成绩比选修1号课的最低成绩要高的学生的学号和成绩。

方法一:

SELECT 学号,成绩 FROM 选课 WHERE 课号="2" AND 成绩>;

(SELECT MIN(成绩) FROM 选课 WHERE 课号="1")

方法二:ANY等价于SOME,所以可将ANY换成SOME。

SELECT 学号,成绩 FROM 选课 WHERE 课号="2" AND 成绩>ANY ;

(SELECT 成绩 FROM 选课 WHERE 课号="1")

2、求选修2号课的学生中,成绩比选修1号课的任何学生的成绩都要高的那些学生的学号和成绩。

方法一:

SELECT 学号,成绩 FROM 选课 WHERE 课号="2" AND 成绩>;

(SELECT MAX(成绩) FROM 选课 WHERE 课号="1")

方法二:

SELECT 学号,成绩 FROM 选课 WHERE 课号="2" AND 成绩>ALL ;

(SELECT 成绩 FROM 选课 WHERE 课号="1")

(三)内外层互相关嵌套(外层依赖于内层的查询结果,内层依赖于外层来进一步查询)

1、列出每门课程中成绩最高的选课信息。

SELECT * FROM 选课 A WHERE 成绩=(SELECT MAX(成绩) FROM 选课 B WHERE A.课号=B.课号)

2、列出每个学生中成绩低于本人平均成绩的选课信息。

SELECT * FROM 选课 A WHERE 成绩<(SELECT AVG(成绩) FROM 选课 B WHERE A.学号=B.学号)

3、列出表“订购单2.dbf”(其内容就是在订购单表的基础上增加一个总金额字段)中每个职工经手的具有最高总金额的订购单信息。(教案中例题)

SELECT out.职工号,out.供应商号,out.订货单号,out.订货日期,out.总金额;

FROM 订购单 out WHERE 总金额=(SELECT MAX(总金额) FROM 订购单 inner1;

Where out.职工号=inner1.职工号)

四、操作功能

1、在课程表中插入新的元组(5,大学英语)。

INSERT INTO 课程(课号,课名) VALUES("5","大学英语")

2、给学生表中男生的记录加上删除标记。

DELETE FROM 学生 WHERE 性别="男"

3、将选课表中所有课程的成绩分别提高5分。将课号为“4”的课程的成绩置为空值。

UPDATE 选课 SET 成绩=成绩+5

UPDATE 选课 SET 成绩=NULL WHERE 课号="4"

五、定义表结构

1、建立研究生表,该表不属于任何数据库,其结构如表所示:

字段名

字段类型

字段长度

小数位数

特殊要求

学号

C

6

 

 

姓名

C

8

 

 

性别

C

2

 

 

年龄

N

3

0

 

入学年月

D

 

 

允许空值

CREATE TABLE 研究生 FREE (学号 C(6),姓名 C(8),性别 C(2),年龄 N(3,0),入学年月 D NULL)

2、假设已经建立了XSK数据库,在XSK中建立“学生1”表,其结构如表所示

字段名

字段类型

字段长度

小数位数

特殊要求

学号

C

6

 

主索引

姓名

C

8

 

不能为空

性别

C

2

 

 

年龄

N

3

0

年龄大于10小于45

是否党员

L

 

 

 

入学年月

D

 

 

默认值为1999年9月1日

OPEN DATABASE XSK

CREATE TABLE 学生1 (学号 C(6) PRIMARY KEY,姓名 C(8) NOT NULL,性别 C(2),;

年龄 N(3,0) CHECK 年龄>10 AND 年龄<45 ERROR "年龄必须大于10小于45",是否党员 L,;

入学年月 D DEFAULT {^1999-9-1})

3、在XSK数据库建立“课程1”表,其结构如表所示:

字段名

字段类型

字段长度

小数位数

特殊要求

课号

C

4

 

主索引

课程名

C

10

 

不能为空

学分

N

2

 

 

CREATE TABLE 课程1 (课号 C(4) PRIMARY KEY,课程名 C(10) NOT NULL,学分 N(2))

4、在XSK数据库建立“选课1”表,其结构如表所示:

字段名

字段类型

字段长度

小数位数

特殊要求

学号

C

6

 

外索引与学生表建立关系

课号

C

4

 

外索引与课程表建立关系

成绩

N

5

2

 

CREATE TABLE 选课1 (学号 C(6) REFERENCE 学生,课号 C(4) REFERENCE 课程,成绩 N(5,2))

六、修改表结构

1、为“课程1”表添加一个开课学期字段,字段类型为数值型,长度为1。

ALTER TABLE 课程1 ADD COLUMN 开课学期 N(1)

2、修改开课学期字段为字符型,合法值为1或2。

ALTER TABLE 课程1 ALTER COLUMN 开课学期 C(1) CHECK 开课学期="1" OR 开课学期="2"

3、删除“课程1”表中对开课学期字段的合法值约束,设置默认值为1。

ALTER TABLE 课程1 ALTER 开课学期 DROP CHECK

ALTER TABLE 课程1 ALTER 开课学期 SET DEFAULT "1"

4、删除“课程1”表中的开课学期字段。修改课程名字段为“课名”字段。

ALTER TABLE 课程1 DROP 开课学期 RENAME 课程名 TO 课名

5、在“学生1”表的“年龄”字段上建立候选索引。

ALTER TABLE 学生1 ADD UNIQUE 年龄 TAG 年龄

6、在“学生1”表中添加一个出生日期字段,删除年龄字段。

ALTER TABLE 学生1 ADD 出生日期 D

ALTER TABLE 学生1 DROP UNIQUE TAG 年龄 DROP 年龄

七、补充练习

利用订货管理数据库中表数据,用SQL完成查询。

1、检索在北京的供应商的名称。

SELECT 供应商名 FROM 供应商 WHERE 地址="北京"

2、检索出向供应商S3发过订购单的职工的职工号和仓库号。

方法一(嵌套查询):

SELECT 职工号,仓库号 FROM 职工 WHERE 职工号 IN;

(SELECT 职工号 FROM 订购单 WHERE 供应商号="S3")

方法二(连接查询):

SELECT 职工.职工号,仓库号 FROM 职工,订购单 ;

WHERE 职工.职工号=订购单.职工号 AND 供应商号="S3"

3、检索出和职工E1、E3都有联系的北京的供应商信息。

SELECT * FROM 供应商 WHERE 地址="北京" AND 供应商号 IN;

(SELECT 供应商号 FROM 订购单 WHERE 职工号="E1") AND 供应商号 IN;

(SELECT 供应商号 FROM 订购单 WHERE 职工号="E3")

4、检索出向S4供应商发出订购单的仓库所在的城市。

SELECT 城市 FROM 仓库,职工,订购单 WHERE 仓库.仓库号=职工.仓库号 ;

AND 职工.职工号=订购单.职工号 AND 供应商号="S4"

5、检索出由工资多于1230元的职工向北京的供应商发出的订购单号。

SELECT 订货单号 FROM 职工,订购单,供应商 WHERE 职工.职工号=订购单.职工号;

AND 订购单.供应商号=供应商.供应商号 AND 工资>1230 AND 地址="北京"

6、检索出所有仓库的平均面积。

SELECT AVG(面积) AS 面积 FROM 仓库

7、检索出每个仓库中工资多于1220元的职工个数。

SELECT 仓库号,COUNT(*) 职工个数 FROM 职工WHERE工资>1220 GROUP BY 仓库号

8、检索工资低于本仓库平均工资的职工信息。

SELECT * FROM 职工 AA WHERE 工资<(SELECT AVG(工资) FROM 职工 BB WHERE AA.仓库号=BB.仓库号)

以上是关于SQL的练习,求答案!!!的主要内容,如果未能解决你的问题,请参考以下文章

求Linux操作系统练习题的答案!!!

sql 练习题及答案

Oracle的sql语句上级练习和答案

求一些C语言入门简单的数学题目,练习一下,顺便附上答案哈

几道sql题求答案

Oracle的sql语句上机练习和答案