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 | | 贝克 | | 贝克 | +-----------------+
注意所得到的结果中可能会存在重复.
如果子查询能够保证返回单个元组, 则子查询可以作为一个值.
对于关系
下面两个查询将完成此项任务.
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 | +----------+
如果表示不在这个关系中, 则使用
对于关系
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 | +--------+--------------------------+ | 百威 | 百威英博啤酒集团 | +--------+--------------------------+
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);
例如: 表达式
注意: 为了能比较, 元组必须仅有一个字段.
其中
例如: 表达式
对于关系
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)