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

阿里云盘里包含了db_student和studymysql的表。
https://www.aliyundrive.com/s/47dHZqRHef9
提取码: od26
SELECT column_name,column_name FROM table_name;
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 参数规定表中列的最大长度。
db_student**中基本表的数据如下,输入下列数据。学生表:Student
| Sno | Sname | Ssex | Sage | Sdept |
|---|---|---|---|---|
| 9512101 | 李勇 | 男 | 19 | 计算机系 |
| 9512103 | 王敏 | 女 | 20 | 计算机系 |
| 9521101 | 张莉 | 女 | 22 | 信息系 |
| 9521102 | 吴宾 | 男 | 21 | 信息系 |
| 9521103 | 张海 | 男 | 20 | 信息系 |
| 9531101 | 钱小平 | 女 | 18 | 数学系 |
| 9531102 | 王大力 | 男 | 19 | 数学系 |
课程表:Course
| Cno | Cname | Ccredit | Semster | Period |
|---|---|---|---|---|
| C01 | 计算机导论 | 3 | 1 | 3 |
| C02 | VB | 4 | 3 | 4 |
| C03 | 计算机网络 | 4 | 7 | 4 |
| C04 | 数据库基础 | 6 | 6 | 4 |
| C05 | 高等数学 | 8 | 1 | 8 |
选课表:SC
| Sno | Cno | Grade |
|---|---|---|
| 9512101 | C03 | 95 |
| 9512103 | C03 | 51 |
| 9512101 | C05 | 80 |
| 9512103 | C05 | NULL |
| 9521101 | C05 | NULL |
| 9521102 | C05 | 80 |
| 9521103 | C05 | 45 |
| 9531101 | C05 | 81 |
| 9531101 | C01 | 67 |
| 9531102 | C05 | 94 |
| 9521103 | C01 | 80 |
| 9512101 | C01 | NULL |
| 9531102 | C01 | NULL |
| 9512101 | C02 | 87 |
| 9512101 | C04 | 76 |
db_student中的数据,完成下列查询,将查询语句写在下方。Select * from student;
Select sno,sname,YEAR(NOW())-sage from student
WHERE sdept='信息系';
Select distinct sno from sc where grade<60;
Select sno,cno from sc where grade is null;
Select * from student order by sage;
(要求:分别使用连接查询、嵌套子查询完成)
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关键字去重),然后在外层查询中选择出学号和姓名两个字段。
Select sname,sage,sdept from student where sage between 20 and 23 order by sdept;
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关键字去重),最后在外层查询中选择出学号和姓名两个字段。
select * from student where sname like'张%';
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',''));
需要先运行这行代码再查询,否则会报错。
SELECT count(DISTINCT sno) FROM sc WHERE sno in (select sno from sc);
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;
SELECT cno,COUNT(*) from sc WHERE grade<60 OR grade is NULL GROUP BY cno;
select sno, count(*),avg(grade)
from sc where grade >= 60
group by sno
having count(*) >= 2 order by count(*) DESC,avg(grade) desc;
SELECT * FROM student WHERE sname !='王大力' and sdept in (
SELECT distinct sdept FROM student WHERE sname='王大力');
(要求:使用基于子查询派生表的查询方法)
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;
通过将子查询的结果作为临时表(派生表)来进行进一步的查询操作。
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)
));
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));
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;
-- (不考虑成绩有重复值的情况)
SELECT * FROM employee WHERE job_title is NULL
OR job_title not IN(
SELECT job_title from employee WHERE job_title='总经理'
OR job_title='经理'
);
SELECT * from customer WHERE customer_name LIKE '%联荣资产%';
select * FROM product WHERE description LIKE '%联想%' AND price BETWEEN 5000 AND 6000
UNION
SELECT * FROM product WHERE description LIKE '%小米%' AND price < 5000;
SELECT * FROM product WHERE description LIKE '%GTX950M%' OR description LIKE '%GTX960M%';
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;
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;
本篇设计大量的查询语句,初学者可能会对有些题产生困惑,这很正常,就好像人终究会被其年少不可得之物困扰一生,也会为一时一景解开其一生的困惑。加油吧少年!!

我正在用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.
我知道我可以指定某些字段来使用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
文章目录一、概述简介原理模块二、配置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
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值小于等
我正在尝试查询我的Rails数据库(Postgres)中的购买表,我想查询时间范围。例如,我想知道在所有日期的下午2点到3点之间进行了多少次购买。此表中有一个created_at列,但我不知道如何在不搜索特定日期的情况下完成此操作。我试过:Purchases.where("created_atBETWEEN?and?",Time.now-1.hour,Time.now)但这最终只会搜索今天与那些时间的日期。 最佳答案 您需要使用PostgreSQL'sdate_part/extractfunction从created_at中提取小时
我看到其他人也遇到过类似的问题,但没有一个解决方案对我有用。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
我在Rails上使用带有ruby的solr。一切正常,我只需要知道是否有任何现有代码来清理用户输入,比如以?开头的查询。或* 最佳答案 我不知道执行此操作的任何代码,但理论上可以通过查看parsingcodeinLucene来完成并搜索thrownewParseException(只有16个匹配!)。在实践中,我认为您最好只捕获代码中的任何solr异常并显示“无效查询”消息或类似信息。编辑:这里有几个“sanitizer”:http://pivotallabs.com/users/zach/blog/articles/937-s
我正在为锦标赛开发一个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
我想用sunspot重现以下原始solr查询q=exact_term_text:fooORterm_textv:foo*ORalternate_text:bar*但我无法通过标准的太阳黑子界面理解这是否可能以及如何实现,因为看起来:fulltext方法似乎不接受多个文本/搜索字段参数我不知道将什么参数作为第一个参数传递给fulltext,就好像我通过了"foo"或"bar"结果不匹配如果我传递一个空参数,我得到一个q=*:*范围过滤器(例如with(:term).starting_with('foo*')(顾名思义)作为过滤器查询应用,因此不参与评分。似乎可以手动编写字符串(或者可能使
我已经开始使用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