Student(S#,Sname,Sage,Ssex) 學生表?
Course(C#,Cname,T#) 課程表?
SC(S#,C#,score) 成績表?
Teacher(T#,Tname) 教師表?
問題:?
1、查詢“001”課程比“002”課程成績高的所有學生的學號;?
select a.S# from (select s#,score from SC where C#=’001’) a,(select s#,score?
from SC where C#=’002’) b?
where a.score>b.score and a.s#=b.s#;?
2、查詢平均成績大于60分的同學的學號和平均成績;?
select S#,avg(score)?重點內容?
from sc?
group by S# having avg(score) >60;?
3、查詢所有同學的學號、姓名、選課數、總成績;?
select Student.S#,Student.Sname,count(SC.C#),sum(score)?
from Student left Outer join SC on Student.S#=SC.S#?
group by Student.S#,Sname?
4、查詢姓“李”的老師的個數;?
select count(distinct(Tname))?
from Teacher?
where Tname like ‘李%’;?
5、查詢沒學過“葉平”老師課的同學的學號、姓名;?
select Student.S#,Student.Sname?
from Student?
where S# not in (select distinct( SC.S#) from SC,Course,Teacher where SC.C#=Course.C# and Teacher.T#=Course.T# and Teacher.Tname=’葉平’);?
6、查詢學過“001”并且也學過編號“002”課程的同學的學號、姓名;?
select Student.S#,Student.Sname from Student,SC where Student.S#=SC.S# and SC.C#=’001’and exists( Select * from SC as SC_2 where SC_2.S#=SC.S# and SC_2.C#=’002’);?
7、查詢學過“葉平”老師所教的所有課的同學的學號、姓名;?
select S#,Sname?
from Student?
where S# in (select S# from SC ,Course ,Teacher where SC.C#=Course.C# and Teacher.T#=Course.T# and Teacher.Tname=’葉平’ group by S# having count(SC.C#)=(select count(C#) from Course,Teacher where Teacher.T#=Course.T# and Tname=’葉平’));?
8、查詢課程編號“002”的成績比課程編號“001”課程低的所有同學的學號、姓名;?
Select S#,Sname from (select Student.S#,Student.Sname,score ,(select score from SC SC_2 where SC_2.S#=Student.S# and SC_2.C#=’002’) score2?
from Student,SC where Student.S#=SC.S# and C#=’001’) S_2 where score2
-------------------------------------------------------------------------------------------------------------------------------------------------------------
--1.學生表
Student(S,Sname,Sage,Ssex) --S 學生編號,Sname 學生姓名,Sage 出生年月,Ssex 學生性別
--2.課程表?
Course(C,Cname,T) --C --課程編號,Cname 課程名稱,T 教師編號
--3.教師表?
Teacher(T,Tname) --T 教師編號,Tname 教師姓名
--4.成績表?
SC(S,C,score) --S 學生編號,C 課程編號,score 分數
*/
--創建測試數據
create table Student(Svarchar(10),Sname varchar(10),Sage datetime,Ssex nvarchar(10))
insert into Student values('01' , '趙雷' , '1990-01-01' , '男')
insert into Student values('02' , '錢電' , '1990-12-21' , '男')
insert into Student values('03' , '孫風' , '1990-05-20' , '男')
insert into Student values('04' , '李云' , '1990-08-06' , '男')
insert into Student values('05' , '周梅' , '1991-12-01' , '女')
insert into Student values('06' , '吳蘭' , '1992-03-01' , '女')
insert into Student values('07' , '鄭竹' , '1989-07-01' , '女')
insert into Student values('08' , '王菊' , '1990-01-20' , '女')
create table Course(Cvarchar(10),Cname,varchar(10),T varchar(10))
insert into Course values('01' , '語文' , '02')
insert into Course values('02' , '數學' , '01')
insert into Course values('03' , '英語' , '03')
create table Teacher(T varchar(10),Tname,varchar(10))
insert into Teacher values('01' , '張三')
insert into Teacher values('02' , '李四')
insert into Teacher values('03' , '王五')
create table SC(S varchar(10),Cvarchar(10),score decimal(18,1))
insert into SC values('01' , '01' , 80)
insert into SC values('01' , '02' , 90)
insert into SC values('01' , '03' , 99)
insert into SC values('02' , '01' , 70)
insert into SC values('02' , '02' , 60)
insert into SC values('02' , '03' , 80)
insert into SC values('03' , '01' , 80)
insert into SC values('03' , '02' , 80)
insert into SC values('03' , '03' , 80)
insert into SC values('04' , '01' , 50)
insert into SC values('04' , '02' , 30)
insert into SC values('04' , '03' , 20)
insert into SC values('05' , '01' , 76)
insert into SC values('05' , '02' , 87)
insert into SC values('06' , '01' , 31)
insert into SC values('06' , '03' , 34)
insert into SC values('07' , '02' , 89)
insert into SC values('07' , '03' , 98)
mysql...
--1、查詢"01"課程比"02"課程成績高的學生的信息及課程分數
SELECT a.*,b.score AS'01分數',c.scoreAS '02分數'
FROM student a
INNER JOIN sc b
ON a.s=b.s AND b.c='01'
INNER JOIN sc c
ON a.s=c.s AND c.c='02'
WHERE b.score>c.score
--2、查詢"01"課程比"02"課程成績低的學生的信息及課程分數
--3、查詢平均成績大于等于60分的同學的學生編號和學生姓名和平均成績
SELECT a.s
?????? ,a.sname
?????? ,AVG(b.score) AS avgnum
FROM student a
INNER JOIN sc b
ON a.s=b.s
GROUP BY a.s
?????? ,a.sname
HAVING AVG(b.score)>60
--4、查詢平均成績小于60分的同學的學生編號和學生姓名和平均成績
--5、查詢所有同學的學生編號、學生姓名、選課總數、所有課程的總成績
SELECT a.s
?????? ,a.sname
?????? ,COUNT(b.c)
?????? ,SUM(b.score)
FROM student a
LEFT JOIN sc b
ON a.s=b.s
GROUP BY 1,2
--6、查詢"李"姓老師的數量?
SELECT COUNT(1) FROM teacherWHERE tname LIKE '李%'
--7、查詢學過"張三"老師授課的同學的信息?
SELECT a.*
FROM student a
INNER JOIN sc b
ON a.s=b.s
INNER JOIN course c
ON b.c=c.c
INNER JOIN teacher d
ON c.t=d.t
WHERE d.tname='張三'
GROUP BY 1,2,3,4
--方法2
SELECT a.*
FROM student a
LEFT JOIN (
?????? SELECT a.*
?????? FROM student a
?????? INNER JOIN sc b
?????? ON a.s=b.s
?????? INNER JOIN course c
?????? ON b.c=c.c
?????? INNER JOIN teacher d
?????? ON c.t=d.t
?????? WHERE d.tname='張三'
?????? GROUP BY 1,2,3,4
)b
ON a.s=b.s
WHERE b.s IS NULL
--8、查詢沒學過"張三"老師授課的同學的信息?
SELECT a.*
FROM student a
LEFT JOIN sc b
ON a.s=b.s
WHERE NOT EXISTS(
????????????? SELECT *
????????????? FROM course aa
????????????? INNER JOIN teacher b
????????????? ON aa.t=b.t
????????????? INNER JOIN sc c
????????????? ON aa.c=c.c
????????????? WHERE b.tname='張三'
????????????? AND c.s=a.s
?????? )
GROUP BY 1,2,3,4
--9、查詢學過編號為"01"并且也學過編號為"02"的課程的同學的信息
SELECT a.*
FROM student a
INNER JOIN sc b
ON a.s=b.s AND b.c='01'
INNER JOIN sc c
ON a.s=c.s AND c.c='02'
--10、查詢學過編號為"01"但是沒有學過編號為"02"的課程的同學的信息
select *
from student a
left join sc b
on a.s=b.s and b.c='01'
left join sc c
on a.s=c.s and c.c='02'
where b.c='01' and c.c is null
--11、查詢沒有學全所有課程的同學的信息?
SELECT a.*
FROM student a
LEFT JOIN sc b
ON a.s=b.s
LEFT JOIN (SELECT COUNT(1) anumFROM course) c
ON 1=1
GROUP BY 1,2,3,4
HAVING MAX(c.anum)>COUNT(b.c)
--12、查詢至少有一門課與學號為"01"的同學所學相同的同學的信息?
SELECT a.*
FROM student a
INNER JOIN sc b
ON a.s=b.s
WHERE EXISTS(
??? SELECT 1 FROM sc WHERE s='01' AND c=b.c
)
GROUP BY 1,2,3,4
--13、查詢和"01"號的同學學習的課程完全相同的其他同學的信息?
SELECTa.s,a.sname,a.sage,a.ssex
FROM (SELECT a.*,COUNT(b.c) ASsnum
?????? FROM student a
?????? INNER JOIN sc b
?????? ON a.s=b.s
?????? WHERE EXISTS(
?????? ??? SELECT 1 FROM scWHERE s='01' AND c=b.c
?????? )
?????? GROUP BY 1,2,3,4)a
INNER JOIN (SELECTa.*,COUNT(b.c) AS anum
?????? FROM student a
?????? INNER JOIN sc b
?????? ON a.s=b.s
?????? GROUP BY 1,2,3,4)b
ON a.s=b.s
INNER JOIN (SELECT COUNT(1) ASnum1 FROM sc WHERE s='01')c
ON 1=1
WHERE a.snum=b.anum ANDa.snum=c.num1
--方法二
SELECT a.*
?????? ,COUNT(b.c) AS anum
?????? ,SUM(CASE WHEN EXISTS(SELECT 1 FROM sc WHERE s='01' AND c=b.c)THEN 1 ELSE 0 END) AS snum
?????? ,MAX(c.num1) AS num1
FROM student a
INNER JOIN sc b
ON a.s=b.s
INNER JOIN (SELECT COUNT(1) ASnum1 FROM sc WHERE s='01')c
ON 1=1
GROUP BY 1,2,3,4
HAVING anum=snum AND anum=num1
--14、查詢沒學過"張三"老師講授的任一門課程的學生姓名?
SELECT a.*
FROM student a
LEFT JOIN(
?????? SELECT a.s
?????? FROM student a
?????? LEFT JOIN sc b
?????? ON a.s=b.s
?????? LEFT JOIN course c
?????? ON b.c=c.c
?????? LEFT JOIN teacher d
?????? ON c.t=d.t AND d.tname='張三'
?????? WHERE d.t IS NOT NULL
?????? )b
ON a.s=b.s
WHERE b.s IS NULL
--15、查詢兩門及其以上不及格課程的同學的學號,姓名及其平均成績?
SELECT a.s
?????? ,a.sname
?????? ,AVG(b.score)
FROM student a
INNER JOIN sc b
ON a.s=b.s
GROUP BY 1,2
HAVING SUM(CASE WHENb.score>=60 THEN 0 ELSE 1 END)>=2
--16、檢索"01"課程分數小于60,按分數降序排列的學生信息
SELECT a.*
?????? ,b.score
FROM student a
INNER JOIN sc b
ON a.s=b.s
WHERE
? b.c='01'
? AND b.score<60
ORDER BY b.score DESC
--17、按平均成績從高到低顯示所有學生的所有課程的成績以及平均成績
SELECT a.*
?????? ,SUM(CASE WHEN b.c='01' THEN b.scoreELSE 0 END) AS s01
?????? ,SUM(CASE WHEN b.c='02' THEN b.scoreELSE 0 END) AS s02
?????? ,SUM(CASE WHEN b.c='03' THEN b.score ELSE0 END) AS s03
?????? ,AVG(CASE WHEN b.score IS NULL THEN 0ELSE b.score END) avs
FROM student a
LEFT JOIN sc b
ON a.s=b.s
GROUP BY 1,2,3,4
ORDER BY avs DESC
--18、查詢各科成績最高分、最低分和平均分:以如下形式顯示:課程ID,課程name,最高分,最低分,平均分,及格率,中等率,優良率,優秀率
--及格為>=60,中等為:70-80,優良為:80-90,優秀為:>=90
SELECT a.c
?????? ,a.cname
?????? ,MAX(b.score)
?????? ,MIN(b.score)
?????? ,AVG(b.score)
?????? ,SUM(CASE WHEN b.score>=60 THEN 1ELSE 0 END)/COUNT(1)
?????? ,SUM(CASE WHEN b.score>=70 ANDb.score<80 THEN 1 ELSE 0 END)/COUNT(1)
?????? ,SUM(CASE WHEN b.score>=80 ANDb.score<90 THEN 1 ELSE 0 END)/COUNT(1)
?????? ,SUM(CASE WHEN b.score>=90 THEN 1ELSE 0 END)/COUNT(1)
FROM course a
INNER JOIN sc b
ON a.c=b.c
GROUP BY 1,2
--19、按各科成績進行排序,并顯示排名
SET @rn:=0;
SELECT a.*,@rn:=@rn+1
FROM(
??? SELECT a.*,b.score
??? FROM course a
??? INNER JOIN sc b
??? ON a.c=b.c
??? WHERE a.c='01'
??? ORDER BY b.c,score DESC
)a
--20、查詢學生的總成績并進行排名
SELECT a.*
?????? ,COUNT(b.c)+1 asall
FROM sc a
LEFT JOIN sc b
ON a.c=b.c ANDa.score<b.score
GROUP BY 1,2,3
ORDER BY a.c,asall
--21、查詢不同老師所教不同課程平均分從高到低顯示?
SELECT a.*
?????? ,b.cname
?????? ,AVG(c.score) ascore
FROM teacher a
INNER JOIN course b
ON a.t=b.t
INNER JOIN sc c
ON b.c=c.c
GROUP BY 1,2,3
ORDER BY ascore DESC
--22、查詢所有課程的成績第2名到第3名的學生信息及該課程成績
SELECT a.*,b.cname,b.score
FROM student a
INNER JOIN (
?????? SELECT a.*
?????? ?????? ,c.cname
?????? ?????? ,COUNT(b.c)+1 AStp
?????? FROM sc a
?????? LEFT JOIN sc b
?????? ON a.c=b.c AND a.score<b.score
?????? LEFT JOIN course c
?????? ON a.c=c.c
?????? GROUP BY 1,2,3,4
?????? HAVING COUNT(b.c)+1 IN(2,3)
?????? ORDER BY a.c,tp)b
ON a.s=b.s
--23、統計各科成績各分數段人數:課程編號,課程名稱,[100-85],[85-70],[70-60],[0-60]及所占百分比?
SELECT a.c
?????? ,a.cname
?????? ,SUM(CASE WHEN b.score<=100 ANDb.score>85 THEN 1 ELSE 0 END) AS '[100-85]'
?????? ,SUM(CASE WHEN b.score<=85 ANDb.score>70 THEN 1 ELSE 0 END) AS '[85-70]'
?????? ,SUM(CASE WHEN b.score<=70 ANDb.score>60 THEN 1 ELSE 0 END) AS '[70-60]'
?????? ,SUM(CASE WHEN b.score<=60 ANDb.score>0 THEN 1 ELSE 0 END) AS '[60-0]'
?????? ,SUM(CASE WHEN b.score<=100 ANDb.score>85 THEN 1 ELSE 0 END)/COUNT(1) AS '[100-85]%'
?????? ,SUM(CASE WHEN b.score<=85 ANDb.score>70 THEN 1 ELSE 0 END)/COUNT(1) AS '[85-70]%'
?????? ,SUM(CASE WHEN b.score<=70 ANDb.score>60 THEN 1 ELSE 0 END)/COUNT(1) AS '[70-60]%'
?????? ,SUM(CASE WHEN b.score<=60 ANDb.score>0 THEN 1 ELSE 0 END)/COUNT(1) AS '[60-0]%'
FROM course a
INNER JOIN sc b
ON a.c=b.c
GROUP BY 1,2
--24、查詢學生平均成績及其名次?
SELECT a.*
?????? ,COUNT(b.s)+1
FROM (
?????? SELECT a.*,AVG(CASE WHEN b.score IS NULL THEN 0 ELSE b.scoreEND) AS ascore
?????? FROM student a
?????? LEFT JOIN sc b
?????? ON a.s=b.s
?????? GROUP BY 1,2,3,4
????? )a
LEFT JOIN(
?????? SELECT a.*,AVG(CASE WHEN b.score IS NULL THEN 0 ELSE b.scoreEND) AS ascore
?????? FROM student a
?????? LEFT JOIN sc b
?????? ON a.s=b.s
?????? GROUP BY 1,2,3,4
????? )b
ON a.ascore<b.ascore
GROUP BY 1,2,3,4,5
--25、查詢各科成績前三名的記錄
SELECT a.*,COUNT(b.c)+1 ASascore
FROM sc a
LEFT JOIN sc b
ON a.c=b.c ANDa.score<b.score
GROUP BY 1,2,3
HAVING ascore<=3
ORDER BY a.c,ascore
--26、查詢每門課程被選修的學生數?
SELECT a.*
?????? ,COUNT(b.s)
FROM course a
LEFT JOIN sc b
ON a.c=b.c
GROUP BY 1,2,3
--27、查詢出只有兩門課程的全部學生的學號和姓名??
SELECT a.*
?????? ,COUNT(b.c)
FROM student a
LEFT JOIN sc b
ON a.s=b.s
GROUP BY 1,2,3,4
HAVING COUNT(b.c)=2
--28、查詢男生、女生人數?
--29、查詢名字中含有"風"字的學生信息
--30、查詢同名同性學生名單,并統計同名人數
?SELECT sname
?????? ,ssex
?????? ,COUNT(1)
FROM student
GROUP BY 1,2
HAVING COUNT(1)>1
--31、查詢1990年出生的學生名單(注:Student表中Sage列的類型是datetime)?
SELECT * FROM student WHEREYEAR(sage)=1990
--32、查詢每門課程的平均成績,結果按平均成績降序排列,平均成績相同時,按課程編號
SELECT a.*
?????? ,AVG(b.score) ascore
FROM course a
LEFT JOIN sc b
ON a.c=b.c
GROUP BY 1,2,3
ORDER BYascore DESC,a.c
--33、查詢平均成績大于等于85的所有學生的學號、姓名和平均成績?
SELECT a.*
?????? ,AVG(b.score) ascore
FROM student a
LEFT JOIN sc b
ON a.s=b.s
GROUP BY 1,2,3,4
HAVING ascore>=85
--34、查詢課程名稱為"數學",且分數低于60的學生姓名和分數?
SELECT c.*
FROM course a
LEFT JOIN sc b
ON a.c=b.c
LEFT JOIN student c
ON b.s=c.s
WHERE a.cname='數學'
AND b.score<60
--35、查詢所有學生的課程及分數情況;?
SELECT *
FROM sc a
INNER JOIN student b
ON a.s=b.s
INNER JOIN course c
ON a.c=c.c
--36、查詢任何一門課程成績在70分以上的姓名、課程名稱和分數;?
SELECT b.sname
?????? ,c.cname
?????? ,a.score
FROM sc a
INNER JOIN student b
ON a.s=b.s
INNER JOIN course c
ON a.c=c.c
WHERE a.score>70
--37、查詢不及格的課程
--38、查詢課程編號為01且課程成績在80分以上的學生的學號和姓名;?
SELECT a.*
FROM student a
INNER JOIN sc b
ON a.s=b.s
WHERE b.c='01' AND b.score>80
--39、求每門課程的學生人數?
--40、查詢選修"張三"老師所授課程的學生中,成績最高的學生信息及其成績
SELECT a.*,b.score
FROM student a
INNER JOIN sc b
ON a.s=b.s
INNER JOIN(
?????? SELECT c.c
?????? ?????? ,MAX(c.score) ASmaxscore
?????? FROM teacher a
?????? INNER JOIN course b
?????? ON a.t=b.t
?????? INNER JOIN sc c
?????? ON b.c=c.c
?????? WHERE a.tname='張三'
?????? GROUP BY c)c
ON b.c=c.c ANDb.score=c.maxscore
--41、查詢不同課程成績相同的學生的學生編號、課程編號、學生成績?
SELECT a.s
?????? ,a.c
?????? ,a.score
FROM sc a
INNER JOIN (
?????? SELECT a.score
?????? ?????? ,b.s
?????? ?????? ,COUNT(1)
?????? FROM sc a
?????? INNER JOIN student b
?????? ON a.s=b.s
?????? GROUP BY a.score,b.s
?????? HAVING COUNT(1)>1
)b
ON a.s=b.s AND a.score=b.score
方法二
SELECT a.*
FROM sc a
LEFT JOIN sc b
ON a.s=b.s AND a.score=b.scoreAND a.c<>b.c
GROUP BY 1,2,3
HAVING COUNT(b.s)>0
--42、查詢每門功成績最好的前兩名?
--43、統計每門課程的學生選修人數(超過5人的課程才統計)。要求輸出課程號和選修人數,查詢結果按人數降序排列,若人數相同,按課程號升序排列 ?
SELECT a.c
?????? ,COUNT(1) AS pnum
FROM sc a
GROUP BY 1
HAVING pnum>5
ORDER BY pnum DESC,a.c
--44、檢索至少選修兩門課程的學生學號?
--45、查詢選修了全部課程的學生信息?
--46、查詢各學生的年齡
SELECT a.*,YEAR(CURDATE())-YEAR(a.sage)
FROM student a
--47、查詢本周過生日的學生
SELECT a.*
FROM student a
WHERECONCAT(MONTH(a.sage),DAY(a.sage))>=CONCAT(MONTH(SUBDATE(CURDATE(),WEEKDAY(CURDATE()))),DAY(SUBDATE(CURDATE(),WEEKDAY(CURDATE()))))
AND CONCAT(MONTH(a.sage),DAY(a.sage))<=CONCAT(MONTH(SUBDATE(CURDATE(),WEEKDAY(CURDATE())-6)),DAY(SUBDATE(CURDATE(),WEEKDAY(CURDATE())-6)))
--48、查詢下周過生日的學生
--49、查詢本月過生日的學生
SELECT a.* FROM student a WHEREMONTH(a.sage)=MONTH(CURDATE())
--50、查詢下月過生日的學生
SELECT a.*FROM student a WHERE MONTH(a.sage)=MONTH(CURDATE())+1
-------------------------------------------------------------------------------------------------------------------------------------------------------------
1、 mysql如何創建一個庫,添加一個表,在表中插入數據。
CREATE DATABASE database_name;
CREATE TABLE table_name(
ID varchar (4) NOT NULL,
NAME varchar (50) NOT NULL
);
INSERT INTO table_name() VAULES();
2、 mysql如何查詢一個表中的所有數據?
SELECT * FROM table_name;
3、 mysql如何給一個表添加完整性約束?
ALTER TABLE COMMENT ADD CONSTRAINT FK_comment_blog_id FOREIGN KEY (blog_id) REFERENCES table_name(id) ON DELETE RESTRICT ON UPDATE RESTRICT;
4、如何清空TabB表的數據
truncate table TabB;
5、如何登陸mysql數據庫
MySQL-u username -p
6、如何開啟/關閉mysql服務
service mysql start/stop
7、查看mysql的狀態
service mysql status
8、如何顯示數所有數據庫
show databases
9、如何獲取表內所有字段對象的名稱和類型
describe table_name;
10、varchar和char的區別
Char是一種固定長度的類型,varchar是一種可變長度的類型
11、數據庫事物屬性有哪幾種?
隔離性、持續性、一致性、原子性
12、mysql里記錄貨幣用什么字段類型好?
NUMERIC和DECIMAL類型被MySQL實現為同樣的類型,這在SQL92標準允許。他們被用于保存值,該值的準確精度是極其重要的值,例如與金錢有關的數據。
13、mysql數據庫索引類型都有哪些?
索引類型: B-TREE索引,哈希索引
14、mysql取得當前時間的函數是?,格式化日期的函數是?
? ? 取得當前時間用 now() 就行。
在數據庫中格式化時間 用DATE_FORMA T(date, format)。
15、mysql批量替換的SQL語句怎么寫?
Update `dede_addonarticle` set body = replace(body,’oldvalue’,'newvalue’) 其中 dede_addonarticle 為你的表名。body為字段名
16、mysql相比于其他數據庫有哪些特點?
MySQL是一個小型關系型數據庫管理系統,開發者為瑞典MySQL AB公司,現在已經被Sun公司收購,支持FreeBSD、Linux、MAC、Windows等多種操作系統
與其他的大型數據庫例如Oracle、DB2、SQL Server等相比功能稍弱一些
? ? ?1)、可以處理擁有上千萬條記錄的大型數據
? ? ?2)、支持常見的SQL語句規范
? ? ?3)、可移植行高,安裝簡單小巧
? ? ?4)、良好的運行效率,有豐富信息的網絡支持
? ? ?5)、調試、管理,優化簡單(相對其他大型數據庫)
17、mysql數據庫是怎么備份的?
備份數據庫:
mysqldump –user=root –password=root密碼 –lock-all-tables 數據庫名 > 備份文件.sql
恢復數據庫:
mysql -u root –password=root密碼 數據庫名 < 備份文件.sql
18、數據庫死鎖概念
如果需要"修改"一條數據,首先數據庫管理系統會在上面加鎖,以保證在同一時間只有一個事務能進行修改操作。鎖定(Locking)發生在當一個事務獲得對某一資源的"鎖"時,這時,其他的事務就不能更改這個資源了,這種機制的存在是為了保證數據一致性。
19、實際操作
Sutdent表的定義
字段名 字段描述 數據類型 主鍵 外鍵 非空 唯一 自增
Id 學號 INT(10) 是 否 是 是 是
Name 姓名 VARCHAR(20) 否 否 是 否 否
Sex 性別 VARCHAR(4) 否 否 否 否 否
Birth 出生年份 YEAR 否 否 否 否 否
Department 院系 VARCHAR(20) 否 否 是 否 否
Address 家庭住址 VARCHAR(50) 否 否 否 否 否
Score表的定義
字段名 字段描述 數據類型 主鍵 外鍵 非空 唯一 自增
Id 編號 INT(10) 是 否 是 是 是
Stu_id 學號 INT(10) 否 否 是 否 否
C_name 課程名 VARCHAR(20) 否 否 否 否 否
Grade 分數 INT(10) 否 否 否 否 否
1).創建student和score表
CREATE ?TABLE ?student (
id ?INT(10) ?NOT NULL ?UNIQUE ?PRIMARY KEY ?,
name ?VARCHAR(20) ?NOT NULL ,
sex ?VARCHAR(4) ?,
birth ?YEAR,
department ?VARCHAR(20) ,
address ?VARCHAR(50)?
);
創建score表。SQL代碼如下:
CREATE ?TABLE ?score (
id ?INT(10) ?NOT NULL ?UNIQUE ?PRIMARY KEY ?AUTO_INCREMENT ,
stu_id ?INT(10) ?NOT NULL ,
c_name ?VARCHAR(20) ,
grade ?INT(10)
);
2).為student表和score表增加記錄
向student表插入記錄的INSERT語句如下:
INSERT INTO student VALUES( 901,'張老大', '男',1985,'計算機系', '北京市海淀區');
INSERT INTO student VALUES( 902,'張老二', '男',1986,'中文系', '北京市昌平區');
INSERT INTO student VALUES( 903,'張三', '女',1990,'中文系', '湖南省永州市');
INSERT INTO student VALUES( 904,'李四', '男',1990,'英語系', '遼寧省阜新市');
INSERT INTO student VALUES( 905,'王五', '女',1991,'英語系', '福建省廈門市');
INSERT INTO student VALUES( 906,'王六', '男',1988,'計算機系', '湖南省衡陽市');
向score表插入記錄的INSERT語句如下:
INSERT INTO score VALUES(NULL,901, '計算機',98);
INSERT INTO score VALUES(NULL,901, '英語', 80);
INSERT INTO score VALUES(NULL,902, '計算機',65);
INSERT INTO score VALUES(NULL,902, '中文',88);
INSERT INTO score VALUES(NULL,903, '中文',95);
INSERT INTO score VALUES(NULL,904, '計算機',70);
INSERT INTO score VALUES(NULL,904, '英語',92);
INSERT INTO score VALUES(NULL,905, '英語',94);
INSERT INTO score VALUES(NULL,906, '計算機',90);
INSERT INTO score VALUES(NULL,906, '英語',85);
3).查詢student表的所有記錄
mysql> SELECT * FROM student;
+-----+--------+------+-------+------------+--------------+
| id ?| name ? | sex ?| birth | department | address ? ? ?|
+-----+--------+------+-------+------------+--------------+
| 901 | 張老大 | 男 ? | ?1985 | 計算機系 ? | 北京市海淀區 |
| 902 | 張老二 | 男 ? | ?1986 | 中文系 ? ? | 北京市昌平區 |
| 903 | 張三 ? | 女 ? | ?1990 | 中文系 ? ? | 湖南省永州市 |
| 904 | 李四 ? | 男 ? | ?1990 | 英語系 ? ? | 遼寧省阜新市 |
| 905 | 王五 ? | 女 ? | ?1991 | 英語系 ? ? | 福建省廈門市 |
| 906 | 王六 ? | 男 ? | ?1988 | 計算機系 ? | 湖南省衡陽市 |
+-----+--------+------+-------+------------+--------------+
4).查詢student表的第2條到4條記錄
mysql> SELECT * FROM student LIMIT 1,3;
+-----+--------+------+-------+------------+--------------+
| id ?| name ? | sex ?| birth | department | address ? ? ?|
+-----+--------+------+-------+------------+--------------+
| 902 | 張老二 | 男 ? | ?1986 | 中文系 ? ? | 北京市昌平區 |
| 903 | 張三 ? | 女 ? | ?1990 | 中文系 ? ? | 湖南省永州市 |
| 904 | 李四 ? | 男 ? | ?1990 | 英語系 ? ? | 遼寧省阜新市 |
+-----+--------+------+-------+------------+--------------+
5).從student表查詢所有學生的學號(id)、姓名(name)和院系(department)的信息
mysql> SELECT id,name,department FROM student;
+-----+--------+------------+
| id ?| name ? | department |
+-----+--------+------------+
| 901 | 張老大 | 計算機系 ? |
| 902 | 張老二 | 中文系 ? ? |
| 903 | 張三 ? | 中文系 ? ? |
| 904 | 李四 ? | 英語系 ? ? |
| 905 | 王五 ? | 英語系 ? ? |
| 906 | 王六 ? | 計算機系 ? |
+-----+--------+------------+
6).從student表中查詢計算機系和英語系的學生的信息
mysql> SELECT * FROM student WHERE department IN ('計算機系','英語系');
+-----+--------+------+-------+------------+--------------+
| id ?| name ? | sex ?| birth | department | address ? ? ?|
+-----+--------+------+-------+------------+--------------+
| 901 | 張老大 | 男 ? | ?1985 | 計算機系 ? | 北京市海淀區 |
| 904 | 李四 ? | 男 ? | ?1990 | 英語系 ? ? | 遼寧省阜新市 |
| 905 | 王五 ? | 女 ? | ?1991 | 英語系 ? ? | 福建省廈門市 |
| 906 | 王六 ? | 男 ? | ?1988 | 計算機系 ? | 湖南省衡陽市 |
+-----+--------+------+-------+------------+--------------+
7).從student表中查詢年齡18~22歲的學生信息
mysql> SELECT id,name,sex,2013-birth AS age,department,address
? ? -> FROM student
? ? -> WHERE 2013-birth BETWEEN ?18 AND 22;
+-----+------+------+------+------------+--------------+
| id ?| name | sex ?| age ?| department | address ? ? ?|
+-----+------+------+------+------------+--------------+
| 905 | 王五 | 女 ? | ? 22 | 英語系 ? ? | 福建省廈門市 |
+-----+------+------+------+------------+--------------+
mysql> SELECT id,name,sex,2013-birth AS age,department,address
? ? -> FROM student
? ? -> WHERE 2013-birth>=18 AND 2013-birth<=22;
+-----+------+------+------+------------+--------------+
| id ?| name | sex ?| age ?| department | address ? ? ?|
+-----+------+------+------+------------+--------------+
| 905 | 王五 | 女 ? | ? 22 | 英語系 ? ? | 福建省廈門市 |
+-----+------+------+------+------------+--------------+
8).從student表中查詢每個院系有多少人?
mysql> SELECT department, COUNT(id) FROM student GROUP BY department;
+------------+-----------+
| department | COUNT(id) |
+------------+-----------+
| 計算機系 ? | ? ? ? ? 2 |
| 英語系 ? ? | ? ? ? ? 2 |
| 中文系 ? ? | ? ? ? ? 2 |
+------------+-----------+
9).從score表中查詢每個科目的最高分
mysql> SELECT c_name,MAX(grade) FROM score GROUP BY c_name;
+--------+------------+
| c_name | MAX(grade) |
+--------+------------+
| 計算機 | ? ? ? ? 98 |
| 英語 ? | ? ? ? ? 94 |
| 中文 ? | ? ? ? ? 95 |
+--------+------------+
10).查詢李四的考試科目(c_name)和考試成績(grade)
mysql> SELECT c_name, grade
? ? -> ? ? ?FROM score WHERE stu_id=
? ? -> ?(SELECT id FROM student
? ? -> ? ?WHERE name= '李四' );
+--------+-------+
| c_name | grade |
+--------+-------+
| 計算機 | ? ?70 |
| 英語 ? | ? ?92 |
+--------+-------+
11).用連接的方式查詢所有學生的信息和考試信息
mysql> SELECT student.id,name,sex,birth,department,address,c_name,grade
? ? -> FROM student,score
? ? -> ?WHERE student.id=score.stu_id;
+-----+--------+------+-------+------------+--------------+--------+-------+
| id ?| name ? | sex ?| birth | department | address ? ? ?| c_name | grade |
+-----+--------+------+-------+------------+--------------+--------+-------+
| 901 | 張老大 | 男 ? | ?1985 | 計算機系 ? | 北京市海淀區 | 計算機 | ? ?98 |
| 901 | 張老大 | 男 ? | ?1985 | 計算機系 ? | 北京市海淀區 | 英語 ? | ? ?80 |
| 902 | 張老二 | 男 ? | ?1986 | 中文系 ? ? | 北京市昌平區 | 計算機 | ? ?65 |
| 902 | 張老二 | 男 ? | ?1986 | 中文系 ? ? | 北京市昌平區 | 中文 ? | ? ?88 |
| 903 | 張三 ? | 女 ? | ?1990 | 中文系 ? ? | 湖南省永州市 | 中文 ? | ? ?95 |
| 904 | 李四 ? | 男 ? | ?1990 | 英語系 ? ? | 遼寧省阜新市 | 計算機 | ? ?70 |
| 904 | 李四 ? | 男 ? | ?1990 | 英語系 ? ? | 遼寧省阜新市 | 英語 ? | ? ?92 |
| 905 | 王五 ? | 女 ? | ?1991 | 英語系 ? ? | 福建省廈門市 | 英語 ? | ? ?94 |
| 906 | 王六 ? | 男 ? | ?1988 | 計算機系 ? | 湖南省衡陽市 | 計算機 | ? ?90 |
| 906 | 王六 ? | 男 ? | ?1988 | 計算機系 ? | 湖南省衡陽市 | 英語 ? | ? ?85 |
+-----+--------+------+-------+------------+--------------+--------+-------+
12).計算每個學生的總成績
mysql> SELECT student.id,name,SUM(grade) FROM student,score
? ? -> WHERE student.id=score.stu_id
? ? -> GROUP BY id;
+-----+--------+------------+
| id ?| name ? | SUM(grade) |
+-----+--------+------------+
| 901 | 張老大 | ? ? ? ?178 |
| 902 | 張老二 | ? ? ? ?153 |
| 903 | 張三 ? | ? ? ? ? 95 |
| 904 | 李四 ? | ? ? ? ?162 |
| 905 | 王五 ? | ? ? ? ? 94 |
| 906 | 王六 ? | ? ? ? ?175 |
+-----+--------+------------+
13).計算每個考試科目的平均成績
mysql> SELECT c_name,AVG(grade) FROM score GROUP BY c_name;
+--------+------------+
| c_name | AVG(grade) |
+--------+------------+
| 計算機 | ? ?80.7500 |
| 英語 ? | ? ?87.7500 |
| 中文 ? | ? ?91.5000 |
+--------+------------+
14).查詢計算機成績低于95的學生信息
mysql> SELECT * FROM student
? ? -> WHERE id IN
? ? -> (SELECT stu_id FROM score
? ? -> WHERE c_name="計算機" and grade<95);
+-----+--------+------+-------+------------+--------------+
| id ?| name ? | sex ?| birth | department | address ? ? ?|
+-----+--------+------+-------+------------+--------------+
| 902 | 張老二 | 男 ? | ?1986 | 中文系 ? ? | 北京市昌平區 |
| 904 | 李四 ? | 男 ? | ?1990 | 英語系 ? ? | 遼寧省阜新市 |
| 906 | 王六 ? | 男 ? | ?1988 | 計算機系 ? | 湖南省衡陽市 |
+-----+--------+------+-------+------------+--------------+
15).查詢同時參加計算機和英語考試的學生的信息
mysql> SELECT * ?FROM student
? ? -> ?WHERE id =ANY
? ? -> ?( SELECT stu_id FROM score
? ? -> ?WHERE stu_id IN (
? ? -> ? ? ? ? ?SELECT stu_id FROM
? ? -> ? ? ? ? ?score WHERE c_name= ?'計算機')
? ? -> ?AND c_name= '英語' );
+-----+--------+------+-------+------------+--------------+
| id ?| name ? | sex ?| birth | department | address ? ? ?|
+-----+--------+------+-------+------------+--------------+
| 901 | 張老大 | 男 ? | ?1985 | 計算機系 ? | 北京市海淀區 |
| 904 | 李四 ? | 男 ? | ?1990 | 英語系 ? ? | 遼寧省阜新市 |
| 906 | 王六 ? | 男 ? | ?1988 | 計算機系 ? | 湖南省衡陽市 |
+-----+--------+------+-------+------------+--------------+
mysql> SELECT a.* FROM student a ,score b ,score c
? ? -> WHERE a.id=b.stu_id
? ? -> AND b.c_name='計算機'
? ? -> AND a.id=c.stu_id
? ? -> AND c.c_name='英語';
+-----+--------+------+-------+------------+--------------+
| id ?| name ? | sex ?| birth | department | address ? ? ?|
+-----+--------+------+-------+------------+--------------+
| 901 | 張老大 | 男 ? | ?1985 | 計算機系 ? | 北京市海淀區 |
| 904 | 李四 ? | 男 ? | ?1990 | 英語系 ? ? | 遼寧省阜新市 |
| 906 | 王六 ? | 男 ? | ?1988 | 計算機系 ? | 湖南省衡陽市 |
+-----+--------+------+-------+------------+--------------+
16).將計算機考試成績按從高到低進行排序
mysql> SELECT stu_id, grade
? ? -> ?FROM score WHERE c_name= '計算機'
? ? -> ?ORDER BY grade DESC;
+--------+-------+
| stu_id | grade |
+--------+-------+
| ? ?901 | ? ?98 |
| ? ?906 | ? ?90 |
| ? ?904 | ? ?70 |
| ? ?902 | ? ?65 |
+--------+-------+
17).從student表和score表中查詢出學生的學號,然后合并查詢結果
mysql> SELECT id ?FROM student
? ? -> UNION
? ? -> SELECT stu_id ?FROM score;
+-----+
| id ?|
+-----+
| 901 |
| 902 |
| 903 |
| 904 |
| 905 |
| 906 |
+-----+
18).查詢姓張或者姓王的同學的姓名、院系和考試科目及成績
mysql> SELECT student.id, name,sex,birth,department, address, c_name,grade
? ? -> FROM student, score
? ? -> WHERE
? ? -> ?(name LIKE ?'張%' ?OR name LIKE ?'王%')
? ? -> ?AND
? ? -> ?student.id=score.stu_id ;
+-----+--------+------+-------+------------+--------------+--------+-------+
| id ?| name ? | sex ?| birth | department | address ? ? ?| c_name | grade |
+-----+--------+------+-------+------------+--------------+--------+-------+
| 901 | 張老大 | 男 ? | ?1985 | 計算機系 ? | 北京市海淀區 | 計算機 | ? ?98 |
| 901 | 張老大 | 男 ? | ?1985 | 計算機系 ? | 北京市海淀區 | 英語 ? | ? ?80 |
| 902 | 張老二 | 男 ? | ?1986 | 中文系 ? ? | 北京市昌平區 | 計算機 | ? ?65 |
| 902 | 張老二 | 男 ? | ?1986 | 中文系 ? ? | 北京市昌平區 | 中文 ? | ? ?88 |
| 903 | 張三 ? | 女 ? | ?1990 | 中文系 ? ? | 湖南省永州市 | 中文 ? | ? ?95 |
| 905 | 王五 ? | 女 ? | ?1991 | 英語系 ? ? | 福建省廈門市 | 英語 ? | ? ?94 |
| 906 | 王六 ? | 男 ? | ?1988 | 計算機系 ? | 湖南省衡陽市 | 計算機 | ? ?90 |
| 906 | 王六 ? | 男 ? | ?1988 | 計算機系 ? | 湖南省衡陽市 | 英語 ? | ? ?85 |
+-----+--------+------+-------+------------+--------------+--------+-------+
19).查詢都是湖南的學生的姓名、年齡、院系和考試科目及成績
mysql> SELECT student.id, name,sex,birth,department, address, c_name,grade
? ? -> FROM student, score
? ? -> WHERE address LIKE '湖南%' ? AND
? ? -> ?student.id=score.stu_id;
+-----+------+------+-------+------------+--------------+--------+-------+
| id ?| name | sex ?| birth | department | address ? ? ?| c_name | grade |
+-----+------+------+-------+------------+--------------+--------+-------+
| 903 | 張三 | 女 ? | ?1990 | 中文系 ? ? | 湖南省永州市 | 中文 ? | ? ?95 |
| 906 | 王六 | 男 ? | ?1988 | 計算機系 ? | 湖南省衡陽市 | 計算機 | ? ?90 |
| 906 | 王六 | 男 ? | ?1988 | 計算機系 ? | 湖南省衡陽市 | 英語 ? | ? ?85 |
+-----+------+------+-------+------------+--------------+--------+-------+