MySQL資料更新

xbhog發表於2020-11-28

MySQL資料更新:

導讀:

  1. 該練習是本人課程學習進行整理的,若有不對,歡迎指出!
  2. 該練習沒有配套的sql檔案,如果需要可以看之前的文章有student表等(MySQL查詢練習);
  3. 這是最後一部分練習題,如果後面有更新,會補上。

第一部分:

1、插入資料

(1)在學生表Student中插入資料:
Sno:9512102 Sname:劉晨 Ssex:男 Sage:20 Sdept:計算機系

Insert into student (sno,sname,ssex,sage,sdept) values('9512102','劉晨','男',20,'計算機系');

(2)在課程表Course中插入資料:
Cno:C06 Cname:資料結構 Ccredit:5 Semster:4

insert into course (cno, cname, ccredit, semster) 
values ('C06', '資料結構', '5', '4');
#或
前提是該屬性列允許為NULL
insert into course values ('c06','資料結構',5,4,null);
insert into course values ('c06','資料結構',5,4,'');

(3)在選課表SC中插入95211班學生選修C04的選課資訊。
提示:
多行資料插入,插入資料中的sno從student表中查詢而來,插入的cno為“C04”

insert into sc(sno, cno) select sno, 'C04' from student
where sno like '95211%';

2、修改資料

(1)將所有學生的年齡增加1歲。

UPDATE student SET sage=sage+1;

(2)修改“9512101”的“C01”課程成績為85。

UPDATE sc SET grade=85 WHERE cno='c01' AND sno='9512101';

(3)修改“王大力”的“計算機導論”課程成績為70。

UPDATE sc SET grade=70 WHERE sno in (SELECT sno FROM student WHERE sname='王大力') AND cno in (SELECT cno from course WHERE cname='計算機導論');

或者:

UPDATE student,sc,course set grade=70 WHERE student.sno=sc.sno AND sc.cno=course.cno and sname='王大力' AND cname='計算機導論';

(4)將所有平均分為75分以上的學生的各門課成績在原來基礎上加5分。
select的結果再通過一箇中間表select多一次,就可以避免這個錯誤

ERROR 1093 (HY000): You can’t specify target table ‘message’ for update in FROM clause

派生表必須使用別名

update sc 
set grade = grade + 5
where sno in 
	(
		select sno 
		from 
		(		
			select sno
			from sc
			group by sno 
			having avg(grade) >= 75 
		) as A
	) ;

(5)修改“高等數學”課程倒數三名成績,在原來分數上減5分。

update sc set grade=grade-5 where cno in
(select cno from course where cname='高等數學')
and grade is not null order by grade limit 3;

更通用,去除成績重複值和為空的情況:

update sc set grade=grade-5 where cno in 
(select sno from couse where cname='高等數學')
and grade in 
(select grade from(
select distinct grade from sc,course where sc.cno=course.cno and 
cname='高等數學' and grade is not null order by grade ase limit 3
) as newtable);

3、刪除資料

(1)刪除“9531102”學生“C05”課程的成績記錄

DELETE FROM sc WHERE sno='9531102' AND cno='c05';

(2)刪除“張海”的所有成績記錄

DELETE FROM sc WHERE sno IN(SELECT sno FROM student where sname='張海');

(3)刪除“資料庫基礎”的全部記錄(包括課程資訊,成績資訊)

DELETE from sc WHERE cno=(SELECT cno from course WHERE cname='資料庫基礎');
DELETE from course WHERE cname='資料庫基礎';

4、建立索引

匯入rental表資料,在customer_id上建立普通索引(通過語句或表設計器均可)
查詢customer_id=367的記錄,記錄查詢時間:

select * 
from rental 
where customer_id = 367 ;
create index ix_ct_id on rental(customer_id);
drop index ix_ct_id on rental ;

有索引情況下的執行時間: 0.001ms
無索引情況下的執行時間: 0.005ms

第二部分:

1.插入圖書資訊:

將圖書資訊插入到book表中,其中書號 7, 書名 組合數學, 作者 劉迪, 價格 36.70, 數量 37。

表結構如下:

book(圖書) 表:bno 書號,bname 書名,author 作者,price 單價,quantity 庫存數

insert into book values('7','組合數學','劉迪','36.70','37');

2.刪除“資料庫基礎”的全部記錄(包括課程資訊,成績資訊)

學生資料庫db_student包括三個資料表student(學生表)、course(課程表)和sc(選課表)。表結構如下:

1、student(學生表):

SNO學號CHAR(7)

SNAME姓名CHAR(10)

SSEX性別CHAR(2)

SAGE年齡SMALLINT

SDEPT所在系 VARCHAR(20)

2、course(課程表)

CNO課程號CHAR(10)

CNAME課程名VARCHAR(20)

CCREDIT學分SMALLINT

SEMSTER學期SMALLINT

PERIOD學時SMALLINT

3、sc(選課表)

SNO 學號CHAR(7)

CNO 課程號CHAR(10)

GRADE 成績 SMALLINT

delete from sc where cno =(select cno from course where sc.cno=course.cno and cname='資料庫基礎' ) ;
delete from course where cno='資料庫基礎';

3.刪除圖書資訊

從BOOK表中刪除當前無人借閱的圖書記錄。

表結構如下:

book(圖書) 表:bno 書號,bname 書名,author 作者,price 單價,quantity 庫存數

borrow(借書記錄)表 :cno 借書卡號,bno 書號,rdate 還書日期

delete from book
where bno not in (
    select bno
  from borrow
  where borrow.bno = book.bno
);

4.修改計算機系李勇的VB課程成績為60

修改計算機系李勇的VB課程成績為60。

表結構如下

course表:

student表:

sc表:

update sc set grade=60
where sno in 
(select sno from student where sname='李勇' and sdept='計算機系') 
and
  cno in 
(select cno from course where cname='VB');

5.將所有平均分為75分以上的學生的各門課成績在原來基礎上加5分

將所有平均分為75分以上的學生的各門課成績在原來基礎上加5分。

學生資料庫db_student包括三個資料表student(學生表)、course(課程表)和sc(選課表)。表結構如下:

1、student(學生表):

SNO學號CHAR(7)

SNAME姓名CHAR(10)

SSEX性別CHAR(2)

SAGE年齡SMALLINT

SDEPT所在系 VARCHAR(20)

2、course(課程表)

CNO課程號CHAR(10)

CNAME課程名VARCHAR(20)

CCREDIT學分SMALLINT

SEMSTER學期SMALLINT

PERIOD學時SMALLINT

3、sc(選課表)

SNO 學號CHAR(7)

CNO 課程號CHAR(10)

GRADE 成績 SMALLINT

update sc
set grade = grade + 5
where sno in 
(
    select sno
    from 
  (
    select sno 
    from sc
       group by sno
      having avg(grade) >75    
  ) as A
);

注意:

派生子查詢需要設定別名。

6.修改“高等數學”課程倒數三名成績,在原來分數上減5分

修改“高等數學”課程倒數三名成績,在原來分數上減5分。

學生資料庫db_student包括三個資料表student(學生表)、course(課程表)和sc(選課表)。表結構如下:

1、student(學生表):

SNO學號CHAR(7)

SNAME姓名CHAR(10)

SSEX性別CHAR(2)

SAGE年齡SMALLINT

SDEPT所在系 VARCHAR(20)

2、course(課程表)

CNO課程號CHAR(10)

CNAME課程名VARCHAR(20)

CCREDIT學分SMALLINT

SEMSTER學期SMALLINT

PERIOD學時SMALLINT

3、sc(選課表)

SNO 學號CHAR(7)

CNO 課程號CHAR(10)

GRADE 成績 SMALLINT

UPDATE sc
SET grade=grade-5
WHERE cno IN(
SELECT cno FROM course WHERE cname='高等數學')
ORDER BY grade ASC LIMIT 3;

7.修改borrow表增加一列;修改日期資料(兩條語句完成)

修改borrow表增加借書日期bdate列,列型別為datetime;

將機械系的同學的借書日期值修改為還書日期的前兩個月的時間。

用兩條語句完成,日期的修改可以用date_add( )或adddate( )。

原表結構如下:

card(借書卡) 表:cno 卡號,name 姓名,class 班級

borrow(借書記錄)表 :cno 借書卡號,bno 書號,rdate 還書日期

alter table borrow 
add column bdate datetime;
update borrow 
set bdate = date_add(rdate,interval - 2 month)
where cno in 
(select cno 
 from card 
 where deptName = '機械系');

註釋:

定義和用法
DATE_ADD() 函式向日期新增指定的時間間隔。
DATE_SUB() 函式向日期減少指定的時間間隔。
語法
DATE_ADD(date,INTERVAL expr type)
DATE_SUB(date,INTERVAL expr type)

date :引數是合法的日期表示式。

expr:引數是您希望新增的時間間隔。

type :引數可以是下列值,具體引數及用法請查下文章最後的部落格連結

8.在選課表SC中插入95211班學生選修C04的選課資訊。

在選課表SC中插入95211班學生選修C04的選課資訊。

提示:多行資料插入,插入的資料的sno從student表中查詢而來,插入的cno為“C04”

學生資料庫db_student包括三個資料表student(學生表)、course(課程表)和sc(選課表)。表結構如下:

1、student(學生表):

SNO學號CHAR(7)

SNAME姓名CHAR(10)

SSEX性別CHAR(2)

SAGE年齡SMALLINT

SDEPT所在系 VARCHAR(20)

2、course(課程表)

CNO課程號CHAR(10)

CNAME課程名VARCHAR(20)

CCREDIT學分SMALLINT

SEMSTER學期SMALLINT

PERIOD學時SMALLINT

3、sc(選課表)

SNO 學號CHAR(7)

CNO 課程號CHAR(10)

GRADE 成績 SMALLINT

INSERT INTO	sc(sno,cno) select sno,'c04' from student where sno like '95211%';

9.在課程表Course中插入資料:

在課程表Course中插入資料:

Cno:C06 Cname:資料結構 Ccredit:5 Semster:4

表結構如下:course(課程表)

列名 說明 資料型別 約束
CNO 課程號 CHAR(10) 主碼
CNAME 課程名 VARCHAR(20) NOT NULL
CCREDIT 學分 SMALLINT
SEMSTER 學期 SMALLINT
PERIOD 學時 SMALLINT
insert into course (cno,cname,ccredit,semster) values('c06','資料結構','5','4');

10.在學生表Student中插入資料

在學生表Student中插入資料:

Sno:9512102 Sname:劉晨 Ssex:男 Sage:20 Sdept:計算機系

表結構如下:student(學生表)

列名 說明 資料型別 約束
SNO 學號 CHAR(7) 主碼
SNAME 姓名 CHAR(10) NOT NULL
SSEX 性別 CHAR(2) 取“男”或“女”
SAGE 年齡 SMALLINT
SDEPT 所在系 VARCHAR(20) 預設“計算機系”
insert into student values('9512102','男','20','計算機系');

11.使用insert set 語句向sc表中插入資料。

使用insert set 向sc表中插入一條選課記錄,姓名為周璐的學生,課程名為資料庫原理與應用的課程的選課記錄。

student表:

course表:

sc表:

用法:

INSERT INTO tablename SET column_name1 = value1, column_name2 = value2,…;
insert sc
set sno=(
  select sno 
  from student 
  where sname='周璐'),
cno=(
  select cno 
  from course 
  where cname='資料庫原理與應用');

12.插入計算機系學生C01課程的選課記錄。

在sc表中插入計算機系所有學生C01課程的選課記錄。

student表結構:

sc表結構:

insert into sc(sno,cno) select sno,'c01' from student where sdept='計算機系';

13.一次向student表中插入多條資料

一次向student表中插入兩條記錄,其中王大力的系別用預設值賦值。
兩行資料的學號,姓名,性別,年齡和系別分別如下:
9520103,王敏,女,20,資訊系;
9520104,王大力,男,19。

student表結構:

insert into student values('9520103','敏','女','20','資訊系'),('9520104','王大力','男','19');

14.向course中插入資料

在course表中插入一新記錄,課程號為c06,課程名為軟體測試,學分為4。

course表結構:

insert into course('c06','軟甲測試',null,'4');

15.刪除“9531102”學生“C05”課程的成績記錄。

刪除“9531102”學生“C05”課程的成績記錄。

學生資料庫db_student包括三個資料表student(學生表)、course(課程表)和sc(選課表)。表結構如下:

1、student(學生表):

SNO學號CHAR(7)

SNAME姓名CHAR(10)

SSEX性別CHAR(2)

SAGE年齡SMALLINT

SDEPT所在系 VARCHAR(20)

2、course(課程表)

CNO課程號CHAR(10)

CNAME課程名VARCHAR(20)

CCREDIT學分SMALLINT

SEMSTER學期SMALLINT

PERIOD學時SMALLINT

3、sc(選課表)

SNO 學號CHAR(7)

CNO 課程號CHAR(10)

GRADE 成績 SMALLINT

delete from sc where sno='9531102' and cno='c05';

結束:

DATE_ADD函式相關用法:https://blog.csdn.net/l1028386804/article/details/87790243

第一部分:MySQL查詢練習 https://www.cnblogs.com/xbhog/p/13971373.html

第二部分:MySQL查詢練習2 https://www.cnblogs.com/xbhog/p/14021013.html

理論部分:

第一部分:MySQL必知必會(1-12章) https://www.cnblogs.com/xbhog/p/13721359.html

.....持續更新.....有時間更新

感謝各位看到最後!

相關文章