SQL自学通之表达式条件语句与运算

目录

一、目标

二、表达式条件语句

1、表达式:

2、条件

2.1、WHERE 子句

三、运算

1、数值型运算:

1.1、加法(+)

1.2、减法 (-)

1.3、除法(/)

1.4、乘法 (*)

1.5、取模 (%)

优先级别

2、比较运算

3、字符操作

LIKE

下划线( _)

 连接(||)

4、逻辑运算

AND

OR

NOT

5、集合运算 SET

UNION 与 UNION ALL

INTERSECT (相交)

MINUS (相减)

6、从属运算 (IN and BETWEEN)

四、问与答

五、校练场


一、目标

在第二天我们学习了使用SELECT语句和FROM语句来对数据进行有趣味性 也是非常有 用的 运算 在今天我们将对昨天学习的进行进一步的扩充 我们将把新的方法应用到查 询 表和行中 引进新的子句和被称为运算的批量处理方法 在第三天的阳光下 你将学会:
知道什么叫作表达式以及如何来使用它们
知道什么叫作条件语句以及如何来使用它们
熟悉基本的子句 WHERE 的使用
可以用算术 比较 字符和逻辑表达式来建立一个运算 学会将多种不同的运算结合在一起使用
注 在今天的学习中我们来使用 PERSONAL ORACLE7 来进行应用举例 其它的 SQL 环 境在命令运算以及结果显示上与它稍有不同 但在遵循 ANSI 标准的基础上它们的结果应 该是相同的。

二、表达式条件语句

1、表达式:

表达式的定义非常简单 表达式可以返回一个值 表达式的类型非常广泛 它以包括各种 类型的数据如数字 字符 以逻辑型等 其实在下列子句 如 SELECT 和 FROM 中所占 成分中表达式最大 在下边的例子中 amount 就是一个表达式 它可以返回 amount 列中的 数据

SELECT amount FROM checks

而在下列语句中 NAME ,ADDRESS, PHONE ,ADDRESSBOOK 是表达式

SELECT NAME, ADDRESS, PHONE
FROM ADDRESSBOOK

现在 请检查一下下边的表达式

WHERE NAME = 'BROWN'

这里 NAME = 'BROWN'是一个条件语句 这是一个逻辑形表达式的实例 NAME = 'BROWN'将根据=号来返回值 TRUE 或 FALSE


2、条件

如果你想在数据库中查找一个或一组特定的信息 你需要使用一个或更多的条件 条件可 以包含在WHERE子句中 在上一个例子中 条件就是

NAME = 'BROWN'

如果你想知道在你们单位中上一个月有谁的工作时间超过了100个小时,你可能会写出下边的条件语句

NUMBEROFHOURS > 100

条件语句可以让你建立一个选择查询 在大多数情况下 条件中包括变量 常量和比较运 算 在第一个例子中的变量是 NAME 常量是'BROWN' 而比较运算符则为= 在第二个 例子中变量为 NUMBEROFHOURS,常量为 100 而比较运算符则是> 当您准备写一个条 件查询时你需要知道两个元素 WHERE子句和运算


2.1、WHERE 子句

Where 子句的语法如下:

WHERE 

Select From 和 Where 在 SQL 中最常使用的三个子句 Where 只是当你的查询具有更大的 选择性 没有Where子句 你可以用查询做得最多的有用工作是显示选定表中的所有记录

例如:
输入:

SQL> SELECT * FROM BIKES

这将会将 BIKES 表中的所有数据按行列出 。

输出:

SQL自学通之表达式条件语句与运算_第1张图片

假若你想要一台特定型号的自行车 你应该键入

SQL> SELECT FROM BIKES WHERE NAME = 'BURLEY'

你将只会收到一个记录:

输出:

 分析:

这个简单的例子显示出了你可以在数据库返回的数据中加以条件限制

三、运算

运算是你需要对从数据库中返回的数据进行数学处理时所用到的元素 运算可以归为六组 数值型 比较型 字符型 逻辑型和备注型以及混合型


1、数值型运算:

数值型运算有加 减 乘 除和取模 前四个不用多说 取模将返回一个除法结果中商的 余数部分 这里有两个例子

5%2=1
6%2=0

对于有小数的数据不能应用取模运算 如实数 如果你在进行数据运算时应用了几个运算符而没有在其中使用括号 那么运算进行的次序 将是先乘后除再模后加减 举例来说 表达式 2*6+9/3 其结果将是 12+3=15 但是 表 达式 2* 6+9 /3 结果则为 2*15/3=10 注意在这里你使用了括号 有时表达式不会按你所 想像的那样得出期望的结果

1.1、加法(+)

你可以在许多场合下使用加号 下面的语句将显示一个价格表:
输入 :

SQL> SELECT * FROM PRICE

输入如下右:

现在请输入:

SQL>SELECT ITEM, WHOLESALE, WHOLESALE +0.15 FROM PRICE;

OUTPUT:

SQL自学通之表达式条件语句与运算_第2张图片

SQL自学通之表达式条件语句与运算_第3张图片 分析
请不要忽视最后一列 WHOLESALE+0.15 中使用了*号 这将会显示出所有的列 和修改后产生的派生列

请再输入一次刚才的语句:
 

SQL> SELECT * FROM PRICE

右面是从表中返回的结果

SQL自学通之表达式条件语句与运算_第4张图片
分析
输出的结果有时原始数据并没有被改变 而标题为 WHOLESALE+0.15 的列也不是表中的 固有列 事实上 由于这个列标题太不容易为人所注意 所以你应该在它的上边再花一些工夫
请输入:

SQL> SELECT ITEM, WHOLESALE ,(WHOLESALE+ 0.15) RETAIL

FROM PRICE

其结果如右:

SQL自学通之表达式条件语句与运算_第5张图片

分析
真棒 你不但可以创建一个新列 而且还可以对它安自己的需要进行重命名 你可以按语 法列名 别名来对任何一个列进行重命名 注意在列名与别名之间有空格
例如 :

输入:

SQL> SELECT ITEM PRODUCE WHOLESALE, WHOLESALE+ 0.25 RETAIL

FROM PRICE

重命名的列如下:

SQL自学通之表达式条件语句与运算_第6张图片

注 一些SQL解释器使用的语法为 列名 = 别名 所以前一个例子要写成如下格式 :

SQL> SELECT ITEM PRODUCE,
WHOLESALE,
WHOLESALE +0.25 RETAIL,

FROM PRICE

请检查你的 SQL 解释器以确认它采用哪一种语法 你大概想知道当不在命令行状态时应如何使用别名吧 很清楚 你知道报表生成器是如何 工作的吗 总有一天 当有人让你写一个报表的生成器时 你就会记住它而且不用却重复 Dr Codd 和 IBM 已经做过的工作
到现在为止 你已经看到了两种加号的用法 第一种用法是在 SELECT 子句中使用+号以 执行对数据的运算并将结果显示出来 第二种用法是在 WHERE 子句中使用加号 在 WHERE 中使用操作符可以在当你对数据有特定条件时具有更大的灵活性
在一些解释器中 加号还同时肩负着进行字符运算的责任 在稍后的几天中你将会看到这 一点

1.2、减法 (-)

减号也有两种用途 第一种用途是作为负号使用 你可以使用HILOW表来验证这项功能

SQL> SELECT * FROM HILOW

输出:

SQL自学通之表达式条件语句与运算_第7张图片

 例如 这里对数据进行这样的运算

SQL> SELECT STATE - HIGHTEMP LOWS ,LOWTEMP 
HIGHS FROM HILOW

SQL自学通之表达式条件语句与运算_第8张图片

第二种用法 很明显 是作为减号从某一列中减去另一列 例如:

SQL> SELECT STATE,
HIGHTEMP LOWS,
LOWTEMP HIGHS,
(LOWTEMP - HIGHTEMP) DIFFERENCE FROM HILOW

SQL自学通之表达式条件语句与运算_第9张图片

SQL自学通之表达式条件语句与运算_第10张图片

注意这里使用了别名来对输入的错误进行更正 这只不过是一种暂时的补救方法 虽然这 不是永久的解决办法 你是以后 第 21 天 常见的 SQL 错误及其解决方案 会看到如何 对数据以及输入进行更正 在那里你将学会如何对错误的数据进行更正 该查询不只是修正 至少看起来是这样 错误的数据 而且还创建了一个新列以获得每个 记录的最高与最低的差价

如何你在一个字符型字段中意外地使用了减号 你将会看到如下信息

SQL> SELECT- STATE FROM HILOW
ERROR: ORA-01722 :invalid number

在不同的解释器中错误的号码可能会不同 但是结果是相同的

1.3、除法(/)

除法只有一种显而易见的应用 在PRICE表中它的应用如下

输入:

SQL> SELECT * FROM PRICE

输出:

SQL自学通之表达式条件语句与运算_第11张图片

在下边的例句中你可以成功地将销售价折半
输入/输出:

SQL> SELECT ITEM, WHOLESALE (WHOLESALE/2) SALEPRICE; 2 FROM PRICE;

SQL自学通之表达式条件语句与运算_第12张图片

在这个 SELECT 语句中除法的作用是显而易见的 只不过将商品半价销售有点太难以理解 了

1.4、乘法 (*)

乘法的运算也非常直观 再以Price表为例:
输入:

SQL> SELECT * FROM PRICE

输出:

SQL自学通之表达式条件语句与运算_第13张图片

SQL自学通之表达式条件语句与运算_第14张图片

将表中的价格下调 10%可以用如下方法来实现:
输入/输出:

SQL>SELECT ITEM ,WHOLESALE, WHOLESALE * 0.9 NEWPRICE FROM PRICE

SQL自学通之表达式条件语句与运算_第15张图片

通过这些操作您可以在 SELECT 语句中进行复杂的运算

1.5、取模 (%)

取模运算将返回一个除法的余数部分 以REMAINS表举例如下:

输入:

SQL> SELECT * FROM REMAINS

输出:

SQL自学通之表达式条件语句与运算_第16张图片

你也可以用 NUMERATOR % DENOMINATOR 的结果来建立一个新列:
输入/输出:

SQL> SELECT NUMERATOR ,DENOMINATOR, NUMERATOR%DENOMINATOR REMAINDER FROM REMAINS

SQL自学通之表达式条件语句与运算_第17张图片

在一些 SQL 解释器中取模运算符为 MOD 下边的语句所得到的结果与上边的语句相同

SQL> SELECT NUMERATOR,DENOMINATOR,MOD(NUMERATNUMERATOR,DENOMINATOR)
REMAINDER FROM REMAINS

优先级别

在这一部分的例子中主要讲述在 SELECT 语句中的优先级别 数据库 PRECEDENCE 的内容如下:

SQL> SELECT * FROM PRECEDENCE

SQL自学通之表达式条件语句与运算_第18张图片

用 PRECEDENCE 来做如下例子:

输入/输出:

SQL> SELECT
N1+N2*N3/N4,

(N1+N2)*N3/N4,
N1+(N2*N3)/N4
FROM PRECEDENCE

SQL自学通之表达式条件语句与运算_第19张图片

看到了吗 第一例与最后一例的结果是相同的 如果你把第四列改写成为 N1+N2* (N3/N4) 那么其结果与上边的例子是相同的

2、比较运算

顾名思义 比较运算就是将两个表达式进行比较并返回三个数值中的一个 True,False,Unknow,请等一下 Unknow True 和 False 的意义无需说明 但是什么是 Unknow 呢

为了便于理解什么是Unknow 你需要理解一下什么是NULL 在数据库领域内NULL 的意义就是在一个字段之中没有数据 这与在该字段中数据为零或为空的不是同一个概念 为零或为空是一种特殊的数值 而 NULL 则表示在这个字段之中什么也没有 如果你想进 行 Field=9 的比较而 Field 字段是空的 那么比较的结果就会返回 Unknow 由于 Unknow 是一种不正常的状态 所以大多数 SQL 都会置其为无效并提供一种叫 IS NULL 的操作来 测试 Null 的存在。

输入:

SQL> SELECT * FROM PRICE

输出:

SQL自学通之表达式条件语句与运算_第20张图片

请注意 WHOLESALE 字段在 ORANGES 处没有输出 这说明在这里的数值是空的 由于 这里的 WHOLESALE 字段的属性为数字 所以空值在这里是显而易见的 但是如果空值 是出现在ITEM列中 那么要将空值与空白值区分开来就是非常重要的了 请试着找一下空值:

输入/输出:

SQL> SELECT * FROM PRICE WHERE WHOLESALE IS NULL

SQL自学通之表达式条件语句与运算_第21张图片

如你所见到的 WHOLESALE 字段中的 ORANGES 是唯一的一个空值 因为它是不可见 的 可是当你使用 = 这个比较运算符时会有什么结果呢
输入/输出:

SQL> SELECT * FROM PRICE WHERE WHOLESALE = NULL

分析:
你没有得到任何记录因为比较运算在这里返回的结果为 FALSE 所以使用 WHERE SWHLESALE IS NULL在这里比使用=更恰当 它将会返回所有存在空值的记录 这个例子也是对使用 = 进行的比较操作进行的完全展示 这之中的 WHERE 子句就不 用多说了 下面简要说一下等号
在今天的早些时候你已经看到了在一些 SQL 解释器中等号可以在 SELECT 子句中用以给 搜索字段赋以别名 而在 WHERE 子句中它则用于比较操作 并且它是从多个记录中捡选 所需要数值的一种有效手段 试一下
输入:

SQL> SELECT * FROM FRIENDS

输出:

SQL自学通之表达式条件语句与运算_第22张图片

现在让我们来找一下 JD.MAST 的记录信息(在我们的这个表中这很容易 但是你的朋友可 能不只这些 也许像这样的记录你有成千上万)
输入/输出:

SQL> SELECT * FROM FRIENDS WHERE FIRSTNAME = 'JD'

结果如我们所愿 再试一下
输入/输出:

SQL> SELECT * FROM FRIENDS WHERE FIRSTNAME = 'AL'

注 你应该看到在这里 = 号返回了多个记录 注意第二个记录的邮政编码 ZIP 是空 的 邮政编码是一个字符型字段 你将在第8天学习如何创建和组装一个表 这个特殊的 空字段表明在字符型字段中空字段与空白字段是不同的。
此外还有一个关于敏感性的问题 试一下

输入/输出:

SQL> SELECT * FROM FRIENDS WHERE FIRSTNAME = 'BUD'

再试一下
输入/输出:

SQL> select * from friends where firstname =' Bud'

分析:

尽管 SQL 对大小写是不敏感的 但是数据库中的数据对大小写却是敏感的 大多数公司在存储数据时采用大写以保证数据的一致性 所以你应该永远采用大写或小写来存储数据 大小写的混合使用会对你精确地查找数据造成障碍。

大于与大于等于

大于操作的使用方法如下:

输入:

SQL> SELECT * FROM FRIENDS WHERE AREACODE > 300

输出:

分析:
这个操作将显示所有比区号比300大的记录 但是不包括300 如果要包括300 应写

成如下方式:
输入/输出:

SQL> SELECT * FROM FRIENDS WHERE AREACODE>=300

SQL自学通之表达式条件语句与运算_第23张图片

 当然 你使用AREACODE>299时会得到相同的结果。
注: 在这个语句中300没有使用引号 对于数字型字段是不需要加引号的 小于与小于等于
如你所料 它们的使用方法与大于和大于等于操作相同 但结果相反

输入:

SQL> SELECT * FROM FRIENDS WHERE STATE< ‘LA’

输出:

注 为什么 STATE 会变成 ST 呢 这是因为这一列只有两个字符宽 所以结果只会返回两 个字符 如果列为COWS 那么它将会显示成CO 而AREACODE 和PHONE所在列的 列宽大于它们自身的名字 所以它们不会被截去。


分析:

请等一下 你现在知道<在字符字段中的用法了吗 当然知道了 你可以在各种数据类型 中进行你想要的比较操作 结果会因数据类型的不同而不同 例如 你在下例中使用小写 字符
输入/输出:

SQL>SELECT * FROM FRIENDS WHERE STATE <' la'

SQL自学通之表达式条件语句与运算_第24张图片

 分析:
因为大写的字母代码比小写的小 所以大写的字符总是排在小写字符的前面 这里再说一 次 为了保证安全 请在执行前检查大小写情况.
技巧: 想知道你所进行操作的结果 那你先要检查一下你的电脑所采用的字符编码集 PC 机解释器使用的是ASCLL编码 而其它平台则使用EBCDIC编码 要想在结果中显示Louisiana 键入
输入/输出:

SQL> SELECT * FROM FRIENDS WHERE STATE<= 'LA'

SQL自学通之表达式条件语句与运算_第25张图片

不等号 (<>或!=)
如果你想要查找一些除了确定信息以外的其它信息 那你可以使用不等号 由于 SQL 的解 释器不同 它可能写做 <> 或 != 如果你想找除了 AL 以外的人 你可以写出
输入:

SQL> SELECT * FROM FRIENDS WHERE FIRSTNAME

输出:

想找一下不在California住的人 可以写成
输入/输出:

SQL> SELECT * FROM FRIENDS WHERE STATE != 'CA'

SQL自学通之表达式条件语句与运算_第26张图片

注意:! =和<>符号都表示不等于

3、字符操作

无论数据的输出是否为有条件输出 你都可以对其中的字符串进行操作 本部分将会讲述 两个操作符 LIKE和|| 以及字符串连接的概念


LIKE

如果你想从数据库中选出一部分数据并把它们添到一个模板中 并且不需要非常精确的匹 配 你可以用 = 来对每一种可能的情况进行操作 但是这一过程烦琐而又耗时 这时 你可以使用LIKE 如下例

输入:

SQL>SELECT * FROM PARTS

输出:

SQL自学通之表达式条件语句与运算_第27张图片

你怎样找出其中有 BACK 的记录呢 粗看一下这里有两个记录 可不幸的是它们有一点差别
请试一下:
输入/输出:

SQL>SELECT * FROM PARTS WHERE LOCATION LIKE ‘%BACK%’

SQL自学通之表达式条件语句与运算_第28张图片

你可能注意到了在这条语句的LIKE后边使用了% 在LIKE表达式中 %是一种通配符 它表示可能在BACK中出现的其它信息 如果你输入如下:
输入:

SQL>SELECT * FROM PARTS WHERE LOCATION LIKE ‘BACK% ’

你将会检索到所有以 BACK 开头的 LOCATION 记录

输出:

如果你输入:
输入:

SQL> SELECT * FROM PARTS WHERE NAME LIKE 'A%'

你将会得到所有NAME中以 A开头的记录

输出:

SQL自学通之表达式条件语句与运算_第29张图片

那么LIKE语句是否对大小写敏感呢 请看下边的例子:
输入/输出:

SQL> SELECT * FROM PARTS WHERE NAME LIKE 'a%'

分析:
回答是敏感的 当涉及到数据是时候总是大小写敏感的 如果你想查找在某一确定的位置上有字符的数据时你应该如何去做呢 你可以使用另一个 通配符— —下划线

下划线( _)

输入:

SQL> SELECT * FROM FRIENDS

输出:

SQL自学通之表达式条件语句与运算_第30张图片

如果你想查找所有以 开头的州 可以使用如下语句
输入/输出:

SQL> SELECT * FROM FRIENDS WHERE STATE LIKE ‘C_’

也可以在一个语句中使用多个下划线, 如:
输入/输出:

SQL> SELECT * FROM FRIENDS WHERE PHONE LIKE ‘555-6_6_’

 这个语句也可以写成如下形式:
输入/输出:

SQL> SELECT * FROM FRIENDS WHERE PHONE LIKE ‘555-6%’

看 它们的结果是一样的 这两个通配符也可以联合起来使用 下边的例子将找出所有的 第 2个字母为 L的记录
输入 /输出:

SQL> SELECT * FROM FRIENDS WHERE FIRSTNAME LIKE '_L%'

 连接(||)

可以将两个字符串连接起来 ,例如:
输入:

SQL> SELECT FIRSTNAME || LASTNAME ENTIRENAME FROM FRIENDS

输出:

SQL自学通之表达式条件语句与运算_第31张图片

分析:
请注意这里使用的是 而不是 号 如果你试图使用 号来连接两个字符串的话 对于我 们使用的 SQL 解释程序(Personal Oracle7)将会产生如下错误信息
输入/输出:

SQL> SELECT FIRSTNAME+ LASTNAME ENTIRENAME FROM FRIENDS

ERROR:
ORA-01722: invalid number
它试图将两个数字做加法运算 但是它没有在表达式中找到任何数字
注 :有一些解释器也采用加号来连接字符串 请检查一下你的解释器 对于连接字符串这里有更多的实例:
输入/输出:

SQL> SELECT LASTNAME || ','|| FIRSTNAME NAME FROM FRIENDS

SQL自学通之表达式条件语句与运算_第32张图片

分析:
这条语句在姓与名之间插入了一个逗号
注 请注意在姓与名之间的多余的空格 这些空格是数据的一部分 对于确定的数据类型 空格将右填充至达到字段的设定宽度 请检查你的解释器 有关数据类型内容将在第 9 天 的 表的创建与维护 中讨论
至现在为止你已经学完了所有的比较操作符 对于一些问题这种方法非常好 可是如果你 是想找出所有的名字中的第一个字母为 P 并且他的应有的休假时间已经超过了 3 天的 呢


4、逻辑运算

逻辑运算用于 SQL 的 WHERE 子句中将两个或更多条件组合在一起 休假的时间总是人们在工作时讨论的热门话题 现在我们来为财务部门设计一个名为渡假VACATION 的表 内容如下 :

输入:

SQL> SELECT * FROM VACATION

输出:

SQL自学通之表达式条件语句与运算_第33张图片

假设你的公司的雇员每年可以有12天的休假时间 现在使用你所知道的逻辑运算来实现以 下要求 名字是以B开头并且他的休假时间已经超过了50天的员工
输入/输出:

SQL> SELECT LASTNAME YEARS * 12- LEAVETAKEN REMAINING FROM VACATION WHERE LASTNAME LIKE ‘B% ’AND
YEARS *12 -LEAVETAKEN 50

SQL自学通之表达式条件语句与运算_第34张图片

分析:
这个查询语句是你讫今为止学到的最为复杂的语句 SELECT 子句中使用了算术运算符来 确定每一个员工还有多少天剩余的假期 标准的算式为 YEARS * 12 – LEAVETAKEN

而 更为清楚的表达方法为 YEARS * 12) LEAVETAKEN LIKE中使用了通配符%来发现所有的以B开头的员工 而比较运算的 则用来发现所有休 假时间超过 50 天的员工 这里我们使用了逻辑运算符号AND来使查找到的记录同时满足两个条件 带下划线的

AND

AND 只有当两个表达式的值都为真的时候才会返回真 如果任意一个表达式的值不是真 那么结果就会是假的 例如 找一下在你的公司中工作不超过 5 年但是剩余的休假时间超 过 20 天的员工
输入:

SQL> SELECT LASTNAME FROM VACATION WHERE YEARS <= 5 AND LEAVETAKEN > 20

输出:

SQL自学通之表达式条件语句与运算_第35张图片如果你想知道在你的公司中工作时间 年以上人员工和休假时间不足已有假期的 的 员工呢 你可以写成下边这样
输入/输出:

SQL> SELECT LASTNAME WORKAHOLICS

FROM VACATION
WHERE YEARS >= 5

AND
((YEARS *12)-LEAVETAKEN)/(YEARS * 12) < 0.50

SQL自学通之表达式条件语句与运算_第36张图片

给这些人放假吧 也让我们结束对AND的学习

OR

你也可以使用 OR 来对几个条件进行合并 当其中的任一个条件为真时 其结果就会为真 值 为了展示它与AND的不同 下面我们用OR来换掉上一个例子中的AND
输入:

SQL> SELECT LASTNAME WORKAHOLICS

FROM VACATION
WHERE YEARS >= 5

OR
((YEARS *12)-LEAVETAKEN)/(YEARS * 12) >= 0.50

输出:

SQL自学通之表达式条件语句与运算_第37张图片

分析:
上例中的结果仍然在其中 但是我们又多个几个记录 这几个记录出现的原因是它们满足 我们所提出的条件中的一个 OR只要记录满足其中的一个条件就会把记录返回


NOT

顾名思义 它对条件取反 条件为假时结果为真 条件为真时结果为假。
下边的 SELECT 子句将返回所有开头的名字不是 B 的员工:
输入:

SQL> SELECT *

FROM VACATION
WHERE LASTNAME NOT LIKE 'B%'

输出:

当 NOT 应用于 NULL 时可以使用操作符 IS 让我们再来看一下 PRICES 表中 WHOLESALE列 ORANGES 记录中的空值

输入/输出:

SQL> SELECT * FROM PRICE

SQL自学通之表达式条件语句与运算_第38张图片

 想找出所有的非空项 可以写出如下语句
输入/输出:

SQL>SELECT * FROM PRICE WHERE WHOLESALE IS NOT NULL

SQL自学通之表达式条件语句与运算_第39张图片

5、集合运算 SET

我们已经知道了SQL是基于集合的理论的 下面这一部分将讨论 集合运算


UNION 与 UNION ALL

UNION将返回两个查询的结果并去除其中的重复部分 下边有两个值勤人员表

输入:
 

SQL> SELECT * FROM FOOTBALL

输出:

SQL自学通之表达式条件语句与运算_第40张图片

输入:

SQL> SELECT * FROM SOFTBALL

输出:

SQL自学通之表达式条件语句与运算_第41张图片


在这两个表中有哪些不重复的人员呢 输入/输出:

SQL> SELECT NAME FROM SOFTBALL

UNION
SELECT NAME FROM FOOTBALL

SQL自学通之表达式条件语句与运算_第42张图片UNION 返回了两个表中的 10 个记录 它们是不重复的 但是两个表中共有多少人呢 包 括重复的人员
输入/输出:

SQL> SELECT NAME FROM SOFTBALL

UNION ALL
SELECT NAME FROM FOOTBALL

 SQL自学通之表达式条件语句与运算_第43张图片

分析:
可以看到 UNION ALL与UNION一样对表进行了合并 但是它不去掉重复的记录 可是 如果我们想知道都有谁同时在两个表中呢 UNION 无法做到这一点 我们需要学习使用 INTERSECT


INTERSECT (相交)

INTERSECT 返回两个表中共有的行 看下例 它将返回两个表中有存在的员工
输入:

SQL> SELECT * FROM FOOTBALL

INTERSECT
SELECT * FROM SOFTBALL

输出:

SQL自学通之表达式条件语句与运算_第44张图片

分析:
这些记录是两个表中都存在的


MINUS (相减)

MINUS 返回的记录是存在于第一个表中但不存在于第二个表中的记录 例如 输入:

SQL> SELECT * FROM FOOTBALL MINUS SELECT * FROM SOFTBALL

输出:

SQL自学通之表达式条件语句与运算_第45张图片

上例中显示了三个不在垒球队中的足球队员 如果你把语句的次序颠倒 那么你将得到在 垒球队中但不在足球队中的队员
输入:

SQL> SELECT * FROM SOFTBALL MINUS SELECT * FROM FOOTBALL

输出:

SQL自学通之表达式条件语句与运算_第46张图片

6、从属运算 (IN and BETWEEN)

这两个运算符对你已经做过的例子提供了更快捷的操作 如果你想找一个你在 Colorado, California,和Louisiana的朋友 可以输入:
输入:

SQL> SELECT * FROM FRIENDS WHERE STATE= 'CA' OR STATE ='CO' OR STATE = 'LA'

输出:

也可以输入:
输入/输出:

SQL> SELECT * FROM FRIENDS WHERE STATE IN('CA','CO','LA')

SQL自学通之表达式条件语句与运算_第47张图片

分析:
第二个实例比第一个更易读和简捷 我想你一会再用以前的方法来工作了吧 在 IN 中也 可以使用数字
例如:
输入/输出:

SQL> SELECT *

FROM FRIENDS

WHERE AREACODE IN(100,381,204)

如果你想要查找符合某一范围的记录

例如:

输入/输出:

SQL> SELECT * FROM PRICE WHERE WHOLESALE 0.25 AND
WHOLESALE < 0.75


SQL自学通之表达式条件语句与运算_第48张图片

或使用BEWTEEN 你可以这样写输入/输出:

SQL>SELECT * FROM

PRICE WHERE

WHOLESALE

BETWEEN

0.25 AND

0.75

 
  

看 第二个是不是比第一个更清楚和易读

注 如果批发价为 0.25 的商品在表中存在 那么它们也将会被返回 BETWEEN 操作将包 括边界值
 

四、问与答

问: 如果我不想使用命令行的SQL那么学习这些东西对我有什么用?
答 不论你使用内嵌 SQL 的 COBOL 还是微软的 ODBC 它们所使用的 SQL 结构都是一 样的 所以你现在学习的东西将会更有助于你以后的学习


问: 既然SQL是一种标准 那为什么又种是让我检查一下自己的解释器呢?
答 我们所使用的是 ANSI1992 标准 但大多数供应商对它进行了修改以使它更适用于自 己的数据库 我们是以ANSI1992标准为基础的 但在具体使用时要注意它们的不同

五、校练场

应用下表的内容来回答下列问题

SQL自学通之表达式条件语句与运算_第49张图片

写一下查询 返回数据库中所有名字以M开头的每一个人

答:

SELECT * FROM FRIENDS  WHERE LASTNAME LIKE 'M%';
 

写一个查询 返回数据库ST为LA且FIRSTNAME以AL开头的人

答:

SELECT * FROM FRIENDS WHERE ST='LA' AND FIRSTNAME LIKE 'AL%';
 

给你两个表 PART1 和 PART2 你如何才能找出两个表中的共有元素
WHERE a >= 10 AND a <=30 的更便捷写法是什么 请写出来?

答:可以使用INNER JOIN语句来找出两个表中的共有元素,具体方法如下:

SELECT PART1.column_name FROM PART1 INNER JOIN PART2 ON PART1.column_name = PART2.column_name;

其中,column_name表示两个表中要比较的列的名称。

WHERE a BETWEEN 10 AND 30 可以更便捷地代替WHERE a >= 10 AND a <=30。其中BETWEEN表示在某个范围内,包括最小值和最大值,比较符号可以简化为一个BETWEEN。因此,更便捷的写法是:

WHERE a BETWEEN 10 AND 30;


下面的查询将返回什么结果?
SELECT FIRSTNAME FROM FRIENDS WHERE FIRSTNAME='AL' AND LASTNAME= ‘BULHER’

答:查询返回:

练习:
用上边给出的表返回下面的结果

SQL自学通之表达式条件语句与运算_第50张图片

输入:

SQL> SELECT (FIRSTNAME || 'FROM') NAME, STATE 2 FROM FRIENDS

WHERE STATE = 'IL' AND

LASTNAME = 'BUNDY'

输出:

SQL自学通之表达式条件语句与运算_第51张图片

你可能感兴趣的:(MYSQL剑客传:征战数据江湖,数据库,sql)