SQL数据查询之单表查询

目录

语句格式

选择表中的若干列

 查询表中所有列

选择表中的若干元组

查询满足条件的元组

 字符匹配

 涉及空值的查询

多重条件查询

ORDRD BY子句

 聚集函数

GROUP BY子句 


语句格式

SELECT [ALL|DISTINCT] <目标列表达式>

[,<目标列表达式>] …

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

[ WHERE <条件表达式> ]

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

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

选择表中的若干列

例子

查询全体学生的学号与姓名

SELECT Sno,Sname FROM Student

 查询表中所有列

在SELECT关键字后面列出所有列名

将<目标列表达式>指定为 *

例子

 查询全体学生的详细记录

SELECT  Sno,Sname,Ssex,Sage,Sdept 
FROM Student; 

OR

SELECT  *
FROM Student; 

选择表中的若干元组

消除取值重复的行

如果没有指定DISTINCT关键词,则缺省为ALL

例子

查询选修了课程的学生学号。

SELECT Sno   FROM SC;

 等价于

SELECT ALL  Sno  FROM SC;

指定DISTINCT关键词,去掉表中重复的行  

   SELECT DISTINCT Sno
    FROM SC; 

查询满足条件的元组

查 询 条 件

谓    词

比    较

=,>,<,>=,<=,!=,<>,!>,!<;NOT+上述比较运算符

确定范围

BETWEEN AND,NOT BETWEEN AND

确定集合

IN,NOT IN

字符匹配

LIKE,NOT LIKE

空    值

IS NULL,IS NOT NULL

多重条件(逻辑运算)

AND,OR,NOT

比较大小

例子

查询计算机科学系全体学生的名单

    SELECT Sname
    FROM Student
    WHERE Sdept=‘CS’;

查询所有年龄在20岁以下的学生姓名及其年龄 

SELECT Sname,Sage 
FROM    Student    
WHERE Sage < 20;

 确定范围

例子

查询年龄在20~23岁(包括20岁和23岁)之间的学生的 姓名、系别和年龄

SELECT Sname,Sdept,Sage
FROM     Student
WHERE   Sage BETWEEN 20 AND 23; 

查询年龄不在20~23岁之间的学生姓名、系别和年龄 

SELECT Sname,Sdept,Sage
	       FROM    Student
	       WHERE Sage NOT BETWEEN 20 AND 23; 

确定集合

例子

查询信息系(IS)、数学系(MA)和计算机科学系(CS)学生的姓名和性别。

SELECT Sname,Ssex
	FROM  Student
	WHERE Sdept IN ( 'IS','MA','CS' );

 查询既不是信息系、数学系,也不是计算机科学系的学生的姓名和性别

SELECT Sname,Ssex
FROM Student
	 WHERE Sdept NOT IN ( 'IS','MA','CS' );

 字符匹配

例子

匹配串为固定字符串

     SELECT *    
     FROM  Student  
     WHERE  Sno LIKE ‘200215121';

 查询名字中第2个字为"阳"字的学生的姓名和学号

      SELECT Sname,Sno
      FROM Student
      WHERE Sname LIKE ‘__阳%’;

查询所有不姓刘的学生姓名。

SELECT Sname,Sno,Ssex
      FROM Student
      WHERE Sname NOT LIKE '刘%';

 涉及空值的查询

例子

某些学生选修课程后没有参加考试,所以有选课记录,但没有考试成绩。查询缺少成绩的学生的学号和相应的课程号。

	 SELECT Sno,Cno
      FROM  SC
      WHERE  Grade IS NULL

查所有有成绩的学生学号和课程号。

      SELECT Sno,Cno
      FROM  SC
      WHERE  Grade IS NOT NULL;

多重条件查询

例子

查询计算机系年龄在20岁以下的学生姓名

SELECT Sname
       FROM  Student
       WHERE Sdept= 'CS' AND Sage<20

查询信息系(IS)、数学系(MA)和计算机科学系(CS)学生的姓名和性别。

SELECT Sname,Ssex
FROM Student
WHERE Sdept IN ( 'IS','MA','CS' )

ORDRD BY子句

 升序:ASC;降序:DESC;缺省值为升序

当排序列含空值时:

ASC:排序列为空值的元组最后显示

DESC:排序列为空值的元组最先显示

例子

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

SELECT Sno,Grade
        FROM  SC
        WHERE  Cno= ' 3 '
        ORDER BY Grade DESC;

查询全体学生情况,查询结果按所在系的系号升序排列,同一系中的学生按年龄降序排列。 

        SELECT  *
        FROM  Student
        ORDER BY Sdept,Sage DESC;  

 聚集函数

  • 计数:COUNT([DISTINCT|ALL] <列名>)
  • 计算总和:SUM([DISTINCT|ALL] <列名>)
  • 计算平均值:AVG([DISTINCT|ALL] <列名>)
  • 计算最大值:MAX([DISTINCT|ALL] <列名>)
  • 计算最小值:MIN([DISTINCT|ALL] <列名>)

例子

查询学生总人数

SELECT COUNT(*)
    FROM  Student;

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

SELECT COUNT(DISTINCT Sno)
     FROM SC;

 计算1号课程的学生平均成绩

SELECT AVG(Grade)
          FROM SC
          WHERE Cno= '1'

 查询选修1号课程的学生最高分数

   SELECT MAX(Grade)
   FROM SC
   WHER Cno= '1';

 查询学生200215012选修课程的总学分数

SELECT SUM(Ccredit)
             FROM  SC, Course
             WHER Sno='200215012' AND SC.Cno=Course.Cno;

GROUP BY子句 

细化聚集函数的作用对象

  • 对查询结果分组后,聚集函数将分别作用于每个组
  • 作用对象是查询的中间结果表
  • 按指定的一列或多列值分组,值相等的为一组

例子

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

     SELECT Cno,COUNT(Sno)
     FROM    SC
     GROUP BY Cno;

查询选修了3门以上课程的学生学号

     SELECT Sno
     FROM  SC
     GROUP BY Sno
     HAVING  COUNT(*) >3;       

 HAVING短语与WHERE子句的区别

  • 作用对象不同
  • WHERE子句作用于基表或视图,从中选择满足条件的元组
  • HAVING短语作用于组,从中选择满足条件的组。

猜你喜欢

转载自blog.csdn.net/weixin_52473454/article/details/125198373