四、mysql 查询

本文详细介绍了SQL中的连接查询(包括内连接、外连接和全外连接)及子查询的使用方法,通过实例展示了不同类型的连接查询和子查询如何帮助优化数据库查询效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、连接查询

    1.内连接(INNER JOIN)

        按照匹配风湿范围以下三种:

                自然连接:

SELECT * FROM table_a a, table_b b;
SELECT * FROM table_a a INNER JOIN table_b b;

                等值连接:

SELECT * FROM table_a a, table_b b WHERE a.id = b.id;
SELECT * FROM table_a a INNER JOIN table_b b ON a.id = b.id;

                不等连接:

SELECT * FROM table_a a, table_b b WHERE a.id <> b.id;
SELECT * FROM table_a a INNER JOIN table_b b WHERE a.id <> b.id;

    2.外连接(OUTER JOIN)

        按照保留不匹配条件数据记录来源可以分为以下三种:

                左外连接(LEFT OUTER JOIN):

SELECT * FROM table_a a  LEFT JOIN table_b b WHERE ON a.id = b.id;

                右外连接(RIGHT OUTER JOIN)

SELECT * FROM table_b b RIGHT JOIN table_a a WHERE ON a.id = b.id;

                全外连接(FULL OUTER JOIN)

SELECT * FROM table_b b FULL JOIN table_a a WHERE ON a.id = b.id;

二、合并查询

    1. UNION

            将查询的数据合并在一起,并去除重复数据

SELECT * FROM table_a a
UNION
SELECT * FROM table_b b;

    2. UNION ALL

            将查询数据合并在一起,不去除重复数据

SELECT * FROM table_a a
UNION ALL
SELECT * FROM table_b b;

 

三、子查询

    连接查询会若导致笛卡尔积过大,则需使用子查询来提升查询效率。

    1.单行单列的子查询

SELECT * FROM table_a a 
WHERE a.age > (
    SELECT b.age FROM table_b b
    WHERE b.name = 'sixgod');

    2.单行多列子查询

SELECT * FROM table_a a
WHERE (a.name, a.age) = (
    SELECT b.name, b.age FROM table_b b
    WHERE b.id = 1);

    3.多行单列子查询

-- 使用IN
SELECT * FROM table_a a
WHERE a.name IN (
    SELECT b.name FROM table_b b
    WHERE b.age = 1);

-- 使用ANY  
-- =ANY与IN相同 
-- >ANY 查询比子查询中返回数据中最小的值还要大的值
-- >=ANY 查询比子查询中返回数据中最大的值还要小的值
SELECT * FROM table_a a
WHERE a.name ANY(
    SELECT b.name FROM table_b b
    WHERE b.age = 1);

-- 使用ALL
-- >ALL 查询比子查询中返回数据中最大的还要大的数据
-- <ALL 查询比子查询中返回数据中最小的还要小的数据
SELECT * FROM table_a a
WHERE a.name > ALL(
    SELECT b.name FROM table_b b
    WHERE b.age = 1);

-- 使用EXISTS
-- EXISTS是一个布尔类型,当返回结果时为true,不返回结果时为false。查询时EXISTS对外表采用遍历的方式逐条查询,
-- 每次查询都会比较EXISTS的条件语句,当EXISTS里的条件语句返回记录行时则为真,此时返回当前遍历到记录。
-- 反之EXISTS里的条件语句不能返回记录行,则丢弃当前遍历到的记录。
SELECT * FROM table_a a
WHERE EXISTS(
    SELECT * FROM table_b b
    WHERE b.id = a.id);

    4.多行多列子查询

-- 将子查询当做一个临时表进行连接查询
SELECT * FROM table_a a
INNER JOIN (
    SELECT * FROM table_b b
    WHERE b.age = 1) c
ON a.name = c.name;

 

转载于:https://my.oschina.net/raiseme2016/blog/887979

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值