数据库SQL语句练习-打卡第一篇

数据库SQL-学生数据库

创建

  • ⭐创建db_student数据库⭐
CREATE DATABASE db_student CHARACTER SET='utf8';

在这里插入图片描述

  • ⭐创建student表,数据自填⭐
CREATE TABLE student(
	sno CHAR(7) PRIMARY KEY COMMENT '学号',
	sname CHAR(10) NOT NULL COMMENT '姓名',
	ssex 	ENUM('男','女'),
	sage SMALLINT,
	sdept VARCHAR(20)  
);

在这里插入图片描述

  • ⭐创建course表⭐
CREATE TABLE course(
	cno CHAR(10) PRIMARY KEY COMMENT '课程号',
	cname VARCHAR(20) NOT NULL COMMENT '课程名',
	ccredit SMALLINT,
	semster SMALLINT,
	period SMALLINT
);

在这里插入图片描述

  • ⭐创建sc表⭐
CREATE TABLE sc(
	sno CHAR(10),
	cno CHAR(10),
	grade SMALLINT,
	PRIMARY KEY(sno,cno),
	FOREIGN KEY(sno) REFERENCES student(sno),
	FOREIGN KEY(cno) REFERENCES course(cno)
);

在这里插入图片描述

查询

  • ⭐查询全体学生的信息⭐
SELECT *FROM student

在这里插入图片描述

  • ⭐查询“信息系”学生的学号,姓名和年龄⭐
SELECT sno,sname,sage FROM student
WHERE sdept='信息系';

在这里插入图片描述

  • ⭐查询考试不及格的学生的学号⭐
SELECT sno FROM sc
WHERE grade<60;

在这里插入图片描述

  • ⭐查询无考试成绩的学生的学号和相应的课程号⭐
SELECT sno,cno FROM sc
WHERE grade is NULL;

在这里插入图片描述

  • ⭐将学生按年龄升序排序⭐

排序 :
ORDER BY sage ASC 按照年龄升序
ORDER BY sage DESC 按照年龄降序

SELECT *FROM student
ORDER BY sage ASC  

在这里插入图片描述

  • ⭐查询选修了课程的学生的学号和姓名⭐

(1)连接查询:

SELECT DISTINCT sc.sno,sname FROM student,sc 
WHERE student.sno=sc.sno;

(2)嵌套子查询:

SELECT sno,sname  FROM student
WHERE sno IN(
	SELECT DISTINCT sno FROM sc
)

(3)嵌套子查询:

SELECT sno,sname FROM student 
WHERE sno= ANY(
	SELECT DISTINCT sno FROM sc
);

在这里插入图片描述

  • ⭐查询年龄在19-20岁之间的学生的系,姓名,年龄,按照系升序排序⭐
SELECT sdept,sname,sage FROM student
WHERE sage BETWEEN 19 AND 20
ORDER BY sdept 
SELECT sdept,sname,sage FROM student
WHERE sage>=19 AND sage<=20
ORDER by sdept;

在这里插入图片描述

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

(1)连接查询:

SELECT DISTINCT  student.sno,sname 
FROM student,sc,course
WHERE student.sno=sc.sno AND course.cno=sc.cno
	AND (cname='计算机网络' OR cname='数据库基础');

(2)嵌套子查询:

SELECT sno,sname FROM student WHERE sno IN(
	SELECT sno FROM sc WHERE cno IN(
		SELECT cno FROM course 
		WHERE cname='计算机网络' OR cname='数据库基础')
);

在这里插入图片描述

  • ⭐查询选修了“计算机网络”和“数据库基础”课程的学生的学号⭐
SELECT sno FROM sc,course  
WHERE sc.cno=course.cno AND cname='计算机网络'
AND sno IN(
	SELECT sno FROM sc,course 
	WHERE sc.cno=course.cno AND cname='数据库基础'
	);
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 *FROM student WHERE sname LIKE '暖%';

在这里插入图片描述

  • ⭐查询学生的选课情况,要求输出学号,姓名,课程门数,课程名列表(用逗号分隔),按照学号升序排序⭐
SELECT student.sno,sname,COUNT(*) as 选修课程数,
GROUP_CONCAT(cname ORDER BY cname SEPARATOR',')as 课程列表
FROM student,sc,course
WHERE student.sno=sc.sno AND sc.cno=course.cno
GROUP BY student.sno
ORDER BY student.sno;

在这里插入图片描述

  • ⭐查询选修了课程的学生的总人数⭐

(1)嵌套子查询的谓词EXISTS

SELECT COUNT(DISTINCT sno)'选课人数' FROM sc 
WHERE  EXISTS (SELECT sno FROM sc);

(2)嵌套子查询的谓词IN

SELECT COUNT(DISTINCT sno)'选课人数' FROM sc 
WHERE sno IN (SELECT sno FROM sc);

在这里插入图片描述

  • ⭐统计各门课程选修人数,要求输出课程代号,课程名,选修人数,有成绩人数(grade不为NULL),最高分,最低分,平均分,按课程号排序⭐
SELECT course.cno,cname,
COUNT(*) as 选修人数,
COUNT(grade)  as 有成绩人数,
MAX(grade) as 最高分,
MIN(grade) as 最低分,
AVG( grade) as 平均分
FROM course,sc WHERE course.cno=sc.cno
GROUP BY course.cno
ORDER BY course.cno;

在这里插入图片描述

  • ⭐统计各门课程的重修人数(包括grade为NULL),要求输出课程代号,重修人数⭐
SELECT cno,COUNT(*)FROM sc 
WHERE grade<60 OR grade IS NULL
GROUP BY cno;

在这里插入图片描述

  • ⭐查询选修通过2门以上的学生的信息,输出学号、选修通过数、平均成绩,按门数降序排序,若门数相同,按照成绩降序⭐
SELECT sno,COUNT(*)  as 人数,
AVG(grade)  as 平均成绩
FROM sc 
WHERE  grade>=60
GROUP BY sno
HAVING COUNT(*)>=3
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, avg_p FROM sc,
(SELECT sno, AVG(grade) avg_p FROM sc GROUP BY sno) AS avg      # 🌂
WHERE sc.sno=avg.sno AND sc.grade>avg.avg_p
ORDER BY sc.sno;

在这里插入图片描述

  • ⭐查询没有同时选修“计算机导论”和“计算机网络”两门课的学生的学号,姓名⭐
SELECT sno,sname 
FROM student
WHERE sno not in(
	SELECT sno 
	FROM sc,course 
	WHERE sc.cno=course.cno 
	AND cname='计算机导论'
	)
OR sno NOT in(
	SELECT sno 
	FROM sc,course
	WHERE sc.cno=course.cno
	AND cname='计算机网络'
	);

在这里插入图片描述

  • ⭐查询选修了全部课程的学生的学号,姓名,系名⭐
SELECT sno,sname,sdept FROM student
WHERE sno in(
	SELECT sno FROM sc 
	GROUP BY sno 
	HAVING COUNT(*)=(SELECT COUNT(*) FROM course  )    # 🌂
    );

在这里插入图片描述

  • ⭐输出“高等数学”成绩前三名的学生的学号,姓名,系名⭐
SELECT student.sno,sname,sdept 
FROM student,sc,course
WHERE student.sno=sc.sno 
	AND sc.cno=course.cno 
	AND cname='高等数学'
ORDER BY grade DESC LIMIT 3 ;      # 🌂

在这里插入图片描述

  • ⭐查询选修通过门数超过1门,且平均分在70以上的学生成绩信息⭐
SELECT sno,COUNT(*),AVG(grade) FROM sc
WHERE grade>60
GROUP BY sno
HAVING COUNT(*)>=2 AND AVG(grade)>70    # 🌂
ORDER BY 3 DESC;

在这里插入图片描述

SQL是高级的非过程化编程语言,是沟通数据库服务器和客户端的重要工具,允许用户在高层数据结构上工作。它不要求用户指定对数据的存放方法,也不需要用户了解具体的数据存放方式,所以,具有完全不同底层结构的不同数据库系统,可以使用相同的SQL语言作为数据输入与管理的SQL接口。 它以记录集合作为操作对象,所有SQL语句接受集合作为输入,返回集合作为输出,这种集合特性允许一条SQL语句的输出作为另一条SQL语句的输入,所以SQL语句可以嵌套,这使它具有极大的灵活性和强大的功能,在多数情况下,在其他语言中需要一大段程序实现的功能只需要一个SQL语句就可以达到目的,这也意味着用SQL语言可以写出非常复杂的语句。    结构化查询语言(Structured Query Language)最早是IBM的圣约瑟研究实验室为其关系数据库管理系统SYSTEM R开发的一种查询语言,它的前身是SQUARE语言。SQL语言结构简洁,功能强大,简单易学,所以自从IBM公司1981年推出以来,SQL语言得到了广泛的应用。如今无论是像Oracle、Sybase、DB2、Informix、SQL Server这些大型的数据库管理系统,还是像Visual Foxpro、PowerBuilder这些PC上常用的数据库开发系统,都支持SQL语言作为查询语言。    美国国家标准局(ANSI)与国际标准化组织(ISO)已经制定了SQL标准。ANSI是一个美国工业和商业集团组织,负责开发美国的商务和通讯标准。ANSI同时也是ISO和International Electrotechnical Commission(IEC)的成员之一。ANSI 发布与国际标准组织相应的美国标准。1992年,ISO和IEC发布了SQL国际标准,称为SQL-92。ANSI随之发布的相应标准是ANSI SQL-92。ANSI SQL-92有时被称为ANSI SQL。尽管不同的关系数据库使用的SQL版本有一些差异,但大多数都遵循 ANSI SQL 标准。SQL Server使用ANSI SQL-92的扩展集,称为T-SQL,其遵循ANSI制定的 SQL-92标准。    SQL语言包含4个部分:    数据定义语言(DDL),例如:CREATE、DROP、ALTER等语句。    数据操作语言(DML),例如:INSERT(插入)、UPDATE(修改)、DELETE(删除)语句。    数据查询语言(DQL),例如:SELECT语句。    数据控制语言(DCL),例如:GRANT、REVOKE、COMMIT、ROLLBACK等语句。    SQL语言包括三种主要程序设计语言类别的语句:数据定义语言(DDL),数据操作语言(DML)及数据控制语言(DCL)。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值