国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【大數(shù)據(jù)】Flink SQL 語法篇(七):Lookup Join、Array Expansion、Table Function

這篇具有很好參考價值的文章主要介紹了【大數(shù)據(jù)】Flink SQL 語法篇(七):Lookup Join、Array Expansion、Table Function。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

Flink SQL 語法篇》系列,共包含以下 10 篇文章:

  • Flink SQL 語法篇(一):CREATE
  • Flink SQL 語法篇(二):WITH、SELECT & WHERE、SELECT DISTINCT
  • Flink SQL 語法篇(三):窗口聚合(TUMBLE、HOP、SESSION、CUMULATE)
  • Flink SQL 語法篇(四):Group 聚合、Over 聚合
  • Flink SQL 語法篇(五):Regular Join、Interval Join
  • Flink SQL 語法篇(六):Temporal Join
  • Flink SQL 語法篇(七):Lookup Join、Array Expansion、Table Function
  • Flink SQL 語法篇(八):集合、Order By、Limit、TopN
  • Flink SQL 語法篇(九):Window TopN、Deduplication
  • Flink SQL 語法篇(十):EXPLAIN、USE、LOAD、SET、SQL Hints

?? 如果您覺得這篇文章有用 ?? 的話,請給博主一個一鍵三連 ?????? 吧 (點贊 ??、關(guān)注 ??、收藏 ??)!??!您的支持 ?????? 將激勵 ?? 博主輸出更多優(yōu)質(zhì)內(nèi)容?。?!

1.Lookup Join(維表 Join)

Lookup Join 定義(支持 Batch / Streaming):Lookup Join 其實就是維表 Join,比如拿離線數(shù)倉來說,常常會有用戶畫像,設(shè)備畫像等數(shù)據(jù),而對應到實時數(shù)倉場景中,這種實時獲取外部緩存的 Join 就叫做維表 Join。

應用場景:小伙伴萌會問,我們既然已經(jīng)有了上面介紹的 Regular Join,Interval Join 等,為啥還需要一種 Lookup Join?因為上面說的這幾種 Join 都是 流與流之間的 Join,而 Lookup Join 是流與 Redis,MySQL,HBase 這種存儲介質(zhì)的 Join。Lookup 的意思就是實時查找,而實時的畫像數(shù)據(jù)一般都是存儲在 Redis,MySQL,HBase 中,這就是 Lookup Join 的由來。

實際案例:使用曝光用戶日志流(show_log)關(guān)聯(lián)用戶畫像維表(user_profile)關(guān)聯(lián)到用戶的維度之后,提供給下游計算分性別,年齡段的曝光用戶數(shù)使用。

  • 曝光用戶日志流(show_log)數(shù)據(jù)(數(shù)據(jù)存儲在 Kafka 中)
log_id  timestamp            user_id
1       2021-11-01 00:01:03  a
2       2021-11-01 00:03:00  b
3       2021-11-01 00:05:00  c
4       2021-11-01 00:06:00  b
5       2021-11-01 00:07:00  c
  • 用戶畫像維表(user_profile)數(shù)據(jù)(數(shù)據(jù)存儲在 Redis 中)
user_id(主鍵)   age     sex
a               12-18   男
b               18-24   女
c               18-24   男

注意:Redis 中的數(shù)據(jù)結(jié)構(gòu)存儲是按照 Key-Value 去存儲的。其中 Key 為 user_id,Value 為 agesex 的 JSON。

具體 SQL:

CREATE TABLE show_log (
    log_id BIGINT,
    `timestamp` as cast(CURRENT_TIMESTAMP as timestamp(3)),
    user_id STRING,
    proctime AS PROCTIME()
)
WITH (
  'connector' = 'datagen',
  'rows-per-second' = '10',
  'fields.user_id.length' = '1',
  'fields.log_id.min' = '1',
  'fields.log_id.max' = '10'
);

CREATE TABLE user_profile (
    user_id STRING,
    age STRING,
    sex STRING
    ) WITH (
  'connector' = 'redis',
  'hostname' = '127.0.0.1',
  'port' = '6379',
  'format' = 'json',
  'lookup.cache.max-rows' = '500',
  'lookup.cache.ttl' = '3600',
  'lookup.max-retries' = '1'
);

CREATE TABLE sink_table (
    log_id BIGINT,
    `timestamp` TIMESTAMP(3),
    user_id STRING,
    proctime TIMESTAMP(3),
    age STRING,
    sex STRING
) WITH (
  'connector' = 'print'
);

-- lookup join 的 query 邏輯
INSERT INTO sink_table
SELECT 
    s.log_id as log_id, 
    s.`timestamp` as `timestamp`, 
    s.user_id as user_id, 
    s.proctime as proctime, 
    u.sex as sex, 
    u.age as age
FROM show_log AS s
LEFT JOIN user_profile FOR SYSTEM_TIME AS OF s.proctime AS u
ON s.user_id = u.user_id

輸出數(shù)據(jù)如下:

log_id  timestamp            user_id  age     sex
1       2021-11-01 00:01:03  a        12-182       2021-11-01 00:03:00  b        18-243       2021-11-01 00:05:00  c        18-244       2021-11-01 00:06:00  b        18-245       2021-11-01 00:07:00  c        18-24

注意:實時的 Lookup 維表關(guān)聯(lián)能使用 處理時間 去做關(guān)聯(lián)。

  • 同一條數(shù)據(jù)關(guān)聯(lián)到的維度數(shù)據(jù)可能不同:實時數(shù)倉中常用的實時維表都是在不斷的變化中的,當前流表數(shù)據(jù)關(guān)聯(lián)完維表數(shù)據(jù)后,如果同一個 key 的維表的數(shù)據(jù)發(fā)生了變化,已關(guān)聯(lián)到的維表的結(jié)果數(shù)據(jù)不會再同步更新。舉個例子,維表中 user_id 1 1 1 的數(shù)據(jù)在 08 : 00 08:00 08:00age12-18 變?yōu)榱?18-24,那么當我們的任務在 08 : 01 08:01 08:01 failover 之后從 07 : 59 07:59 07:59 開始回溯數(shù)據(jù)時,原本應該關(guān)聯(lián)到 12-18 的數(shù)據(jù)會關(guān)聯(lián)到 18-24age 數(shù)據(jù)。這是有可能會影響數(shù)據(jù)質(zhì)量的。所以小伙伴萌在評估你們的實時任務時要考慮到這一點。
  • 會發(fā)生實時的新建及更新的維表博主建議小伙伴萌應該建立起數(shù)據(jù)延遲的監(jiān)控機制,防止出現(xiàn)流表數(shù)據(jù)先于維表數(shù)據(jù)到達,導致關(guān)聯(lián)不到維表數(shù)據(jù)。

再說說維表常見的性能問題及優(yōu)化思路。

所有的維表性能問題都可以總結(jié)為:高 QPS 下訪問維表存儲引擎產(chǎn)生的任務背壓,數(shù)據(jù)產(chǎn)出延遲問題。

舉個例子:

  • 在沒有使用維表的情況下:一條數(shù)據(jù)從輸入 Flink 任務到輸出 Flink 任務的時延假如為 0.1 ? m s 0.1\ ms 0.1?ms,那么并行度為 1 1 1 的任務的吞吐可以達到 1 ? q u e r y ? / ? 0.1 ? m s = 10000 ? q p s 1\ query\ /\ 0.1\ ms = 10000\ qps 1?query?/?0.1?ms=10000?qps
  • 在使用維表之后:每條數(shù)據(jù)訪問維表的外部存儲的時長為 2 ? m s 2\ ms 2?ms,那么一條數(shù)據(jù)從輸入 Flink 任務到輸出 Flink 任務的時延就會變成 2.1 ? m s 2.1\ ms 2.1?ms,那么同樣并行度為 1 的任務的吞吐只能達到 1 ? q u e r y ? / ? 2.1 ? m s = 476 ? q p s 1\ query\ /\ 2.1\ ms = 476\ qps 1?query?/?2.1?ms=476?qps。兩者的吞吐量相差 21 21 21 倍。

這就是為什么維表 Join 的算子會產(chǎn)生背壓,任務產(chǎn)出會延遲。

那么當然,解決方案也是有很多的。拋開 Flink SQL 想一下,如果我們使用 DataStream API,甚至是在做一個后端應用,需要訪問外部存儲時,常用的優(yōu)化方案有哪些?這里列舉一下:

  • 1?? 按照 Redis 維表的 key 分桶 + local cache:通過按照 key 分桶的方式,讓大多數(shù)據(jù)的維表關(guān)聯(lián)的數(shù)據(jù)訪問走之前訪問過的 local cache 即可。這樣就可以把訪問外部存儲 2.1 ? m s 2.1\ ms 2.1?ms 處理一個 Query 變?yōu)樵L問內(nèi)存的 0.1 ? m s 0.1\ ms 0.1?ms 處理一個 Query 的時長。
  • 2?? 異步訪問外存:DataStream API 有異步算子,可以利用線程池去同時多次請求維表外部存儲。這樣就可以把 2.1 ? m s 2.1\ ms 2.1?ms 處理 1 1 1 個 Query 變?yōu)? 2.1 ? m s 2.1\ ms 2.1?ms 處理 10 10 10 個 Query。吞吐可變優(yōu)化到 10 ? q u e r y ? / ? 2.1 ? m s = 4761 ? q p s 10\ query\ /\ 2.1\ ms = 4761\ qps 10?query?/?2.1?ms=4761?qps。
  • 3?? 批量訪問外存:除了異步訪問之外,我們還可以批量訪問外部存儲。舉一個例子:在訪問 Redis 維表的 1 1 1 Query 占用 2.1 ? m s 2.1\ ms 2.1?ms 時長中,其中可能有 2 ? m s 2\ ms 2?ms 都是在網(wǎng)絡(luò)請求上面的耗時 ,其中只有 0.1 ? m s 0.1\ ms 0.1?ms 是 Redis Server 處理請求的時長。那么我們就可以使用 Redis 提供的 pipeline 能力,在客戶端(也就是 Flink 任務 lookup join 算子中),攢一批數(shù)據(jù),使用 pipeline 去同時訪問 Redis Sever。這樣就可以把 2.1 ? m s 2.1\ ms 2.1?ms 處理 1 1 1 個 Query 變?yōu)? 7 ? m s = 2 ? m s + 50 ? 0.1 ? m s 7\ ms=2\ ms + 50 * 0.1\ ms 7?ms=2?ms+50?0.1?ms 處理 50 50 50 個 Query。吞吐可變?yōu)? 50 ? q u e r y ? / ? 7 ? m s = 7143 ? q p s 50\ query\ /\ 7\ ms = 7143\ qps 50?query?/?7?ms=7143?qps。

博主認為上述優(yōu)化效果中,最好用的是 1?? + 3??,2?? 相比 3?? 還是一條一條發(fā)請求,性能會差一些。

既然 DataStream 可以這樣做,F(xiàn)link SQL 必須必的也可以借鑒上面的這些優(yōu)化方案。具體怎么操作呢?看下文騷操作

  • 1?? 按照 Redis 維表的 key 分桶 + local cache:SQL 中如果要做分桶,得先做 group by,但是如果做了 group by 的聚合,就只能在 udafuser defined aggregation function)中做訪問 Redis 處理,并且 udaf 產(chǎn)出的結(jié)果只能是一條,所以這種實現(xiàn)起來非常復雜。我們選擇不做 keyby 分桶。但是我們可以直接使用 local cache 去做本地緩存,雖然【直接緩存】的效果比【先按照 key 分桶再做緩存】的效果差,但是也能一定程度上減少訪問 Redis 壓力。在博主實現(xiàn)的 Redis Connector 中,內(nèi)置了 local cache 的實現(xiàn)。
  • 2?? 異步訪問外存:目前博主實現(xiàn)的 Redis Connector 不支持異步訪問,但是官方實現(xiàn)的 HBase Connector 支持這個功能,參考下面鏈接文章的,點開之后搜索 lookup.async。https://nightlies.apache.org/flink/flink-docs-release-1.13/docs/connectors/table/hbase/
  • 3?? 批量訪問外存:這玩意官方必然沒有實現(xiàn)啊,但是,但是,但是,經(jīng)過博主周末兩天的瘋狂 debug,改了改源碼,搞定了基于 Redis 的批量訪問外存優(yōu)化的功能。

2.Array Expansion(數(shù)組列轉(zhuǎn)行)

應用場景(支持 Batch / Streaming):將表中 ARRAY 類型字段(列)拍平,轉(zhuǎn)為多行。

實際案例:比如某些場景下,日志是合并、攢批上報的,就可以使用這種方式將一個 Array 轉(zhuǎn)為多行。

CREATE TABLE show_log_table (
    log_id BIGINT,
    show_params ARRAY<STRING>
) WITH (
  'connector' = 'datagen',
  'rows-per-second' = '1',
  'fields.log_id.min' = '1',
  'fields.log_id.max' = '10'
);

CREATE TABLE sink_table (
    log_id BIGINT,
    show_param STRING
) WITH (
  'connector' = 'print'
);

INSERT INTO sink_table
SELECT
    log_id,
    t.show_param as show_param
FROM show_log_table
-- array 炸開語法
CROSS JOIN UNNEST(show_params) AS t (show_param)

show_log_table 原始數(shù)據(jù):

+I[7, [a, b, c]]
+I[5, [d, e, f]]

輸出結(jié)果如下所示:

-- +I[7, [a, b, c]] 一行轉(zhuǎn)為 3 行
+I[7, a]
+I[7, b]
+I[7, b]
-- +I[5, [d, e, f]] 一行轉(zhuǎn)為 3 行
+I[5, d]
+I[5, e]
+I[5, f]

3.Table Function(自定義列轉(zhuǎn)行)

應用場景(支持 Batch / Streaming):這個其實和 Array Expansion 功能類似,但是 Table Function 本質(zhì)上是個 UDTF 函數(shù),和離線 Hive SQL 一樣,我們可以自定義 UDTF 去決定列轉(zhuǎn)行的邏輯。

Table Function 使用分類:

  • Inner Join Table Function:如果 UDTF 返回結(jié)果為空,則相當于 1 1 1 行轉(zhuǎn)為 0 0 0 行,這行數(shù)據(jù)直接被丟棄。
  • Left Join Table Function:如果 UDTF 返回結(jié)果為空,折行數(shù)據(jù)不會被丟棄,只會在結(jié)果中填充 null 值。
public class TableFunctionInnerJoin_Test {

    public static void main(String[] args) throws Exception {

        FlinkEnv flinkEnv = FlinkEnvUtils.getStreamTableEnv(args);

        String sql = "CREATE FUNCTION user_profile_table_func AS 'flink.examples.sql._07.query._06_joins._06_table_function"
                + "._01_inner_join.TableFunctionInnerJoin_Test$UserProfileTableFunction';\n"
                + "\n"
                + "CREATE TABLE source_table (\n"
                + "    user_id BIGINT NOT NULL,\n"
                + "    name STRING,\n"
                + "    row_time AS cast(CURRENT_TIMESTAMP as timestamp(3)),\n"
                + "    WATERMARK FOR row_time AS row_time - INTERVAL '5' SECOND\n"
                + ") WITH (\n"
                + "  'connector' = 'datagen',\n"
                + "  'rows-per-second' = '10',\n"
                + "  'fields.name.length' = '1',\n"
                + "  'fields.user_id.min' = '1',\n"
                + "  'fields.user_id.max' = '10'\n"
                + ");\n"
                + "\n"
                + "CREATE TABLE sink_table (\n"
                + "    user_id BIGINT,\n"
                + "    name STRING,\n"
                + "    age INT,\n"
                + "    row_time TIMESTAMP(3)\n"
                + ") WITH (\n"
                + "  'connector' = 'print'\n"
                + ");\n"
                + "\n"
                + "INSERT INTO sink_table\n"
                + "SELECT user_id,\n"
                + "       name,\n"
                + "       age,\n"
                + "       row_time\n"
                + "FROM source_table,\n"
                // Table Function Join 語法對應 LATERAL TABLE
                + "LATERAL TABLE(user_profile_table_func(user_id)) t(age)";

        Arrays.stream(sql.split(";"))
                .forEach(flinkEnv.streamTEnv()::executeSql);
    }

    public static class UserProfileTableFunction extends TableFunction<Integer> {

        public void eval(long userId) {
            // 自定義輸出邏輯
            if (userId <= 5) {
                // 一行轉(zhuǎn) 1 行
                collect(1);
            } else {
                // 一行轉(zhuǎn) 3 行
                collect(1);
                collect(2);
                collect(3);
            }
        }

    }
}

執(zhí)行結(jié)果如下:文章來源地址http://www.zghlxwxcb.cn/news/detail-857337.html

-- userId <= 5,則只有 1 行結(jié)果
+I[3, 7, 1, 2021-05-01T18:23:42.560]
-- userId > 5,則有行 3 結(jié)果
+I[8, e, 1, 2021-05-01T18:23:42.560]
+I[8, e, 2, 2021-05-01T18:23:42.560]
+I[8, e, 3, 2021-05-01T18:23:42.560]
-- userId <= 5,則只有 1 行結(jié)果
+I[4, 9, 1, 2021-05-01T18:23:42.561]
-- userId > 5,則有行 3 結(jié)果
+I[8, c, 1, 2021-05-01T18:23:42.561]
+I[8, c, 2, 2021-05-01T18:23:42.561]
+I[8, c, 3, 2021-05-01T18:23:42.561]

到了這里,關(guān)于【大數(shù)據(jù)】Flink SQL 語法篇(七):Lookup Join、Array Expansion、Table Function的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務器費用

相關(guān)文章

  • 【flink番外篇】15、Flink維表實戰(zhàn)之6種實現(xiàn)方式-通過Temporal table實現(xiàn)維表數(shù)據(jù)join

    一、Flink 專欄 Flink 專欄系統(tǒng)介紹某一知識點,并輔以具體的示例進行說明。 1、Flink 部署系列 本部分介紹Flink的部署、配置相關(guān)基礎(chǔ)內(nèi)容。 2、Flink基礎(chǔ)系列 本部分介紹Flink 的基礎(chǔ)部分,比如術(shù)語、架構(gòu)、編程模型、編程指南、基本的datastream api用法、四大基石等內(nèi)容。 3、

    2024年01月20日
    瀏覽(27)
  • 【flink番外篇】9、Flink Table API 支持的操作示例(14)- 時態(tài)表的join(java版本)

    一、Flink 專欄 Flink 專欄系統(tǒng)介紹某一知識點,并輔以具體的示例進行說明。 1、Flink 部署系列 本部分介紹Flink的部署、配置相關(guān)基礎(chǔ)內(nèi)容。 2、Flink基礎(chǔ)系列 本部分介紹Flink 的基礎(chǔ)部分,比如術(shù)語、架構(gòu)、編程模型、編程指南、基本的datastream api用法、四大基石等內(nèi)容。 3、

    2024年02月02日
    瀏覽(20)
  • 【大數(shù)據(jù)】Flink SQL 語法篇(一):CREATE

    CREATE 語句用于向當前或指定的 Catalog 中注冊庫、表、視圖或函數(shù)。注冊后的庫、表、視圖和函數(shù)可以在 SQL 查詢中使用。 目前 Flink SQL 支持下列 CREATE 語句: CREATE TABLE CREATE DATABASE CREATE VIEW CREATE FUNCTION 下面的 SQL 語句就是建表語句的定義,根據(jù)指定的表名創(chuàng)建一個表,如果同

    2024年02月21日
    瀏覽(24)
  • Flink Temporal Join 系列 (4):用 Temporal Table Function 實現(xiàn)基于處理時間的關(guān)聯(lián)

    Flink Temporal Join 系列 (4):用 Temporal Table Function 實現(xiàn)基于處理時間的關(guān)聯(lián)

    博主歷時三年精心創(chuàng)作的《大數(shù)據(jù)平臺架構(gòu)與原型實現(xiàn):數(shù)據(jù)中臺建設(shè)實戰(zhàn)》一書現(xiàn)已由知名IT圖書品牌電子工業(yè)出版社博文視點出版發(fā)行,點擊《重磅推薦:建大數(shù)據(jù)平臺太難了!給我發(fā)個工程原型吧!》了解圖書詳情,京東購書鏈接:https://item.jd.com/12677623.html,掃描左側(cè)

    2024年04月23日
    瀏覽(18)
  • 大數(shù)據(jù)Flink(一百零三):SQL 表值聚合函數(shù)(Table Aggregate Function)

    大數(shù)據(jù)Flink(一百零三):SQL 表值聚合函數(shù)(Table Aggregate Function)

    文章目錄 SQL 表值聚合函數(shù)(Table Aggregate Function) Python UDTAF,即 Python TableAggregateFunction。Python UDTAF 用來針對一組數(shù)據(jù)進行聚合運算,比如同一個 window 下的多條數(shù)據(jù)、或者同一個 key 下的多條數(shù)據(jù)等,與 Python UDAF 不同的是,針對同一組輸入數(shù)據(jù),Python UDTAF 可以產(chǎn)生 0 條、1 條

    2024年02月07日
    瀏覽(40)
  • 【flink番外篇】9、Flink Table API 支持的操作示例(7)- 表的join操作(內(nèi)聯(lián)接、外聯(lián)接以及聯(lián)接自定義函數(shù)等)

    一、Flink 專欄 Flink 專欄系統(tǒng)介紹某一知識點,并輔以具體的示例進行說明。 1、Flink 部署系列 本部分介紹Flink的部署、配置相關(guān)基礎(chǔ)內(nèi)容。 2、Flink基礎(chǔ)系列 本部分介紹Flink 的基礎(chǔ)部分,比如術(shù)語、架構(gòu)、編程模型、編程指南、基本的datastream api用法、四大基石等內(nèi)容。 3、

    2024年01月19日
    瀏覽(26)
  • 24、Flink 的table api與sql之Catalogs(java api操作數(shù)據(jù)庫、表)-2

    一、Flink 專欄 Flink 專欄系統(tǒng)介紹某一知識點,并輔以具體的示例進行說明。 1、Flink 部署系列 本部分介紹Flink的部署、配置相關(guān)基礎(chǔ)內(nèi)容。 2、Flink基礎(chǔ)系列 本部分介紹Flink 的基礎(chǔ)部分,比如術(shù)語、架構(gòu)、編程模型、編程指南、基本的datastream api用法、四大基石等內(nèi)容。 3、

    2024年02月04日
    瀏覽(26)
  • Flink-SQL join 優(yōu)化 -- MiniBatch + local-global

    Flink-SQL join 優(yōu)化 -- MiniBatch + local-global

    問題1. 近期在開發(fā)flink-sql期間,發(fā)現(xiàn)數(shù)據(jù)在啟動后,任務總是進行重試,運行一段時間后,container heartbeat timeout,內(nèi)存溢出(GC overhead limit exceede) ,作業(yè)無法進行正常工作 問題2. 未出現(xiàn)container心跳超時的,作業(yè)運行緩慢,超過一天 ,作業(yè)仍存在反壓情況 查看日志內(nèi)容發(fā)現(xiàn),出

    2024年02月06日
    瀏覽(28)
  • MySQL基礎(chǔ)篇補充 | 多表查詢中使用SQL99實現(xiàn)7種JOIN操作、SQL99語法新特性

    MySQL基礎(chǔ)篇補充 | 多表查詢中使用SQL99實現(xiàn)7種JOIN操作、SQL99語法新特性

    目錄 一:多表查詢中使用SQL99實現(xiàn)7種JOIN操作? 二:SQL99語法新特性 1. 自然連接Natural 2.?USING連接 在多表查詢中,除了遇到最多的內(nèi)連接、左外連接和右外連接,還有其它的連接方式;接下來就聊聊其它的連接方式,如下圖:???????? 并且在正式講解之前,需要先了解

    2024年02月03日
    瀏覽(24)
  • MySQL基礎(chǔ)~NATURAL JOIN(自然連接) 和USING的使用(SQL99語法新特性)

    我們在查詢兩張表時,可能會將 連接條件 設(shè)為 相同的字段 ,如下: 而有了 NATURAL JOIN 自然連接后,它會幫我們自動查詢兩張表中 所有相同的字段 ,然后 進行 等值連接 ,這樣就可以直接省略連接條件 這兩種寫法效果相同,查詢到的都是同一個結(jié)果 優(yōu)點 是簡化了SQL語句,查

    2024年02月04日
    瀏覽(23)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包