您的位置:首页 > 数据库

SQL语言基础-数据查询

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

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

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

[WHERE<条件表达式>]

[GROUP BY<列名1>[H***ING<条件表达式>]]

[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;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: