SQL SELECT语句的基本用法

SQL SELECT语句的基本用法

表S有三个字段:学生学号Sno,课程号Cno,成绩score。求每个学生的总分。这是一个很简单的问题,这篇博客就是源于这个问题,博主是一个大三即将入坑的菜鸟,进入公司实习的第一天,就被几个SQL查询问题难倒了。通过这篇文章复习一下数据库基本的SELECT语句,仅供参考,如有错误或不当之处还望大神们告知。

这里使用的是SQL Fiddle,一款在线的SQL语句练习网站

链接: SQL Fiddle.
在这里插入图片描述
左侧编写创建数据表基本语句,点击Build Schema即可成功创建数据表。

在这里插入图片描述
右侧直接使用SELECT语句查询即可

创建数据表

由于仅限测试使用,所以建的数据表不用太复杂,能满足我们基本的SELECT查询即可

// 选课表SC,学号,课程号,成绩
CREATE TABLE SC(
Sno       varchar(10),
Cno       varchar(10),
score     int
);

INSERT INTO SC(Sno,Cno,score) VALUES('1','6',90);
INSERT INTO SC(Sno,Cno,score) VALUES('1','7',76);
INSERT INTO SC(Sno,Cno,score) VALUES('2','5',89);
INSERT INTO SC(Sno,Cno,score) VALUES('2','7',80);
INSERT INTO SC(Sno,Cno,score) VALUES('3','5',90);
INSERT INTO SC(Sno,Cno,score) VALUES('3','6',78);
INSERT INTO SC(Sno,Cno,score) VALUES('4','5',56);
INSERT INTO SC(Sno,Cno,score) VALUES('4','6',58);
INSERT INTO SC(Sno,Cno,score) VALUES('4','7',88);

// 学生表S,学号,姓名,性别,年龄,班级
CREATE TABLE S(
Sno varchar(10),
Sname varchar(10),
Sex varchar(2),
Age int,
Class varchar(10)
);
INSERT INTO S(Sno,Sname,Sex,Age,Class) VALUES('1','托克','男','22','一班');
INSERT INTO S(Sno,Sname,Sex,Age,Class) VALUES('2','托尼','男','21','一班');
INSERT INTO S(Sno,Sname,Sex,Age,Class) VALUES('3','露西','女','21','二班');
INSERT INTO S(Sno,Sname,Sex,Age,Class) VALUES('4','汤姆','男','19','三班');

// 课程表C,课程号,课程名,学分
CREATE TABLE C(
Cno varchar(10),
Cname varchar(10),
Tno varchar(10),
Credit int
);
INSERT INTO C(Cno,Cname,Tno,Credit) VALUES('5','C语言','11',5);
INSERT INTO C(Cno,Cname,Tno,Credit) VALUES('6','JAVA','22',6);
INSERT INTO C(Cno,Cname,Tno,Credit) VALUES('7','python','33',7);

// 教师表SC,教师编号,教师姓名
CREATE TABLE T(
Tno varchar(10),
Tname varchar(10)
 );
INSERT INTO T(Tno,Tname) VALUES('11','张三');
INSERT INTO T(Tno,Tname) VALUES('22','李一');
INSERT INTO T(Tno,Tname) VALUES('33','王先洪');
 

例子

// 查询每个学生的总分
SELECT Sno,SUM(score) AS '总成绩' 
FROM SC 
GROUP BY Sno

// 查询每门课程的平均分
SELECT Cno,AVG(score) AS '平均分' 
FROM SC 
GROUP BY Cno

// 查询年龄在20-21岁之间的学生姓名,年龄
SELECT Sno,score1 FROM S WHERE score1(SELECT MAX(score1) FROM S)

// 查询年龄在20-21岁之间的学生姓名,年龄
SELECT Sname,Age 
FROM S 
WHERE Age BETWEEN 20 AND 21

// 查询年龄不在20-21岁之间的学生姓名,年龄
SELECT Sname,Age 
FROM S 
WHERE Age NOT BETWEEN 20 AND 21

// 查询一班、二班的学生姓名,性别,班级
SELECT Sname,Sex,Class 
FROM S 
WHERE Class in ('一班','二班')

//查询选修了3门课以上的学号
SELECT Sno 
FROM SC 
GROUP BY Sno 
HAVING COUNT(*)>3

//查询跟杰克在同一个班的学生姓名,班级
SELECT Sname,Class
FROM S WHERE 
Class IN (SELECT Class FROM S WHERE Sname='杰克')

//查询选修了python的学生姓名,学号
SELECT S.Sno,S.Sname 
FROM S,SC,C 
WHERE S.Sno=SC.Sno 
	  AND C.Cno=SC.Cno 
	  AND C.Cname='python' 

 //查询选修了python或JAVA的学生姓名,学号
SELECT DISTINCT S.Sno,S.Sname 
FROM S,SC,C 
WHERE S.Sno=SC.Sno 
	  AND C.Cno=SC.Cno 
	  AND C.Cname IN ('python','JAVA')
	  
//查询选修了课程号为5的学生姓名
SELECT Sname 
FROM S,(SELECT Sno FROM SC WHERE Cno='5') AS NEW_SC 
WHERE NEW_SC.Sno=S.Sn

//查询" 5 "课程比" 6 "课程成绩高的学生的信息及课程分数
SELECT S.*,a.score '5号课程成绩' ,b.score '6号课程成绩'  
FROM S 
JOIN SC a ON  S.Sno=a.Sno 
			  AND a.Cno='5' 
LEFT JOIN SC b ON  S.Sno=b.Sno 
			  AND b.Cno='6' 
WHERE a.score>b.score

//查询平均成绩大于60分的同学的学生编号和学生姓名和平均成绩
SELECT S.Sno,S.Sname,AVG(score) AS '平均成绩' 
FROM SC,S 
WHERE SC.Sno=S.Sno 
GROUP BY Sno 
HAVING AVG(score)>60

//查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩
SELECT S.Sno,S.Sname,COUNT(Cno) AS '选课总数' ,SUM(score) AS '总成绩' 
FROM S,SC 
WHERE S.Sno=SC.Sno 
GROUP BY Sno

//查询"托"姓学生的数量
SELECT COUNT(Sname) AS '托姓学生数量' 
FROM S WHERE 
Sname LIKE '托%'

//查询学过"张三"老师授课的同学的信息
#SELECT S.* 
FROM S,T,C,SC 
WHERE  S.Sno=SC.Sno 
	   AND SC.Cno=C.Cno 
       AND T.Tno=C.Tno 
       AND T.Tname='张三'

//查询学过编号为"01"并且也学过编号为"02"的课程的同学的信息
SELECT S.* 
FROM S, SC AS a, SC AS b 
WHERE S.Sno=a.Sno 
	  AND S.Sno=b.Sno 
	  AND a.Cno=5 
	  AND b.Cno=6

//查询没学过"张三"老师讲授的任一门课程的学生姓名 
SELECT S.Sname 
FROM S 
WHERE S.Sno NOT IN(
		SELECT Sno FROM SC WHERE Cno= (
					SELECT Cno FROM C WHERE Tno=(
							     SELECT Tno FROM T WHERE Tname='张三')))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值