一、多表全查(笛卡尔积)
SELECT * FROM emp,dept;
二、内连接
SELECT * FROM emp t1,dept t2 WHERE t1.dept_id = t2.id;
SELECT * FROM emp t1 (INNER) JOIN dept t2 ON t1.dept_id = t2.id;
三、外连接
-- 左连接
SELECT * FROM emp t1 LEFT (OUTER) JOIN dept t2 ON t1.dept_id = t2.id;
-- 右连接
SELECT * FROM emp t1 RIGHT (OUTER) JOIN dept t2 ON t1.dept_id = t2.id;
四、子连接
1、
单行单列:A语句的结果当B语句的条件
-- 查询员工工资小于平均工资的人
SELECT
*
FROM
emp
WHERE
emp.`salary` = (SELECT MAX(salary) FROM emp);
2、
多行单列:关键字IN
-- 查询'财务部'和'市场部'所有的员工信息
SELECT
*
FROM
emp
WHERE
dept_id
IN
(SELECT id FROM dept WHERE NAME = '财务部' OR NAME = '市场部');
3、
多行多列:采用虚拟表
-- 查询员工入职日期是2011-11-11日之后的员工信息和部门信息
SELECT
*
FROM
dept t1 ,
(SELECT * FROM emp WHERE emp.`join_date` > '2011-11-11') t2
WHERE
t1.id = t2.dept_id;
五、测试用表
-- 部门表
CREATE TABLE dept(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(20)
);
INSERT INTO dept (NAME) VALUES ('开发部'),('市场部'),('财务部');
-- 员工表
CREATE TABLE emp (
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(10),
gender CHAR(1), # 性别
salary DOUBLE, # 工资
join_date DATE, # 入职日期
dept_id INT,
FOREIGN KEY (dept_id) REFERENCES dept(id) # 外键,关联部门表(部门表的主键)
);