This slide is based on Jeffrey D. Ullman's work, which can be download from his website.
数据库修改通过以下三条命令进行:
这里所有查询的例子都是基于下面的数据库模式.
Beers(name, manf) Bars(name, addr, license) Drinkers(name, addr, phone) Likes(drinker, beer) Sells(bar, beer, price) Frequents(drinker, bar)
加下划线的是组成键的属性.
在关系
查询的结果是一个新的关系, 仅有一个属性(name)构成. 返回的元组是所有由 Anheuser-Busch 生成的啤酒名称, 如 Bud 等.
| name |
|---|
| Bud |
| Bud Lite |
| Michelob |
| ... |
mysql> select name
> from Beers
> where manf='百威英博啤酒集团';
+---------------+ | name | +---------------+ | 百威 | | 贝克 | | Stella Artois | +---------------+
| name | manf |
|---|---|
| Bud | Anheuser-Busch |
执行查询操作过程中, 会定义一个元组变量 $t$, 它将在所有元组(即这个关系)中进行循环, 检查第二个属性的值
当
例子:
SELECT * FROM Beers WHERE manf = 'Anheuser-Busch';
| name | manf |
|---|---|
| Bud | Anheuser-Busch |
| Bud Lite | Anheuser-Busch |
| Michelob | Anheuser-Busch |
| ... | ... |
返回的结果关系包含每个属性.
mysql> select *
> from Beers
> where manf='百威英博啤酒集团';
+---------------+--------------------------+---------+---------+ | name | manf | name_en | Country | +---------------+--------------------------+---------+---------+ | 百威 | 百威英博啤酒集团 | NULL | NULL | | 贝克 | 百威英博啤酒集团 | NULL | NULL | | Stella Artois | 百威英博啤酒集团 | NULL | NULL | +---------------+--------------------------+---------+---------+
对于得到的结果关系, 如果希望有不同的属性名字, 则可以使用
SELECT name AS beer, manf FROM Beers WHERE manf ='Anheuser-Busch';
查询的结果是
| beer | manf |
|---|---|
| Bud | Anheuser-Busch |
| Bud Lite | Anheuser-Busch |
| Michelob | Anheuser-Busch |
| ... | ... |
mysql> select name as beer, manf
-> from Beers
-> where manf='百威英博啤酒集团';
+---------------+--------------------------+ | beer | manf | +---------------+--------------------------+ | 百威 | 百威英博啤酒集团 | | 贝克 | 百威英博啤酒集团 | | Stella Artois | 百威英博啤酒集团 | +---------------+--------------------------+
任何有意义的表达式均可以作为
例如对于关系
SELECT bar, beer, price*6.3424 AS priceInRMB FROM Sells;
查询的结果是
| bar | beer | priceInRMB |
|---|---|---|
| Joe's | Bud | 15.856 |
| Sue's | Miller | 19.0272 |
| ... | ... | ... |
mysql> select bar, beer,
-> price/6.2704 as priceInUSD
-> from Sells;
+--------------------------+-----------------+--------------------+ | bar | beer | priceInUSD | +--------------------------+-----------------+--------------------+ | 3DArtBar | 喜力 | 3.9869864761418725 | | 3DArtBar | 嘉士伯 | 5.103342689461597 | | 3DArtBar | 安贝夫 | 6.379178361826996 | | 3DArtBar | 百威 | 4.784383771370247 | | 3DArtBar | 贝克 | 5.581781066598622 | | HardRock | 健力士黑啤 | 6.219698902781321 | | HardRock | 喜力 | 4.465424853278898 | | HardRock | 嘉士伯 | 4.784383771370247 | | HardRock | 安贝夫 | 6.219698902781321 | | HardRock | 百威 | 5.103342689461597 | | HardRock | 科罗娜 | 6.379178361826996 | | HardRock | 贝克 | 5.262822148507272 | | Westside | 健力士黑啤 | 6.219698902781321 | | Westside | 南非啤酒 | 5.741260525644297 | | Westside | 朝日 | 4.146465935187548 | | Westside | 百威 | 5.103342689461597 | | Westside | 科罗娜 | 6.379178361826996 | | Westside | 纯种苦啤酒 | 5.262822148507272 | | Westside | 贝克 | 4.465424853278898 | | 宝莱纳餐厅 | 健力士黑啤 | 6.219698902781321 | | 宝莱纳餐厅 | 南非啤酒 | 5.741260525644297 | | 宝莱纳餐厅 | 喜力 | 4.465424853278898 | | 宝莱纳餐厅 | 朝日 | 4.146465935187548 | | 宝莱纳餐厅 | 百威 | 5.103342689461597 | | 宝莱纳餐厅 | 科罗娜 | 6.379178361826996 | | 宝莱纳餐厅 | 纯种苦啤酒 | 5.262822148507272 | | 扬州老啤酒厂酒吧 | Stella Artois | 5.741260525644297 | | 扬州老啤酒厂酒吧 | 健力士黑啤 | 4.146465935187548 | | 扬州老啤酒厂酒吧 | 喜力 | 5.581781066598622 | | 扬州老啤酒厂酒吧 | 安贝夫 | 6.379178361826996 | | 扬州老啤酒厂酒吧 | 百威 | 5.103342689461597 | | 扬州老啤酒厂酒吧 | 科罗娜 | 6.379178361826996 | | 扬州老啤酒厂酒吧 | 米勒 | 7.973972952283745 | | 扬州老啤酒厂酒吧 | 纯种苦啤酒 | 5.262822148507272 | | 扬州老啤酒厂酒吧 | 贝克 | 6.698137279918346 | | 扬州老啤酒厂酒吧 | 麒麟 | 6.219698902781321 | | 木板房啤酒吧 | 嘉士伯 | 6.857616738964021 | | 木板房啤酒吧 | 安贝夫 | 6.379178361826996 | | 木板房啤酒吧 | 生力 | 3.9869864761418725 | | 木板房啤酒吧 | 米勒 | 5.103342689461597 | | 木板房啤酒吧 | 贝克 | 5.581781066598622 | | 木板房啤酒吧 | 麒麟 | 4.784383771370247 | | 苏荷酒吧 | 健力士黑啤 | 6.219698902781321 | | 苏荷酒吧 | 南非啤酒 | 5.741260525644297 | | 苏荷酒吧 | 喜力 | 4.465424853278898 | | 苏荷酒吧 | 朝日 | 4.146465935187548 | | 苏荷酒吧 | 生力 | 6.0602194437356465 | | 苏荷酒吧 | 百威 | 5.103342689461597 | | 苏荷酒吧 | 科罗娜 | 0 | | 苏荷酒吧 | 纯种苦啤酒 | NULL | +--------------------------+-----------------+--------------------+
SELECT drinker, 'likes Bud' AS whoLikesBud FROM Likes WHERE beer = 'Bud';
查询的结果是
| drinker | whoLikesBud |
|---|---|
| Sally | likes Bud |
| Fred | likes Bud |
| ... | ... |
mysql> select drinker,
> 'likes 百威' as whoLikesBudweiser
-> from Likes
-> where beer='百威';
+-----------------+-------------------+ | drinker | whoLikesBudweiser | +-----------------+-------------------+ | Charles Babbage | likes 百威 | | John Hennessy | likes 百威 | +-----------------+-------------------+
对许多来自各种源的数据, 我们经常建立数据仓库(data warehouses).
假设每个酒吧(bar)有自己的关系
为了将酒吧的信息集中到
举个例子, 对于 Joe's Bar, 我们可以执行下面的查询:
SELECT 'Joe''s Bar', beer, price FROM Menu;
对于关系
SELECT price FROM Sells WHERE bar = 'Joe''s Bar' AND beer = 'Bud';
mysql> select price
-> from Sells
-> where bar='Westside'
-> and beer='百威';
+-------+ | price | +-------+ | 32 | +-------+
模式是指用来匹配字符串的. 形如:
模式是用引号括起来的一个字符串, 其中
对于关系
SELECT name FROM Drinkers WHERE phone LIKE '%555-_ _ _ _';
mysql> select name
-> from Drinkers
-> where phone like '%723-____';
+---------------+ | name | +---------------+ | John Hennessy | +---------------+
SQL 关系中的元组可以在一个或多个字段上取值
其具体意思要取决于上下文, 比如两个常见的情形:
SQL 中的条件的逻辑值实际上有三个:
任何值(包括
一个元组成为查询的结果当且仅当
mysql> SELECT 1 = 1, NULL = NULL, 1 = NULL;
+-------+-------------+----------+ | 1 = 1 | NULL = NULL | 1 = NULL | +-------+-------------+----------+ | 1 | NULL | NULL | +-------+-------------+----------+
不过 MySQL 中有一个安全等于比较符
mysql> SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL;
+---------+---------------+------------+ | 1 <=> 1 | NULL <=> NULL | 1 <=> NULL | +---------+---------------+------------+ | 1 | 1 | 0 | +---------+---------------+------------+
尝试下面的查询.
mysql > select NULL <=> unknown;
mysql > select NULL is unknown;
为理解
TRUE AND (FALSE OR NOT(UNKNOWN)) =MIN(1, MAX(0,(1-1/2))) =MIN(1, MAX(0,1/2)) =MIN(1, 1/2) =1/2 =UNKNOWN
mysql> select TRUE and (FALSE or NOT(NULL));
+-------------------------------+ | TRUE and (FALSE or NOT(NULL)) | +-------------------------------+ | NULL | +-------------------------------+
试一下下面的.
mysql> select TRUE and (FALSE or NOT(UNKNOWN));
对于下面的
| bar | beer | price |
|---|---|---|
| Joe's Bar | Bud |
SELECT bar FROM Sells WHERE price < 2.00 OR price >= 2.00;
由于 Joe 的酒店中 Bud 啤酒的价格为
mysql> select bar, beer
-> from Sells
-> where price < 2.00 or price >=2.00;
发现价格为
一些定律, 如
但是有的可能不成立, 例如:
p OR NOT p = TRUE
许多有趣的查询都是将两个或两个以上关系中的数据结合起来的.
要对多个关系进行查询, 首先将它们的名字列出在
如果不同关系有同名的属性, 则在它们的属性名前加上关系名加以区别. 如
对于关系
SELECT beer FROM Likes, Frequents WHERE bar='Joe''s Bar' AND Frequents.drinker=Likes.drinker;
mysql> SELECT beer
-> FROM Likes, Frequents
-> WHERE bar='苏荷酒吧' AND
-> Frequents.drinker=Likes.drinker;
+-----------------+ | beer | +-----------------+ | 健力士黑啤 | +-----------------+
多关系查询与单关系查询的语义基本一致.
对于
如果这些元组变量所指向的元组组合满足
对于关系
SELECT b1.name, b2.name FROM Beers b1, Beers b2 WHERE b1.manf = b2.manf AND b1.name < b2.name;
mysql> SELECT b1.name, b2.name
-> FROM Beers b1, Beers b2
-> WHERE b1.manf = b2.manf AND
-> b1.name < b2.name;
+---------------+--------+ | name | name | +---------------+--------+ | Stella Artois | 百威 | | 百威 | 贝克 | | Stella Artois | 贝克 | +---------------+--------+
用圆括号括起来的
例如: 在
列出经常去 Joe 的酒吧的顾客所喜爱的啤酒名称.
SELECT beer FROM Likes, (SELECT drinker FROM Frequents WHERE bar='Joe''s Bar') JD WHERE Likes.drinker=JD.drinker;
小括号内的就是经常去 Joe 的酒吧喝酒的酒客.
mysql> SELECT beer
-> FROM Likes, (SELECT drinker
-> FROM Frequents
-> WHERE bar='Westside') JD
-> WHERE Likes.drinker=JD.drinker;
+-----------------+ | beer | +-----------------+ | 健力士黑啤 | | Stella Artois | | 贝克 | | 贝克 | +-----------------+
注意所得到的结果中可能会存在重复.
haife@localhost:5432 testbar# select beer
testbar-> from likes, (select drinker from frequents where bar='Westside') JD
testbar-> where likes.drinker=JD.drinker;
beer
---------------
Stella Artois
贝克
健力士黑啤
(3 行记录)
如果子查询能够保证返回单个元组, 则子查询可以作为一个值.
对于关系
下面两个查询将完成此项任务.
SELECT bar FROM Sells WHERE beer='Miller' AND price=(SELECT price From Sells WHERE bar='Joe''s Bar' AND beer='Bud');
mysql> SELECT bar
-> FROM Sells
-> WHERE beer='贝克' AND
-> price=(SELECT price
-> From Sells
-> WHERE bar='Westside'
-> AND beer='纯种苦啤酒');
+----------+ | bar | +----------+ | HardRock | +----------+
haife@localhost:5432 testbar# SELECT bar FROM sells WHERE beer='贝克' AND price= testbar-> (SELECT price FROM sells WHERE bar='Westside' AND beer='纯种苦啤酒'); bar ---------- HardRock (1 行记录) 时间:40.928 ms haife@localhost:5432 testbar#
如果表示不在这个关系中, 则使用
对于关系
SELECT * FROM Beers WHERE name IN (SELECT beer FROM Likes WHERE drinker='Fred');
mysql> SELECT *
-> FROM Beers
-> WHERE name IN (SELECT beer
-> FROM Likes
-> WHERE drinker='John Hennessy');
+--------+--------------------------+ | name | manf | +--------+--------------------------+ | 百威 | 百威英博啤酒集团 | +--------+--------------------------+
haife@localhost:5432 testbar# SELECT * FROM beers WHERE name IN testbar-> (SELECT beer FROM likes WHERE drinker='John Hennessy'); name | manf ------+------------------ 百威 | 百威英博啤酒集团 (1 行记录) 时间:2.581 ms haife@localhost:5432 testbar#
SELECT a FROM R, S WHERE R.b = S.b;
SELECT a FROM R WHERE b IN (SELECT b FROM S);
例子: 对于
SELECT name FROM Beers b1 WHERE NOT EXISTS ( SELECT * FROM Beers WHERE manf=b1.manf AND name <> b1.name);
下面的查询语句是否与上面的等价?
SELECT name FROM Beers b1 WHERE manf NOT IN ( SELECT b1.manf FROM b1 WHERE manf=b1.manf AND name <> b1.name);
如果上面的查询语句有问题, 请修改, 使之能在 MySQL 下运行.
mysql> SELECT name
-> FROM Beers b1
-> WHERE NOT EXISTS (
-> SELECT *
-> FROM Beers
-> WHERE manf=b1.manf AND
-> name <> b1.name);
+-----------------+ | name | +-----------------+ | 喜力 | | 嘉士伯 | | 安贝夫 | | 南非啤酒 | | 米勒 | | 科罗娜 | | 朝日 | | 麒麟 | | 生力 | | 健力士黑啤 | | 纯种苦啤酒 | +-----------------+ 11 rows in set (0.35 sec)
下面的代码由姚凯哲(信科1501)给出.
mysql> SELECT name
-> FROM Beers b1
-> WHERE manf NOT IN (
-> SELECT b2.manf
-> FROM Beers b2
-> WHERE b1.manf = b2.manf AND
-> b1.name <> b2.name);
haife@localhost:5432 testbar# SELECT name
testbar-> FROM beers b1
testbar-> WHERE NOT EXISTS (
testbar(> SELECT * FROM beers
testbar(> WHERE manf=b1.manf AND name<>b1.name);
name
------------
喜力
嘉士伯
安贝夫
南非啤酒
米勒
科罗娜
朝日
麒麟
生力
健力士黑啤
纯种苦啤酒
(11 行记录)
时间:2.209 ms
haife@localhost:5432 testbar#
例如: 表达式
注意: 为了能比较, 元组必须仅有一个字段.
其中
例如: 表达式
对于关系
SELECT beer FROM Sells WHERE price >= ALL( SELECT price FROM Sells);
使用 MAX(price) 也可以做到.
SELECT beer FROM Sells WHERE price = ( SELECT MAX(price) FROM Sells);
mysql> SELECT beer
-> FROM Sells
-> WHERE price >= ALL(
-> SELECT price
-> FROM Sells);
+--------+ | beer | +--------+ | 米勒 | +--------+ 1 row in set (0.00 sec)
mysql> SELECT beer
-> FROM Sells
-> WHERE price >= ALL(
-> SELECT price
-> FROM Sells
-> WHERE price >=10 or price < 10
->);
关系的并、交、差采用如下的表达式, 每个涉及到子查询.
注意,
不过
mysql> (SELECT * FROM Bars)
-> UNION
-> (SELECT * FROM Bars);
+--------------------------+---------------------------------+---------+
| name | addr | license |
+--------------------------+---------------------------------+---------+
| 3DArtBar | 上海虹梅路3338弄9-11号 | BHXGZX |
| HardRock | 上海政通路315号 | XJ8QGF |
| Westside | 上海衡山路237号 | EDS9HF |
| 宝莱纳餐厅 | 上海徐汇区汾阳路150号 | SKAPXJ |
| 扬州老啤酒厂酒吧 | 广陵区南通东路128号 | 8NZBSG |
| 木板房啤酒吧 | 上海子长路350号 | YJVI9A |
| 苏荷酒吧 | 扬州1912 | LYMTD5 |
+--------------------------+---------------------------------+---------+
7 rows in set (0.00 sec)
mysql> (select 1) union (select 2) union (select 1); +---+ | 1 | +---+ | 1 | | 2 | +---+
说明是集合运算. 如果强调结果允许重复, 则使用
对于关系
(SELECT * FROM Likes) INTERSECT (SELECT drinker, beer FROM Sells, Frequents WHERE Frequents.bar=Sells.bar );
mysql> SELECT Likes.drinker, Likes.beer
-> FROM Likes INNER JOIN
-> (SELECT drinker, beer FROM Sells, Frequents
-> WHERE Frequents.bar=Sells.bar)
-> AS Temp USING (beer)
-> ORDER BY Likes.drinker;
你会发现结果中有很多是重复的. 因此使用 DISTINCT 关键字.
mysql> SELECT distinct Likes.drinker, Likes.beer
-> FROM Likes INNER JOIN
-> (SELECT drinker, beer FROM Sells, Frequents WHERE Frequents.bar=Sells.bar)
-> AS Temp USING (beer)
-> ORDER BY Likes.drinker;
+---------------------+-----------------+
| drinker | beer |
+---------------------+-----------------+
| Alan Turing | 生力 |
| Andrew Chi-Chih Yao | 生力 |
| Charles Babbage | 百威 |
| Charles Babbage | 嘉士伯 |
| Charles Babbage | 米勒 |
| Claude Shannon | 健力士黑啤 |
| David Patterson | 朝日 |
| Donald Ervin Knuth | 安贝夫 |
| Edsger Dijkstra | 南非啤酒 |
| Gerald Jay Sussman | 纯种苦啤酒 |
| Gordon Moore | 健力士黑啤 |
| Guy Steele Jr. | 安贝夫 |
| Herbert A. Simon | 健力士黑啤 |
| John Hennessy | 百威 |
| John von Neumann | 喜力 |
| Lynn Conway | 贝克 |
| Lynn Conway | Stella Artois |
| Tim Berners-Lee | 麒麟 |
| Tim Berners-Lee | 科罗娜 |
| Tony Hoare | 南非啤酒 |
+---------------------+-----------------+
20 rows in set (0.01 sec)
尽管
也就是说, 当执行并、交、差操作后, 重复的元组被消除了.
当进行投影操作时, 避免消除重复元组会使投影操作很简单.
而对于交(intersection)或差(difference)运算, 先将关系进行排序会使效率大大提高.
强制一个关系变成一个集合, 使用
强制一个关系变成一个包(即, 不要消除重复的元组), 使用
对于关系
SELECT DISTINCT price FROM Sells;
注意: 如果没有
mysql> SELECT DISTINCT price
-> FROM Sells;
+-------+
| price |
+-------+
| 25 |
| 32 |
| 40 |
| 30 |
| 35 |
| 39 |
| 28 |
| 33 |
| 36 |
| 26 |
| 50 |
| 42 |
| 43 |
| 38 |
+-------+
14 rows in set (0.00 sec)
对于关系
(SELECT drinker FROM Frequents) EXCEPT ALL (SELECT drinker FROM Likes);
这个查询的意思是: 找出经常光顾酒吧但不喜欢啤酒的酒客. 并且在进行差运算时不消除重复的元组.
mysql> select drinker from Frequents
-> where drinker not in
-> (select drinker from Likes);
Empty set (0.00 sec)
不妨插入一些数据:
mysql> insert into Frequents values("atzjg","宝莱纳餐厅");
mysql> insert into Frequents values("atzjg","Westside");
再次执行刚才的查询, 得到如下结果.
+---------+ | drinker | +---------+ | atzjg | | atzjg | +---------+ 2 rows in set (0.00 sec)
SQL 提供了包连接(bag join)的几个版本.
这些表达式可以是单独的查询, 或者是用于作为
自然连接(Natural Join):
乘积(Product):
其中关系也可以是用圆括号界定的子查询.
mysql> SELECT drinker, beer, bar, price
-> from Likes
-> NATURAL JOIN Sells;
+---------------------+-----------------+--------------------------+-------+ | drinker | beer | bar | price | +---------------------+-----------------+--------------------------+-------+ | John von Neumann | 喜力 | 3DArtBar | 25 | | Charles Babbage | 嘉士伯 | 3DArtBar | 32 | | Donald Ervin Knuth | 安贝夫 | 3DArtBar | 40 | | Guy Steele Jr. | 安贝夫 | 3DArtBar | 40 | | Charles Babbage | 百威 | 3DArtBar | 30 | | John Hennessy | 百威 | 3DArtBar | 30 | | Lynn Conway | 贝克 | 3DArtBar | 35 | | Claude Shannon | 健力士黑啤 | HardRock | 39 | | Gordon Moore | 健力士黑啤 | HardRock | 39 | | Herbert A. Simon | 健力士黑啤 | HardRock | 39 | | John von Neumann | 喜力 | HardRock | 28 | | Charles Babbage | 嘉士伯 | HardRock | 30 | | Donald Ervin Knuth | 安贝夫 | HardRock | 39 | | Guy Steele Jr. | 安贝夫 | HardRock | 39 | | Charles Babbage | 百威 | HardRock | 32 | | John Hennessy | 百威 | HardRock | 32 | | Tim Berners-Lee | 科罗娜 | HardRock | 40 | | Lynn Conway | 贝克 | HardRock | 33 | | Claude Shannon | 健力士黑啤 | Westside | 39 | | Gordon Moore | 健力士黑啤 | Westside | 39 | | Herbert A. Simon | 健力士黑啤 | Westside | 39 | | Edsger Dijkstra | 南非啤酒 | Westside | 36 | | Tony Hoare | 南非啤酒 | Westside | 36 | | David Patterson | 朝日 | Westside | 26 | | Charles Babbage | 百威 | Westside | 32 | | John Hennessy | 百威 | Westside | 32 | | Tim Berners-Lee | 科罗娜 | Westside | 40 | | Gerald Jay Sussman | 纯种苦啤酒 | Westside | 33 | | Lynn Conway | 贝克 | Westside | 28 | | Claude Shannon | 健力士黑啤 | 宝莱纳餐厅 | 39 | | Gordon Moore | 健力士黑啤 | 宝莱纳餐厅 | 39 | | Herbert A. Simon | 健力士黑啤 | 宝莱纳餐厅 | 39 | | Edsger Dijkstra | 南非啤酒 | 宝莱纳餐厅 | 36 | | Tony Hoare | 南非啤酒 | 宝莱纳餐厅 | 36 | | John von Neumann | 喜力 | 宝莱纳餐厅 | 28 | | David Patterson | 朝日 | 宝莱纳餐厅 | 26 | | Charles Babbage | 百威 | 宝莱纳餐厅 | 32 | | John Hennessy | 百威 | 宝莱纳餐厅 | 32 | | Tim Berners-Lee | 科罗娜 | 宝莱纳餐厅 | 40 | | Gerald Jay Sussman | 纯种苦啤酒 | 宝莱纳餐厅 | 33 | | Lynn Conway | Stella Artois | 扬州老啤酒厂酒吧 | 36 | | Claude Shannon | 健力士黑啤 | 扬州老啤酒厂酒吧 | 26 | | Gordon Moore | 健力士黑啤 | 扬州老啤酒厂酒吧 | 26 | | Herbert A. Simon | 健力士黑啤 | 扬州老啤酒厂酒吧 | 26 | | John von Neumann | 喜力 | 扬州老啤酒厂酒吧 | 35 | | Donald Ervin Knuth | 安贝夫 | 扬州老啤酒厂酒吧 | 40 | | Guy Steele Jr. | 安贝夫 | 扬州老啤酒厂酒吧 | 40 | | Charles Babbage | 百威 | 扬州老啤酒厂酒吧 | 32 | | John Hennessy | 百威 | 扬州老啤酒厂酒吧 | 32 | | Tim Berners-Lee | 科罗娜 | 扬州老啤酒厂酒吧 | 40 | | Charles Babbage | 米勒 | 扬州老啤酒厂酒吧 | 50 | | Gerald Jay Sussman | 纯种苦啤酒 | 扬州老啤酒厂酒吧 | 33 | | Lynn Conway | 贝克 | 扬州老啤酒厂酒吧 | 42 | | Tim Berners-Lee | 麒麟 | 扬州老啤酒厂酒吧 | 39 | | Charles Babbage | 嘉士伯 | 木板房啤酒吧 | 43 | | Donald Ervin Knuth | 安贝夫 | 木板房啤酒吧 | 40 | | Guy Steele Jr. | 安贝夫 | 木板房啤酒吧 | 40 | | Alan Turing | 生力 | 木板房啤酒吧 | 25 | | Andrew Chi-Chih Yao | 生力 | 木板房啤酒吧 | 25 | | Charles Babbage | 米勒 | 木板房啤酒吧 | 32 | | Lynn Conway | 贝克 | 木板房啤酒吧 | 35 | | Tim Berners-Lee | 麒麟 | 木板房啤酒吧 | 30 | | Claude Shannon | 健力士黑啤 | 苏荷酒吧 | 39 | | Gordon Moore | 健力士黑啤 | 苏荷酒吧 | 39 | | Herbert A. Simon | 健力士黑啤 | 苏荷酒吧 | 39 | | Edsger Dijkstra | 南非啤酒 | 苏荷酒吧 | 36 | | Tony Hoare | 南非啤酒 | 苏荷酒吧 | 36 | | John von Neumann | 喜力 | 苏荷酒吧 | 28 | | David Patterson | 朝日 | 苏荷酒吧 | 26 | | Alan Turing | 生力 | 苏荷酒吧 | 38 | | Andrew Chi-Chih Yao | 生力 | 苏荷酒吧 | 38 | | Charles Babbage | 百威 | 苏荷酒吧 | 32 | | John Hennessy | 百威 | 苏荷酒吧 | 32 | | Tim Berners-Lee | 科罗娜 | 苏荷酒吧 | 40 | | Gerald Jay Sussman | 纯种苦啤酒 | 苏荷酒吧 | 33 | +---------------------+-----------------+--------------------------+-------+ 75 rows in set (0.00 sec)
mysql> SELECT *
-> from Likes
-> CROSS JOIN Sells;
结果是这两张表的笛卡尔积
对于关系
Drinkers JOIN Frequents ON name = drinker;
这个语句执行后给出了所有形如
mysql> select Drinkers.name,Drinkers.addr,
-> Frequents.drinker,Frequents.bar
-> from Drinkers
-> Join Frequents ON Drinkers.name=Frequents.drinker;
+---------------------+--------------------------------------------------------------------------------------------+---------------------+--------------------------+ | name | addr | drinker | bar | +---------------------+--------------------------------------------------------------------------------------------+---------------------+--------------------------+ | Alan Turing | 英国剑桥大学 | Alan Turing | HardRock | | Andrew Chi-Chih Yao | Institute for Interdisciplinary Information Sciences,Tsinghua University,Beijing,P.R.China | Andrew Chi-Chih Yao | 宝莱纳餐厅 | | Charles Babbage | 英国伦敦波特兰广场德文郡街5号 | Charles Babbage | 3DArtBar | | Claude Shannon | 密歇根州佩托斯基 | Claude Shannon | 木板房啤酒吧 | | David Patterson | 美国加州柏克莱市 | David Patterson | 扬州老啤酒厂酒吧 | | Donald Ervin Knuth | 美国威斯康星州密尔沃基 | Donald Ervin Knuth | 3DArtBar | | Edsger Dijkstra | 荷兰Nuenen | Edsger Dijkstra | HardRock | | Gerald Jay Sussman | 美国麻省理工学院 | Gerald Jay Sussman | 宝莱纳餐厅 | | Gordon Moore | 美国加利福尼亚州旧金山 | Gordon Moore | 苏荷酒吧 | | Guy Steele Jr. | 美国密苏里州 | Guy Steele Jr. | 3DArtBar | | atzjg | atzjg.net,atzjg.com | atzjg | Westside | | atzjg | atzjg.net,atzjg.com | atzjg | 宝莱纳餐厅 | | Herbert A. Simon | 德国达姆施塔特 | Herbert A. Simon | Westside | | John Hennessy | Building 10, situated in the Inner Quad at the heart of the Stanford campus. | John Hennessy | 木板房啤酒吧 | | John von Neumann | 匈牙利布达佩斯 | John von Neumann | 扬州老啤酒厂酒吧 | | Lynn Conway | 密歇根州安娜堡市密歇根大学3640 CSE 大楼 | Lynn Conway | Westside | | Tim Berners-Lee | 32 Vassar Street MIT Room 32-G524 Cambridge MA 02139 USA | Tim Berners-Lee | HardRock | | Tony Hoare | | Tony Hoare | 宝莱纳餐厅 | +---------------------+--------------------------------------------------------------------------------------------+---------------------+--------------------------+ 18 rows in set (0.00 sec)