精华内容
下载资源
问答
  • 隐式内连接
    千次阅读
    2021-01-19 11:02:18

    显式内连接就是使用inner join的办法,写起来复杂些

    以windows版本mysql里自带的sakila数据库为例

    显式内连接语法 select 字段名 from 表1 join 表2 on 连接条件 [ join 表3 on 连接条件 ... ] [ where 查询条件 ... ];

    SELECT store.address_id,first_name,last_name FROM store INNER JOIN staff ON store.manager_staff_id=staff.staff_id;

    结果:

    address_idfirst_namelast_name

    1MikeHillyer

    2JonStephens

    隐式内连接语法 select 字段名 from 表1,表2 [ ,表3... ] where 连接条件 [ and 查询/连接条件 ... ];

    SELECT store.address_id,first_name,last_name FROM store,staff WHERE store.manager_staff_id=staff.staff_id;

    结果:

    address_idfirst_namelast_name

    1MikeHillyer

    2JonStephens

    相对而言,隐式连接好理解好书写,语法简单,担心的点较少。但是显式连接可以减少字段的扫描,有更快的执行速度。这种速度优势在3张或更多表连接时比较明显

    更多相关内容
  • 一、多表查询 二、在 MySQL 中创建 三、隐式内连接 1.1 隐式内连接:没有JOIN关键字,条件使用WHERE指定 SELECT 字段 FROM 表1, 表2 WHERE 条件;

    一、多表查询

    在这里插入图片描述

    二、在 MySQL 中创建 book 和 actor 两张表

    1 创建 book 表及添加数据
    CREATE TABLE `book` (
    	`id` INT PRIMARY KEY NOT NULL AUTO_INCREMEN,
    	`bookName` VARCHAR (60),
    	`author` VARCHAR (60)
    ); 
    INSERT INTO `book` (`id`, `bookName`, `author`) VALUES('1','水浒传','施耐庵');
    INSERT INTO `book` (`id`, `bookName`, `author`) VALUES('2','三国演义','罗贯中');
    INSERT INTO `book` (`id`, `bookName`, `author`) VALUES('3','西游记','吴承恩');
    INSERT INTO `book` (`id`, `bookName`, `author`) VALUES('4','红楼梦','曹雪芹');
    

    在这里插入图片描述

    2 创建 actor 表及添加数据
    CREATE TABLE `actor` (
    	`id` INT PRIMARY KEY NOT NULL AUTO_INCREMENT,
    	`actorName` VARCHAR (30),
    	`gender` VARCHAR (3),
    	`designation` VARCHAR (30),
    	`bookId` INT 
    ); 
    INSERT INTO `actor` (`id`, `actorName`, `gender`, `designation`, `bookId`) VALUES('1','唐僧','男','旃檀功德佛','3');
    INSERT INTO `actor` (`id`, `actorName`, `gender`, `designation`, `bookId`) VALUES('2','孙悟空','男','斗战胜佛','3');
    INSERT INTO `actor` (`id`, `actorName`, `gender`, `designation`, `bookId`) VALUES('3','猪八戒','男','净坛使者','3');
    INSERT INTO `actor` (`id`, `actorName`, `gender`, `designation`, `bookId`) VALUES('4','沙僧','男','金身罗汉','3');
    INSERT INTO `actor` (`id`, `actorName`, `gender`, `designation`, `bookId`) VALUES('5','刘备','男','字玄德','2');
    INSERT INTO `actor` (`id`, `actorName`, `gender`, `designation`, `bookId`) VALUES('6','关羽','男','字云长','2');
    INSERT INTO `actor` (`id`, `actorName`, `gender`, `designation`, `bookId`) VALUES('7','张飞','男','字翼德','2');
    INSERT INTO `actor` (`id`, `actorName`, `gender`, `designation`, `bookId`) VALUES('8','宋江','男','及时雨','1');
    INSERT INTO `actor` (`id`, `actorName`, `gender`, `designation`, `bookId`) VALUES('9','林冲','男','豹子头','1');
    INSERT INTO `actor` (`id`, `actorName`, `gender`, `designation`, `bookId`) VALUES('10','武松','男','行者','1');
    INSERT INTO `actor` (`id`, `actorName`, `gender`, `designation`, `bookId`) VALUES('11','李逵','男','黑旋风','1');
    INSERT INTO `actor` (`id`, `actorName`, `gender`, `designation`, `bookId`) VALUES('12','鲁智深','男','花和尚','1');
    INSERT INTO `actor` (`id`, `actorName`, `gender`, `designation`, `bookId`) VALUES('13','贾宝玉','男','宝玉','4');
    INSERT INTO `actor` (`id`, `actorName`, `gender`, `designation`, `bookId`) VALUES('14','林黛玉','女','黛玉','4');
    INSERT INTO `actor` (`id`, `actorName`, `gender`, `designation`, `bookId`) VALUES('15','薛宝钗','女','宝钗','4');
    

    在这里插入图片描述

    三、内连接

    1 隐式内连接:没有JOIN关键字,条件使用WHERE指定
    SELECT 字段 FROM1,2 WHERE 条件;
    
    SELECT * FROM book b, actor a WHERE a.bookId = b.id AND a.bookId = 3;
    

    在这里插入图片描述

    2 显式内连接:使用INNER JOIN ... ON语句, 可以省略INNER
    SELECT 字段 FROM 左表 INNER JOIN 右表 ON 表连接条件 WHERE 查询条件;
    
    SELECT * FROM book b INNER JOIN actor a ON a.bookId = b.id WHERE a.bookId = 2;
    

    在这里插入图片描述

    四、左外连接

    1 左外连接:使用LEFT OUTER JOIN ... ONOUTER可以省略
    SELECT 字段 FROM 左表 LEFT OUTER JOIN 右表 ON 表连接条件 WHERE 查询条件;
    
    左外连接可以理解为:将满足要求的数据显示,左表不满足要求的数据也显示(在内连接的基础上,保证左表的数据全部显示)
    2 在 book 表中添加新的书籍
    INSERT INTO `book` (`id`, `bookName`, `author`) VALUES('5','斗罗大陆','唐家三少');
    

    在这里插入图片描述

    3 使用内连接查询
    SELECT * FROM book b INNER JOIN actor a ON a.bookId = b.id;
    

    在这里插入图片描述

    4 使用左外连接查询
    SELECT * FROM book b LEFT OUTER JOIN actor a ON a.bookId = b.id;
    

    在这里插入图片描述

    五、右外连接

    1 右外连接:使用RIGHT OUTER JOIN ... ONOUTER可以省略
    SELECT 字段 FROM 左表 RIGHT OUTER JOIN 右表 ON 表连接条件 WHERE 查询条件;
    
    右外连接可以理解为:满足要求的数据显示,并且右表不满足要求的数据也显示(在内连接的基础上保证右边的数据全部显示)
    2 在 actor 表中添加新的人物
    INSERT INTO `actor` (`id`, `actorName`, `gender`, `designation`, `bookId`) VALUES('16','史湘云','女','湘云',NULL);
    

    在这里插入图片描述

    3 使用内连接查询
    SELECT * FROM book b INNER JOIN actor a ON a.bookId = b.id;
    

    在这里插入图片描述

    4 使用右外连接查询
    SELECT * FROM book b LEFT OUTER JOIN actor a ON a.bookId = b.id;
    

    在这里插入图片描述

    展开全文
  • Mysql数据库常用语句——多表查询,包括隐式内连接,显式外连接,左外连接,右外连接,子连接

    Mysql数据库常用语句——创建数据库/表_yopky的博客-CSDN博客
    Mysql数据库常用语句——插入/更改/删除数据_yopky的博客-CSDN博客
     

    新增一张表

    -- 新增一张工资表wage
    CREATE TABLE wage(
    			wid INT PRIMARY KEY AUTO_INCREMENT,
    			wage_level VARCHAR(30),
    			wage_money VARCHAR(30));
    			
    INSERT INTO wage (wage_level,wage_money) VALUES ('1级','9000-8000'),('2级','7000-6000'),('3级','5000-4000'),('4级','3000-2000');
    SELECT * FROM wage
    
    -- employee 新增一列wage_id
    ALTER TABLE employee ADD wage_id INT;
    
    -- 插入wage_id数据
    UPDATE employee SET wage_id = 1 where eid in (2,6,8,13);
    UPDATE employee SET wage_id = 2 where eid in (1,5,10,14);
    UPDATE employee SET wage_id = 3 where eid in (3,6,8,12);
    UPDATE employee SET wage_id = 4 where eid in (4,5,11,15);
    

    内连接查询

    内连接

    通过指定条件匹配2张表的数据,匹配上就显示,匹配不上就不显示

    隐式内连接

    隐式内连接:FROM后面直接写多个表名,使用where指定连接条件的连接方式

    查询所有的员工信息及所在部门

    -- 查询所有的员工信息及所在部门
    SELECT * FROM employee,department where dept_id = id;
    
    -- 查询员工名字及所在部门
    SELECT e.ename,d.dep_name FROM employee e,department d WHERE e.dept_id= d.id
    
    
    -- 查询黄二属于哪个部门
    SELECT e.eid,e.ename,d.dep_name FROM employee e,department d WHERE e.dept_id=d.id AND e.ename='黄二'
    

    显式内连接

    显式内连接:使用INNER JOIN..ON 这种方式

    两表显式内连接查询

    -- 查询所有员工信息及对应的部门信息
    
    SELECT * FROM employee e INNER JOIN department d ON e.dept_id=d.id ORDER BY e.eid

    查询年龄小于于40的员工信息,包括部门跟工资级别

    三表显式内连接查询

    -- 查询年龄小于于40的员工信息,包括部门跟工资级别
    -- 三表显式内连接查询
    SELECT e.ename,d.dep_name,w.wage_level FROM (employee e INNER JOIN department d ON e.dept_id=d.id) INNER JOIN wage w ON e.wage_id=w.wid WHERE e.age<40
    SELECT * from employee WHERE age<40;
    

    左外连接查询

    左外连接:使用LEFT OUTER JOIN

    1.已左表为基准,匹配右边表中的数据,如果匹配得上,就展示匹配到的数据

    2.如果匹配不到,左表的数据正常展示,右边的展示为NULL

    -- department添加一条数据
    INSERT into department (dep_name,dep_location) VALUES ('运营部','上海')
    
    -- 2表左外连接
    SELECT * FROM employee e LEFT JOIN department d ON e.dept_id=d.id;
    

    SELECT * FROM department d LEFT JOIN employee e ON e.dept_id=d.id;

     示例代码:

    -- 3表左外连接
    SELECT * FROM (employee e LEFT JOIN department d ON e.dept_id=d.id) LEFT JOIN wage w ON e.wage_id=w.wid ORDER BY e.eid
    
    -- 查询每个部门有多少人
    SELECT d.dep_name AS '部门',COUNT(e.ename) As '人数' FROM employee e LEFT JOIN department d ON e.dept_id=d.id GROUP BY e.dept_id
    
    -- 查询每个部门有多少人不包括没部门的
    SELECT d.dep_name AS '部门',COUNT(e.ename) As '人数' FROM employee e LEFT JOIN department d ON e.dept_id=d.id WHERE e.dept_id IS NOt NULL GROUP BY e.dept_id
    

    右外连接查询

    右外连接:使用RIGHT OUTER JOIN

    1.已右表为基准,匹配左边表中的数据,如果匹配得上,就展示匹配到的数据

    2.如果匹配不到,右表的数据正常展示,左边的展示为NULL

    -- 右外连接
    SELECT * FROM department d RIGHT JOIN employee e ON d.id=e.dept_id;
    

    子查询

    一条select查询语句的结果,作为另一条select语句的一部分

    -- 子查询
    -- 通过子查询,查询员工年龄最大的员工信息
    SELECT * FROM employee WHERE age = (SELECT MAX(age) FROM employee)
    
    -- 查询产品部的所有人的信息
    -- 方法一:子连接
    SELECT * FROM employee e WHERE e.dept_id = (SELECT d.id FROM department d WHERE d.dep_name='产品部')
    -- 方法二:左连接
    SELECT * FROM employee e LEFT JOIN department d ON e.dept_id=d.id WHERE d.dep_name='产品部' 
    
    -- 查询小于平均年龄的员工信息
    SELECT * FROM employee WHERE age<(SELECT AVG(age) FROM employee)
    
    -- 查询小于平均年龄的员工信息,包括部门及工资级别信息
    SELECT e.ename,d.dep_name,w.wage_level FROM (employee e LEFT JOIN department d ON e.dept_id=d.id) LEFT JOIN wage w ON e.wage_id=w.wid WHERE age < (SELECT AVG(age) FROM employee)
    
    -- 查询年龄小于40的员工来自哪个个部门
    -- 方法一:子查询使用IN获得单列多行数据
    SELECT * FROM department d WHERE d.id IN (SELECT DISTINCT e.dept_id FROM employee e WHERE e.age <40);
    
    -- 方法二:
    SELECT DISTINCT d.id,d.dep_name FROM employee e LEFT JOIN department d ON e.dept_id = d.id WHERE e.age < 40
    
    -- 查询‘行政部’与‘开发部’下面的全部员工信息
    -- 方法一:
    SELECT * FROM employee WHERE dept_id IN (SELECT id FROM department WHERE dep_name IN ('行政部','开发部'))
    
    -- 方法二:
    SELECT * FROM employee e LEFT JOIN department d ON e.dept_id=d.id WHERE d.dep_name IN ('行政部','开发部')
    

    展开全文
  • 内连接查询 测试样表 内连接查询 关键字 join on 语法:select 字段1,字段2 from 表1 join 表2 on 条件; #显式内连接 #关键字 join on #查询所有员工信息和对应部门信息 SELECT * -- 所有员工信息 FROM ...

    目录

     

    内连接查询

    测试样表


    内连接查询

    关键字 join on

    语法:select 字段1,字段2 from 表1 join 表2 on 条件; 

    #显式内连接 
    #关键字 join on
    #查询所有员工信息和对应部门信息
    SELECT 
    	* -- 所有员工信息
    FROM
    	emp -- 员工表
    JOIN
    	dept -- 部门表
    on 
    	emp.dept_id = dept.id; -- 约束条件
    	
    
    #查询员工表的名称,性别,部门表的名称
    SELECT
    	t1.`NAME`,t1.gender,t2.`NAME` -- 员工表的名称,性别,部门表的名称
    FROM
    	emp t1 -- 员工表
    JOIN
    	dept t2 -- 部门表
    ON
    	t1.dept_id = t2.id; -- 约束条件

     

    测试样表

    MySQL样表

    展开全文
  • -- 多表连接 DROP TABLE IF EXISTS emp; DROP TABLE IF EXISTS dept; # 创建部门表 CREATE TABLE dept( did INT PRIMARY KEY AUTO_INCREMENT, dname VARCHAR(20) ); # 创建员工表 CREATE TABLE emp ( id INT
  • 显式vs隐式SQL连接

    2021-04-25 13:22:22
    显式vs隐式SQL连接在显式vs隐式内连接中是否存在效率差异?例如:SELECT * FROMtable a INNER JOIN table bON a.id = b.id;与SELECT a.*, b.*FROM table a, table bWHERE a.id = b.id;dmanxiii asked 2019-01-30T02:...
  • 显式内连接语法 select 字段名 from 表1 join 表2 on 连接条件 [ join 表3 on 连接条件 ...... 隐式内连接语法 select 字段名 from 表1,表2 [ ,表3... ] where 连接条件 [ and 查询/连接条件 ... ];......
  • 查询可以去除笛卡尔积现象,这种查询也叫 隐式内连接查询 一、隐式内连接 上面的去除笛卡尔积现象,也叫隐式内连接,条件使用 where select * from employee e,department d where e.department_id = d.id;...
  • 显式与隐式SQL连接

    2021-03-16 13:07:36
    显式和隐式内部联接是否存在效率差异? 例如:SELECT * FROMtable a INNER JOIN table bON a.id = b.id;与SELECT a.*, b.*FROM table a, table bWHERE a.id = b.id;#1楼在MySQL 5.1.51上,两个查询的执行计划相同:...
  • 多表查询前先根据目标厘清如下思路: ①确定表(从哪些表中查?);from 表1,表2 ②确定连接条件:where/on ③确定筛选出哪些列:select 列 一、内连接 1)、隐式内连接 首先得澄清一个概念:...隐式内连接:就是使
  • 隐式连接和显式连接

    千次阅读 2019-06-06 09:39:15
    目录 文档用途 详细信息 ...FROM子句后面直接列出多个表名,这种连接方式即属于连接,是隐式连接。 示例: 创建两张测试表test_1和test_2,分别插入数据,然后查询两张表中id列相同的记录。...
  • ①确定表(从哪些表中查?);from 表1,表2 ②确定连接条件:where/on ...隐式内连接:就是使用where条件,消除不符合条件的无用数据(消除笛卡尔积的无用数据)。 select 列 1,列2 from 表1,表2 where 条件 ; ...
  • 查询用户 老王 的权限 显示内连接(推荐 inner join 比隐式内连接更快) ## 显示内连接 select m.name from pe_user u inner join pe_role_user ru inner join pe_role r inner join pe_role_module rm inner join ...
  • 隐式连接:select user_name as ‘昵称’,gname as ...from子句后面直接出现多个表名,这种连接方式即属于连接,是隐式连接 显式链接:select col_list from table1 inner join table2 on table1.col=table2.co

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 138,035
精华内容 55,214
关键字:

隐式内连接

友情链接: 高斯干涉.zip