데이터베이스 실험 2: 데이터 쿼리

실험 2 데이터 쿼리

하나. 목적

1. 데이터베이스에 있는 데이터의 다른 쿼리 방법 및 응용 프로그램을 이해합니다.

2. 다양한 쿼리 요구 사항을 구현하는 방법을 배웁니다.

3. 다양한 쿼리의 유사점과 차이점 및 변환 방법을 알아보세요.

2. 실험적 내용

실험 1을 바탕으로 계산열, 합산, 최대값과 최소값, 다양한 선택 조건, 문자 매칭, 그룹화 및 정렬, 조인 쿼리, 중첩 쿼리, EXISTS 쿼리 등 기타 쿼리문 활용을 연습하고, 경험 다양한 쿼리 간의 유사점, 차이점 및 변환을 학습하고, 다양한 쿼리의 실행 프로세스를 이해하며, 간단하고 포괄적인 응용을 위한 좋은 기반을 마련합니다.

1. 공급업체 번호가 S1인 공급업체의 이름 SNAME과 해당 공급업체가 위치한 도시: CITY를 쿼리합니다.

2. 색상이 빨간색인 부품번호를 조회하세요.

3. 프로젝트 위치가 Tianjin인 프로젝트 이름 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가 사용됩니다.

3. 실험과정 및 코드

1. 공급업체 번호가 S1인 공급업체의 이름 SNAME과 해당 공급업체가 위치한 도시: CITY를 쿼리합니다.

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

2. 색상이 빨간색인 부품번호를 조회하세요.

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

3. 프로젝트 위치가 Tianjin인 프로젝트 이름 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)
);

4. 실험 요약

  1. 결과의 열 별칭을 쿼리하려면 선택 열 이름 뒤에 공백과 열 별칭을 추가하기만 하면 됩니다.

        목록 항목 + 공백 + [헤더 이름] 뒤에 as를 사용하여 공백을 바꿀 수도 있습니다.

  1. LOWER(SNO)를 사용하여 문자열을 나타내려면 소문자를 사용하고, UPPER(SNO)를 사용하여 문자열을 나타내려면 대문자를 사용하십시오.
  2. MySQL의 문자 집합과 정렬 규칙이 다르며 정렬 결과도 다릅니다.
  3. 평균을 구하는 함수: avg()
  4. 숫자를 세는 함수: count()
  5. 퍼지 쿼리의 경우 "="가 아닌 LIKE를 사용합니다. %는 임의의 문자 수를 나타내고 _(밑줄)은 문자의 위치를 ​​나타냅니다.
  6. 등가 조인과 왼쪽 외부 조인은 모두 여러 테이블을 완전히 조인한 다음 조건에 따라 쿼리합니다.
  7. 다수의 다중 테이블 쿼리에는 중첩 쿼리를 사용하는 것이 매우 편리하며, 이는 레이어별로 분석할 수 있어 비교적 쉽습니다. 참고: 중첩 쿼리는 쿼리 결과가 테이블에 속하는 경우에만 사용할 수 있습니다.
  8. Exist 쿼리의 원리는 for 루프와 비슷하다고 생각하시면 됩니다. 예를 들어 18번 문제에서는 j1부터 j7까지 순서대로 쿼리가 입력되는데, Exist는 조건을 만족하는지, 부품에 대한 조건을 만족하는지 판단하는데 사용됩니다. 천진에서 생산됨 존재하는 것은 참이고 존재하지 않는 것은 거짓이며, 출력되지 않고 천진에서 생산된 부품의 조건에 맞지 않으면 존재하지 않는 것이 참인 경우에 출력할 수 있다. (단순히 이해하는 방법이므로 표현이 적절하지 않을 수 있습니다.)

추천

출처blog.csdn.net/pzcxl/article/details/124661754