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

本文涉及的产品
云数据库 RDS MySQL,集群版 2核4GB 100GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云原生大数据计算服务MaxCompute,500CU*H 100GB 3个月
简介: 查询查来查去都是差不多,这里想玩点新的,主要还是多用了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
目录
相关文章
|
17天前
|
安全 关系型数据库 MySQL
|
3天前
|
XML 数据库 数据格式
Spring5入门到实战------14、完全注解开发形式 ----JdbcTemplate操作数据库(增删改查、批量增删改)。具体代码+讲解 【终结篇】
这篇文章是Spring5框架的实战教程的终结篇,介绍了如何使用注解而非XML配置文件来实现JdbcTemplate的数据库操作,包括增删改查和批量操作,通过创建配置类来注入数据库连接池和JdbcTemplate对象,并展示了完全注解开发形式的项目结构和代码实现。
Spring5入门到实战------14、完全注解开发形式 ----JdbcTemplate操作数据库(增删改查、批量增删改)。具体代码+讲解 【终结篇】
|
5天前
|
SQL 存储 Java
完整java开发中JDBC连接数据库代码和步骤
该博客文章详细介绍了使用JDBC连接数据库的完整步骤,包括加载JDBC驱动、提供连接URL、创建数据库连接、执行SQL语句、处理结果以及关闭JDBC对象的过程,并提供了相应的示例代码。
|
5天前
|
消息中间件 数据采集 关系型数据库
大数据-业务数据采集-FlinkCDC 读取 MySQL 数据存入 Kafka
大数据-业务数据采集-FlinkCDC 读取 MySQL 数据存入 Kafka
20 1
|
5天前
|
数据采集 关系型数据库 MySQL
大数据-业务数据采集-FlinkCDC The MySQL server is not configured to use a ROW binlog_format
大数据-业务数据采集-FlinkCDC The MySQL server is not configured to use a ROW binlog_format
15 1
|
10天前
|
存储 SQL 运维
运维开发.MySQL.范式与反范式化
运维开发.MySQL.范式与反范式化
27 1
|
25天前
|
存储 关系型数据库 MySQL
MySQL数据库开发进阶:精通数据库表的创建与管理22
【7月更文挑战第22天】数据库的创建与删除,数据表的创建与管理
34 1
|
4天前
|
SQL 数据可视化 关系型数据库
平时MySQL开发时,经常用到的小技巧
MySQL开发过程中常用的一些技巧,包括使用MD5函数、创建带逻辑删除标识和时间戳的表、多行合并为一行、时间差计算、不走索引的查询优化、多表连接更新等操作的SQL语句示例。
12 0
|
4天前
|
SQL 存储 Java
完整java开发中JDBC连接数据库代码和步骤
该博客文章详细介绍了使用JDBC连接数据库的完整步骤,包括加载JDBC驱动、提供连接URL、创建数据库连接、执行SQL语句、处理结果以及关闭JDBC对象的过程,并提供了相应的示例代码。

热门文章

最新文章