需要数据库表1.学生表

Student(SID,Sname,Sage,Ssex) --SID 学生编号,Sname 学生姓名,Sage 出生年月,Ssex 学生性别

2.课程表

Course(CID,Cname,TID) --CID --课程编号,Cname 课程名称,TID 教师编号

3.教师表

Teacher(TID,Tname) --TID 教师编号,Tname 教师姓名

4.成绩表

SC(SID,CID,score) --SID 学生编号,CID 课程编号,score 分数

添加测试数据1.学生表

create table Student(SID varchar(10),Sname nvarchar(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' , '女');

2.课程表

create table Course(CID varchar(10),Cname nvarchar(10),TID varchar(10));

insert into Course values('01' , '语文' , '02');

insert into Course values('02' , '数学' , '01');

insert into Course values('03' , '英语' , '03');

3.教师表

create table Teacher(TID varchar(10),Tname nvarchar(10));

insert into Teacher values('01' , '张三');

insert into Teacher values('02' , '李四');

insert into Teacher values('03' , '王五');

4.成绩表

create table SC(SID varchar(10),CID varchar(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);

以下是整理的题目、答案以及学习心得

1.查询"01"课程比"02"课程成绩高的学生的信息及课程分数

SELECT

m.sid,

sum( CASE m.cid WHEN '01' THEN m.score END ) AS a,

sum( CASE m.cid WHEN '02' THEN m.score END ) AS b,

n.*

FROM

sc m

left join student n on m.sid=n.sid

GROUP BY

m.sid

HAVING

a >b

学习心得:

一开始以为传统的sql可以实现,比如子查询之类的,但是发现不能比较前后两列的数据,后来想把同一个学生的成绩在一列展示,在网上找到一个解决方法

select stuName,

sum(decode(courseName,'语文',score,null)) as chineseScore,

sum(decode(courseName,'数学',score,null)) as mathScore,

sum(decode(courseName,'英语',score,null)) as englishScore

from stuScore group by stuName;

但是不能实现,报错,具体的原因没有找到

最后找到了一个可以实现的方法,先分组,然后用case...when...then...end,把同一个sid的数据在一行展示,这样就可以用having进行判断。

备注:

还有一种写法

SELECT

a.SID ,a.score

FROM

( SELECT SID, score FROM sc WHERE cid = '01' ) a,

( SELECT SID, score FROM sc WHERE cid = '02' ) b

WHERE

a.score > b.score

AND a.SID = b.SID;

2.查询同时存在"01"课程和"02"课程的情况

SELECT

m.sid,

sum( CASE m.cid WHEN '01' THEN m.score END ) AS a,

sum( CASE m.cid WHEN '02' THEN m.score END ) AS b,

n.*

FROM

sc m

LEFT JOIN student n ON m.sid = n.sid

GROUP BY

m.sid

HAVING

a IS NOT NULL

AND b IS NOT NULL

3.查询同时存在"01"课程和"02"课程的情况和存在"01"课程但可能不存在"02"课程的情况(不存在时显示为null)(以下存在相同内容时不再解释)

SELECT

m.sid,

sum( CASE m.cid WHEN '01' THEN m.score END ) AS a,

sum( CASE m.cid WHEN '02' THEN m.score END ) AS b,

n.*

FROM

sc m

LEFT JOIN student n ON m.sid = n.sid

GROUP BY

m.sid

HAVING

( a IS NOT NULL AND b IS NOT NULL )

OR ( a IS NOT NULL AND b IS NULL )

4.查询"01"课程比"02"课程成绩低的学生的信息及课程分数

SELECT

m.sid,

sum( CASE m.cid WHEN '01' THEN m.score END ) AS a,

sum( CASE m.cid WHEN '02' THEN m.score END ) AS b,

n.*

FROM

sc m

LEFT JOIN student n ON m.sid = n.sid

GROUP BY

m.sid

HAVING

a

5.查询同时存在"01"课程和"02"课程的情况和不存在"01"课程但存在"02"课程的情况

SELECT

m.sid,

sum( CASE m.cid WHEN '01' THEN m.score END ) AS a,

sum( CASE m.cid WHEN '02' THEN m.score END ) AS b,

n.*

FROM

sc m

LEFT JOIN student n ON m.sid = n.sid

GROUP BY

m.sid

HAVING

( a IS NOT NULL AND b IS NOT NULL )

OR ( a IS NULL AND b IS NOT NULL )

6.查询平均成绩大于等于60分的同学的学生编号和学生姓名和平均成绩

SELECT

sid,

a,

b,

c,

( a + b + c ) / 3

FROM

(

SELECT

m.sid,

sum( CASE m.cid WHEN '01' THEN m.score END ) AS a,

sum( CASE m.cid WHEN '02' THEN m.score END ) AS b,

sum( CASE m.cid WHEN '03' THEN m.score END ) AS c

FROM

sc m

LEFT JOIN student n ON m.sid = n.sid

GROUP BY

m.sid

) w

GROUP BY

sid

HAVING

( a + b + c ) / 3 >= 60

7.查询平均成绩小于60分的同学的学生编号和学生姓名和平均成绩

SELECT

sid,

a,

b,

c,

( a + b + c ) / 3

FROM

(

SELECT

m.sid,

sum( CASE m.cid WHEN '01' THEN m.score END ) AS a,

sum( CASE m.cid WHEN '02' THEN m.score END ) AS b,

sum( CASE m.cid WHEN '03' THEN m.score END ) AS c

FROM

sc m

LEFT JOIN student n ON m.sid = n.sid

GROUP BY

m.sid

) w

GROUP BY

sid

HAVING

( a + b + c ) / 3 < 60

学习心得:

主查询如果想用子查询得到的字段,必须在主查询select里输出,否则where条件或者having就不能用子查询得到的字段

8.查询在sc表存在成绩的学生信息的SQL语句

SELECT

m.sid,

sum( CASE m.cid WHEN '01' THEN m.score END ) AS a,

sum( CASE m.cid WHEN '02' THEN m.score END ) AS b,

sum( CASE m.cid WHEN '03' THEN m.score END ) AS c,

n.*

FROM

sc m

LEFT JOIN student n ON m.sid = n.sid

GROUP BY

m.sid

9.查询在sc表中不存在成绩的学生信息的SQL语句

SELECT

*

FROM

student

WHERE

sid NOT IN ( SELECT sid FROM sc GROUP BY sid )

mysql语句面试题_mysql的sql面试题(1)相关推荐

  1. mysql 语句性能分析_mysql的sql语句的性能诊断分析

    1> explain SQL,类似于Oracle中explain语句 例如:explain select * from nad_aditem; 2> select benchmark(co ...

  2. mysql 语句账号注入_mysql中SQL语句的注入问题

    SET NAMES utf8mb4; DROP TABLE IF EXISTS `user`; CREATE TABLE `user` ( `id` INT(11) UNSIGNED NOT NULL ...

  3. mysql 语句块语法_MySQL ------ MySQL常用语句的语法 (三十四)

    MySQL常用的语句语法 注意:1. | 符号用来指出几个选中中的一个,因此NULL | NOT NULL 表示给出null 或 not null 2.包含在方括号中的关键字或子句是可选的(如 [li ...

  4. mysql语句engin_MySQL必会的SQL语句

    本文谈谈MySQL的开发必会的sql语句 创建数据库 create database db1; 删除数据库 drop database db1; 创建数据表 create table tb1用户表( ...

  5. mysql语句大小写要求_mysql踩坑(一)-大小写规则

    mysql大小写 在实际的项目中,大家或多或少都会遇到过mysql数据库大小写的问题.下面,博主将简单的介绍一下mysql数据库的大小写问题. sql关键字和函数名 在mysql数据库中,sql关键字 ...

  6. mysql简单防注入_mysql防止sql注入的方法

    mysql防止sql注入的方法 发布时间:2020-08-25 14:07:29 来源:亿速云 阅读:98 作者:小新 这篇文章将为大家详细讲解有关mysql防止sql注入的方法,小编觉得挺实用的,因 ...

  7. 将mysql语句转换为sql_数据库-转换sql语句

    文章描述:主要说明转换成SQL语句的过程.----必要信息(数据库名,表名,条件)转换成SQL语句 一些界面上数据增删改查的操作往往只需要输入一数据库名,表名,加条件就可以进行数据查询了,在这背后是怎 ...

  8. mysql多表查询sql语句怎么写_MySQL基本SQL语句之单表查询、多表查询和子查询

    一.简单查询: 基本语法: SELECT * FROM tb_name;查询全部 SELECT field1,field2 FROM tb_name; 投影 SELECT [DISTINCT] * F ...

  9. mysql中常用动词_mysql常用sql语句总结

    sql语言简洁只有7个动词:SELECT , DROP, ALTER, CREATE,INSERT, UPDATE,DELETE: 获取表结构:Desc 表名:(show databases;tabl ...

最新文章

  1. Python3算法基础练习:编程100例( 31 ~ 35 )
  2. FIXML and FpML - Background, Comparison, Integration Interoperability Opportunities
  3. Tomcat集群快速入门2
  4. 使用Oracle WebLogic对应用程序外部的EJB的引用
  5. 程序设计工程师c语言,《C语言程序设计》自学百问.doc
  6. linux如何查看nginx是否启动
  7. 20141113--SQL 事务
  8. Python生态工具、文本处理和系统管理(虚拟)
  9. nginx反代+varnish缓存+后端LAMP平台集群实现
  10. 深信服桌面云(aDesk)学习笔记
  11. 插值方法: 拉格朗日插值--逐步插值的自适应算法
  12. 金蝶k3 wise版本安装流程
  13. 我的面经——投行+咨询+外资银行
  14. 1-Unity是什么
  15. Linux常用指令(详解)
  16. codeforces 702F 可持久化平衡树
  17. su和su-以及sudo的理解
  18. 删除MySQL表的SQL语句-DROP-TABLE-简介
  19. 传奇手游开服教程:怎么开传奇手游?开传奇手游需要准备什么?
  20. 线性代数 --- 线性代数基本定理下(四个基本子空间两两正交且互为正交补)

热门文章

  1. 【BZOJ3729】Gty的游戏,博弈+splay
  2. 【BZOJ3143】游走,概率计算+高斯消元
  3. python随机生成k个不重复的随机数_使用Python生成不重复的随机值
  4. 2017.10.10 杀人游戏 思考记录
  5. linux文件未识别,linux的内核文件vmlinuz介绍-深入理解Linux重定向的使用-网卡eth0,未识别的端口的解决方法_169IT.COM...
  6. 【英语学习】【English L06】U07 Jobs L2 I have my own bakery now
  7. 【英语学习】【WOTD】thole 释义/词源/示例
  8. Intel Core Enhanced Core架构/微架构/流水线 (10) - 先进存储器访问
  9. 在 Linux 平台下使用 JNI
  10. 图形学理论知识 BRDF 双向反射分布函数