数据库技术七①(多表查询)

多表查询

语法形式:select     列名列表    from 表名列表     where....

下面将会以例子的形式给出sql语句

一、准备表

1.创建部门表

CREATE TABLE dept(
		id INT PRIMARY KEY AUTO_INCREMENT,
		NAME VARCHAR(20)
		);
INSERT INTO dept(NAME) VALUES ('开发部'),('市场部'),('财务部');

2.创建员工表

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) -- 外键,关联部门表(部门表的主键)
		);
		
INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('Simron','男',7200,'2013-02-24',1);
INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('Snow','男',3600,'2010-12-02',2);
INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('Far','男',9200,'2008-08-28',2);
INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('Lucy','女',5000,'2015-10-07',3);
INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('lili','女',4500,'2011-03-14',1);

二、多表查询的分类

笛卡尔积的概念:

若有两个集合A、B,取这两个集合的所有组成情况,而完成多表查询,需要消除无用的数据。

1.内连接查询

     1.隐式内连接 :使用where条件消除无用数据

                -- 查询所有员工信息和对应的部门信息

SELECT * FROM emp,dept WHERE emp.dept_id=dept.`id`

                -- 查询员工表的名称,性别。部门表的名称 

   SELECT emp.`NAME`,emp.`gender`,dept.`NAME`
          FROM emp ,dept WHERE emp.dept_id=dept.`id`

     2.显式内连接

语法形式:select 字段列表 from 表名1 [inner]   join 表名2  on 条件

SELECT * FROM emp INNER JOIN dept ON emp.`dept_id`=dept.`id`
SELECT * FROM emp JOIN dept ON emp.`dept_id`=dept.`id`

查询步骤:

                1. 从哪些表中查询数据

                2. 条件是什么

                3. 查询哪些字段

2.外连接查询

     1.左外连接

语法形式:select  字段列表 from 表1   left  [outer]  join  表2  on  条件

                 查询的是左表所有数据以及其交集部分。

                 -- 查询所有员工信息,如果员工有部门,则查询部门名称,没有部门,则不显示部门名称

SELECT 	t1.*,t2.`name` FROM emp t1 LEFT JOIN dept t2 ON t1.`dept_id` = t2.`id`;

     2.右外连接

语法形式:select  字段列表 from 表1   right [outer]  join  表2  on  条件

                查询的是右表所有数据以及其交集部分。

SELECT 	* FROM dept t2 RIGHT JOIN emp t1 ON t1.`dept_id` = t2.`id`;

3.子查询

     1. 子查询的结果是单行单列的:

        子查询可以作为条件,使用运算符去判断。 运算符: > >= < <= =

        -- 查询员工工资小于平均工资的人

 SELECT * FROM emp WHERE 
      salary< (SELECT AVG(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

          -- 普通内连接

SELECT * FROM emp t1,dept t2 WHERE t1.`dept_id` = t2.`id` AND t1.`join_date` >  '2011-11-11'

猜你喜欢

转载自blog.csdn.net/dreame_life/article/details/87730984