数据库多表查询

 多表查询

    select * from 表名1,表名2;    -- 会产生笛卡尔积

    笛卡尔积:
        1.有两个集合A,B,取这两个集合的所有组成情况
        2.要完成多表查询,需要消除无用的数据

    多表查询的分类:

        1.内连接查询
            用左边表的记录去匹配右边表的记录,如果符合条件的则显示。如:从表.外键=主表.主键

            1.隐式内连接:使用where条件消除无用数据
                    -- 查找两张表中的数据,当 emp 表的外键 dept_id 与 dept 表中的主键 id 匹配时,显示数据
                    -- 消除了无用数据
                    SELECT * 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`;
            3.注意事项:
                1.从哪些表查询数据
                2.查询条件是什么
                3.查询哪些字段
内连接查询步骤:
    1) 确定查询哪些表
    2) 确定表连接的条件
    3) 确定查询的条件
    4) 确定查询的字段

        2.外连接查询
            1.左外连接
                *语法:select 字段列表 from 表1 left [outer] join 表2 on 条件
                *查询的是左表所有数据以及其交集部分(在内连接的基础上保证左表的数据全部显示)
                SELECT
                    t1.*,t2.`name`
                FROM
                    dept t2
                LEFT JOIN
                    emp t1
                ON
                    t1.`dept_id` = t2.`id`

            2.右外连接
                *语法:select 字段列表 from 表1 right [outer] join 表2 on 条件
                *查询的是右表所有数据以及其交集部分(在内连接的基础上保证右表的数据全部显示)
                SELECT
                    t1.*,t2.`name`
                FROM
                    dept t2
                RIGHT JOIN
                    emp t1
                ON
                    t1.`dept_id` = t2.`id`

        3.子查询
            *查询中嵌套查询,成嵌套查询为子查询
                -- 查询工资最高的员工信息
                SELECT * FROM emp WHERE salary = (SELECT MAX(salary) FROM emp);
            *子查询的情况
                1.子查询的结果是单行单列的     当成一个数据进行处理
                    * 子查询可以作为条件,使用运算符去判断。运算符:> < = !=
                    * 语法:SELECT 查询字段 FROM 表 WHERE 字段=(子查询);
                    -- 查询工资大于平均工资的员工信息
                        SELECT * FROM emp WHERE salary > (SELECT AVG(salary) FROM emp);
                2.子查询的结果是多行单列的     当成一个集合进行处理
                    * 子查询可以作为条件,使用运算符去判断。运算符:in
                    * 语法:SELECT 查询字段 FROM 表 WHERE 字段 IN (子查询);
                    -- 查询财务部和市场部的员工信息
                        SELECT * FROM emp WHERE emp.`dept_id` IN (SELECT id FROM dept WHERE NAME IN('财务部','市场部'));
                3.子查询的结果是多行多列的      当成一张虚拟表
                    * 子查询可以作为一张虚拟表参与查询
                    * 语法:SELECT 查询字段 FROM (子查询) 表别名 WHERE 条件;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值