SELECT 查询

  脚本文件:http://pan.baidu.com/share/link?shareid=461107&uk=3912660076

SELECT语句中各子句的说明

SELECT 查询—单表查询

    单表查询指的是在一个源表中查找所需的数据。  因此,单表查询时,FROM子句中的<数据源表> 只需要给出一个源表表名

  (1)选择表中若干列

    在SELECT子句的<目标列名表>中指定整个查询结果表中出现的若干个列名,各列名之间用逗号分隔.

  (2)选择表中所有列

    可以在<目标列名表>中指定表中所有列的列名,也可以用*来代替,或用<表名>.*代表指定表的所有列

   (3)使用表达式

     表达式可以是列名、常量、函数、或用列名、常量、函数等经过+(加)、-(减)、*(乘)、/(除)等组成的公式。

  (4)设置列的别名

    所谓别名,就是另一个名字。主要是为了方便阅读。设置列别名的方法有:      原列名  [AS]  列别名 

  (5)使用DISTINCT消除结果表中完全重复的行

FROM子句

  WHERE子句

    WHERE<查询条件>    查询体条件中没有多表连接条件,只有一个表的行筛选条件 。 

  <查询条件>中常用的运算符:比较运算符和逻辑运算符。比较运算符用于比较两个数值之间的大小是否相等。

    常用的比较运算符有:=(等于)、>(大于)、<(小于)、>=(大于等于)、<=(小于等于)、<>(不等于)。

    逻辑运算符主要有:范围比较运算符:BETWEENAND… ,NOT BETWEENAND集合比较运算符:INNOT IN字符匹配运算符:LIKENOT LIKE空值比较运算符:IS NULLIS NOT NULL条件连接运算符:ANDORNOT

 基于比较运算符的查询:

 基于逻辑运算符的查询:

([not] BETWEEN…AND

           注意:列名类型要与下限值或上限值的类型一致

in)

   IN用于测试一个列值是否与常量表中的任何一个值相等。IN条件表示格式为:列名 IN (常量1, 常量2, … 常量n)

   NOT IN与IN的含义正好相反,当列值与IN中的任一常量值都不相等

此句等价于: SELECT Sno,Sname FROM Students  WHERE Sdept! ='Math' AND Sdept! = 'Software Designing' ;

(LIKE)

  LIKE用于测试一个字符串是否与给定的模式匹配。所谓模式是一种特殊的字符串,其中可以包含普通字符,也可以包含特殊意义的字符,通常叫通配符。

LIKE运算符的一般形式为:列名  LIKE  <模式串>

     模式串中可包含如下通配符,它们的含义是:

      _: 匹配任意一个字符。注意,在这里一个汉字或一个全角字符也算一个字符。如 '_u_'表示第二个字符为u或U,第一、第三个字符为任意字符的字符串。

      %:匹配任意0个或多个字符。如'S%'表示以S开头的字符串

(NULL)

   空值是尚未确定或不确定的值。判断某列值是否为NULL值,不能使用比较运算符等于和不等于,而只能使用专门的判断空值的子句,如下:   判断列值为空的语句格式为:列名IS NULL    判断列值不为空的语句格式为:列名 IS NOT NULL

( 6 )基于多个条件的查询   可以使用AND、OR逻辑谓词来连接多个条件,构成一个复杂的查询条件。

  使用格式为:   <条件1> AND<条件2> AND…<条件n>  <条件1> OR<条件2> OR…<条件n>

  用AND连接的所有的条件都为TRUE时,整个查询条件才为TRUE。

  用OR连接的条件中,只要其中任一个条件为TRUE, 整个查询条件就为TRUE

 使用统计函数的查询

    统计函数也称为集合函数或聚集函数,其作用是对一组值进行计算并返回一个值。 

Count(*) 求表中或组中记录个数
Count(Col_name) 求不是null的列值个数
Sum(col_name) 求该列所有值的总和(必须是数值类型)
Avg(col_name) 求该列所有值的平均值(必须是数值类型)
Max(col_name) 求该列的最大值(必须是数值类型)
Min(col_name) 求该列的最小值(必须是数值类型)

 

GROUP BY 子句

     有时我们需要把FROM、WHERE子句产生的表按某种原则分成若干组,然后对每个组进行统计。GROUP BY子句在WHERE子句后边。一般形式为: GROUP BY <分组列> [,… n ]其中<分组列>是分组的依据。分组原则是<分组列>的列值相同,就为同一组。当有多个<分组列>时,则先按第一个列值分组,然后对每一组再按第二个列值进行分组,依此类推。

       求选修每门课程的学生人数

          输出每个学生的学号和他/她的各门课程的总成绩。

HAVING子句

     HAVING子句指定GROUP BY生成的组表的选择条件。    它的一般形式为: HAVING <组选择条件>  HAVING子句在GROUP BY子句之后,并且必须与GROUP BY子句一起使用

          求选修课程大于等于2门课的学生的学号、平均成绩,选修的门数

COUNT(*) 更加准确...

 ORDER BY子句

      指定整个SELECT语句的输出结果中记录的排序依据。ORDER BY排序子句的格式为:

ORDER BY <列名> [ASC | DESC ] [ ,… n ]    其中<列名>指定排序的依据,ASC表示按列值升序方式排序,DESC表示按列值降序方式排序。如果没有指定排序方式,则默认的排序方式为升序排序。    

   在ORDER BY子句中,可以指定多个用逗号分隔的列名。这些列出现的顺序决定了查询结果排序的顺序。当指定多个列时,首先按最前面的列进行排序,如果排序后存在两个或两个以上列值相同的行,则对这些值相同的行再依据第二列进行排序,依此类推。

      查询选修了C1课程的学生的学号和成绩,查询结果按成绩降序排列。

      查询全体学生信息,查询结果按所在系的系名升序排列,同一系的学生按年龄降序排列。

      求选修课程大于等于2门课的学生的学号、平均成绩和选课门数,并按平均成绩降序排列。

 SELECT 查询—多表连接查询

    多表查询指的是从多个源表中检索数据 。因此,多表查询时,FROM子句中的<数据源表>要给出所有源表表名,各个表名之间要用逗号分隔,与单表查询的SELECT子句功能基本相同,也是用来指定查询结果表中包含的列名。不同的是:如果多个表中有相同的列名,则需要用:<表名>.<列名>来限定列是那个表的列。

还可用<表名>.*,表示<表名>指定的表中的所有列。例如Students. *,表示Students表的所有列。

 多表查询中的GROUP BY、HAVING、ORDER BY子句    与单表查询中的用法相同。   

  不同的是:如果列名有重复,则要用  <表名>.<列名>来限定列是那个表的列。

 多表查询中的WHERE子句与单表查询中的用法差别较大。多表查询中往往要有多表的连接条件,当然还有表的一个或多个行选择条件,两者用AND操作符组合。 

按连接条件的不同,连接分为:内连接、外连接。外连接又分为左外连接、右外连接。

内连接 :

    等值连接与自然连接

等值连接:即根据两个表的对应列值相等的原则进行连接。

   连接条件的形式往往是“主键=外键”。即按一个表的主键值与另一个表的外键值相同的原则进行连接。

    常用的等值连接条件形式:<表名1>.<列名1>=<表名2> . <列名2>

      查询每个学生的基本信息以及他/她选课的情况

    上述结果表中含有Students和Enrollment表的所有列,存在一个重复的列Sno,这说明是等值连接。如果要去掉重复列,就要用SELECT子句指定结果表中包含的列名,这样就成为自然连接。如下:

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

       查询选修了C2且成绩大于90分的学生的学号、姓名、成绩。

       求计算机系选修课程大于等于2门课的学生的学号、姓名、平均成绩, 并按平均成绩从高到低排序。

 

  自身连接

   自身连接是一种特殊的内连接,可以看作是同一个表的两个副本之间进行的连接。为了给两个副本命名,必须为每一个表副本设置不同的别名,使之在逻辑上成为两张表。表设置别名的方式:   <源表名> [ AS ] <表别名>

       查询与BugsBug在同一个系学习的所有学生的学号和姓名。

 

   说明:当给表指定了别名后,在查询语句的其他所有用到表名的地方都要使用别名,而不能再使用源表名。并且输出的列一定要加上表的别名来限定是哪个逻辑表中的列

 外连接:

   外连接不仅包括满足连接条件的行,而且还包括其中某个表中不满足连接条件的行。

 左外连接保留连接条件左边表中的非匹配行。

   右外连接保留连接条件右边表中的非匹配行。

 格式为:FROM  表1  LEFT|RIGHT   JOIN  表2  ON <连接条件>。

       查询所有学生的选修情况,要求包括选修了课程的学生和没有修课的学生,显示他们的学号、姓名、课程号、成绩。

  


原文地址:https://www.cnblogs.com/wjshan0808/p/3081399.html