-- 多表操作
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