"Database Principles MySQL"의 네 번째 컴퓨터 실험

1. 연결 쿼리

1. 여학생의 학번과 총점 조회

SELECT s.sno,SUM(degree)
FROM student s
RIGHT JOIN sc r
ON s.sno=r.sno
WHERE ssex='女'
GROUP BY s.sno

2. 리용이 선택한 과목과 등급을 확인한다.

SELECT r.cno,degree
FROM sc r
LEFT JOIN student s
ON r.sno=s.sno
WHERE sname='李勇'

3. Mr. Li Xin이 가르치는 과정의 과정 이름을 쿼리합니다.

SELECT c.cname
FROM course c
RIGHT JOIN teaching g
ON c.cno=g.cno
INNER JOIN teacher t
ON g.tno=t.tno
WHERE tname='李新'

4. 여교사가 가르치는 과목의 과목번호와 과목명 조회

SELECT c.cno,c.cname
FROM course c
RIGHT JOIN teaching g
ON c.cno=g.cno
INNER JOIN teacher t
ON g.tno=t.tno
WHERE tsex='女'

5. "Wang"이라는 성을 가진 학생이 공부한 과정 이름을 쿼리합니다.

SELECT c.cname
FROM course c
RIGHT JOIN sc r
ON c.cno=r.cno
INNER JOIN student s
ON r.sno=s.sno
WHERE sname LIKE '王%'

6. "데이터베이스" 과목을 수강하고 성적이 80에서 90 사이인 학생의 학생 번호와 성적을 쿼리합니다.

SELECT r.cno,degree
FROM sc r
INNER JOIN course c
ON r.cno=c.cno
WHERE cname='数据库'
AND degree BETWEEN 80 AND 90

7. "C03" 과정을 수강하는 학생의 평균 연령을 쿼리합니다.

SELECT AVG(YEAR(CURDATE())-YEAR((Sbirthday))) 平均年龄
FROM student s
RIGHT JOIN sc
ON s.sno=sc.sno
WHERE cno='C03'

8. "database"라는 과목명을 가진 학생의 학번과 이름을 조회

SELECT s.sno,sname
FROM student s
RIGHT JOIN sc
ON s.sno=sc.sno
INNER JOIN course c
ON sc.cno=c.cno
WHERE c.cname='数据库'

9. 교사 "Li Xin"의 과목 번호, 과목을 수강하는 학생의 학생 번호 및 성적 조회

SELECT g.cno,sno,degree
FROM teaching g
RIGHT JOIN sc
ON sc.cno=g.cno
LEFT JOIN teacher t
ON g.tno=t.tno
WHERE tname='李新'

10. 3학기 개설과목명, 수강인원, 수강생의 성적 조회

SELECT c.cname,sno,degree
FROM course c
RIGHT JOIN sc
ON c.cno=sc.cno
LEFT JOIN teaching g
ON sc.cno=g.cno
WHERE cterm=3

2. 중첩 쿼리
1. 2과목 이상 수강한 남학생 이름 쿼리

SELECT s.sname
FROM student s
WHERE ssex='男'
AND sno=(
	SELECT sno
	FROM sc
	GROUP BY sno
	HAVING COUNT(sno)>=2
)

2. Liu Chen과 같은 학과에 있는 학생의 이름을 쿼리합니다.

SELECT s.sname
FROM student s
WHERE sname!='刘晨' 
AND sdept=(
	SELECT sdept
	FROM student
	WHERE sname='刘晨'
)

3. 학번이 Liu Chen보다 어린 학생과 Liu Chen보다 어린 학생의 이름을 쿼리하고 MySQL에서 sysdate()와 now() 함수 간의 기능적 차이점을 기록합니다.

SELECT s.sname	
FROM student s
WHERE sno<(SELECT sno FROM student WHERE sname='刘晨')
AND (YEAR(CURDATE())-YEAR(Sbirthday))<(
	SELECT (YEAR(CURDATE())-YEAR(Sbirthday))
	FROM student
	WHERE sname='刘晨'
)

NOW(): 문이 실행되기 시작하는 시간을 기준으로
SYSDATE(): 시스템의 실시간 시간으로 시간 불일치가 발생하는 지연이 있으며 마스터 라이브러리와 슬레이브 라이브러리의 반환 값이 다릅니다. 실행될 때

4. 남학생보다 생일이 더 많은 여학생의 이름과 학과를 질의한다.

SELECT s.sname,sdept
FROM student s
WHERE ssex='女'
AND YEAR(Sbirthday)>ALL(
	SELECT YEAR(sbirthday)
	FROM student 
	WHERE ssex='男'
)

5. 해당 과목의 평균 성적보다 성적이 높은 학생의 학번, 학번, 성적 조회

SELECT cno,degree
FROM sc r
WHERE r.degree>(
	SELECT AVG(degree)
	FROM sc
	WHERE sc.cno=r.cno
)

6. "C01"을 가르치지 않는 교사의 이름을 쿼리하십시오.

SELECT t.tname
FROM teacher t
WHERE tno NOT IN(
	SELECT tno
	FROM teaching g
	WHERE cno='C01'
)

7. "C02" 과목을 수강하지 않은 학생의 학번과 이름 조회

SELECT s.sno,sname
FROM student s
WHERE sno NOT IN(
	SELECT sno
	FROM sc
	WHERE cno='C02'
)

8. "데이터베이스" 과목을 수강한 수강생의 학번, 이름, 학과 조회

SELECT s.sno,sname,sdept
FROM student s
WHERE sno IN(
	SELECT sno
	FROM sc
	INNER JOIN course c
	ON sc.cno=c.cno
	WHERE cname='数据库'
)

9. 모든 과정을 수강한 학생의 이름을 쿼리합니다.

SELECT s.sname
FROM student s
WHERE sno IN(
	SELECT sno
	FROM sc
	GROUP BY sno
	HAVING COUNT(sno)=(
		SELECT COUNT(cno)
		FROM course
	)
)

10. "C01" 과정에서 80점 이상 득점한 학생의 정보를 찾기 위해 각각 하위 쿼리와 조인 쿼리를 사용합니다
.

SELECT *
FROM student s
WHERE sno IN(
	SELECT sno
	FROM sc
	WHERE cno='C01'
	AND degree>80
)

연결 쿼리:

SELECT s.*
FROM student s
LEFT JOIN sc r
ON s.sno=r.sno
WHERE cno='C01'
AND degree>80

3. 데이터 업데이트
1. Student 테이블에 레코드 삽입('20050203', 'Zhang Jing', 'female', '1981-3-21', 'CS', 'e-commerce')

INSERT INTO `student`(`sno`,`sname`,`ssex`,`sbirthday`,`sdept`,`speciality`)
VALUES('20050203','张静','女','1981-3-21','CS' ,'电子商务')

2. 학번이 '20050302'이고 이름이 'Li Si'인 학생의 정보를 입력합니다.

INSERT INTO `student`(`sno`,`sname`)
VALUES('20050302','李四')

3. 남학생 기록을 테이블 TS에 저장

CREATE TABLE ts(
	SELECT * 
	FROM student 
	WHERE ssex='男'
)

4. 학번이 '20150202'인 학생의 이름을 '장화'로, 학과를 'CS', 전공을 '멀티미디어공학'으로 변경

UPDATE `student` 
SET `sname`='张华',`sdept`='CS',`Speciality`='多媒体技术'
WHERE sno=20050202

5. "C03" 과목을 수강하는 '20150201' 학생의 성적을 본 과목의 평균 성적으로 변경

UPDATE `sc`
SET degree=(
	SELECT * FROM(
		SELECT AVG(degree)
		FROM sc
		WHERE cno='C03'
	) a
)
WHERE sno='20050201'
AND cno='C03'

6. 여학생 성적 5% 상승

UPDATE `sc`
SET degree=(1+0.05)*degree 
WHERE sno IN(
	SELECT sno
	FROM student
	WHERE ssex='女'
)

7. (1) "데이터베이스" 과목을 수강한 학생의 성적을 NULL로 변경

UPDATE `sc`
SET degree=NULL
WHERE cno IN(
	SELECT cno
	FROM course
	WHERE cname='数据库'
)

(2) 과목 '01'의 성적을 임의의 성적 데이터로 업데이트하고 성적의 값 범위는 0에서 100 사이입니다.

UPDATE `sc`
SET degree=FLOOR(RAND()*100)
WHERE cno='C01'

8. 학번이 20150302인 학생기록 삭제

DELETE FROM student
WHERE sno=20050302

9. "Liu Chen"의 모든 코스 선택 기록 삭제

DELETE FROM sc
WHERE sno IN(
	SELECT sno
	FROM student
	WHERE sname='刘晨'
)

10. 전자상거래를 전공하는 모든 학생의 교과목 선택기록 삭제

DELETE FROM sc
WHERE sno IN(
	SELECT sno
	FROM student
	WHERE speciality='电子商务'
)

생각하기 질문
1. 수량자 [NOT]EXISTS와 함께 중첩 쿼리를 사용할 때 외부 쿼리의 WHERE 조건이 참인 경우와 거짓인 경우는 언제입니까?

Exists 루프를 사용하여 모양을 하나씩 쿼리합니다. 각 쿼리는 exists의 조건문을 확인합니다. 조건문이 존재하면 레코드 라인을 반환할 수 있습니다(레코드 라인 수에 관계없이 반환할 수 있는 한). 조건문이 true가 되어 현재 루프로 돌아갑니다 반대로 exists의 조건문이 레코드 라인을 반환할 수 없으면 현재 루프의 레코드를 버립니다. exists의 조건은 부울 조건과 같습니다. true입니다. 결과 집합을 반환할 수 있고 결과를 반환할 수 없는 경우 false로 설정

2. DROP 명령과 DELETE 명령의 근본적인 차이점은 무엇입니까? DELETE FROM 명령으로 삭제된 데이터를 복구하는 방법.

  1. 트리거 조건이 다릅니다
    .delete 문은 데이터베이스 작업 언어(dml)입니다.이 작업은 rollbacksegment에 배치되며 트랜잭션이 커밋된 후 적용되며 실행될 때 해당 트리거가 트리거됩니다.
    drop은 데이터베이스 정의 언어(ddl)이며 작업이 즉시 적용되고 원본 데이터가 롤백 세그먼트에 배치되지 않으며 롤백할 수 없으며 작업이 트리거를 트리거하지 않습니다.
  2. 사용법이 다릅니다
    . delete는 내용만 삭제하고 공간을 해제하지만 정의는 삭제하지 않는 반면 delete는 행 데이터 또는 전체 테이블 데이터를 삭제할 수 있습니다.
    삭제는 콘텐츠 및 정의를 삭제하고 공간을 확보하는 것입니다. drop 문을 실행하면 이 테이블의 구조가 함께 삭제됩니다.
  3. 삭제의 실행 속도는
    삭제의 실행 속도와 다릅니다.
    삭제는 삭제보다 빠르게 실행됩니다.

복원 방법: Delete 문을 잘못 사용하면 테이블 데이터만 삭제되지만 테이블 구조는 그대로 남아 있습니다. 데이터베이스의 binlog 저장 위치를 ​​찾고 mysqlbinlog 명령의 --start-datetime 매개변수를 사용하여 데이터 위치를 빠르게 찾으십시오.

시작점을 결정합니다.

mysqlbinlog -vv --start-datetime='2022-05-19 17:20:00' on.000004| head -1000 |more

끝점을 결정합니다.

mysqlbinlog -vv --start-datetime='2022-05-19 17:20:00' --stop-datetime='2022-05-19 17:23:00' on.000004| tail -1000 |more

복원할 데이터 내보내기

mysqlbinlog -vv --start-position=192 --stop-position=435 on.000004 |grep ^"###" >/tmp/bin_data

DELETE 문을 INSERT 문으로 변환

cat /tmp/bin_data | sed -n '/###/p' | sed 's/### //g;s/\/\*.*/,/g;s/DELETE FROM/INSERT INTO/g;s/WHERE/SELECT/g;' |sed -r 's/(@6.*),/\1;/g' | sed 's/@[1-9]=//g' | sed 's/@[1-9][0-9]=//g' >/tmp/student.sql

INSERT 문을 데이터베이스로 가져오기

mysql -hlocalhost -P3306 -uroot -pyL@98 > /tmp/student.sql

완전한 데이터 복구

3. INSERT, UPDATE 및 DELETE 명령을 사용하여 여러 테이블에서 동시에 작업할 수 있습니까?여러 테이블을 동시에 작업해야 하는 경우 어떻게 해야 합니까?

INSERT, UPDATE, DELETE는 하나의 테이블에서만 동작 가능
다중 테이블 동작을 위해 트리거 사용 가능

Supongo que te gusta

Origin blog.csdn.net/Aurinko324/article/details/124867865
Recomendado
Clasificación