SQL语言基础-数据查询

在SQL语言中,只提供了一个动词SELECT用来进行数据查询操作,但这个动词的参数十分复杂,且能嵌套使用,其通用格式如下:

SELECT [All|Distinct]<目标列表达式>[,<目标列表达式>]...

FROM <表名或视图名>[,<表名或视图名>]...

[WHERE<条件表达式>]

[GROUP BY<列名1>[HAVING<条件表达式>]]

[ORDER BY<列名2>[ASC|DESC]];

 

1、单表查询

  数据查询主要通过一些例子来说明SELECT语句的使用。假设有学生表Student(Sno,Sname,Ssex,Sage,Sdept),还有课程表Course(Cno,Cname,Credit,Cpno)和选修表SC(Sno,Cno,Grade)。其中Cno为课程表,Cname为课程名称,Cpno为先修课程号,Credit为学分,Grade为成绩。

  • 查询全体学生学号姓名的命令格式为:

SELECT Sno,Sname

FROM Student;

  • 查询全体男同学详细记录的命令格式为:

SELECT *

FROM Student

WHERE Ssex="男";

  • 查询所有年龄大于21岁的学生的姓名出生年份所在系,要求用小写字母表示所在系名

SELECT Sname,'Year of birth',2004-Sage,lower(Sdept)

FROM Student

WHERE Sage>21;

  • 查询IS系、MA系和CS系学生姓名性别的命令格式为:

SELECT Sname,Ssex

FROM Student

WHERE Sdept In('IS','MA','CS');

  • 查询名字中第二个字为'阳'学生姓名学号的命令格式为:

SELECT Sname,Sno

FROM Student

WHERE Sname LIKE'_ _阳%';  //其中的“_”代表一个字符,而“%”代表0到若干个字符。

  • 查询DB_Design课程课程号学分的命令格式为:

SELECT Cno,Credit

FROM Course

WHERE Cname LIKE 'DB/_Design'Escape'/';  

  • 查询选修了3号课程的学生的学号成绩,查询结果按分数的降序排列所有有成绩的学生学号和课程号。

SELECT Sno,Credit

FROM  SC

WHERE Cno='3'

ORDER BY Grade DESC;

在SQL语言中,也可以使用集函数:

Count([Distinct|All]*):统计元组个数;

Count([Distinct|All]<列名>):统计一列中值的个数;

Sum([Distinct|All]<列名>):计算一列值的总和;

Avg([Distinct|All]<列名>):计算一列值的平均值;

Max([Distinct|All]<列名>):求一列值中的最大值;

Min([Distinct|All]<列名>):求一列值中的最小值;

  • 求各个课程号相应的选课人数

SELECT Cno,Count(Sno)

FROM SC

GROUP BY Cno;

 

2、连接查询

  • 查询每个学生及其选修课程的情况

SELECT Student.*,SC.*

FROM Student,SC

WHERE Student.Sno=SC.Sno;

  • 查询每个学生及其选修课程的情况

SELECT Student.Sno,Sname,Ssex,Sage,Cno,Grade

FROM Student Left Outer join SC

WHERE Student.Sno=SC.Sno;

  • 查询每一门课程间接选修课   //区别间接选修课和直接选修课

SELECT F.Cno,S.Cpno

FROM Course F,Course S

WHERE F.Cpno=S.Cno;

其中的F和S称为课程的别名

  • 查询每个学生学号姓名选修的课程名称成绩

SELECT Sno,Sname,Cno,Grade

FROM Student,Course,SC

WHERE Student.Sno=SC.Sno And  Course.Cno=SC.Cno;

 

3、嵌套查询

  • 查询与“刘晨”在同一系学习的学生

SELECT Sno,Sname

FROM Student

WHERE Sdept IN

   (SELECT Sdept

FROM Student

WHERE Sname='刘晨');

  • 查询选修了课程名为信息系统(MIS)的学生学号姓名

SELECT Sno,Sname

FROM Student

WHERE Sno IN(SELECT Sno

FROM SC

WHERE Cno IN(SELECT Cno

             FROM Course

             WHERE Cname='MIS'));

  • 查询其它系中比信息系个学生年龄小的学生姓名年龄

SELECT Sname,Sage

FROM Student

WHERE Sage<Any

(SELECT Sage

FROM Student

WHERE Sdept='IS');

或者

SELECT Sname,Sage

FROM Student

WHERE Sage<(SELECT Max(Sage)

FROM Student

WHERE Sdept='IS')

  AND Sdept<>'IS';

  • 查询没有选修1号课程学生

SELECT Sname

FROM Student

WHERE Not Exists

(SELECT *

FROM SC

WHERE Sno=Student.Sno And Cno='1');

  • 查询至少选修了95002选修表全部课程的学生的学号

SELECT Distinct Sno

FROM SC SCX

WHERE Not Exists(SELECT *

FROM SC SCY

WHERE SCY.Sno='95002'

And Not Exists(SELECT *

  FROM SC SCZ

  WHERE SCZ.Sno=SCX.Sno And SCZ.Cno=SCY.Cno));

 

4、集合查询

  • 查询计算机系的学生及年龄不大于19岁的学生

SELECT *

FROM Student

WHERE Sdept='CS'

UNION

SELECT *

FROM Student

WHERE Sage<19;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值