MySQL必知必会 学习笔记 第十六章 创建高级联结

可给表起别名,理由是:
1.缩短SQL语句。
2.允许在单条SELECT语句中多次使用相同的表(自联结时可用)。

SELECT title, name
FROM film f, language l
WHERE f.language_id = l.language_id;

与上一章取电影和语言的SQL返回相同。表别名还可用于SELECT的列表、ORDER BY子句和语句的其他部分。

表别名只在查询执行中使用,不会像列别名一样返回到客户机。

在这里插入图片描述
找出film表中与某电影所用语言相同的电影名和语言:

SELECT f1.title 
FROM film f1, film f2 
WHERE f1.language_id = f2.language_id AND f2.film_id = 1;

以上查询SELECT子句必须使用限定的列名,因为不能分清列名来自于哪张表。

以上查询使用子查询也可完成:

SELECT title
FROM film
WHERE film.language_id = (SELECT language_id 
                          FROM film
                          WHERE film_id = 1
                         );

联结通常比子查询效率高。

对表进行联结时,应该至少有一个列出现在不止一个表中(被联结的列)。标准的联结返回所有数据,相同的列会出现多次,自然联结排除多次出现,使每个列只返回一次。但系统不完成这项工作,需要自己完成,SELECT子句中不使用相同的列即可。

外部连结可返回没有被关联的行,如列出使用一个语言的电影数时,有的语言没有使用它的电影,此时内连结就不会返回此语言的电影数:

SELECT COUNT(f.title), l.name
FROM film f INNER JOIN language l
ON f.language_id = l.language_id
GROUP BY l.name;

运行它:
在这里插入图片描述
而外联结可选出另一个表中没有的行:

SELECT COUNT(f.title), l.name
FROM film f RIGHT OUTER JOIN language l
ON f.language_id = l.language_id
GROUP BY l.name;

运行它:
在这里插入图片描述
左右连结取决于想保留哪个表中的所有行,如上例想保留所有的语言行,即使没有电影使用该语言,就使用右连结,如果语言表在左边,电影表在右边,要想达到相同目的,就要使用左连结。

上例中的COUNT函数选的是电影名列,而非全部列*,这是因为由于使用了外联结,总会返回一行,如使用全部列,则没有使用该语言的电影时COUNT函数会返回1,而没有电影时,电影名是NULL,因此使用COUNT列名可以忽略此种行,COUNT列明只会计算非NULL行。

MySQL不支持*==*操作符,他俩在其他DBMS中很流行。

猜你喜欢

转载自blog.csdn.net/tus00000/article/details/111227505