所用数据库——链接地址
一、笛卡尔积
SELECT sname,grade FROM student,sc
- 当两张表进行连接查询的时候,没有任何条件进行限制,最终的查询结果条数是两张表记录条数的乘积
- 如何避免笛卡尔积
加条件进行过滤,但不会减少记录的匹配次数,只不过显示的是有效记录(效率不变)
二、连接查询的分类
- 连接查询需要关联多个表查询(多表查询)
1. 内连接
- 语法(SQL99):
... A (INNER) JOIN B ON 连接条件...
INNER可以省略
- 特点:
将两张表能够匹配上的记录查询出来,两张表没有主副之分,两张表平等
1.1 等值连接
- 条件是等量关系,即使用等号"="比较两个表的连接列的值,相当于两表执行笛卡尔后,取两表连结列值相等的记录
SQL92(旧,不常用):select a,b from A,B where a.x=b.x;
SQL99(新,常用):select a,b from A (inner) join B on a.x=b.x; - SQL99连接查询语法使得表的连接条件与where条件分离
- 查询学生姓名、成绩
SELECT sname,grade FROM student INNER JOIN sc ON student.sno = sc.sno
1.2 非等值连接
- 条件是非等量关系,即使用大于号">“或小于号”<"比较两个表的连接列的值,相当于两表执行笛卡尔积后,取一个表大于或小于另一个表的连接列值的记录
1.3 自连接
- 一张表看作两张表,使用表的别名自己连接自己
SELECT A.sname FROM student A,student B WHERE A.sno = B.sno
- 使用别名的好处
执行效率高
可读性好
2. 外连接
- 语法:
... A LEFT (OUTER) JOIN B ON 连接条件...
... A RIGHT (OUTER) JOIN B ON 连接条件...
OUTER可以省略
- 两张表一张是主表,一张是副表,主要查询主表的数据,当副表中的数据没有和主表中的数据匹配上,副表自动模拟出null与主表匹配
- 特点:
主表的数据无条件的全部查询出来
2.1 左外连接
- 左(外)连接,左表的记录将会全部表示出来,即左表是主表,而右表只会显示符合搜索条件的记录,右表记录不足的地方显示为NULL与左表匹配
- 以左表为主表查询学生姓名、成绩
SELECT sname,grade FROM student LEFT JOIN sc ON student.sno = sc.sno
2.2 右外连接
- 右(外)连接,右表的记录将会全部表示出来,即右表是主表,而左表只会显示符合搜索条件的记录,左表记录不足的地方显示为NULL与右表匹配
- 以右表为主表查询学生姓名、成绩
SELECT sname,grade FROM student RIGHT JOIN sc ON student.sno = sc.sno