数据查询语言QL

聚合函数:

SQL提供了下列聚合函数:

COUNT(*)

计算元组的个数

COUNT(<列名>)

对一列中的值计算个数

SUM(<列名>)

求某一列值的总和(此列的值必须是数值型)

AVG(<列名>)

求某一列的平均值(此列的值必须是数值型)

MAX(<列名>)

求某一列的最大值

MIN(<列名>)

求某一列的最小值

SELECT语句的完整结构:

SELECT<目标表的列名或列表达序列>     FORM<基本表名 或/和 视图序列>     [ WHARE <行条件表达式>]     [ GROUP BY <列名序列>             [ HAVING <组条件表达式> ] ]     [ORDER BY <列名[ ASC | DESC ]>, ... ]

整个语句的执行过程如下:

  1. 读取FORM子句中的基本表、视图的数据,执行笛卡儿积操作;
  2. 选取满足WHERE子句中给出的条件表达式的元组;
  3. 按GROUP子句中指定列的值分组,同时提取满足HAVING子句中组条件表达式的那些列;
  4. 按SELECT子句中给出的列名或列表达式求值输出;
  5. ORDER子句对输出的目标表进行排序,ASC表示升序排列,DESC表示降序排列。

例:求每一教师每门课程的学生选修人数(超过50人),要求显示教师工号、课程号和学生人数。显示时,查询结果按人数升序排列,人数相同按工号升序、课程号降序排列。

SELECT T#,C.C#,COUNT(S#)
FROM C,SC
WHERE C.C# = SC.C#
GROUP BY T#,C.C#
    HAVING COUNT(*)>50
ORDER BY 3,T#,C.C# DESC;

ORDER BY 语句中的 3 表示对SECECT子句的第三个属性(学生人数)进行升序排列,若人数相同,则按照教师工号升序,课程号降序排列。

关于SELECT子句:

SELECT子句用于描述查询输出的表格结构。其形式如下:

SELECT [ ALL | DISTINCT ] <列名或列表达式序列> | *

  • DISTINCT 选项保证重复的行将从结果中去除;ALL是默认值,表示重复的行留在结果中;
  • 星号 * 表示选择所有列;
  • 列表达式的意思是对一个单列求聚合值的表达式,即运用上面的聚合函数;
  • 允许表达式中出现+,-,*,/以及列名、常数的算数表达式。

列和基本表的改名操作:

使用AS可以给列和基本表进行改名。有时一个基本表在多个SELECT中出现或用户要求输出的列名和基本表中的不一致,就可以给基本表或列改名。

SELECT SNAME AS STUDENT_NAME
FORM S AS STUDENT

集合的并、交、差操作:

当两个子查询的结构完全一致时,可以将这两个子查询进行并、交、差等操作。并、交、差的运算符是:UNION、INTERSECT、EXCEPT。三个关键字后面带上ALL,则不消除重复元组,不带ALL,则返回的结果消除重复元组。

(SELECT 查询语句1) UNION [ ALL ] (SELECT 查询语句2)

(SELECT 查询语句1) INTERSECT [ ALL ] (SELECT 查询语句2)

(SELECT 查询语句1) EXCEPT [ ALL ] (SELECT 查询语句2)

上述操作不带关键字ALL, 返回结果中消除了重复元组;带ALL,不消除重复元组。

关于WHERE子句:

在WHERE子句中的条件表达式F中可以使用下列运算符:

  • 算术比较运算符:<, <=, >, >=, =, <>或!=
  • 逻辑运算符:AND, OR, NOT
  • 集合成员资格运算符:IN, NOT IN
  • 谓词:EXISTS, ALL, SOME, UNIQUE
  • 聚合函数:AVG, MIN, MAX, SUM, COUNT 
  • 区间判断:[NOT] BETWEEN ... TO ...
  • 等值判断:[NOT] LIKE
  • 空值判断:IS [NOT] NULL
  • F中的运算对象还可以是另一个SELECT语句,即SELECT可以嵌套。

字符串匹配操作:

字符串匹配操作符是“LIKE", 在表达式中可以使用两个通配符:

  • 百分号:与零个或多个字符组成的字符串匹配;
  • 下划线:与单个字符匹配。
//匹配S中以字母D打头的学生姓名SELECT SNAME
    FORM S
    WHERE SNAME LIKE'D%';

为了使字符串中包含特殊字符(%和_),SQL允许定义转义字符。转义字符紧靠特殊字符并放在前面,表示该特殊字符将被当作普通字符。在LIKE中使用ESCAPE关键字来定义转义字符。

LIKE 'ab\%cd%' ESCAPE'\'    //匹配所有以ab%cd开头的字符串

SQL还允许在字符上使用多种函数,例如连接(”||“),提取子串,计算字符串长度,大小写转换等操作。

空值的比较操作:

SQL允许列值为空,空值用NULL表示,NULL不占用空间。

空值的存在增加了算术操作和比较操作的复杂性。SQL中规定,涉及+,-,*,/的算术表达式中有一个值是空值时,表达式的值也是空值。涉及空值的比较操作的结果认为是”false“。

在聚合函数中遇到空值时,除了COUNT(*)外,都跳过空值去处理非空值。

集合成员资格的比较:

判断元组是否在查询的结果(即集合)中的操作,叫做”集合成员资格的比较“。其形式为:

<元组> [NOT] IN (<集合>)

这里的元组和集合的形式应该相同。IN操作符表示,如果远足在集合内,则返回true。

//在S和SC中检索至少不学C2和C4两门课的学生学号SELECT S#
FORM SWHERE S# NOT IN (SELECT S#
                 FORM SC
                 WHERE C# IN ('C2','C4'));

集合成员算术的比较:

其形式如下:

<元组> θ ALL | SOME | ANY (<集合>)

θ是算术比较运算符”θ ALL"表示左边那个元组和右边集合中每一个元组满足θ运算;“θ SOME"和”θ ANY“意义一样,表示左边那个元组和右边集合中至少一个元组满足θ运算。

这里应该注意,元组的比较操作和字符串的比较操作类似。例如:

(a1, a2) = (b1, b2),其意义是(a1<b1) OR (a1=b1) AND (a2<=b2)

集合中重复元组是否存在测试:

SELECT T#, TNAME
FORM TWHERE UNIQUE (SELECT T#
              FORM C
              WHERE C.T# = T.T#);

嵌套查询的改进写法

导出表的使用

SQL语句允许在FORM中使用子查询。如果在FROM中使用了子查询,那么要为查询的结果起一个表名和相应的列名。

//在基本表SC中检索平均成绩最高的学生学号
SELECT SC.S#
FROM SC,(SELECT AVG(SCORE)
         FROM SC
         GROUP BY S#) AS RESULT(AVG_SCORE)
GROUP BY SC.S#
     HAVING AVG(SC.SCORE)>=ALL(RESULT.AVG_SCORE);

WITH子句的临时视图

SQL允许用户用WITH语句定义一个临时视图(即子查询),置于SELECT语句的开始处。而临时视图本身是用SELECT语句定义的。

WITH RESULT(AVG_SCORE)AS
    SELECT AVG(SCORE)
    FROM SC
    GROUP BY S#
SELECT S#
FROM SC.RESULT
GROUP BY S#
    HAVING AVG(SCORE)>=ALL(RESULT.AVG_SCORE);

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏峰会SaaS大佬云集

Oracle 数据库入门之----------------------单行函数

SQL> select lower('Hello World') 转小写,upper('Hello World') 转大写,initcap('hello wor...

8200
来自专栏Java成神之路

Oracle学习笔记_02_基本SQL

        SQL 语言大小写不敏感。         SQL 可以写在一行或者多行 关键字不能被缩写也不能分行         各子句一般要分行写。 ...

9620
来自专栏C# 编程

5 - SQL Server 2008 之 四则运算、比较运算、逻辑运算及字符连接运算

四则运算如下: --加减乘除(+、-、*、\、%)取余运算 SELECT --加法运算 3+5 AS 加法结果1, 3.5+6 AS 加法结果2,...

38700
来自专栏栗霖积跬步之旅

第12章:汇总数据

表名:products  字段:product_id、product_name、product_price、vend_id(供应商) 12.1聚集函数: 我们常...

20400
来自专栏数据和云

深入剖析:认识Oracle 中的 NULL 值

杨廷琨,网名 yangtingkun 云和恩墨技术总监,Oracle ACE Director,ACOUG 核心专家 经常看到很多人提出和NULL有关的问题。N...

32950
来自专栏乐沙弥的世界

PL/SQL变长数组

  PL/SQL变长数组时PL/SQL集合数据类型中的一种,其使用方法与PL/SQL嵌套表大同小异,唯一的区别则是变长数组的元素的最大个数是有限 制的。也即是说...

9920
来自专栏西安-晁州

mybatis学习之高级映射

一对一映射查询 1、数据库执行脚本: /* SQLyog Ultimate v12.09 (64 bit) MySQL - 5.7.11-log : Datab...

29400
来自专栏菜鸟致敬

MySQL 数据类型

MySQL中定义数据字段的类型对你数据库的优化是非常重要的。 MySQL支持多种类型,大致可以分为三类:数值、日期/时间和字符串(字符)类型。 ---- 数值类...

32270
来自专栏与神兽党一起成长

[MySQL]查询学生选课的情况(二)

上一篇文章使用了自定义的函数查找出来选择Math,或者选择Chinese或选择Japanese课程的学生。

18600
来自专栏闻道于事

Hibernate框架HQL语句

这篇随笔将会记录hql的常用的查询语句,为日后查看提供便利。 在这里通过定义了三个类,Special、Classroom、Student来做测试,Special...

31150

扫码关注云+社区

领取腾讯云代金券