SQL 21日自学通(V3.0)(PDF格式)-第16部分
按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
如果你想查找所有以 开头的州 可以使用如下语句
输入/输出
SQL》 SELECT * FROM FRIENDS WHERE STATE LIKE C_
LASTNAME FIRSTNAME AREACODE PHONE ST ZIP
MERRICK BUD 300 555…6666 CO 80212
PERKINS ALTON 911 555…3116 CA 95633
BOSS SIR 204 555…2345 CT 95633
也可以在一个语句中使用多个下划线 如
输入/输出
SQL》 SELECT * FROM FRIENDS WHERE PHONE LIKE 555…6_6_
LASTNAME FIRSTNAME AREACODE PHONE ST ZIP
MERRICK BUD 300 555…6666 CO 80212
MAST JD 381 555…6767 LA 23456
这个语句也可以写成如下形式
输入/输出
SQL》 SELECT * FROM FRIENDS WHERE PHONE LIKE 555…6%
LASTNAME FIRSTNAME AREACODE PHONE ST ZIP
MERRICK BUD 300 555…6666 CO 80212
MAST JD 381 555…6767 LA 23456
看 它们的结果是一样的 这两个通配符也可以联合起来使用 下边的例子将找出所有的
第 个字母为 的记录
输入 输出
SQL》 SELECT * FROM FRIENDS WHERE FIRSTNAME LIKE _L%
LASTNAME FIRSTNAME AREACODE PHONE ST ZIP
BUNDY AL 100 555…1111 IL 22333
MEZA AL 200 555…2222 UK
PERKINS ALTON 911 555…3116 CA 95633
连接
可以将两个字符串连接起来 例如
输入
SQL》 SELECT FIRSTNAME || LASTNAME ENTIRENAME FROM FRIENDS
输出
ENTIRE NAME
AL BUNDY
AL MEZA
BUD MERRICK
JD MAST
FERRIS BULHER
ALTON PERKINS
SIR BOSS
7 rows selected。
EMAIL wyhsillypig@163。 53
…………………………………………………………Page 54……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
分析
请注意这里使用的是 而不是 号 如果你试图使用 号来连接两个字符串的话 对于我
们使用的 SQL 解释程序(Personal Oracle7)将会产生如下错误信息
输入/输出
SQL》 SELECT FIRSTNAME LASTNAME ENTIRENAME FROM FRIENDS
ERROR
ORA…01722 invalid number
它试图将两个数字做加法运算 但是它没有在表达式中找到任何数字
注 有一些解释器也采用加号来连接字符串 请检查一下你的解释器
对于连接字符串这里有更多的实例
输入/输出
SQL》 SELECT LASTNAME || || FIRSTNAME NAME FROM FRIENDS
NAME
BUNDY AL
MEZA AL
MERRICK BUD
MAST JD
BULHER FERRIS
PERKINS ALTON
BOSS SIR
7 rows selected。
分析
这条语句在姓与名之间插入了一个逗号
注 请注意在姓与名之间的多余的空格 这些空格是数据的一部分 对于确定的数据类型
空格将右填充至达到字段的设定宽度 请检查你的解释器 有关数据类型内容将在第 9 天
的 表的创建与维护 中讨论
至现在为止你已经学完了所有的比较操作符 对于一些问题这种方法非常好 可是如果你
是想找出所有的名字中的第一个字母为 P 并且他的应有的休假时间已经超过了 3 天的人
呢
逻辑运算
逻辑运算用于 SQL 的 WHERE 子句中将两个或更多条件组合在一起
休假的时间总是人们在工作时讨论的热门话题 现在我们来为财务部门设计一个名为渡假
VACATION 的表 内容如下
输入
SQL》 SELECT * FROM VACATION
输出
LASTNAME EMPLOYEENUM YEARS LEAVETAKEN
ABLE 101 2 4
BAKER 104 5 23
BLEDSOE 107 8 45
BOLIVAR 233 4 80
BOLD 210 15 100
COSTALES 211 10 78
6 rows selected。
假设你的公司的雇员每年可以有 12 天的休假时间 现在使用你所知道的逻辑运算来实现以
下要求 名字是以 B 开头并且他的休假时间已经超过了 50 天的员工
输入/输出
EMAIL wyhsillypig@163。 54
…………………………………………………………Page 55……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
SQL》 SELECT LASTNAME YEARS * 12 LEAVETAKEN REMAINING
FROM VACATION WHERE LASTNAME LIKE B% AND
YEARS *12 LEAVETAKEN 50
LASTNAME REMAINING
BLEDSOE 51
BOLD 80
分析
这个查询语句是你讫今为止学到的最为复杂的语句 SELECT 子句中使用了算术运算符来
确定每一个员工还有多少天剩余的假期 标准的算式为 YEARS * 12 – LEAVETAKEN 而
更为清楚的表达方法为 YEARS * 12) LEAVETAKEN
LIKE 中使用了通配符%来发现所有的以 B 开头的员工 而比较运算的 则用来发现所有休
假时间超过 50 天的员工
这里我们使用了逻辑运算符号 AND 来使查找到的记录同时满足两个条件 带下划线的
AND
AND 只有当两个表达式的值都为真的时候才会返回真 如果任意一个表达式的值不是真
那么结果就会是假的 例如 找一下在你的公司中工作不超过 5 年但是剩余的休假时间超
过 20 天的员工
输入
SQL》 SELECT LASTNAME FROM VACATION WHERE YEARS20
输出
LASTNAME
BAKER
BOLIVAR
如果你想知道在你的公司中工作时间 年以上人员工和休假时间不足已有假期的 的
员工呢 你可以写成下边这样
输入/输出
SQL》 SELECT LASTNAME WORKAHOLICS
2 FROM VACATION
3 WHERE YEARS 》= 5
4 AND
5 ((YEARS *12)…LEAVETAKEN)/(YEARS * 12) 《 0。50
WORKAHOLICS
BAKER
BLEDSOE
给这些人放假吧 也让我们结束对 AND 的学习
OR
你也可以使用 OR 来对几个条件进行合并 当其中的任一个条件为真时 其结果就会为真
值 为了展示它与 AND 的不同 下面我们用 OR 来换掉上一个例子中的 AND
输入:
SQL》 SELECT LASTNAME WORKAHOLICS
2 FROM VACATION
3 WHERE YEARS 》= 5
4 OR
5 ((YEARS *12)…LEAVETAKEN)/(YEARS * 12) 》= 0。50
输出:
EMAIL wyhsillypig@163。 55
…………………………………………………………Page 56……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
WORKAHOLICS
ABLE
BAKER
BLEDSOE
BOLD
COSTALES
分析
上例中的结果仍然在其中 但是我们又多个几个记录 这几个记录出现的原因是它们满足
我们所提出的条件中的一个 OR 只要记录满足其中的一个条件就会把记录返回
NOT
顾名思义 它对条件取反 条件为假时结果为真 条件为真时结果为假
下边的 SELECT 子句将返回所有开头的名字不是 B 的员工
输入
SQL》 SELECT *
2 FROM VACATION
3 WHERE LASTNAME NOT LIKE 'B%'
输出:
LASTNAME EMPLOYEENUM YEARS LEAVETAKEN
ABLE 101 2 4
COSTALES 211 10 78
当 NOT 应用于NULL 时可以使用操作符 IS 让我们再来看一下 PRICES 表中WHOLESALE
列 ORANGES 记录中的空值
输入/输出:
SQL》 SELECT * FROM PRICE
ITEM WHOLESALE
TOMATOES 。34
POTATOES 。51
BANANAS 。67
TURNIPS 。45
CHEESE 。89
APPLES 。23
ORANGES
7 rows selected。
想找出所有的非空项 可以写出如下语句
输入/输出:
SQL》SELECT * FROM PRICE WHERE WHOLESALE IS NOT NULL
ITEM WHOLESALE
TOMATOES 。34
POTATOES 。51
BANANAS 。67
TURNIPS 。45
CHEESE 。89
APPLES 。23
6 rows selected。
集合运算 SET
在第一天 介绍 SQL 中我们已经知道了 SQL 是基于集合的理论的 下面这一部分将讨论
集合运算
UNION 与 UNION ALL
UNION 将返回两个查询的结果并去除其中的重复部分 下边有两个值勤人员表
EMAIL wyhsillypig@163。 56
…………………………………………………………Page 57……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
输入:
SQL》 SELECT * FROM FOOTBALL
输出:
NAME
ABLE
BRAVO
CHARLIE
DECON
EXITOR
FUBAR
GOOBER
7 rows selected。
输入:
SQL》 SELECT * FROM SOFTBALL
输出:
NAME
ABLE
BAKER
CHARLIE
DEAN
EXITOR
FALCONER
GOOBER
7 rows selected。
在这两个表中有哪些不重复的人员呢
输入/输出:
SQL》 SELECT NAME FROM SOFTBALL
2 UNION
3 SELECT NAME FROM FOOTBALL
NAME
ABLE
BAKER
BRAVO
CHARLIE
DEAN
DECON
EXITOR
FALCONER
FUBAR
GOOBER
10 rows selected。
UNION 返回了两个表中的 10 个记录 它们是不重复的 但是两个表中共有多少人呢 包
括重复的人员
输入/输出:
SQL》 SELECT NAME FROM SOFTBALL
2 UNION ALL
3 SELECT NAME FROM FOOTBALL
NAME
ABLE
EMAIL wyhsillypig@163。 57
…………………………………………………………Page 58……………………………………………………………
SQL 21 日自学通(V1。0)