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