MySQL数据库学习笔记(八)—— SQL(多表查询)

格式
  • SELECT * FROM 表1,表2;,这样所得集合称笛卡尔积,取集合A,B的所有组合情况。这种方式会产生无用的数据,要完成多表查询,需要消除这些无用的数据
分类
  • 内链接查询

    • 隐式内连接
    // employee表中的dep_id与的department表中的id相匹配的查询结果
    SELECT
    	*
    FROM 
    	employee,department 
    WHERE 
    	employee.`dep_id`=department.`id`;
    // 查询只显示employee表中的dep_id,department表中的dep_name和dep_location
    SELECT 
    	employee.`dep_id`,
    	department.`dep_name`,
    	department.`dep_location` 
    FROM 
    	employee,
    	department
    WHERE 
    	employee.`dep_id`=department.`id`;
    // 给表employee取别名t1,表department取别名t2
    SELECT 
    	t1.`dep_id`,
    	t2.`dep_name`,
    	t2.`dep_location` 
    FROM 
    	employee t1,
    	department t2
    WHERE 
    	t1.`dep_id`=t2.`id`;
    
    • 显示内连接

      • 语法:SELECT * FROM 表1 INNER JOIN 表2 ON 条件,INNER可以省略
    SELECT
    	*
    FROM
    	employee  
    INNER JOIN // INNER可写可不写
    	department
    ON
    	employee.`dep_id`=department.`id`; // 条件
    
    • 内链接查询
      • 确定查询表
      • 确定查询条件
      • 确定查询字段
  • 外连接查询

    • 左外连接
      • 语法:SELECT 显示字段 FROM 表1 LEFT OUTER JOIN 表2 ON 条件,OUTER可以省略
      • 查询的结果是表1的所有数据及表1与表2的交集部分
    // employee表中dep_id为null的不会显示
    SELECT
    	t1.*,
    	t2.`dep_name`
    FROM
    	employee t1,
    	department t2
    WHERE
    	t1.`dep_id`=t2.`id`;
    // employee表中dep_id为null的显示出来
    SELECT
    	t1.*,
    	t2.`dep_name`
    FROM
    	employee t1
    LEFT JOIN // 省略了OUTER
    	department t2
    ON
    	t1.`dep_id`=t2.`id`;
    
    • 右外连接
      • 语法:SELECT 显示字段 FROM 表1 RIGHT OUTER JOIN 表2 ON 条件,OUTER可以省略
      • 查询的结果是表2的所有数据及表1与表2的交集部分
    // department表中dep_name所有数据全部显示,包括null
    SELECT
    	t1.*,
    	t2.`dep_name`
    FROM
    	employee t1
    RIGHT JOIN
    	department t2
    ON
    	t1.`dep_id`=t2.`id`;
    
  • 子查询

    • 概念:查询中嵌套查询,称嵌套查询的为子查询
    // 查询employee表中salary值最大的一项
    SELECT 
    	* 
    FROM 
    	employee
    WHERE
    	employee.`salary` = (
    		SELECT // 子查询
    			MAX(salary) 
    		FROM 
    			employee);
    
    • 子查询的不同情况
      • 结果是单行单列
        • 子查询可以作为条件,使用运算符判断,运算符> < >= <= =
    // 查询employee表中salary值小于平均值
    SELECT 
    * 
    FROM 
    	employee
    WHERE
    	employee.`salary` < (
    		SELECT 
    			AVG(salary) 
    		FROM 
    			employee);
    
      • 结果是多行单列
        • 子查询可以作为条件,使用运算符IN判断
    // 查询employee表中dep_id值对应的id值(表department中dep_name等于"研发部"或者"财务部"所对应的id值)的所有数据
    SELECT 
    	*
    FROM
    	employee
    WHERE
    	dep_id
    IN
    	(SELECT
    		id
    	FROM
    		department
    	WHERE 
    		dep_name="研发部" 
    	OR 
    		dep_name="财务部"
    	);
    
      • 结果是多行多列
        • 子查询可以作为一张虚拟表
    // 查询employee表中salary值大于3000,并与department表中相对应的id数据关联 
    SELECT 
    	* 
    FROM 
    	department t1,
    	(SELECT 
    		* 
    	FROM 
    		employee 
    	WHERE 
    		employee.`salary` > 3000) t2 
    WHERE 
    t1.`id`=t2.`dep_id`;
    
发布了113 篇原创文章 · 获赞 1 · 访问量 936

猜你喜欢

转载自blog.csdn.net/weixin_44876003/article/details/103416629