草庐IT

SQL第三次实验

m0_62537560 2023-04-14 原文

接实验2

目录

一、数据库的单表查询和连接查询

1.查询各位学生的学号、班级和姓名

2.查询课程的全部信息

 3.查询数据库有哪些专业班级

 4.查询学时数大于60的课程信息

5.查询在1986年出生的学生的学号、姓名和出生日期

 6.查询三次作业的成绩都在80分以上的学号、课程号

7.查询姓张的学生的学号、姓名和专业班级

8.查询05级的男生信息

9.查询没有作业成绩的学号和课程号

10.查询学号为0538的学生的作业1总分

 11.查询选修了K001课程的学生人数

12.查询数据库中有几个班级

13.查询选修三门以上(含三门)课程的学生的学号和作业1平均分、作业2平均分和作业3平均分

14.查询于兰兰的选课信息,列出学号、姓名、课程名(使用两种连接查询的方式)

二、数据库查询与数据操纵

1.使用查询语句完成以下任务

1.查询与‘张志国’同一班级的学生信息(使用连接查询和子查询方式)

2.查询比“计算机应用基础”学时多的课程信息(使用连接查询与子查询的方式)

3.查询选修课程号为K002的学生的学号、姓名(使用连接查询、普通子查询、相关子查询、使用exists关键字的子查询)

4.查询没有选修K001和M001课程的学号、课程号和三次成绩(使用子查询)

 2.使用数据操纵完成以下任务

1.在学生表中添加一条学生记录,其中,学号为0593,姓名为张乐,性别为男,专业班级为电子05

2.将所有课程的学分数变为原来的两倍

3.删除张乐的信息


一、数据库的单表查询和连接查询

1.查询各位学生的学号、班级和姓名

SELECT DISTINCT 学号,专业班级,姓名
FROM 学生表

2.查询课程的全部信息

SELECT *
FROM 课程表

 3.查询数据库有哪些专业班级

SELECT DISTINCT 专业班级
FROM 学生表

 4.查询学时数大于60的课程信息

SELECT *
FROM 课程表
WHERE 学时数>60

5.查询在1986年出生的学生的学号、姓名和出生日期

SELECT 学号,姓名,出生日期
FROM 学生表
WHERE 学生表.出生日期>='1986-01-01' AND 学生表.出生日期<='1986-12-31'

 6.查询三次作业的成绩都在80分以上的学号、课程号

SELECT 学号,课程号
FROM 学生作业表
WHERE 作业1成绩>=80 AND 作业2成绩>=80 AND 作业3成绩>=80

7.查询姓张的学生的学号、姓名和专业班级

SELECT 学号,姓名,专业班级
FROM 学生表
WHERE 学生表.姓名 LIKE '张%'

8.查询05级的男生信息

SELECT *
FROM 学生表
WHERE 专业班级 LIKE '%05'
	AND 性别='男'

%表示任意字符,_表示一个字符。用于部分匹配查询(也称模糊查询),用于字符型数据查找。

格式:<属性名> LIKE <字符串常量>

%abc表示以abc结尾,前面可以有任意个字符。

abc%表示以abc开头,后面可以有任意个字符。

%abc%表示中间含有abc,前后可以有任意个字符。

a_b表示ab之间有一个字符。

[0-9]表示在0~9范围的字符。

[^a-z]表示不在a~z范围的字符。

9.查询没有作业成绩的学号和课程号

SELECT 学号,课程号
FROM 学生作业表
WHERE 作业1成绩 IS NULL
	OR 作业2成绩 IS NULL
	OR 作业3成绩 IS NULL

判断数据是否为NULL值,不能用=NULL来判断,要用IS NULL判断。

10.查询学号为0538的学生的作业1总分

SELECT 作业1总分=SUM(作业1成绩)
FROM 学生作业表
WHERE 学号='0538'

select后既可接属性名,也可接表达式。

 11.查询选修了K001课程的学生人数

SELECT 学生人数=COUNT(课程号)
FROM 学生作业表
WHERE 课程号='K001'

12.查询数据库中有几个班级

SELECT 班级数=COUNT(DISTINCT 专业班级)
FROM 学生表

 

13.查询选修三门以上(含三门)课程的学生的学号和作业1平均分、作业2平均分和作业3平均分

SELECT 学号,作业1平均分=AVG(作业1成绩),作业2平均分=AVG(作业2成绩),作业3平均分=AVG(作业3成绩)
FROM 学生作业表
GROUP BY 学号
HAVING (COUNT(课程号)>=3)

 使用GROUP分组后,如果再进行筛选,不能使用SELECT语句,只能使用HAVING语句。

库函数(如AVG,MAX,COUNT等)用在select或having子句中,不能用在where子句中。

14.查询于兰兰的选课信息,列出学号、姓名、课程名(使用两种连接查询的方式)

方式一:

SELECT DISTINCT 学生作业表.学号,学生表.姓名,课程表.课程名
FROM 学生作业表
INNER JOIN 学生表
	ON 学生作业表.学号=学生表.学号
INNER JOIN 课程表
	ON 学生作业表.课程号=课程表.课程号
WHERE 学生表.姓名='于兰兰'

 方式二:

SELECT DISTINCT 学生作业表.学号,学生表.姓名,课程表.课程名
FROM 学生作业表,学生表,课程表
WHERE 学生表.姓名='于兰兰'
	AND 学生作业表.学号=学生表.学号
	AND 学生作业表.课程号=课程表.课程号

如果两张表有外键关系可以使用内链接,因为通过内链接每一条只能返回单条记录。

使用内链接如果出现重复记录则大部分情况说明查询是错误的,在确保sql查询没有逻辑错误的情况下,可以使用DISTINCT去除重复记录。

显示的内连接,一般称为内连接,有INNER JOIN,形成的中间表为两个表经过ON条件过滤后的笛卡尔积。

隐式的内连接,没有INNER JOIN,形成的中间表为两个表的笛卡尔积。

二、数据库查询与数据操纵

1.使用查询语句完成以下任务

1.查询与‘张志国’同一班级的学生信息(使用连接查询和子查询方式)

方式一:连接查询

SELECT 学生表2.学号,学生表2.姓名,学生表2.性别,
	学生表2.专业班级,学生表2.出生日期,学生表2.联系电话
FROM 学生表 AS 学生表1,学生表 AS 学生表2
WHERE 学生表1.专业班级=学生表2.专业班级
	AND 学生表1.姓名='张志国'
	AND 学生表2.姓名<>'张志国'

采用自连接方式,由于列同名,要带上表名称。

连接查询:

连接方法
类别连接方法作用
内连接

内连接

(INNER JOIN)

显示符合条件的记录,此为默认值。
外连接

左(外)连接

(LEFT JOIN)

显示符合条件的数据行以及左边表中不符合条件的数据行。此时右边数据行会以NULL来显示。

右(外)连接

(RIGHT JOIN)

显示符合条件的数据行以及右边表中不符合条件的数据行。此时左边数据行会以NULL来显示。

全外连接

(FULL JOIN)

显示符合条件的数据行以及两边表中不符合条件的数据行。此时缺乏数据的数据行会以NULL来显示。
交叉连接CROSS JOIN将一个表中的每一个记录和另一个表的每个记录匹配成新的数据行(笛卡尔积)。

引用列名时要加上表名前缀,避免产生二义性。若列名唯一,则不必加前缀。

内连接几种创建方式:
注:R,T为两个不同的表,TNo为两个表共有的列。

1.常见写法

SELECT T.TNo,TN,RNo
FROM T INNER JOIN R
ON T.TNo=R.TNo

内连接两个表,连接条件为TNo属性的值相等。

2.投影法

SELECT T.TNo,TN,RNo
FROM
(SELECT TNo,TN) AS T0
INNER JOIN
(SELECT TNo,RNo) AS R0
ON T0.TNo=R0.TNo

选取两个表需要的属性组成新表,内连接两个新表,连接条件同上。

3.筛选法

SELECT T.TNo,TN,RNo
FROM T,R
WHERE T.TNo=R.TNo

默认连接两表,由于没有设置连接条件,结果为两表的笛卡尔积(相同的属性列重合),需要用WHERE语句筛选。

方式二:子查询:

SELECT *
FROM 学生表
WHERE 专业班级=(SELECT 专业班级
	FROM 学生表
	WHERE 姓名='张志国')
	AND 姓名<>'张志国'

 WHERE中进行子查询,返回符合子查询的集合,父查询在集合中继续查询。

2.查询比“计算机应用基础”学时多的课程信息(使用连接查询与子查询的方式)

方式一:连接查询

SELECT 课程表2.课程号,课程表2.课程名,课程表2.学分数,
	课程表2.学时数,课程表2.任课老师
FROM 课程表 AS 课程表1,课程表 AS 课程表2
WHERE 课程表1.课程名='计算机应用基础'
	AND 课程表2.学时数>课程表1.学时数

方式二:子查询

SELECT *
FROM 课程表
WHERE 学时数>(SELECT 学时数
	FROM 课程表
	WHERE 课程名='计算机应用基础')

3.查询选修课程号为K002的学生的学号、姓名(使用连接查询、普通子查询、相关子查询、使用exists关键字的子查询)

方法一:连接查询

SELECT 学生表.学号,姓名
FROM 学生表,学生作业表
WHERE 学生表.学号=学生作业表.学号
	AND 学生作业表.课程号='K002'

 方法二:普通子查询

SELECT 学号,姓名
FROM 学生表
WHERE (学号 IN (SELECT 学号
	FROM 学生作业表
	WHERE 课程号='K002'))

 方法三:相关子查询

SELECT 学号,姓名
FROM 学生表
WHERE ('K002' IN (SELECT 课程号
	FROM 学生作业表
	WHERE 学号=学生表.学号))

相关子查询涉及表外查询

 方法四:使用exists关键字的子查询

SELECT 学号,姓名
FROM 学生表
WHERE (EXISTS(SELECT 课程号
	FROM 学生作业表
	WHERE 学号=学生表.学号
	AND 课程号='k002'))

 子查询:

4.查询没有选修K001和M001课程的学号、课程号和三次成绩(使用子查询)

SELECT 学号,课程号,作业1成绩,作业2成绩,作业3成绩
FROM 学生作业表
WHERE (课程号 NOT IN(SELECT 课程号
	FROM 学生作业表
	WHERE 课程号 IN ('K001','M001')))

 2.使用数据操纵完成以下任务

1.在学生表中添加一条学生记录,其中,学号为0593,姓名为张乐,性别为男,专业班级为电子05

INSERT INTO 学生表
VALUES ('0593','张乐','男','电子05',NULL,NULL)

 

2.将所有课程的学分数变为原来的两倍

UPDATE 课程表
SET 学分数=2*学分数

 表格数据变化:

原先:

当前:

3.删除张乐的信息

DELETE
FROM 学生表
WHERE 姓名='张乐'

 删除成功(已没有张乐的信息):

有关SQL第三次实验的更多相关文章

  1. Hive SQL 五大经典面试题 - 2

    目录第1题连续问题分析:解法:第2题分组问题分析:解法:第3题间隔连续问题分析:解法:第4题打折日期交叉问题分析:解法:第5题同时在线问题分析:解法:第1题连续问题如下数据为蚂蚁森林中用户领取的减少碳排放量iddtlowcarbon10012021-12-1212310022021-12-124510012021-12-134310012021-12-134510012021-12-132310022021-12-144510012021-12-1423010022021-12-154510012021-12-1523.......找出连续3天及以上减少碳排放量在100以上的用户分析:遇到这类

  2. 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中提取小时

  3. sql - 在 Rails Console for PostgreSQL 的表中显示数据 - 2

    我找到了这样的东西:Rails:Howtolistdatabasetables/objectsusingtheRailsconsole?这一行没问题:ActiveRecord::Base.connection.tables并返回所有表但是ActiveRecord::Base.connection.table_structure("users")产生错误:ActiveRecord::Base.connection.table_structure("projects")我认为table_structure不是Postgres方法。如何列出Postgres数据库的Rails控制台中表中的所有

  4. ruby - 尝试比较两个文本文件,并根据信息创建第三个 - 2

    我有两个文本文件,master.txt和926.txt。如果926.txt中有一行不在master.txt中,我想写入一个新文件notinbook.txt。我写了我能想到的最好的东西,但考虑到我是一个糟糕的/新手程序员,它失败了。这是我的东西g=File.new("notinbook.txt","w")File.open("926.txt","r")do|f|while(line=f.gets)x=line.chompifFile.open("master.txt","w")do|h|endwhile(line=h.gets)ifline.chomp!=xputslineendende

  5. ruby - 防止SQL注入(inject)/好的Ruby方法 - 2

    Ruby中防止SQL注入(inject)的好方法是什么? 最佳答案 直接使用ruby?使用准备好的语句:require'mysql'db=Mysql.new('localhost','user','password','database')statement=db.prepare"SELECT*FROMtableWHEREfield=?"statement.execute'value'statement.fetchstatement.close 关于ruby-防止SQL注入(inject

  6. ruby-on-rails - 如何在 Rails 中的不同数据库上执行直接 SQL 代码 - 2

    我正在编写一个Rails应用程序,它将监视某些特定数据库的数据质量。为了做到这一点,我需要能够对这些数据库执行直接SQL查询——这当然与用于驱动Rails应用程序模型的数据库不同。简而言之,这意味着我无法使用通过ActiveRecord基础连接的技巧。我需要连接的数据库在设计时是未知的(即:我不能将它们的详细信息放在database.yaml中)。相反,我有一个模型“database_details”,用户将使用它来输入应用程序将在运行时执行查询的数据库的详细信息。因此与这些数据库的连接实际上是动态的,细节仅在运行时解析。 最佳答案

  7. sql - Rails:使用 Postgres 创建对象时重复 ActiveRecord::RecordNotUnique? - 2

    我正在使用Rails4应用程序,它需要创建大量对象以响应来自另一个系统的事件。当我调用create!时,主键列上出现非常频繁的ActiveRecord::RecordNotUnique错误(由PG::UniqueViolation引起)我的模型之一。我在SO上找到了其他答案,建议挽救异常并调用retry:beginTableName.create!(data:'here')rescueActiveRecord::RecordNotUnique=>eife.message.include?'_pkey'#Onlyretryprimarykeyviolationslog.warn"Retr

  8. ruby-on-rails - Ruby 和 SQL 中的重复业务逻辑 - 2

    我有一个PORO(普通旧Ruby对象)来处理一些业务逻辑。它接收一个ActiveRecord对象并对其进行分类。为了简单起见,以下面为例:classClassificatorSTATES={1=>"Positive",2=>"Neutral",3=>"Negative"}definitializer(item)@item=itemenddefnameSTATES.fetch(state_id)endprivatedefstate_idreturn1if@item.value>0return2if@item.value==0return3if@item.value但是,我还想根据这些st

  9. sql - ActiveRecord 的意外行为包括 - 2

    我正在使用ARincludes在对象User和Building之间执行LEFTOUTERJOIN的方法,其中User可能有也可能没有Building关联:users=User.includes(:building).references(:buildings)因为我正在使用references,任何关联的Building对象都将被预先加载。我的期望是我随后能够遍历用户列表,并检查用户是否有与其关联的建筑物而不会触发额外的查询,但实际上每当我尝试访问建筑物属性时我都会看到对于没有建筑物的用户,AR会进行另一个SQL调用以尝试检索该建筑物(尽管在后续尝试中它只会返回nil)。这些查询显然是

  10. sql - 如何查询具有 3 个标签的事件? - 2

    我有以下模型:activity.rbtag.rbtagging.rb标签是事件和标签的连接模型。我想搜索具有2个或更多标签的事件。我如何在Rails中执行此操作?例如:我有tag1=Christmas,tag2=Florida,tag3=John如果存在,我想找到tag1、tag2和tag3存在的Activity。[编辑]我最终做了什么:tags=[tag1,tag2,tag3]activities=[]tags.eachdo|tag|activities如果任何组值的大小等于tags.size,则该事件包含所有标签。 最佳答案 如

随机推荐