首页 > 数据库 >mysql-多表连接的学习

mysql-多表连接的学习

时间:2024-04-03 17:03:08浏览次数:26  
标签:多表 name employees departments 连接 mysql department last id

-- 4.3
-- ****************************************************************************************
1. 多表连接
1.1 为了避免笛卡尔积,可以在where中加入有效的连接条件
        SELECT table1.column,table2.column 
        FROM table1,table2
        WHERE table1.column1=table2.column2; #连接条件
        -- 在表中有相同列时,在列名之前加上表名前缀
1.2 多表查询分类讲解
分类1 等值连接VS 非等值连接 
         select e.last_name,d.department_name,l.city
         from employees e ,departments d,locations l
         WHERE e.`department_id`=d.`department_id` AND d.`location_id`=l.`location_id`
         总结:连接n个表,至少需要n-1个连接条件
 分类2 自连接VS非自连接
            table1和table2 本质上是同一张表,只是取别名的方式虚拟成两张表用以表达不同的意义,然后两个表可以进行内连接,外连接等查询
            SELECT CONCAT(worker.last_name,' works for ',manager.last_name)
            FROM employees worker, employees manager
            WHERE worker.`last_name`=manager.`last_name`
            练习:查询出last_name为 ‘Chen’ 的员工的 manager 的信息。
            SELECT manager.*
            FROM employees worker, employees manager
            WHERE worker.manager_id = manager.employee_id and worker.`last_name`='chen'
            -- 内连接:合并具有同一列的两个以上的表的行,结果集中不含一个表和另一个表不匹配的行
            SELECT employee_id, department_name
            FROM employees e,departments d 
            WHERE e.`department_id` = d.`department_id`
            #SQL99语法实现内连接:
            SELECT table1.column, table2.column,table3.column
            FROM table1
            JOIN table2 ON table1和table2的连接条件
            JOIN table3 ON table2和table3的连接条件
            练习:
            SELECT last_name,department_name
            FROM employees e INNER JOIN departments d
            ON e.`department_id` = d.`department_id`;

            SELECT last_name,department_name,city
            FROM employees e JOIN departments d
            ON e.`department_id` = d.`department_id`
            JOIN locations l
            ON d.`location_id` = l.`location_id`;
            #SQL99语法实现内连接:
            -- 外连接: 两个表在连接过程中除了返回满足连接条件的行以外还返回左(或右)表中不满足条件的行 ,这种连接称为左(或右) 外连接。没有匹配的行时, 结果表中相应的列为空(NULL)。
            -- 如果是左外连接,则连接条件中左边的表也称为 主表 ,右边的表称为 从表 。
            SELECT last_name, department_name
            FROM employees LEFT JOIN departments
            ON employees.department_id=departments.department_id -- 包含了一个人是没有部门名称的
            -- 如果是右外连接,则连接条件中右边的表也称为 主表 ,左边的表称为 从表 。
            SELECT last_name, department_name
            FROM employees RIGHT JOIN departments
            ON employees.department_id=departments.department_id  -- departments是主表,很多部门没有是没有人的(last_name=null)
            -- union 的使用
            SELECT COLUMN ,....from table1
            union ALL
            SELECT column,......FROM table2 
            
            中间: 
            SELECT employee_id,last_name,department_name
            FROM employees JOIN departments
            ON employees.`department_id`=departments.`department_id`
            
            左上:
            SELECT employee_id,last_name,department_name
            FROM employees left JOIN departments
            ON employees.`department_id`=departments.`department_id`
            
            右上:
            SELECT employee_id,last_name,department_name
            FROM employees right JOIN departments
            ON employees.`department_id`=departments.`department_id`
            
            左中:
            SELECT employee_id,last_name,department_name
            FROM employees left JOIN departments
            ON employees.`department_id`=departments.`department_id`
            WHERE departments.`department_name` is NULL 
            
            右中: 
            SELECT employee_id,last_name,department_name
            FROM employees right join departments
            ON employees.`department_id`=departments.`department_id`
            WHERE employees.`employee_id` is NULL
            
            左下:
            左上+右中
            SELECT employee_id,last_name,department_name
            FROM employees left JOIN departments
            ON employees.`department_id`=departments.`department_id`
            UNION ALL
            SELECT employee_id,last_name,department_name
            FROM employees right join departments
            ON employees.`department_id`=departments.`department_id`
            WHERE employees.`employee_id` is NULL
            
            右上+左中:
            SELECT employee_id,last_name,department_name
            FROM employees right JOIN departments
            ON employees.`department_id`=departments.`department_id`
            UNION ALL
            SELECT employee_id,last_name,department_name
            FROM employees left JOIN departments
            ON employees.`department_id`=departments.`department_id`
            WHERE departments.`department_name` is NULL 
            
            下中:
            左中+右中
            SELECT employee_id,last_name,department_name
            FROM employees left JOIN departments
            ON employees.`department_id`=departments.`department_id`
            WHERE departments.`department_name` is NULL 
          union ALL
            SELECT employee_id,last_name,department_name
            FROM employees right join departments
            ON employees.`department_id`=departments.`department_id`
            WHERE employees.`employee_id` is NULL
            
            
            
            
            

 

标签:多表,name,employees,departments,连接,mysql,department,last,id
From: https://www.cnblogs.com/clairedandan/p/18113069

相关文章

  • mysql --聚合函数的学习
    聚合函数1.常见的聚合函数1.1AVG/SUM:只适用于数值类型的字段(或变量)1.2MAX/MIN:适用于数值类型、字符串类型、时间日期类型的字段(或变量)1.3COUNT1.3.1作用:计算指定字段在查询结构中出现的个数(不包含NULL值的)#如果计算表中有......
  • go~连接redis的方法
    在Go语言中使用Redis,通常需要使用第三方库来实现与Redis服务器的交互。目前比较流行的Go语言Redis客户端库有go-redis和redigo等。这里以go-redis为例,简单介绍如何在Go语言中使用Redis。使用go-redis连接Redis数据库安装go-redis库:可以使用go命令行工具安装go-redis库:goget......
  • Python访问mysql与sqlite3数据库
    在Python中,数据库访问是一个常见的需求,无论是在Web开发还是数据分析中都非常重要。Python提供了多种数据库访问库,使得与不同类型的数据库进行交互变得简单。在这篇博客中,我们将介绍如何使用Python进行数据库访问操作,并提供一些代码示例。Python数据库访问概述Python中的数据......
  • mysql多安装空间坐标随笔
    geofuctionST_GeomFromGeoJson(#{geoJson})st_geomfromgeojson(#{fence.trajectory},1,4326)st_geomfromtext(#{fence.trajectory},4326)st_geomfromtext(CONCAT('POINT(',longitude,'',latitude,')'),4326))安装多个MySQL关闭所有已安装的mysql服务......
  • mysql windows离线安装
    D:\mysql-8.2.0-winx64\bin>mysqld--removemysql8.2Servicesuccessfullyremoved.D:\mysql-8.2.0-winx64\bin>mysqld--installmysql8.2Servicesuccessfullyinstalled.D:\mysql-8.2.0-winx64\bin>mysqld--initialize--console2024-03-29T06:05:......
  • 03 Python进阶:MySQL
    mysql-connector安装要在Python中使用MySQL数据库,你需要安装MySQL官方提供的MySQLConnector/Python。下面是安装MySQLConnector/Python的步骤:首先,确保你已经安装了Python,如果没有安装,可以在Python官网(https://www.python.org)下载并安装最新版本的Python......
  • 03 MySQL数据库的基本操作-DDL
    DDL(DataDefinitionLanguage),数据定义语言,该语言部分包括以下内容对数据库的常用操作对表结构的常用操作修改表结构可以在命令行里面进行如下的操作;也可以在Navicat图形化工具中操作创建数据库createdatabase数据库名[库选项]例如:createdatabase数据库......
  • OM6650AM支持蓝牙5.1协议栈与2.4GHz私有协议的双模无线连接SoC芯片
    OM6650AM是一款超低功耗、同时支持蓝牙5.1协议栈与2.4GHz私有协议的双模无线连接SoC芯片,采用4.0mmx4.0mmQFN32封装,具有丰富的资源,极低的功耗,优异的射频性能,可广泛应用于车载数字钥匙模组、胎压检测、PKE钥匙等场景。01主要特性蓝牙规格:全功能BLE5.1;支持数据传输速率:1Mb......
  • mysql基于二次注入(基于时间)盲注,python脚本
    根据mysql二次注入原理,存储型注入利用,先注册,再登陆、再调用修改密码,完成自动时间盲注类型判断,实现脱裤借用:“孤桜懶契”大佬的脚本#--coding:UTF-8--#Author:孤桜懶契#Date:2021/8/10#blog:gylq.gitee.ioimportrequestsimporttimeflag=""#***************......
  • MySQL数据库:第十六章:sql高级函数,和腾讯大牛的技术面谈
    CURDATE()或CURRENT_DATE()返回当前的日期CURTIME()或CURRENT_TIME()返回当前的时间DATE_ADD(date,INTERVALintkeyword)返回日期date加上间隔时间int的结果(int必须按照关键字进行格式化),如:SELECTDATE_ADD(CURRENT_DATE,INTERVAL6MONTH);DATE_FORMAT(date,fmt......