SQL语言基础-数据查询

SQL语言基础-数据查询

标签 语言 sql join 栏目 SQL

原文   http://blog.csdn.net/lwk2011/article/details/5634233

在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;

猜你喜欢

转载自blog.csdn.net/weixin_44657888/article/details/102557266