多表查询
CREATE TABLE DEPT( id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(20) ); INSERT INTO dept (NAME) VALUES(‘开发部’),(‘市场部’),(‘财务部’); CREATE TABLE empp( 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) ); INSERT INTO empp(NAME,gender,salary,join_date,dept_id) VALUES(‘孙悟空’,‘男’,7200,‘2013-02-24’,1); INSERT INTO empp(NAME,gender,salary,join_date,dept_id) VALUES(‘猪八戒’,‘男’,3600,‘2010-12-02’,2); INSERT INTO empp(NAME,gender,salary,join_date,dept_id) VALUES(‘唐僧’,‘男’,9000,‘2008-08-08’,2); INSERT INTO empp(NAME,gender,salary,join_date,dept_id) VALUES(‘白骨精’,‘女’,5000,‘2015-10-07’,3); INSERT INTO empp(NAME,gender,salary,join_date,dept_id) VALUES(‘蜘蛛精’,‘女’,4500,‘2011-03-14’,1);
多表代码 SELECT * FROM empp, dept; 查询多表代码 会出以下结果,多表查询就是除去多余的结果
1 孙悟空 男 7200 2013-02-24 1 1 开发部
1 孙悟空 男 7200 2013-02-24 1 2 市场部
1 孙悟空 男 7200 2013-02-24 1 3 财务部
2 猪八戒 男 3600 2010-12-02 2 1 开发部
2 猪八戒 男 3600 2010-12-02 2 2 市场部
2 猪八戒 男 3600 2010-12-02 2 3 财务部
3 唐僧 男 9000 2008-08-08 2 1 开发部
3 唐僧 男 9000 2008-08-08 2 2 市场部
3 唐僧 男 9000 2008-08-08 2 3 财务部
4 白骨精 女 5000 2015-10-07 3 1 开发部
4 白骨精 女 5000 2015-10-07 3 2 市场部
4 白骨精 女 5000 2015-10-07 3 3 财务部
5 蜘蛛精 女 4500 2011-03-14 1 1 开发部
5 蜘蛛精 女 4500 2011-03-14 1 2 市场部
5 蜘蛛精 女 4500 2011-03-14 1 3 财务部
笛卡尔积:有两个集合A B 去这两个集合所有的组合情况
要完成多表查询需要消除无用的数据
多表查询分类
内连接查询
隐式内连接:
使用where条件 SELECT * FROM empp, dept WHERE empp.dept_id = dept.id; SELECT empp.NAME,empp.gender,dept.NAME FROM empp, dept WHERE empp.dept_id = dept.id; SELECT t1.NAME,t1.gender,t2.NAME 把需要查询的定义成 t1 t2 FROM empp t1,dept t2 WHERE t1.dept_id = t2.id;
显式内连接:
语法:
SELECT 字段列表 FROM 表1 INNER JOIN 表2 ON 条件; SELECT * FROM empp INNER JOIN dept ON empp.dept_id = dept.id;
外连接查询
左外连接:SELECT 字段列表 FROM 表1 LEFT OUTER JOIN 表2 ON 条件
查询的是左表所有数据以及交集部分
右外连接:SELECT 字段列表 FROM 表1 RIGHT OUTER JOIN 表2 ON 条件
查询的是右表所有数据以及交集部分
子查询
嵌套查询就是子查询
SELECT * FROM 表名 WHERE 表名.列名 = (其他查询语句);