一、使用表别名
在sql中,除了可以使用列别名之外,也可以使用表别名,这样做有两个理由
缩短sql语句
允许在单个select语句中使用相同的表
例子:
SELECT name, age, sex
FROM students as s, courses as c, course_selection as cs
WHERE cs.student_id = s.id
AND c.course_teacher = 'zhang'
AND c.course_id = cs.course_id;
上面的语句使用了表别名,缩短了sql语句的长度。
二、使用不同类型的联结
目前为止我们使用的都是内部联结,sql中还存在其他三种类型的联结:
自联结
自然联结
外部联结
1、自联结
假设我们想在students
表中找出和学生jyjxycgw
分数相同的所有学生的信息。
编写查询语句如下:
SELECT id, name, sex, age, score
FROM students
WHERE score =
(
SELECT score
FROM students
WHERE name = 'jyjxycgw'
);
输出为:
+-----+----------+--------+-----+-------+
| id | name | sex | age | score |
+-----+----------+--------+-----+-------+
| 2 | jyjxycgw | male | 44 | 27 |
| 121 | ibtzfqzo | female | 34 | 27 |
| 126 | hjvgmryx | female | 21 | 27 |
| 170 | jaqzptez | male | 53 | 27 |
| 194 | kuxvtxwd | female | 17 | 27 |
| 427 | iuuludyb | male | 52 | 27 |
| 432 | dhhmommn | female | 40 | 27 |
| 455 | kkhiunlf | male | 90 | 27 |
| 463 | jnlnrezu | female | 61 | 27 |
| 489 | zurgnibf | male | 55 | 27 |
| 653 | tkpkhbhq | male | 43 | 27 |
| 879 | kvprpaph | female | 11 | 27 |
| 908 | atydodkc | female | 4 | 27 |
+-----+----------+--------+-----+-------+
上面使用了一个简单的select子查询,我们还可以使用联结达到同样的效果:
SELECT a.id, a.name, a.sex, a.age, a.score
FROM students as a, students as b
WHERE a.score = b.score
AND b.name = 'jyjxycgw';
输出完全相同。
与其等价的join语法:
SELECT a.id, a.name, a.sex, a.age, a.score
FROM students as a JOIN students as b
on a.score = b.score
AND b.name = 'jyjxycgw';
2、自然联结
无论何时对表进行联结,应该至少有一个列出现在不止一个表中(被联结的列)。这样在使用标准联结(前面提到的内部联结)的时候,重复的列会不止出现一次。
而所谓自然联结是排除了那些重复的列,使得重复的列只出现一次的联结。
系统没有这样的功能,需要我们自己指定,方法是指定从各个表中指定要select的列。
这不是废话吗?
3、外部联结
许多联结将一个表中的行与另一各表中的行相关联。但有时候需要包含没有关联行的那些行