牛客SQL练习题 (202094)

tech2025-08-17  4

1. 查询出每门课都大于80 分的学生姓名

一张学生成绩表score,部分内容如下: name course grade 张三 操作系统 67 张三 数据结构 86 李四 软件工程 89

用一条SQL 语句查询出每门课都大于80 分的学生姓名

思路1

Select distinct name from score where name not in(Select name from score where grade <= 80);

思路2

select name from score group by name having count(*)=sum(case when grade >80 then 1 else 0 end);



2.

DDL(Data Definition Language): 数据定义语言 用来定义数据库对象: 数据库,表,列等。 关键字:create,drop, alter等。

DML(Data Manipulation Language): 数据操作语言 用来对数据库中的表进行增删改操作。 关键字:insert,delete,update等。

DQL(Data Query Language): 数据查询语言 用来查询数据库中表的记录(数据)。 关键字:select, where等

DCL(Data Control Language): 数据控制语言 用来定义数据库的访问控制权限和安全级别,及创建用户。 关键字: grant, revoke等





3. select语句完整语法:

select 目标表的列名或列表达式序列

from 基本表名和(或)视图序列

[where 行条件表达式]

[group by 列名序列] [having 组条件表达式]

[order by 列名[asc | desc]],

排序采用 order by 子句,order by 后面跟上排序字段,排序字段可以放多个,多个采用逗号 间隔,order by 默认采用升序,如果存在 where 子句那么 order by 必须放到 where 语句的后 面。

order by 必须放到 group by 后面

则sql语句的执行顺序是:

2),3),4),1) ,5)





4. 删除已有表

drop是完全删除表,包括表结构delete是删除表数据,保留表的结构,而且可以加where,只删除一行或者多行truncate 只能删除表数据,会保留表结构,而且不能加where

DELETE FROM waterinfo001; 清除 waterinfo001 表全部记录

DROP TABLE waterinfo001; 删除 waterinfo001 表

delete是数据操作语言,drop是数据定义语言





5. 请取出当天的所有记录

请取出 BORROW表中日期 (RDATE字段) 为当天的所有记录? RDATE字段为datetime型,包含日期与时间。

select * from BORROW where datediff(RDATE,getdate())=0;

MySQL中DATEDIFF()函数语法为DATEDIFF(date1,date2), 返回两个日期之间的天数

例1

SELECT DATEDIFF('2008-12-29','2008-12-30') AS DiffDate;

返回结果是-1

例2

SELECT DATEDIFF('2008-12-30','2008-12-29') AS DiffDate;

返回结果是1





6. any/all

any表示有任何一个满足就返回true,all表示全部都满足才返回true

运动员ATHLETE(运动员编号 Ano,姓名Aname,性别Asex,所属系名 Adep)

项目 ITEM (项目编号Ino,名称Iname,比赛地点Ilocation)

成绩SCORE (运动员编号Ano,项目编号Ino,积分Score)

写出目前总积分最高的系名及其积分.

SELECT Adep,SUM(Score)FROM ATHLETE,SCORE WHERE ATHLETE.Ano=SCORE.Ano GROUP BY Adep HAVING SUM(Score)>= ALL(SELECT SUM(Score) FROM ATHLETE,SCORE WHERE ATHLETE.Ano=SCORE.Ano GROUP BY Adep);

我的答案:

select a.adep, sum(s.score) total_score from score s left join athlete a on s.ano=a.ano group by a.adep order by total_score desc limit 1;



7. 行转列

有一张学生成绩表sc(sno 学号,class 课程,score 成绩),请查询出每个学生的英语、数学的成绩(行转列,一个学生只有一行记录)。

select sno, sum(if(class='english',score,0)) as english, sum( if(class='math',score,0) ) as math from sc where class in('english','math') group by sno;



8. 从一个表中选取数据,插入另一个表中

某打车公司将表drivers 中 驾驶里程(drivedistanced)超过5000里的司机信息转移到一张称为seniordrivers 的表中

select * into seniordrivers from drivers where drivedistanced >=5000;

INSERT INTO 语句用于向表格中插入新的行。 INSERT INTO table_name VALUES (值1, 值2,…)

指定所要插入数据的列: INSERT INTO table_name (列1, 列2,…) VALUES (值1, 值2,…)

SELECT INTO 语句从一个表中选取数据,然后把数据插入另一个表中。 常用于创建表的备份复件或者用于对记录进行存档。

把所有的列插入新表 SELECT * INTO new_table_name [IN externaldatabase] FROM old_tablename

只把希望的列插入新表 SELECT column_name(s) INTO new_table_name [IN externaldatabase] FROM old_tablename

最新回复(0)