一.多表查询
语法规则:
SELECT table1.column, table2.column
FROM table1, table2
WHERE table1.column1 = table2.column2;
为了连接n个表,至少需要n-1个连接条件。
点击了解:笛卡儿积
连接种类: 等值连接 非等值链接 多于两个表的连接
二.表连接(点击了解:表连接图解,及语法)
通过join连接表,通过on字句限定连接条件
交叉连接CROSS JOIN
交叉联接返回左表中的所有行,左表中的每一行与右表中的所有行组合,交叉联接也称作笛卡尔积.
自然连接NATURAL JOIN
- NATURAL JOIN子句基于两个表中列名完全相同的列产生连接
- 两个表有相同名字的列
- 数据类型相同
- 从两个表中选出连接列的值相等的所有行自然连接的结果不保留重复的属性
外联接-------外联接可以是左向外联接、右向外联接或完整外部联接。
在 FROM子句中指定外联接时,可以由下列几组关键字中的一组指定:
1)LEFT JOIN或LEFT OUTER JOIN
左向外联接的结果集包括 LEFT OUTER子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值。
2)RIGHT JOIN 或 RIGHT OUTER JOIN
右向外联接是左向外联接的反向联接。将返回右表的所有行。如果右表的某行在左表中没有匹配行,则将为左表返回空值。
3)FULL JOIN 或 FULL OUTER JOIN
完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。
自连接
将一张 表视为一张表,并进行连接
全连接 FULL JOIN
Mysql没有全连接
Union : 将字段及其结果完全一样的值 融合,不同值时,不融合
Union all: 将字段及其结果 都不融合,添加在一起,作为新的结果
----------------连接使用详解:点击直达-------------------------------------------
三.子查询
SQL允许多层嵌套。子查询,即嵌套在其他查询中的查询。
语法:
SELECT select_list
FROM table
WHERE expr operator
(SELECT select_list FROM table);
注意事项:
- 理解子查询的关键在于把子查询当作一张表来看待。外层的语句可以把内嵌的子查询返回的结果当成一张表使用。
- 子查询要用括号括起来
- 将子查询放在比较运算符的右边(增强可读性)
子查询的种类:
单行子查询
- 子查询返回一行记录
- 使用单行记录比较运算符
= > < >= <= != <>
多行子查询
- 子查询返回多行行记录
- 使用集合比较运算符
常用in some all
示例代码:
1.使用in运算符
eg:在emp表中查询不是销售(sales)部门员工的信息
select empno,ename,sal where deptno in
(select depno from dept where dname <> 'sales');
2.使用any运算符
eg:查询工资大于10号部门的任意一个员工工资的其他部门的员工信息
select depno,ename,sal,from emp where sal > any
(select sal from emp where depno =10) and depno <> 10;
3.使用all运算符
eg:在emp表中,查询工资大于部门编号为30的所有员工工资的员工信息
select depno,ename,sal from emp where sal > all
(select sal from emp where deptno=30);
关联子查询
内查询和外查询是相互关联的
eg: 在emp表中,使用“关联子查询”检索工资大于同职位的平均工资的员工信息
select depno,ename,sal from emp f where sal >
(select avg(sal) from emp where job=f.job)
group by job;