主打一个实用
交叉连接
交叉连接返回两个表的笛卡尔积,即每个表的每一行与另一个表的每一行组合
语法:
SELECT *FROM table1 CROSS JOIN table2;
查询两张表都存在的数据,即排除两张表的未匹配部分
语法:
SELECT 字段名 FROM 左表 INNER JOIN 右表 ON 条件;
外连接
a. 左外连接
保留左表部分(包括其未匹配部分),可以通过加上右表对应字段等于空的条件排除交集部分
语法:
SELECT 字段名 FROM 左表 LEFT OUTER JOIN 右表 ON 条件
b. 右外连接
保留右表部分(包括其未匹配部分),可以通过加上左表对应字段等于空的条件排除交集部分
语法:
SELECT 字段名 FROM 左表 RIGHT OUTER JOIN 右表 ON 条件
自连接
自连接算是外连接的一种特殊情况,这里单独提出来,所用语法与交叉连接相似
自连接是指连接同一个表的两个不同实例,用于在同一个表中比较不同行之间的数据,例如我需要查询表中工资为平均值的员工姓名,由于在where里面不能使用聚合函数,所以无法通过单表实现,但可以借助自连接实现
SELECT columns
FROM table1 AS alias1
JOIN table1 AS alias2 ON alias1.column = alias2.column;
保留两表所有行,在
mysql
里面需要用UNION
实现,UNION
会取并集并去除,所以可以直接将左连接与右连接并起来
语法:
SELECT columns
FROM table1
LEFT JOIN table2 ON table1.column = table2.column
UNION
SELECT columns
FROM table1
RIGHT JOIN table2 ON table1.column = table2.column
使用单行运算符的子查询,"= > >= < <= != "
举例:
select * from emp where salary>(select salary from emp where name='眨眼睛')
同理,“in、any、all”
举例
# 查询工资高于5000的员工(使用in)
SELECT dept.name FROM dept WHERE dept.id IN (SELECT dept_id FROM emp WHERE salary > 5000)
# 查询工资在眨眼睛以上的所有员工(使用any)
select name,salary from emp where salary >=any(select salary from emp where name='眨眼睛')
# 查询工资比眨眼睛高的所有员工(使用all)
select name,salary from emp where salary >all(select salary from emp where name='眨眼睛')
# 查询部门在纽约并且入职时间在xxx时间以后的员工信息
SELECT
emp.id AS emp_id,
emp.name AS emp_name,
emp.salary AS emp_salary,
dept.id AS dept_id,
dept.name AS dept_name
FROM
employees emp,
(SELECT * FROM departments WHERE location = 'New York') AS dept
WHERE
emp.department_id = dept.id
AND emp.join_date > '2011-01-01';