【大数据开发】MySQL数据库进阶

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 查询查来查去都是差不多,这里想玩点新的,主要还是多用了union、exists、在from中要用子查询

一、建表


CREATE TABLE Student(

Sno CHAR(3) PRIMARY KEY COMMENT "学号(主码)",

Sname CHAR(8) NOT NULL COMMENT "学生姓名",

Ssex CHAR(2) COMMENT "学生性别",

Sbirthday DATETIME COMMENT "学生出生年月",

Class CHAR(5) COMMENT "学生所在班级"

)



CREATE TABLE Course(

Cno CHAR(5) PRIMARY KEY COMMENT "课程号(主码)",

Cname VARCHAR(10) NOT NULL COMMENT "课程名称",

Tno CHAR(3) NOT NULL COMMENT "教工编号(外码)"

)



CREATE TABLE Score(

Sno CHAR(3) COMMENT "学号(外码)",

Cno CHAR(5) COMMENT "课程号(外码)",

Degree DECIMAL(4,1) COMMENT "成绩",

-- primary key(Sno,Cno),

FOREIGN KEY(Sno) REFERENCES Student(Sno),

FOREIGN KEY(Cno) REFERENCES Course(Cno)

)



CREATE TABLE Teacher(

Tno CHAR(3) PRIMARY KEY COMMENT "教工编号(主码)",

Tname CHAR(4) NOT NULL COMMENT "教工姓名",

Tsex CHAR(2) NOT NULL COMMENT "教工性别",

Tbirthday DATETIME COMMENT "教工出生年月",

Prof CHAR(6) COMMENT "职称",

Depart VARCHAR(10) COMMENT "教工所在部门"

)


INSERT INTO Student VALUES ('108','曾华','男','1977-09-01','95033');

INSERT INTO Student VALUES ('105','匡明','男','1975-10-02','95031');

INSERT INTO Student VALUES ('107','王丽','女','1976-01-23','95033');

INSERT INTO Student VALUES ('101','李军','男','1976-02-20','95033');

INSERT INTO Student VALUES ('109','王芳','女','1975-02-10','95031');

INSERT INTO Student VALUES ('103','陆君','男','1974-06-03','95031');



INSERT INTO Course VALUES ('3-105','计算机导论','825'),

('3-245','操作系统','804'),

('6-166 ','数字电路','856'),

('9-888','高等数学','831')




INSERT INTO Score VALUES ('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','3-105',64),

('107','3-105',91),

('108','3-105',78)



INSERT INTO Teacher VALUES('804','李诚','男','1958-12-02','副教授','计算机系'),

('856','张旭','男','1969-03-12','讲师','电子工程系'),

('825','王萍','女','1972-05-05','助教','计算机系'),

('831','刘冰','女','1977-08-14','助教','电子工程系')


   1

   2

   3

   4

   5

   6

   7

   8

   9

   10

   11

   12

   13

   14

   15

   16

   17

   18

   19

   20

   21

   22

   23

   24

   25

   26

   27

   28

   29

   30

   31

   32

   33

   34

   35

   36

   37

   38

   39

   40

   41

   42

   43

   44

   45

   46

   47

   48

   49

   50

   51

   52

   53

   54

   55

   56

   57

   58

   59

   60

   61

   62

   63

   64

   65


二、练习


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 *

FROM Score

WHERE Degree BETWEEN 60 AND 80


5、 查询Score表中成绩为85,86或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,Degree DESC


9、 查询“95031”班的学生人数。

SELECT COUNT(Class)

FROM Student

GROUP BY Class

HAVING Class=95031


10、  查询Score表中的最高分的学生学号和课程号。(子查询或者排序)

SELECT st.sno,sc.cno,degree

FROM student st JOIN score sc

ON st.sno=sc.sno

ORDER BY Degree DESC

LIMIT 1


11、 查询每门课的平均成绩。

SELECT cno,AVG(IFNULL(degree,0))

FROM score

GROUP BY cno



12、 查询Score表中至少有5名学生选修的并以3开头的课程的平均分数。

SELECT sc.cno,AVG(IFNULL(sc.degree,0))

FROM student st JOIN score sc

ON st.sno=sc.sno

GROUP BY sc.cno

HAVING COUNT(sc.cno)>=5 AND sc.cno LIKE "3%"



13、 查询分数大于70,小于90的Sno列。

SELECT sc.sno

FROM student st JOIN score sc

ON st.sno=sc.sno

WHERE degree>70 AND degree<90



14、 查询所有学生的Sname、Cno和Degree列。

SELECT st.sname,cno,degree

FROM student st JOIN score sc

ON st.sno=sc.sno



15、 查询所有学生的Sno、Cname和Degree列。

SELECT st.sno,cno,degree

FROM student st JOIN score sc

ON st.sno=sc.sno



16、 查询所有学生的Sname、Cname和Degree列。

SELECT st.sname,cname,degree

FROM student st JOIN score sc

ON st.sno=sc.sno

JOIN course co

ON sc.cno=co.cno



17、  查询“95033”班学生的平均分。

SELECT AVG(IFNULL(degree,0)) 平均分

FROM student st JOIN score sc

ON st.sno=sc.sno

GROUP BY class

HAVING class="95033"



18、 假设使用如下命令建立了一个grade表:

CREATE TABLE grade(

low INT(3),

upp INT(3),

ranks CHAR(1)

)

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');

现查询所有同学的Sno、Cno和ranks列。


SELECT Sno,Cno,ranks

FROM score t1,(

     SELECT low,upp,ranks

  FROM grade

    )t2

WHERE degree BETWEEN t2.low AND t2.upp




19、  查询选修“3-105”课程的成绩高于“109”号同学成绩的所有同学的记录。

SELECT *

FROM student st JOIN score sc

ON st.sno=sc.sno

WHERE sc.cno="3-105" AND degree > ALL(

  SELECT degree

  FROM student st JOIN score sc

  ON st.sno=sc.sno

  WHERE st.sno="109"

  )



20、查询score中选学多门课程的同学中分数为非最高分成绩的记录。

SELECT t1.sno,t2.cno,t2.degree

FROM score t2,(

SELECT sno,MAX(degree) degree  

FROM score

GROUP BY sno

HAVING COUNT(sno)>1

)t1

WHERE t1.sno=t2.sno AND t2.degree<t1.degree




21、查询成绩高于学号为“109”、课程号为“3-105”的成绩的所有记录。

SELECT st.*,sc.cno,degree

FROM student st JOIN score sc

ON st.sno=sc.sno

WHERE degree>(

SELECT degree

FROM score

WHERE cno='3-105' AND sno=109

)




22、查询和学号为108的同学同年出生的所有学生的Sno、Sname和Sbirthday列。

SELECT sno,sname,Sbirthday

FROM student

WHERE YEAR(sbirthday)=(

 SELECT YEAR(sbirthday)

 FROM student

 WHERE sno=108

 )

 

 


23、查询“张旭“教师任课的学生成绩。

SELECT st.*,sc.degree

FROM student st JOIN score sc

ON st.sno=sc.sno

JOIN course co

ON sc.cno=co.cno

JOIN teacher te

ON co.tno=te.tno

WHERE te.tname='张旭'




24、查询选修某课程的同学人数多于5人的教师姓名。

SELECT te.tname

FROM teacher te,course co,score sc,student st

WHERE te.tno=co.tno AND co.cno=sc.cno AND sc.sno=st.sno

GROUP BY te.tno

HAVING COUNT(st.sno)>5




25、查询95033班和95031班全体学生的记录。

SELECT *

FROM student

WHERE class IN(95033,95031)



26、  查询存在有85分以上成绩的课程Cno.

SELECT co.cno

FROM course co JOIN score sc

ON co.cno = sc.cno

WHERE degree>85



27、查询出“计算机系“教师所教课程的成绩表。

SELECT *

FROM teacher te JOIN course co

ON te.tno=co.tno

JOIN score sc

co.cno=sc.cno

WHERE cname='计算机系'



28、查询“计算机系”与“电子工程系“不同职称的教师的Tname和Prof。

SELECT tname,prof

FROM teacher

WHERE prof NOT IN (

SELECT prof

FROM teacher

WHERE depart IN ('计算机系','电子工程系')

)



29、查询选修编号为“3-105“课程且成绩至少高于选修编号为“3-245”的同学的Cno、Sno和Degree,

并按Degree从高到低次序排序。

SELECT st.sno,sc.cno,sc.degree

FROM(

SELECT sno,cno,degree

FROM score

WHERE cno='3-105' AND degree>(

   SELECT MAX(degree)

   FROM score

   WHERE cno='3-245'

   )

   )sc

JOIN student st

ON sc.sno=st.sno




30、查询选修编号为“3-105”且成绩高于选修编号为“3-245”课程的同学的Cno、Sno和Degree.

SELECT st.sno,sc.cno,sc.degree

FROM(

SELECT sno,cno,degree

FROM score

WHERE cno='3-105' AND degree>(

   SELECT MAX(degree)

   FROM score

   WHERE cno='3-245'

   )

   )sc

JOIN student st

ON sc.sno=st.sno



31、 查询所有教师和同学的name、sex和birthday.

SELECT sname NAME, ssex sex,sbirthday birthday

FROM student

UNION

SELECT tname NAME, tsex sex,tbirthday birthday

FROM teacher


-- 下面结果和上面的查询结果是一样的,这是因为union查询只会使用第一个查询的字段名

SELECT sname NAME, ssex sex,sbirthday birthday

FROM student

UNION

SELECT tname, tsex,tbirthday

FROM teacher




32、查询所有“女”教师和“女”同学的name、sex和birthday.

SELECT sname NAME,ssex sex,sbirthday birthday

FROM student

WHERE ssex='女'

UNION

SELECT tname,tsex,tbirthday birthday

FROM teacher

WHERE tsex='女'




33、 查询成绩比该课程平均成绩低的同学的成绩表。

SELECT s2.*

FROM (

SELECT AVG(IFNULL(degree,0)) avg_score

FROM score

    )s1,score s2

WHERE s1.avg_score>s2.degree




34、查询所有任课教师的Tname和Depart.

SELECT tname,depart

FROM teacher



35 、 查询所有未讲课的教师的Tname和Depart.

SELECT tname,depart

FROM teacher te

WHERE NOT EXISTS(

SELECT 1

FROM course co

WHERE te.tno=co.tno

)



36、查询至少有2名男生的班号。

SELECT class

FROM student

GROUP BY ssex

HAVING COUNT(ssex)>1




37、查询Student表中不姓“王”的同学记录。

SELECT *

FROM student

WHERE sname NOT LIKE '王%'




38、查询Student表中每个学生的姓名和年龄。

SELECT sname,YEAR(NOW())-YEAR(sbirthday) age

FROM student




39、查询Student表中最大和最小的Sbirthday日期值。

SELECT MAX(sbirthday),MIN(sbirthday)

FROM student



40、以班号和年龄从大到小的顺序查询Student表中的全部记录。

SELECT st1.*,st2.age

FROM student st1 JOIN (

 SELECT sno,YEAR(NOW())-YEAR(sbirthday) age

 FROM student

 )st2

ON st1.sno=st2.sno

ORDER BY class DESC,st2.age DESC




41、查询“男”教师及其所上的课程。

SELECT te.*,co.cno,co.cname

FROM teacher te JOIN course co

ON te.tno=co.tno

WHERE te.tsex='男'



42、查询最高分同学的Sno、Cno和Degree列。

SELECT sno,cno,MAX(degree)

FROM score




43、查询和“李军”同性别的所有同学的Sname.

SELECT sname

FROM student s1,(

 SELECT ssex

 FROM student

 WHERE sname='李军'

 )s2

WHERE s1.ssex=s2.ssex




44、查询和“李军”同性别并同班的同学Sname.

SELECT sname

FROM student s1,(

 SELECT ssex,class

 FROM student

 WHERE sname='李军'

 )s2

WHERE s1.ssex=s2.ssex AND s1.class=s2.class




45、查询所有选修“计算机导论”课程的“男”同学的成绩表。

SELECT st.sname,st.ssex,degree

FROM student st JOIN score sc

ON st.sno=sc.sno

JOIN course co

ON sc.cno=co.cno

WHERE co.cname='计算机导论' AND st.ssex='男'






   1

   2

   3

   4

   5

   6

   7

   8

   9

   10

   11

   12

   13

   14

   15

   16

   17

   18

   19

   20

   21

   22

   23

   24

   25

   26

   27

   28

   29

   30

   31

   32

   33

   34

   35

   36

   37

   38

   39

   40

   41

   42

   43

   44

   45

   46

   47

   48

   49

   50

   51

   52

   53

   54

   55

   56

   57

   58

   59

   60

   61

   62

   63

   64

   65

   66

   67

   68

   69

   70

   71

   72

   73

   74

   75

   76

   77

   78

   79

   80

   81

   82

   83

   84

   85

   86

   87

   88

   89

   90

   91

   92

   93

   94

   95

   96

   97

   98

   99

   100

   101

   102

   103

   104

   105

   106

   107

   108

   109

   110

   111

   112

   113

   114

   115

   116

   117

   118

   119

   120

   121

   122

   123

   124

   125

   126

   127

   128

   129

   130

   131

   132

   133

   134

   135

   136

   137

   138

   139

   140

   141

   142

   143

   144

   145

   146

   147

   148

   149

   150

   151

   152

   153

   154

   155

   156

   157

   158

   159

   160

   161

   162

   163

   164

   165

   166

   167

   168

   169

   170

   171

   172

   173

   174

   175

   176

   177

   178

   179

   180

   181

   182

   183

   184

   185

   186

   187

   188

   189

   190

   191

   192

   193

   194

   195

   196

   197

   198

   199

   200

   201

   202

   203

   204

   205

   206

   207

   208

   209

   210

   211

   212

   213

   214

   215

   216

   217

   218

   219

   220

   221

   222

   223

   224

   225

   226

   227

   228

   229

   230

   231

   232

   233

   234

   235

   236

   237

   238

   239

   240

   241

   242

   243

   244

   245

   246

   247

   248

   249

   250

   251

   252

   253

   254

   255

   256

   257

   258

   259

   260

   261

   262

   263

   264

   265

   266

   267

   268

   269

   270

   271

   272

   273

   274

   275

   276

   277

   278

   279

   280

   281

   282

   283

   284

   285

   286

   287

   288

   289

   290

   291

   292

   293

   294

   295

   296

   297

   298

   299

   300

   301

   302

   303

   304

   305

   306

   307

   308

   309

   310

   311

   312

   313

   314

   315

   316

   317

   318

   319

   320

   321

   322

   323

   324

   325

   326

   327

   328

   329

   330

   331

   332

   333

   334

   335

   336

   337

   338

   339

   340

   341

   342

   343

   344

   345

   346

   347

   348

   349

   350

   351

   352

   353

   354

   355

   356

   357

   358

   359

   360

   361

   362

   363

   364

   365

   366

   367

   368

   369

   370

   371

   372

   373

   374

   375

   376

   377

   378

   379

   380

   381

   382

   383

   384

   385

   386

   387

   388

   389

   390

   391


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
2月前
|
分布式计算 关系型数据库 MySQL
大数据-88 Spark 集群 案例学习 Spark Scala 案例 SuperWordCount 计算结果数据写入MySQL
大数据-88 Spark 集群 案例学习 Spark Scala 案例 SuperWordCount 计算结果数据写入MySQL
54 3
|
2月前
|
消息中间件 分布式计算 关系型数据库
大数据-140 - ClickHouse 集群 表引擎详解5 - MergeTree CollapsingMergeTree 与其他数据源 HDFS MySQL
大数据-140 - ClickHouse 集群 表引擎详解5 - MergeTree CollapsingMergeTree 与其他数据源 HDFS MySQL
58 0
|
2月前
|
消息中间件 关系型数据库 MySQL
大数据-117 - Flink DataStream Sink 案例:写出到MySQL、写出到Kafka
大数据-117 - Flink DataStream Sink 案例:写出到MySQL、写出到Kafka
184 0
|
14天前
|
JavaScript 安全 Java
java版药品不良反应智能监测系统源码,采用SpringBoot、Vue、MySQL技术开发
基于B/S架构,采用Java、SpringBoot、Vue、MySQL等技术自主研发的ADR智能监测系统,适用于三甲医院,支持二次开发。该系统能自动监测全院患者药物不良反应,通过移动端和PC端实时反馈,提升用药安全。系统涵盖规则管理、监测报告、系统管理三大模块,确保精准、高效地处理ADR事件。
|
1月前
|
存储 SQL API
探索后端开发:构建高效API与数据库交互
【10月更文挑战第36天】在数字化时代,后端开发是连接用户界面和数据存储的桥梁。本文深入探讨如何设计高效的API以及如何实现API与数据库之间的无缝交互,确保数据的一致性和高性能。我们将从基础概念出发,逐步深入到实战技巧,为读者提供一个清晰的后端开发路线图。
|
1月前
|
监控 前端开发 Java
【技术开发】接口管理平台要用什么技术栈?推荐:Java+Vue3+Docker+MySQL
该文档介绍了基于Java后端和Vue3前端构建的管理系统的技术栈及功能模块,涵盖管理后台的访问、登录、首页概览、API接口管理、接口权限设置、接口监控、计费管理、账号管理、应用管理、数据库配置、站点配置及管理员个人设置等内容,并提供了访问地址及操作指南。
|
1月前
|
存储 缓存 NoSQL
2款使用.NET开发的数据库系统
2款使用.NET开发的数据库系统
|
1月前
|
存储 SQL 数据库
深入浅出后端开发之数据库优化实战
【10月更文挑战第35天】在软件开发的世界里,数据库性能直接关系到应用的响应速度和用户体验。本文将带你了解如何通过合理的索引设计、查询优化以及恰当的数据存储策略来提升数据库性能。我们将一起探索这些技巧背后的原理,并通过实际案例感受优化带来的显著效果。
47 4
|
1月前
|
存储 Java 关系型数据库
在Java开发中,数据库连接是应用与数据交互的关键环节。本文通过案例分析,深入探讨Java连接池的原理与最佳实践
在Java开发中,数据库连接是应用与数据交互的关键环节。本文通过案例分析,深入探讨Java连接池的原理与最佳实践,包括连接创建、分配、复用和释放等操作,并通过电商应用实例展示了如何选择合适的连接池库(如HikariCP)和配置参数,实现高效、稳定的数据库连接管理。
62 2
|
1月前
|
监控 Java 数据库连接
在Java开发中,数据库连接管理是关键问题之一
在Java开发中,数据库连接管理是关键问题之一。本文介绍了连接池技术如何通过预创建和管理数据库连接,提高数据库操作的性能和稳定性,减少资源消耗,并简化连接管理。通过示例代码展示了HikariCP连接池的实际应用。
21 1
下一篇
DataWorks