數據分析-SQL練習

圖片、部分試題來源網絡,侵刪,謝謝。html

1.SQL 45題

create database  school;
use school;

#學生表
create table `Student`
(
  `Sno` varchar(20) not null COMMENT '人名',
  `Sname` varchar(20) not null COMMENT '姓名',
  `Ssex` varchar(20) not null COMMENT '性別',
  `Sbirthday` datetime COMMENT '出生日期',
  `Class` varchar(20) COMMENT '班級'
);
#課程表
create table `Course`(
  `Cno` varchar(20) not null COMMENT '課程號',
  `Cname` varchar(20) not null COMMENT '課程名稱',
  `Tno` varchar(20) not null COMMENT '教工編號'
);
#成績表
Create table `Score` (
  `Sno` varchar(20) not null COMMENT '學號',
  `Cno` varchar(20) not NULL comment '課程號',
  `Degree` DECIMAL(4,1) null COMMENT '成績'
);
#教師表
create table `Teacher` (
  `Tno` varchar(20) not null COMMENT '教工編號',
  `Tname` varchar(20) not null COMMENT '教工姓名',
  `Tsex` varchar(20) not null COMMENT '教工性別',
  `Tbirthday` datetime null COMMENT '教工出生日期',
  `Prof` varchar(20) null COMMENT '職稱',
  `Depart` varchar(20) null COMMENT '教工所在部門'
);

insert into `Student` value
(108,'曾華','','1977-09-01',95033),
(105,'匡明','','1975-10-02',95031),
(107,'王麗','','1976-01-23',95033),
(101,'李軍','','1976-02-20',95033),
(109,'王芳','','1975-02-10',95031),
(103,'陸軍','','1974-06-03',95031);

insert into `Course` value
('3-105','計算機導論',825),
('3-245','操做系統',804),
('6-166','數字電路',856),
('9-888','高等數學',831);

insert into `Score` value
(103,'3-245',86),
(105,'3-245',75),
(109,'3-245',68),
(103,'3-105',92),
(105,'3-105',88),
(109,'3-105',76),
(101,'2-105',64),
(107,'3-105',91),
(108,'3-105',78),
(101,'6-166',85),
(107,'6-166',79),
(108,'6-166',81);

insert into `Teacher` value
(804,'李城','','1958-12-02','副教授','計算機系'),
(856,'張旭','','1969-03-12','講師','電子工程系'),
(825,'王萍','','1972-05-05','助教','計算機系'),
(831,'劉冰','','1977-08-14','助教','電子工程系');

1 查詢Student表中的全部記錄的Sname、Ssex和Class列

select Sname, Ssex, Class from student;

2 查詢教師全部的單位即不重複的Depart列。(多練)

select distinct depart from teacher;

3 查詢Student表的全部記錄

select * from student;

4 查詢Score表中成績在60到80之間的全部記錄

select Sno, Cno, degree from score where degree >= 60 and degree < 80;

5 查詢Score表中成績爲85,86或88的記錄

select Sno, Cno, degree from score where degree = 85 or degree = 86 or degree = 88;
#或另外一種寫法
select * from score where degree in (85, 86, 88)

6 查詢Student表中「95031」班或性別爲「女」的同窗記錄

select * from student where Class = '95031' or Ssex = '';

7 以Class降序查詢Student表的全部記錄

select * from student order by Class desc;

8 以Cno升序、Degree降序查詢Score表的全部記錄

select * from score order by Cno asc, degree desc;
# asc, ascending order(升序排列), desc, descending order(降序排列), 默認按升序排列

9 查詢「95031」班的學生人數

select count(Class) as '95031班學生數'  from student where Class = '95031';

10 查詢Score表中的最高分的學生學號和課程號。(子查詢或者排序)

select * from score where degree = (select max(degree) from score); 
# 直接寫 select * from score where degree = max(degree)不行,會報錯

11 查詢每門課的平均成績。(group by:根據Cno進行分組)  *

select Cno, avg(degree) as '課程平均分' from score group by Cno ; 

12 查詢Score表中至少有4名學生選修的並以3開頭的課程的平均分數(*須要細究*)

select cno, avg(degree) from score where cno like '3%' group by cno having count(sno) > 4;
#參考網站是5名學生,則查詢不到,應爲4名學生
#like '3%' 以3開頭,或like '%3' 以3結尾, 或包含'%12%'\
#HAVING增長的緣由是WHERE關鍵字沒法與合計函數一塊兒使用

13 查詢分數大於70,小於90的Sno列

SELECT SNO FROM SCORE WHERE DEGREE BETWEEN 70 AND 90;

14 查詢全部學生的Sname、Cno和Degree列

select student.Sname, score.Cno, score.Degree from student, score where student.Sno = score.Sno;
#另外一種inner join 寫法
select student.Sname, score.Cno, score.Degree from student inner join score on student.Sno = score.Sno

15 查詢全部學生的Sno、Cname和Degree列

select score.Sno, course.Cname, score.Degree from  score, course where course.Cno = score.Cno;
#或另外一種inner join寫法
select score.Sno, course.Cname, score.Degree from  score INNER JOIN course on course.Cno = score.Cno;

16 查詢全部學生的Sname、Cname和Degree列

select student.Sname, course.Cname, score.Degree from student, course, score WHERE student.Sno = score.Sno and score.Cno = course.Cno;

17 查詢「95033」班學生的平均分。(子查詢or條件查詢)

select avg(degree) as '95033班平均分' from score where sno in (select sno from student where Class = '95033');

18 假設使用以下命令創建了一個grade表

create table `grade`( `low` int COMMENT '人名', `upp` int not null COMMENT '課長', `weight` varchar(20) not null COMMENT '等級' ); insert into `grade` values(90,100,'A'); insert into `grade` values(80,89,'B'); insert into `grade` values(70,79,'C'); insert into `grade` values(60,69,'D'); insert into `grade` values(0,59,'E');
#網絡上的grede,錯誤, rank關鍵字不能用,sql存在rank函數,經測試更改成weight能夠

19 現查詢全部同窗的Sno、Cno和weight列。(between選取兩個值之間的數據範圍)

#select Sno,Cno,Degree,rank from grade join Score on Score.Degree between low and upp;
#select Sno,Cno,Degree,rank from Score, grade where Degree between low and upp;
以上爲網絡上的答案,在Navicat 11.1.13測試錯誤,實際也是由於rank關鍵字的緣由

select Sno, Cno, weight from Score, grade where (score.Degree > grade.low and score.Degree < grade.upp);
或者是
select Sno, Cno, weight from Score, grade where Degree between low and upp;
或者是
select Sno, Cno, weight from Score inner join grade where Degree between low and upp

20 查詢選修「3-105」課程的成績高於「109」號同窗成績的全部同窗的記錄

select sno from score where score.cno = '3-105' and score.degree>(select Degree from Score where Cno = '3-105' and Sno = '109');
#上面是個人答案,題目要求是查詢到全部同窗的記錄,我的是把全部的同窗找出來了,下面是網絡上的答案,把知足條件的同窗的特徵又補全了。
select * from Student,Score where Score.Cno = '3-105' and Student.Sno = Score.Sno
and Score.Degree>(select Degree from Score where Cno = '3-105' and Sno = '109');

21 查詢score中選學多門課程的同窗中分數爲非最高分紅績的記錄(***挺難***)

select * from Score a where Degree<(select MAX(Degree)from  Score b
where a.Cno = b.Cno) and Sno in(select Sno from Score group by  Sno having  count(*) > 1);

22 查詢成績高於學號爲「109」、課程號爲「3-105」的成績的全部記錄

select * from Student,Score where Student.Sno = Score.Sno and Score.Degree>
(select Degree from Score where Cno='3-105' and Sno = '109');
#此爲網絡上答案,我的感受不對,第一要求只查詢課程號3-105的課程,實際查詢少限制條件,第二信息不全
select * from student, course, score where score.sno = student.sno and score.cno = course.cno and score.cno = '3-105' and score.degree >
(select degree from score where cno = '3-105' and sno = '109')

23 查詢和學號爲107的同窗同年出生的全部學生的Sno、Sname和Sbirthday列

select Sno, Sname, Sbirthday from student where YEAR(Sbirthday) = (select year(Sbirthday) from student where sno = '107');
#用到了year()函數

24 查詢「張旭「教師任課的學生成績

select * from student, course, score where student.sno =score.sno and score.cno = course.cno and course.tno = (select tno from teacher where tname = '張旭');
#以上爲個人答案,將學生的信息補充的較爲完整,如下是網絡答案,兩個where in 跟score.cno = course.cno student.sno = score.sno 等價,也是另外一種寫法
select Sno,Cno,Degree from Score where Cno in(select Cno from Course where Tno in(select Tno from Teacher where Tname = '張旭'));

25 查詢選修某課程的同窗人數多於5人的教師姓名

select DISTINCT tname from teacher where tno in (select tno from course where cno in (select cno from score group by cno having count(sno) > 5));
#以前的聯等的寫法行不通,由於沒想到group by 與having count和where之間的鏈接方式

26 查詢95033班和95031班全體學生的記錄

select * from student where Class='95033' or Class='95031'

27 查詢存在有85分以上成績的課程Cno

select cno from score where degree >= 85;

28 查詢出「計算機系「教師所教課程的成績表

select * from teacher, student, course, score where score. sno = student.sno and score.cno = course.cno and teacher.tno =course.tno and teacher.depart = '計算機系';
#此處有歧義的是成績表到底包含哪些內容,一般學生姓名、性別、學號包含,因此這裏我把信息特徵補的較爲齊全
select sno,Cno ,Degree from Score where Cno in (select Cno from Course where Tno in (select tno from Teacher where Depart='計算機系'))
#以上爲網絡答案

29 查詢「計算機系」與「電子工程系「不一樣職稱的教師的Tname和Prof。使用相關子查詢

select Tname,Prof from Teacher a where Prof not in(select Prof from Teacher b where a.Depart!=b.Depart);
#此處感受略奇怪,不一樣職稱的應該有遺漏

30 查詢選修編號爲「3-105「課程且成績至少高於選修編號爲「3-245」課程的同窗的Cno、Sno和Degree,並按Degree從高到低次序排序

select Cno,Sno,Degree from Score a where (select Degree from Score b where Cno='3-105' and
b.Sno = a.Sno)>=(select Degree from Score c where Cno='3-245' and c.Sno = a.Sno)order by
Degree desc ;

31 查詢選修編號爲「3-105」課程且成績高於選修編號爲「3-245」課程的同窗的Cno、Sno和Degree.

select cno, sno, degree from score a where (select degree from score b where cno = '3-105' and a.sno = b.sno) > (select degree from score c where cno = '3-245' and a.sno = c.sno);

32 查詢全部教師和同窗的name、sex和birthday

select distinct sname as name, ssex as sex, sbirthday as birthday from student union select distinct tname as name, tsex as sex, tbirthday as birthday from teacher (ORDER BY birthday) ;
#這裏order by birthday 是本身加的,按生日升序排列,實際不用

33 查詢全部「女」教師和「女」同窗的name、sex和birthday.

select distinct sname as name, ssex as sex, sbirthday as birthday from student where ssex = '女' union select distinct tname as name, tsex as sex, tbirthday as birthday from teacher where tsex = '女';

34 查詢成績比該課程平均成績低的同窗的成績表

SELECT sno, cno, degree from score a  where a.degree < (select avg(Degree) from score b where a.sno = b.sno); 

35 查詢全部任課教師的Tname和Depart

select tname, depart from teacher where tname in (select distinct tname from teacher, course, score, student where course.tno = teacher.tno and course.cno = score.cno and score.sno =student.sno);

36 查詢全部未講課的教師的Tname和Depart

select tname, depart from teacher where tname not in (select distinct tname from teacher, course, score, student where course.tno = teacher.tno and course.cno = score.cno and score.sno =student.sno);

37 查詢至少有2名男生的班號

select Class from student where Ssex='' group by Class having count(*)>1;

38 查詢Student表中不姓「王」的同窗記錄

select * from Student where Sname not like ('王%');

39 查詢Student表中每一個學生的姓名和年齡(暫有問題)

select Sname,YEAR(GETDATE())-year(Sbirthday) from student;
#getdate函數不可用

40 查詢Student表中最大和最小的Sbirthday日期值

select MAX(Sbirthday) as 最大,MIN(Sbirthday) as 最小 from student;

41 以班號和年齡從大到小的順序查詢Student表中的所有記錄

select * from Student order by Class desc ,Sbirthday asc;
#注意生日數字越大,年齡越小

42 查詢「男」教師及其所上的課程

select Tname,Cname from Teacher,Course where teacher.Tsex='' and Teacher.Tno = Course.Tno;

43 查詢最高分同窗的Sno、Cno和Degree列

select sno, cno, degree from score where degree = (select max(Degree) from score);

44 查詢和「李軍」同性別的全部同窗的Sname.

select sname from student where ssex = (select ssex from student where sname = '李軍') and sname not in ('李軍');

45 查詢和「李軍」同性別並同班的同窗Sname

select Sname from Student where Ssex=(select Ssex from Student where Sname='李軍')and Sname not in ('李軍')and Class=(select Class from Student where Sname='李軍');

46 查詢全部選修「計算機導論」課程的「男」同窗的成績表

select Sno,Degree from Score where Sno in(select Sno from Student where Ssex='')and Cno in (select Cno from Course where Cname='計算機導論');

2. SQL 面試題

2.1 row_number

2.2 行列轉換

id    學生姓名    課程名稱    課程成績
1    張三         Linux       85
2    張三         MySQL       92
3    張三         Java        87
4    李四         Linux       96
5    李四         MySQL       100
7    王五         Linux       91
8    王五         MySQL       83
9    王五         Java        98
學生姓名    Linux    MySQL    Java
張三          85      92      87
李四          96      89      100
王五          91      83      98
#建立數據表
CREATE TABLE tb_lemon_grade (
id INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,
student_name VARCHAR(20) DEFAULT NULL,
course VARCHAR(20) DEFAULT NULL,
score FLOAT DEFAULT '0');
#更改顯示形式
SELECT
student_name, MAX(IF(COURSE = 'Linux',SCORE,0)) 'Linux', MAX(IF(COURSE = 'MySQL',SCORE,0)) 'MySQL', MAX(IF(COURSE = 'Java',SCORE,0)) 'Java' FROM lemon_grade group by student_name;
year   month amount
1991   1     1.1
1991   2     1.2
1991   3     1.3
1991   4     1.4
1992   1     2.1
1992   2     2.2
1992   3     2.3
1992   4     2.4

year m1   m2   m3   m4
1991 1.1 1.2 1.3 1.4
1992 2.1 2.2 2.3 2.4 

select year, 
(select amount from   aaa m where month=1   and m.year=aaa.year) as m1,
(select amount from   aaa m where month=2   and m.year=aaa.year) as m2,
(select amount from   aaa m where month=3   and m.year=aaa.year) as m3,
(select amount from   aaa m where month=4   and m.year=aaa.year) as m4
from aaa   group by year
 姓名  類別          花費
  李  看電影         30
  李  吃飯           100
  李  旅遊           500
  王  吃飯           500
  王  看電影         100
  王  買衣服         700

姓名     TOP1類別        TOP1花費         TOP2類別       TOP2花費            TOP3類別         TOP3花費
李       旅遊            500               吃飯            100               看電影            30
王       買衣服          700               吃飯            500               看電影            100
 
#decode(條件,值1,翻譯值1,值2,翻譯值2,...值n,翻譯值n,缺省值)

2.3 索引

索引就一種特殊的查詢表,數據庫的搜索引擎能夠利用它加速對數據的檢索。它很相似與現實生活中書的目錄,不須要查詢整本書內容就能夠找到想要的數據。索引能夠是惟一的,建立索引容許指定單個列或者是多個列。缺點是它減慢了數據錄入的速度,同時也增長了數據庫的尺寸大小。git

2.4 union all 與 union 的區別

union 去重且排序, union all 不去重且不排序github

2.5 where 和 having 的區別

WHERE 子句用來篩選 FROM 子句中指定的操做所產生的行。GROUP BY 子句用來分組 WHERE 子句的輸出。HAVING 子句用來從分組的結果中篩選行面試

2.6 經常使用的時間函數

經常使用的日期提取函數包括 year()/month()/day()/hour()/minute()/second()sql

日期運算函數包括datediff(enddate,startdate) 計算兩個時間的時間差(day);數據庫

date_sub(startdate,days) 返回開始日期startdate減小days天后的日期。網絡

date_add(startdate,days) 返回開始日期startdate增長days天后的日期。模塊化

2.7 存儲過程

存儲過程是一個預編譯的 SQL 語句,優勢是容許模塊化的設計,就是說只需建立一次,之後在該程序中就能夠調用屢次。若是某次操做須要執行屢次 SQL ,使用存儲過程比單純 SQL 語句執行要快。能夠用一個命令對象來調用存儲過程。函數

 

create proc StuProc
@sname varchar(100)   
as 
begin
select S#,Sname,Sage,Ssex from student where sname=@sname
end
go

 

2.8 要求給定數據展現效果

2.9 分組函數使用

2.10 LEFT JOIN、RIGHT JOIN、INNER JOIN、FULL JOIN

2.11 查詢某時間段例如0:00-9:00用戶登陸次數。

給定user_id, login_time(時間戳),表A測試

3. SQL練習題

4. 參考連接

3.1 https://bbs.csdn.net/topics/392337114

3.2 https://blog.csdn.net/qq_41568597/article/details/84309503

3.3 https://blog.csdn.net/weederss/article/details/78034364

相關文章
相關標籤/搜索