MySQL-7:多表查询

今日内容

1.多表查询

2.事务

3.DCL

多表查询:

  • 查询语法:
    select 
        列名列表
    from
        表名列表
    where....
  • 数据准备(数据库表以及数据的创建):

       # 新增数据
       INSERT INTO dept (NAME) VALUES('开发部'),('市场部'),('财务部');
       
       # 创建员工表
       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('孙悟空','男',7200,'2014-02-24',1);
    INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('猪八戒','男',4200,'2015-03-15',2);
    INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('沙师弟','男',3600,'2013-02-24',2);
    INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('唐僧','男',9000,'2013-02-24',2);
    INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('白骨精','男',5400,'2018-08-08',3);
    INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('蜘蛛精','男',6100,'2019-01-01',1);
    
  • 笛卡尔积

    • 有两个集合a,b,取这两个集合的所以组成情况
    • 要完成多表查询,需要消除无用的数据
  • 多表查询分类
    1.内链接查询:
    (1)隐式内链接:使用 where 条件,消除无用的数据。

    • 例子:
-- 查询员工表的名称,性别。部门表的名称

-- 正规写法 方便添加注释(符合企业sql规范)
SELECT
   t1.name, -- 员工表的姓名
   t1.gender, -- 员工表的性别
   t2.name -- 部门表的名称
FROM
   emp t1,
   dept t2
WHERE
   t1.dept_id=t2.id;

(2)显式内链接

  • 语法:
    select 字段列表 from 表明 inner join 表明2 on 条件
  • 例如:
-- 查询员工表的名称,性别。部门表的名称(使用显式内链接) 
SELECT * FROM emp [INNER] JOIN dept ON emp.dept_id = dept.id;

-- INNER 是可选操作,可以直接使用 JOIN ON 如下:
SELECT * FROM emp JOIN dept ON emp.dept_id = dept.id;

(3)内链接查询注意事项:

  • 从哪些表中查询数据
  • 条件是什么?
  • 查询哪些字段?

2.外链接查询:
(1)左外连接:

  • 语法:select 字段列表 from 表1 left [outer] join 表2 on 条件
  • 查询的是左表所有数据以及其交集部分。


    左外连接,图片来自互联网
 -- 左外连接 (LEFT JOIN 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 条件
  • 查询的是右表所有数据以及其交集部分。


    右外连接,图片来自互联网
 -- 右外连接 (RIGHT JOIN ON)
SELECT
    t1.*,
    t2.name
FROM
    dept t2
RIGHT JOIN
    emp t1
 ON
    t1.dept_id = t2.id;

3.子查询:

  • 概念:查询中嵌套查询,称嵌套查询为子查询。
     -- 子查询
     -- 查询工资最高的员工的信息

     -- 1、查询最高的工资是多少?
     SELECT MAX(salary) FROM emp;

    -- 查询的结果是 9000

     -- 2.查询员工信息,并且工资等于最高的
     SELECT * FROM emp WHERE emp.salary=9000;
     
     -- 一条SQL就能完成
    SELECT * FROM emp WHERE emp.salary=(
        SELECT MAX(salary) FROM emp
        );

  • 子查询的不同情况
    1、子查询的结果是单行单列的:
    • 子查询可以作为条件,使用运算符(>、<、>=、<=、=)去判断。
-- 查询员工工资小于平均工资的人
SELECT * FROM emp WHERE emp.salary < (SELECT AVG(salary) FROM emp);

2、子查询的结果是多行单列的:

  • 可以使用运算符IN来判断
-- 查询‘财务部’和'市场部'所有的员工信息
-- 1、先查询财务部的id
SELECT id FROM dept WHERE name='财务部' OR name='市场部';
-- 2、再根据ID查询信息
SELECT * FROM emp WHERE dept_id = 3 OR dept_id=2;

-- 其中第二条语句可以改写成如下:(相当与上面这条 )
SELECT * FROM emp WHERE dept_id IN(3,2);

-- 子查询
SELECT * FROM emp WHERE dept_id IN(SELECT id FROM dept WHERE name='财务部' OR name='市场部');

3、子查询的结果是多行多列的:

  • 子查询可以作为一张虚拟表来进行查询
-- 多行多列
-- 例:查询员工入职日期是2015年-11-11之后的员工信息和部门信息(子查询)
-- 括号里的叫做虚拟表
SELECT * FROM dept t1,(SELECT * FROM emp WHERE emp.join_date > '2015-11-11') t2
WHERE t1.id = t2.dept_id;

-- 例:查询员工入职日期是2015年-11-11之后的员工信息和部门信息(普通内链接查询)
SELECT * FROM emp t1, dept t2 
WHERE t1.dept_id = t2.id AND t1.join_date > '2015-11-11';

事务

DCL

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • ORACLE自学教程 --create tabletestone ( id number, --序号usernam...
    落叶寂聊阅读 1,170评论 0 0
  • 1. 了解SQL 1.1 数据库基础 ​ 学习到目前这个阶段,我们就需要以某种方式与数据库打交道。在深入学习MyS...
    锋享前端阅读 1,180评论 0 1
  • 数据库的概述 1.数据库的作用:仓库,存储数据。 2.关系型的数据库,保存实体与实体之间的关系。 3.常见的数据库...
    三万_chenbing阅读 930评论 0 3
  • 和外婆刚刚通过电话,老人家精神很好。我是相当佩服外婆的,八十五岁,独自生活在自己的小房子里,虽然亲戚们都在附近,但...
    风之女孩阅读 536评论 0 1
  • 1. 很多人觉得:把一件事坚持到底,得靠强大的意志力。自己之所以半途而废,是因为意志力不坚定。但事实上,人的意志力...
    共剪西窗烛阅读 896评论 1 1