MySQL子查询


typora-root-url: img

1.内连接 inner join

获取两个表中字段匹配关系的记录。类似于等值连接

两个表中有相同的数据才能被查出来,没有就查不出来,是交集

image-20230728113323483

语法

select * from dept join emp on emp.dept_id = dept.dept_no;

查询结果:

![image-20230728113602579](https://s2.loli.net/2023/07/28/b7LPXupDfYa68W3.png

image-20230728113626055

image-20230728113709026

2.左连接 left join

在内连接中,如果两个表中没有相同的数据,则不会被查询出来

使用左连接,则可以将左表中的数据全部查询出来,即使右表中无数据

image-20230728114104575

语法:

 select * from emp left join dept on emp.dept_id = dept.dept_no;

在emp表中,可以看到员工李四是没有部门编号的,但是使用左连接,左边中的数据会被全部查询出来,右表中则只将对应的数据查询出来。

Snipaste_2023-07-28_11-55-05

3.右连接 right join

使用右连接,则可以将右表中的数据全部查询出来,即使左表中无数据

select * from emp right join dept on emp.dept_id = dept.dept_no;

Snipaste_2023-07-28_12-02-04

细节补充

mysql需要外键和引用键上的索引,以便外键检查可以快速且不需要表扫描,在引用表中,必须有一个索引,其中外键列按相同顺序列为第一列。如果在引用表不存在,则会自动在引用表上创建此类索引。如果创建另一个可用于强制外键约束的所以,则稍后可能会默默地删除该索引。index_name,如果给出则按前面所述使用。

使用

alter table emp drop constraint fk_dept_no;

删除外键约束时索引还存在,可以使用来删除

alter table emp drop index fk_dept_no;

4.子查询

存在于另一个sql语句中、被括号包起来的查询语句,为子查询。相对于子查询来说,在外部直接执行的查询语句称为主查询

  • 单列子查询:返回单行单列数据的子查询

     select emp_name from emp where dept_id = (select dept_id from dept where dept_name = '技术部');
    

  • 单行子查询:返回单行多列数据的子查询

     select emp_name,emp_sal from emp where dept_id = (select dept_id from dept where dept_name = '技术部');
    

  • 多行子查询:返回数据时多行数据

    多行子查询操作符:

    • in 子查询中所有的记录
    • >any 表示大于子查询中的任意一个值,即大于最小值
    • >all表示大于子查询中的所有值,即大于最大值
    select * from emp where dept_id  in (select dept_no from dept where dept_name = '项目部' or dept_name = '运营部');
    

    select * from emp where dept_id  < any (select dept_no from dept where dept_name = '项目部' or dept_name = '运营部');
    

    select * from emp where dept_id  > all (select dept_no from dept where dept_name = '财务部' or dept_name = '技术部');
    

    exist and not exist

    在MySQL中,EXISTSNOT EXISTS用于子查询,用于检查在另一个查询中是否存在行或行是否存在。

    • EXISTS:如果子查询返回至少一行结果,则EXISTS返回TRUE,否则返回FALSE
    • NOT EXISTS:如果子查询未返回至少一行结果,则NOT EXISTS返回TRUE,否则返回FALSE

    exist

    select * from emp where  exists (select dept_no from dept where dept_name = '财务部' or dept_name= '技术部');
    

    not exist

    select * from emp where  not exists (select dept_no from dept where dept_name = '财务部2' or dept
    _name = '技术部1');
    

    查询结果都如下

    细节

    在 SQL 中,可以在 DELETE 和 UPDATE 语句中使用子查询,但是存在一些限制。

    首先,子查询的结果必须是一个标量值(单个值),不能是多行结果。这意味着,子查询必须返回一个列,并且只能返回一行的数据。如果子查询返回多行结果,将会引发错误。

    其次,子查询必须在 DELETE 或 UPDATE 语句中作为 FROM 子句的一部分,不能作为 WHERE 或SET 子句的一部分。因此,您可以使用子查询来指定要删除或更新的行,但是不能使用子查询来更新特定列的值。

    另外,DELETE 和 UPDATE 语句中的子查询必须符合主查询的语法和限制。例如,主查询中的 WHERE 子句必须使用等式或条件,而不能使用子查询中的聚合函数或 GROUP BY 子句。

    最后,使用子查询进行 DELETE 和 UPDATE 操作时,性能可能较差,因为数据库必须执行两个查询操作,而不是一个。因此,如果可能的话,最好使用 JOIN 或 INNER JOIN 操作来组合多个表,并一次性更新或删除多个行。

    总之,可以在 DELETE 和 UPDATE 语句中使用子查询,但是需要遵守上述限制,并注意性能问题。

ELETE 和 UPDATE 操作时,性能可能较差,因为数据库必须执行两个查询操作,而不是一个。因此,如果可能的话,最好使用 JOIN 或 INNER JOIN 操作来组合多个表,并一次性更新或删除多个行。

总之,可以在 DELETE 和 UPDATE 语句中使用子查询,但是需要遵守上述限制,并注意性能问题。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值