草庐IT

MySQL实验三:查询练习

程序猿小火龙 2023-09-06 原文

MySQL实验三:查询练习

目录

目录


前言

整理实验的查询练习题,数据库表会提供建立的sql语句,个人整理版非官方,如果有错误或者疑问,欢迎在评论区提出见解!

需要准备的工具:

  1. Navicat9以上
  2. mysql5.7或者mysql8都可以

sql文件

阿里云盘里包含了db_student和studymysql的表。

https://www.aliyundrive.com/s/47dHZqRHef9

提取码: od26

实验目的

  1. 掌握查询语句的基本组成和使用方法。
  2. 掌握常见的查询技巧。

实验预习

1、 SQL中查询语句的语句格式:

SELECT column_name,column_name FROM table_name;

2、SQL中创建数据表的语句格式:

 CREATE TABLE table_name (column_name1 data_type(size),column_name2 data_type(size),column_name3 data_type(size), .... );

column_name 参数规定表中列的名称。

data_type 参数规定列的数据类型(例如 varchar、integer、decimal、date 等等)。

size 参数规定表中列的最大长度。

实验内容及要求

1、数据库**db_student**中基本表的数据如下,输入下列数据。

学生表:Student

SnoSnameSsexSageSdept
9512101李勇19计算机系
9512103王敏20计算机系
9521101张莉22信息系
9521102吴宾21信息系
9521103张海20信息系
9531101钱小平18数学系
9531102王大力19数学系

课程表:Course

CnoCnameCcreditSemsterPeriod
C01计算机导论313
C02VB434
C03计算机网络474
C04数据库基础664
C05高等数学818

选课表:SC

SnoCnoGrade
9512101C0395
9512103C0351
9512101C0580
9512103C05NULL
9521101C05NULL
9521102C0580
9521103C0545
9531101C0581
9531101C0167
9531102C0594
9521103C0180
9512101C01NULL
9531102C01NULL
9512101C0287
9512101C0476

2、根据db_student中的数据,完成下列查询,将查询语句写在下方。

1)查询全体学生的信息

Select * from student;

2)查询“信息系”学生的学号,姓名和出生年份。

Select sno,sname,YEAR(NOW())-sage from student 

WHERE sdept='信息系';

3)查询考试不及格的学生的学号。

Select distinct sno from sc where grade<60;

4)查询无考试成绩的学生的学号和相应的课程号

Select sno,cno from sc where grade is null;

5)将学生按年龄升序排序。

Select * from student order by sage;

6)查询选修了课程的学生的学号和姓名。

(要求:分别使用连接查询、嵌套子查询完成)

连接查询:

SELECT distinct student.Sno, Sname

FROM student

INNER JOIN sc ON student.Sno = sc.Sno;

这里使用了INNER JOIN连接了student和sc表,通过Sno字段将两个表关联起来,然后选择出Sno和Sname两个字段。

嵌套子查询:

SELECT Sno, Sname

FROM student

WHERE Sno IN (

  SELECT DISTINCT Sno

  FROM sc

);

这里使用了IN子句和嵌套子查询,首先在子查询中获取所有选过课程的学生学号(使用DISTINCT关键字去重),然后在外层查询中选择出学号和姓名两个字段。

7)查询年龄在20-23岁之间的学生的系,姓名,年龄,按照系升序排序。

Select sname,sage,sdept from student where sage between 20 and 23 order by sdept;

8)查询选修了“计算机网络”或者“数据库基础”课程的学生的学号,姓名。

连接查询:

SELECT student.Sno, Sname
FROM student
INNER JOIN sc ON student.Sno = sc.Sno
INNER JOIN course ON sc.Cno = course.Cno
WHERE Cname IN ('计算机网络', '数据库基础');

这里使用了INNER JOIN连接了student、sc和course表,通过Sno和Cno字段将三个表关联起来,然后使用WHERE子句过滤出选修了“计算机网络”或者“数据库基础”课程的选课记录,最后选择出Sno和Sname两个字段。

嵌套子查询:

SELECT Sno, Sname
FROM student
WHERE Sno IN (
    SELECT DISTINCT Sno
    FROM sc
    WHERE Cno IN (
        SELECT Cno
        FROM course
        WHERE Cname IN ('计算机网络', '数据库基础')
    )
);

这里使用了嵌套子查询,首先在最内层子查询中获取课程名为“计算机网络”或者“数据库基础”的课程号,然后在中间层子查询中获取选修了这些课程的学生学号(使用DISTINCT关键字去重),最后在外层查询中选择出学号和姓名两个字段。

9)查询姓“张”的学生的基本信息。

select * from student where sname like'张%';

10)查询学生的选课情况,要求输出学号,姓名,课程门数,课程名列表(用逗号分隔),按照学号升序排序。

SELECT student.Sno, Sname, COUNT(sc.Cno) AS CourseCount, GROUP_CONCAT(course.Cname SEPARATOR ', ') AS CourseList
FROM student
LEFT JOIN sc ON student.Sno = sc.Sno
LEFT JOIN course ON sc.Cno = course.Cno
GROUP BY student.Sno
ORDER BY student.Sno ASC;

需要注意的是MySQL的版本中启用了ONLY_FULL_GROUP_BY模式,该模式要求SELECT语句中的非聚合列必须在GROUP BY子句中出现。换句话说,如果SELECT语句中包含非聚合列,那么这些列必须在GROUP BY子句中列出。

可以通过修改MySQL的配置文件或者执行如下SQL语句来关闭ONLY_FULL_GROUP_BY模式:

SET sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));

需要先运行这行代码再查询,否则会报错。

11)查询选修了课程的学生的总人数。

SELECT count(DISTINCT sno) FROM sc WHERE sno in (select sno from sc);

12)统计各门课程选修人数,要求输出课程代号,课程名,选修人数,有成绩人数(grade不为NULL),最高分,最低分,平均分,按课程号排序。

Select c.cno,cname,count(*),MAX(grade),MIN(grade),AVG(grade),COUNT(grade)

From student s,sc,course c where s.sno=sc.sno and sc.cno=c.cno GROUP BY c.cno

order by cno;

13)统计各门课程的重修人数(包括grade为NULL),要求输出课程代号,重修人数。

SELECT cno,COUNT(*) from sc WHERE grade<60 OR grade is NULL GROUP BY cno;

14)查询选修通过2门(包括2门)以上的学生的信息,输出学号、选修通过门数、平均成绩,按门数降序排序,若门数相同,按照成绩降序。

select sno, count(*),avg(grade)

from sc  where grade >= 60

group by sno

having count(*) >= 2 order by count(*) DESC,avg(grade) desc;

15)查询与“王大力”同一个系的学生的基本信息。

SELECT * FROM student WHERE sname !='王大力' and sdept in (

SELECT distinct sdept FROM student WHERE sname='王大力');

16)查询每个学生高于他自己选修平均分的那门课程的成绩,输出学号,课程号,课程成绩,他所有课程的平均分,并按学号升序排列。

(要求:使用基于子查询派生表的查询方法)

SELECT sc.sno,cno,grade, avggrade FROM sc,

(SELECT sno, AVG(grade) avggrade FROM sc GROUP BY sno) AS  avg_sc

WHERE sc.sno=avg_sc.sno AND

sc.grade>avg_sc.avggrade

ORDER BY sc.sno;

通过将子查询的结果作为临时表(派生表)来进行进一步的查询操作。

17)查询没有同时选修“计算机导论”和“计算机网络”两门课的学生的学号,姓名。

SELECT sno, sname 
FROM student 
WHERE sno NOT IN (
  SELECT sno 
  FROM sc 
  WHERE cno IN (
    SELECT cno 
    FROM course 
    WHERE cname IN ('计算机导论', '计算机网络')
  )
  GROUP BY sno
  HAVING COUNT(DISTINCT cno) = 2
);

这个SQL语句使用了三个子查询:

  • 最内层的子查询 SELECT cno FROM course WHERE cname IN ('计算机导论', '计算机网络') 查询出了“计算机导论”和“计算机网络”两门课程的课程号。
  • 中间层的子查询 SELECT sno FROM sc WHERE cno IN (...) GROUP BY sno HAVING COUNT(DISTINCT cno) = 2 查询出了同时选修了这两门课程的学生的学号。这里使用了GROUP BY子句和HAVING子句,分别对学生的选课记录按学号分组,然后筛选出选修的课程数为2的学生,即同时选修了“计算机导论”和“计算机网络”两门课程的学生。
  • 最外层的查询 SELECT sno, sname FROM student WHERE sno NOT IN (...) 选择出没有选修这两门课程的学生的学号和姓名。这里使用NOT IN子句来排除已经在中间层查询中被筛选出的学生。

本题同样可以用not exits来写,思路一致。

Select sno,sname from student where sno not in (select sno from student where not exists(

Select * from course where cname in ('计算机网络','计算机导论') and not exists(

Select * from sc where sno=student.sno and cno=course.cno)

));

18)查询选修了全部课程的学生的学号,姓名,系名。

select student.sno,sname,sdept from student where NOT exists     

(select  * from course where NOT exists    

(select * from sc where sc.sno = student.sno  and sc.cno = course.cno));

19)输出“高等数学”课程成绩前三名的学生的学号,姓名,系名

SELECT s.sno,sname,sdept from student s,sc,course c WHERE s.sno=sc.sno and sc.cno=c.cno AND cname='高等数学'

ORDER BY grade DESC LIMIT 3;
-- (不考虑成绩有重复值的情况)

数据库studymysql,完成下列查询

1)查询总经理、经理以下的职员信息,包括NULL值记录。

SELECT * FROM employee WHERE job_title is NULL

OR job_title not IN(

SELECT job_title from employee WHERE job_title='总经理'

OR job_title='经理'

);

2)查询“联荣资产”的客户信息

SELECT * from customer WHERE customer_name LIKE '%联荣资产%';

3)查询价格5000-6000的“联想”品牌和价格在5000以下的“小米”品牌的产品信息。

select * FROM product WHERE description LIKE '%联想%' AND price BETWEEN 5000 AND 6000 

UNION 

SELECT * FROM product WHERE description LIKE '%小米%' AND price < 5000;

4)查询如“GTX950M”/“GTX960M”系列的产品信息。

SELECT * FROM product WHERE description LIKE '%GTX950M%' OR description LIKE '%GTX960M%';

5)统计各年份订单总数,订单总额,按年份降序排列。

SELECT YEAR(pay_time),count(*) as number,sum(total_money) as money FROM payment GROUP BY YEAR(pay_time) ORDER BY YEAR(pay_time) DESC;

6)统计2016年各产品的订购数量(降序排列),输出5-10名的统计信息,包括产品ID,订购总数。

SET sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));

select product_id,payment.order_id, count(*), payment_id

from payment, order_detail where year(pay_time) = 2016 

and payment.order_id = order_detail.order_id group by order_id

order by buy_number desc limit 4,6;

总结

本篇设计大量的查询语句,初学者可能会对有些题产生困惑,这很正常,就好像人终究会被其年少不可得之物困扰一生,也会为一时一景解开其一生的困惑。加油吧少年!!

有关MySQL实验三:查询练习的更多相关文章

  1. ruby - ECONNRESET (Whois::ConnectionError) - 尝试在 Ruby 中查询 Whois 时出错 - 2

    我正在用Ruby编写一个简单的程序来检查域列表是否被占用。基本上它循环遍历列表,并使用以下函数进行检查。require'rubygems'require'whois'defcheck_domain(domain)c=Whois::Client.newc.query("google.com").available?end程序不断出错(即使我在google.com中进行硬编码),并打印以下消息。鉴于该程序非常简单,我已经没有什么想法了-有什么建议吗?/Library/Ruby/Gems/1.8/gems/whois-2.0.2/lib/whois/server/adapters/base.

  2. ruby-on-rails - 在 Rails 和 ActiveRecord 中查询时忽略某些字段 - 2

    我知道我可以指定某些字段来使用pluck查询数据库。ids=Item.where('due_at但是我想知道,是否有一种方法可以指定我想避免从数据库查询的某些字段。某种反拔?posts=Post.where(published:true).do_not_lookup(:enormous_field) 最佳答案 Model#attribute_names应该返回列/属性数组。您可以排除其中一些并传递给pluck或select方法。像这样:posts=Post.where(published:true).select(Post.attr

  3. 使用canal同步MySQL数据到ES - 2

    文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co

  4. 牛客网专项练习30天Pytnon篇第02天 - 2

    1.在Python3中,下列关于数学运算结果正确的是:(B)a=10b=3print(a//b)print(a%b)print(a/b)A.3,3,3.3333...B.3,1,3.3333...C.3.3333...,3.3333...,3D.3.3333...,1,3.3333...解析:    在Python中,//表示地板除(向下取整),%表示取余,/表示除(Python2向下取整返回3)2.如下程序Python2会打印多少个数:(D)k=1000whilek>1:    print(k)k=k/2A.1000 B.10C.11D.9解析:    按照题意每次循环K/2,直到K值小于等

  5. sql - 查询忽略时间戳日期的时间范围 - 2

    我正在尝试查询我的Rails数据库(Postgres)中的购买表,我想查询时间范围。例如,我想知道在所有日期的下午2点到3点之间进行了多少次购买。此表中有一个created_at列,但我不知道如何在不搜索特定日期的情况下完成此操作。我试过:Purchases.where("created_atBETWEEN?and?",Time.now-1.hour,Time.now)但这最终只会搜索今天与那些时间的日期。 最佳答案 您需要使用PostgreSQL'sdate_part/extractfunction从created_at中提取小时

  6. ruby-on-rails - 无法安装 mysql2 0.3.14 gem - 2

    我看到其他人也遇到过类似的问题,但没有一个解决方案对我有用。0.3.14gem与其他gem文件一起存在。我已经完全按照此处指示完成了所有操作:https://github.com/brianmario/mysql2.我仍然得到以下信息。我不知道为什么安装程序指示它找不到include目录,因为我已经检查过它存在。thread.h文件存在,但不在ruby​​目录中。相反,它在这里:C:\RailsInstaller\DevKit\lib\perl5\5.8\msys\CORE\我正在运行Windows7并尝试在Aptana3中构建我的Rails项目。我的Ruby是1.9.3。$gemin

  7. ruby-on-rails - solr 清理查询 - 2

    我在Rails上使用带有ruby​​的solr。一切正常,我只需要知道是否有任何现有代码来清理用户输入,比如以?开头的查询。或* 最佳答案 我不知道执行此操作的任何代码,但理论上可以通过查看parsingcodeinLucene来完成并搜索thrownewParseException(只有16个匹配!)。在实践中,我认为您最好只捕获代码中的任何solr异常并显示“无效查询”消息或类似信息。编辑:这里有几个“sanitizer”:http://pivotallabs.com/users/zach/blog/articles/937-s

  8. ruby-on-rails - Rails 3 在一个查询中包含多个表 - 2

    我正在为锦标赛开发一个Rails应用程序。我在这个查询中使用了三个模型:classPlayertruehas_and_belongs_to_many:tournamentsclassTournament:destroyclassPlayerMatch"Player",:foreign_key=>"player_one"belongs_to:player_two,:class_name=>"Player",:foreign_key=>"player_two"在tournaments_controller的显示操作中,我调用以下查询:Tournament.where(:id=>params

  9. ruby-on-rails - Sunspot:如何对具有不同值的多个字段进行全文查询? - 2

    我想用sunspot重现以下原始solr查询q=exact_term_text:fooORterm_textv:foo*ORalternate_text:bar*但我无法通过标准的太阳黑子界面理解这是否可能以及如何实现,因为看起来:fulltext方法似乎不接受多个文本/搜索字段参数我不知道将什么参数作为第一个参数传递给fulltext,就好像我通过了"foo"或"bar"结果不匹配如果我传递一个空参数,我得到一个q=*:*范围过滤器(例如with(:term).starting_with('foo*')(顾名思义)作为过滤器查询应用,因此不参与评分。似乎可以手动编写字符串(或者可能使

  10. ruby - 如何使用 ruby​​ mysql2 执行事务 - 2

    我已经开始使用mysql2gem。我试图弄清楚一些基本的事情——其中之一是如何明确地执行事务(对于批处理操作,比如多个INSERT/UPDATE查询)。在旧的ruby-mysql中,这是我的方法:client=Mysql.real_connect(...)inserts=["INSERTINTO...","UPDATE..WHEREid=..",#etc]client.autocommit(false)inserts.eachdo|ins|beginclient.query(ins)rescue#handleerrorsorabortentirelyendendclient.commi

随机推荐