数据库实验二之数据查询

实验二 数据查询

一.实验目的

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,就可以输出。(仅仅是理解方法,表述不一定恰当)。

猜你喜欢

转载自blog.csdn.net/pzcxl/article/details/124661754