友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!
SQL 21日自学通(V3.0)(PDF格式)-第15部分
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部! 如果本书没有阅读完,想下次继续接着阅读,可使用上方 "收藏到我的浏览器" 功能 和 "加入书签" 功能!
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) 翻译人 笨猪
BAKER
CHARLIE
DEAN
EXITOR
FALCONER
GOOBER
ABLE
BRAVO
CHARLIE
DECON
EXITOR
FUBAR
GOOBER
14 rows selected。
分析
可以看到 UNION ALL 与 UNION 一样对表进行了合并 但是它不去掉重复的记录 可是
如果我们想知道都有谁同时在两个表中呢 UNION 无法做到这一点 我们需要学习使用
INTERSECT
INTERSECT 相交
INTERSECT 返回两个表中共有的行 看下例 它将返回两个表中有存在的员工
输入:
SQL》 SELECT * FROM FOOTBALL
2 INTERSECT
3 SELECT * FROM SOFTBALL
输出
NAME
ABLE
CHARLIE
EXITOR
GOOBER
分析
这些记录是两个表中都存在的
MINUS 相减
MINUS 返回的记录是存在于第一个表中但不存在于第二个表中的记录 例如
输入:
SQL》 SELECT * FROM FOOTBALL MINUS SELECT * FROM SOFTBALL
输出
NAME
BRAVO
DECON
FUBAR
上例中显示了三个不在垒球队中的足球队员 如果你把语句的次序颠倒 那么你将得到在
垒球队中但不在足球队中的队员
输入:
SQL》 SELECT * FROM SOFTBALL MINUS SELECT * FROM FOOTBALL
输出
NAME
BAKER
DEAN
EMAIL wyhsillypig@163。 58
…………………………………………………………Page 59……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
FALCONER
从属运算 IN and BETWEEN
这两个运算符对你已经做过的例子提供了更快捷的操作 如果你想找一个你在 Colorado;
California;和 Louisiana 的朋友 可以输入
输入:
SQL》 SELECT * FROM FRIENDS WHERE STATE= 'CA' OR STATE ='CO' OR STATE =
'LA'
输出
LASTNAME FIRSTNAME AREACODE PHONE ST ZIP
MERRICK BUD 300 555…6666 CO 80212
MAST JD 381 555…6767 LA 23456
PERKINS ALTON 911 555…3116 CA 95633
也可以输入
输入/输出:
SQL》 SELECT * FROM FRIENDS WHERE STATE IN('CA';'CO';'LA')
LASTNAME FIRSTNAME AREACODE PHONE ST ZIP
MERRICK BUD 300 555…6666 CO 80212
MAST JD 381 555…6767 LA 23456
PERKINS ALTON 911 555…3116 CA 95633
分析
第二个实例比第一个更易读和简捷 我想你一会再用以前的方法来工作了吧 在 IN 中也
可以使用数字 例如
输入/输出:
SQL》 SELECT *
2 FROM FRIENDS
3 WHERE AREACODE IN(100;381;204)
LASTNAME FIRSTNAME AREACODE PHONE ST ZIP
BUNDY AL 100 555…1111 IL 22333
MAST JD 381 555…6767 LA 23456
BOSS SIR 204 555…2345 CT 95633
如果你想要查找符合某一范围的记录 例如
输入/输出:
SQL》 SELECT * FROM PRICE WHERE WHOLESALE 0。25 AND WHOLESALE
0。75
ITEM WHOLESALE
TOMATOES 。34
POTATOES 。51
BANANAS 。67
TURNIPS 。45
或使用 BEWTEEN 你可以这样写
输入/输出:
SQL》SELECT * FROM PRICE WHERE WHOLESALE BETWEEN 0。25 AND 0。75
ITEM WHOLESALE
TOMATOES 。34
POTATOES 。51
BANANAS 。67
TURNIPS 。45
看 第二个是不是比第一个更清楚和易读
EMAIL wyhsillypig@163。 59
…………………………………………………………Page 60……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
注 如果批发价为 0。25 的商品在表中存在 那么它们也将会被返回 BETWEEN 操作将包
括边界值
摘要
在第三天我们学会了使用最基本的 SELECT 子句和 FROM 子句 现在我们已经掌握了最为
常用的操作来使数据库返回的结果满足你的要求 你学会了使用算术 比较 字符和逻辑
操作 这为你进一步学习 SQL 打下了良好的基础
问与答
问 如果我不想使用命令行的 SQL 那么学习这些东西对我有什么用
答 不论你使用内嵌 SQL 的 COBOL 还是微软的 ODBC 它们所使用的 SQL 结构都是一
样的 所以你现在学习的东西将会更有助于你以后的学习
问 既然 SQL 是一种标准 那为什么又种是让我检查一下自己的解释器呢
答 我们所使用的是 ANSI1992 标准 但大多数供应商对它进行了修改以使它更适用于自
己的数据库 我们是以 ANSI1992 标准为基础的 但在具体使用时要注意它们的不同
校练场
应用下表的内容来回答下列问题
LASTNAME FIRSTNAME AREACODE PHONE ST ZIP
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!