mysql 多表查询

-- 多表操作

1对多 (多的一方维护关系)

 多对多(中间表维护关系)

一对一(一般运用的比较少 如果真的是一对一 那还不如设计到一张表单当中即可)

-- 多表操作

CREATE TABLE emp(
     id INT PRIMARY KEY  AUTO_INCREMENT,
     NAME VARCHAR(20) NOT NULL,
     dept_id INT NOT NULL,
     CONSTRAINT emp_dept_fk FOREIGN KEY(dept_id) REFERENCES dept(id)    
)
    
CREATE TABLE dept(
     id INT PRIMARY KEY  AUTO_INCREMENT,
     NAME VARCHAR(20) NOT NULL    
)
    
INSERT INTO dept(NAME)VALUES('开发部'),('市场部'),('系统部门')  -- 一次性插入多条数据  
-- 查询操作

SELECT * FROM emp,dept; -- 会产生笛卡儿积现象 通过以下方式解决 内连接,子查询,外连接

-- 内连接
  -- 隐式内连接
SELECT * FROM emp,dept WHERE emp.`dept_id` = dept.`id`;
  -- 显示内连接
SELECT * FROM emp INNER JOIN dept ON emp.`dept_id` = dept.`id`;  -- inner可以省掉

-- 外连接
  -- 左外连接 left out join  out可以省掉 特点 左边的表全部显示
SELECT * FROM emp LEFT JOIN dept ON emp.`dept_id` = dept.`id`
  -- 右外连接 left out join  out可以省掉 特点 右边的表全部显示
SELECT * FROM emp RIGHT JOIN dept ON emp.`dept_id` = dept.`id`

-- 子查询

 -- 1 子查询的结果是单行单列  这种可以作为条件,使用运算符去判断  运算符:如 > ,>=, < 等
 SELECT * FROM students  WHERE english >= (SELECT MAX(english) FROM students )
 
 -- 2 子查询的结果是多行单列的  这种也可以作为条件
 SELECT * FROM students  WHERE NAME IN (SELECT NAME FROM s2 WHERE dept ='电脑部' )
 
 -- 3 子查询的结果是多行多列的  这样的类型子查询就可以把他看作一张表 来与需要的表进行关联查询
 SELECT * FROM dept t1,(SELECT * FROM emp WHERE emp.join_date>'2011-11-11')t2
 WHERE t1.id = t2.id
坚持
原文地址:https://www.cnblogs.com/gaoSJ/p/12882713.html