数据库实验二之数据查询

实验二 数据查询

一.实验目的

1.理解数据库中数据的其他查询方法和应用;

2.学会各种查询要求的实现;

3.学会各种查询的异同及相互之间的转换方法。

二. 实验内容

在实验1的基础上,练习其它查询语句的使用,包括计算列、求和、最大、最小值、各类选择条件、字符匹配、分组和排序,连接查询、嵌套查询及EXISTS查询等,体会各种查询的异同及相互之间的转换,体会各种查询的执行过程,为简单综合应用打下良好的基础。

1.       查询供应商号码为S1的供应商的名称SNAME,所在城市CITY

2.       查询颜色为红色的零件号码

3.       查询工程所在地为天津的工程名称JNAME

4.       查询供应商号和名称,分别用小写字母和大写字母表示供应商代码

5.       查询零件的详细信息,用结果属性名用中文显示。

6.       查询供应工程J1零件P1的供应商号SNO

7.       查询供应商的名称和所在城市,并按照所在城市升序排序,同一个城市的按照供应商的名称降序排序

8.       查询使用供应商S1所供应零件的工程号码

9.       查询各种零件的平均重量

10.   查询零件的总个数

11.   查询所有以“螺”字开头的零件的零件号、零件名和颜色

12.   查询各个供应商供应的零件P3总数量

13.   供应工程J1红色零件的供应商号SNO

14.   工程项目J2使用的各种零件的名称及数量

15.   使用上海产的零件的工程的名称

16.   所有项目的使用零件的情况(无论有没有使用零件),包括项目代码、项目名称、零件代码和零件数量

17.   供应商S1和S3供应的相同的零件编号

18.   没有使用天津产的零件的工程号码

19.   没有使用天津供应商生产的红色零件的工程号

20.   至少用了供应商S1所供应的全部零件的工程号Jno

三. 实验过程与代码

1.       查询供应商号码为S1的供应商的名称SNAME,所在城市CITY

SELECT SNAME,CITY
FROM s
WHERE sno='s1';

2.       查询颜色为红色的零件号码

SELECT PNO 零件号码
FROM p
WHERE color='红';

3.       查询工程所在地为天津的工程名称JNAME

SELECT JNAME
FROM j
WHERE city='天津';

4.       查询供应商号和名称,分别用小写字母和大写字母表示供应商代码

--1)	小写字母表示供应商代码:
SELECT LOWER(SNO)小写字母表示供应商代码,SNAME 名称
FROM s
--2)	大写字母表示供应商代码:
SELECT UPPER(SNO)大写字母表示供应商代码,SNAME 名称
FROM s

5.       查询零件的详细信息,用结果属性名用中文显示。

SELECT PNO 零件代码,PNAME 零件名,COLOR 颜色,WEIGHT 重量 
FROM p

6.       查询供应工程J1零件P1的供应商号SNO

SELECT SNO
FROM spj
WHERE JNO='J1'AND PNO='P1';

7.       查询供应商的名称和所在城市,并按照所在城市升序排序,同一个城市的按照供应商的名称降序排序

SELECT SNAME,CITY
FROM s
ORDER BY CITY,SNAME DESC;

如果排序结果感觉跟习惯不同,原因是MySQL编码格式造成的, 们只需要将utf的编码格式换成gb2312(如下图所示),排序规则换成gb2312_chinese_ci就可以实现看似正常一点的排序结果了

8.       查询使用供应商S1所供应零件的工程号码

SELECT DISTINCT JNO
FROM spj
WHERE SNO='S1';

9.       查询各种零件的平均重量

--按名字分类
SELECT PNAME,avg(WEIGHT)平均重量
FROM p
GROUP BY PNAME

10.   查询零件的总个数

SELECT COUNT(*) 零件总数
FROM p

11.   查询所有以“螺”字开头的零件的零件号、零件名和颜色

SELECT PNO 零件号,PNAME 零件名,COLOR 颜色
FROM p
WHERE PNAME LIKE'螺%';

12.   查询各个供应商供应的零件P3总数量

SELECT  SNO,SUM(QTY)零件P3总数量
FROM spj
WHERE PNO='P3'
GROUP BY SNO
	--“=”可以用“in”来代替:
SELECT  SNO,SUM(QTY)零件P3总数量
FROM spj
WHERE PNO in ('P3')
GROUP BY SNO
	--“not in”也可以实现:
SELECT  SNO,SUM(QTY)零件P3总数量
FROM spj
WHERE PNO NOT in('P1','P2','P4','P5','P6')
GROUP BY SNO
--但是,怎样显示所有供应商呢(没有供应P3的显示为空)?这就需要进行s表与spj表的连接了
SELECT s1.SNO,SUM(QTY)零件P3总数量
FROM s s1 LEFT OUTER JOIN (
	SELECT * 
	FROM spj 
	WHERE PNO='P3') s2 ON s1.SNO=s2.SNO
GROUP BY SNO

13.   供应工程J1红色零件的供应商号SNO

--左外连接:
SELECT SNO
FROM p LEFT OUTER JOIN spj ON p.PNO=spj.PNO
WHERE spj.JNO='J1' AND p.color='红'
--等值连接:
SELECT sno
FROM p,spj
WHERE p.pno=spj.pno AND jno='j1' AND color='红'
--嵌套查询
SELECT sno
FROM spj
WHERE jno='j1' AND pno in(
						SELECT pno
						FROM p
							WHERE color='红')

14.   工程项目J2使用的各种零件的名称及数量

--左外连接:
SELECT p.PNAME,spj.QTY 
FROM spj LEFT OUTER JOIN p ON spj.PNO=P.PNO 
WHERE JNO='J2';
--等值连接:
SELECT PNAME 零件名,QTY 数量
FROM spj,p  
WHERE  spj.PNO=P.PNO and JNO='J2';

15.   使用上海产的零件的工程的名称

--三个表的左外连接:
SELECT  DISTINCT j.JNAME
FROM spj LEFT OUTER JOIN s ON spj.SNO=s.SNO LEFT OUTER JOIN j ON spj.JNO=j.JNO
WHERE s.CITY='上海';
--三层嵌套查询:
SELECT DISTINCT JNAME
FROM j
WHERE jno in(SELECT jno 
            FROM spj 
            WHERE sno in(SELECT sno 
                         FROM s 
                         WHERE city='上海'));
--三个表的等值连接:
SELECT DISTINCT JNAME
FROM j,s,spj
WHERE j.JNO=spj.JNO AND spj.SNO=s.SNO AND s.CITY='上海'

16.   所有项目的使用零件的情况(无论有没有使用零件),包括项目代码、项目名称、零件代码和零件数量

SELECT  J1.JNO 项目代码,J1.JNAME 项目名称,SPJ1.PNO 零件代码,SPJ1.QTY 零件数量
FROM j J1  LEFT OUTER JOIN spj SPJ1 ON SPJ1.JNO=J1.JNO 
ORDER BY J1.JNO;

17.   供应商S1和S3供应的相同的零件编号

--内连接:
SELECT DISTINCT spj1.PNO 
FROM spj spj1  INNER JOIN  spj spj2 ON spj1.PNO=spj2.PNO 
WHERE spj1.SNO='S1' AND spj2.SNO='S3';
--旧式内连接:
SELECT DISTINCT `FIRST`.PNO
FROM spj FIRST,spj SECOND
WHERE `FIRST`.PNO=`SECOND`.PNO AND `FIRST`.SNO='S1'AND `SECOND`.SNO='S3'

18.   没有使用天津产的零件的工程号码

--EXISTS
SELECT JNO 
FROM j  
WHERE NOT EXISTS (
						SELECT * 
						FROM spj 
						WHERE SNO IN (
									SELECT SNO 
									FROM s 
									WHERE CITY='天津') AND j.JNO=spj.JNO);
--嵌套查询:
SELECT jno
FROM j
WHERE jno not in(
		SELECT  DISTINCT JNO
		FROM spj
		WHERE sno in(SELECT sno 
					FROM s
					WHERE CITY='天津'));

19.   没有使用天津供应商生产的红色零件的工程号

--Exist方法:
SELECT JNO 
FROM j  
WHERE NOT EXISTS (
					SELECT * 
					FROM spj 
					WHERE SNO IN (
								SELECT SNO 
								FROM s 
								WHERE CITY='天津' ) AND PNO IN (
												    SELECT PNO 
												    FROM p 
										            WHERE COLOR='红') AND 
                                                    j.JNO=spj.JNO);
--嵌套查询:
SELECT jno
FROM j
WHERE jno not in(
				SELECT  DISTINCT JNO
				FROM spj
				WHERE sno in(SELECT sno 
									FROM s
									WHERE CITY='天津')
		  		 AND pno in(SELECT pno 
					        FROM p
					        WHERE color='红'));

20.   至少用了供应商S1所供应的全部零件的工程号Jno

SELECT DISTINCT JNO
FROM spj spj1
WHERE NOT EXISTS
(SELECT * 
 FROM spj spj2 
 WHERE spj2.SNO='S1' AND NOT EXISTS
(SELECT * 
 FROM spj spj3 
 WHERE spj3.JNO=spj1.JNO AND spj3.PNO=spj2.PNO)
);

四. 实验总结

  1. 查询结果列别名,只需要在select 列名后面+空格,+列别名就可以了。

        列表项后面+空格+[表头名],也可以用as代替空格。

  1. 用小写字母表示字符串用LOWER(SNO),用大写字母表示字符串用UPPER(SNO)。
  2. MySQL的字符集和排列规则不同,排序结果是不同的。
  3. 求平均值的函数:avg()
  4. 统计个数的函数:count()
  5. 模糊查询,用LIKE,不是“=”,%代表任意数量的字符,_(下划线)代表一个字符的位置。
  6. 等值连接和左外连接都是将几个表全连接起来,再根据条件查询。
  7. 很多多表查询用嵌套查询非常方便,可以一层一层分析,比较容易。注意:当查询结果属于一个表里的时候才可以用嵌套查询。
  8. Exist查询的原理可以认为类似一个for循环,比如在18题当中,从j1到j7依次带入查询,通过exist判断是否符合条件,符合天津产的零件的条件,exist为true,not exist为false,不输出,不符合天津产的零件的条件时,not exist为true,就可以输出。(仅仅是理解方法,表述不一定恰当)。
  • 15
    点赞
  • 97
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的,下面是实验七的内容。 实验目的: 1. 掌握Oracle数据库数据控制语句 2. 掌握Oracle数据库用户权限管理 实验环境: Oracle 11g及以上版本 实验步骤: 1. 创建一个测试用户 ```sql create user test identified by test; ``` 2. 授予测试用户查询表的权限 ```sql grant select on 表名 to test; ``` 3. 创建一个测试表 ```sql create table test_table( id number primary key, name varchar2(20) ); ``` 4. 插入测试数据 ```sql insert into test_table values(1,'张三'); insert into test_table values(2,'李四'); insert into test_table values(3,'王五'); ``` 5. 测试用户查询数据 ```sql select * from test_table; ``` 此时会提示“无权访问表”,因为测试用户没有该表的查询权限。 6. 将查询权限授予测试用户 ```sql grant select on test_table to test; ``` 7. 再次查询数据 ```sql select * from test_table; ``` 此时测试用户可以查询到表数据。 8. 创建一个新用户,并给该用户授予所有权限 ```sql create user all_privs identified by all_privs; grant dba to all_privs; ``` 9. 使用新用户登录数据库,查看所有表 ```sql select table_name from user_tables; ``` 可以看到所有表的列表。 10. 退出当前用户,使用管理员用户删除测试用户和测试表 ```sql drop user test cascade; drop table test_table; ``` 实验完成。通过此实验,你应该已经掌握了Oracle数据库数据控制语句和用户权限管理的基本操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值