前端學資料庫之多表操作

来源:http://www.cnblogs.com/xiaohuochai/archive/2016/11/18/6078814.html
-Advertisement-
Play Games

[1]準備工作 [2]多表更新 [3]兩步更新 [4]連接 [5]無限級表 ...


×
目錄
[1]準備工作 [2]多表更新 [3]兩步更新[4]連接[5]無限級表

前面的話

  上一篇博文中介紹了子查詢的相關內容,最後我們將查詢結果存儲到一個新的數據表中。下麵我們將接著子查詢的案例,詳細介紹資料庫中的多表操作

 

準備工作

  在上一篇博文,我們將詳細數據存儲到tdb_goods數據表中,將詳細數據中的類別信息存儲到tdb_goods_cates數據表中

  接下來,我們要研究如何通過tdb_goods_cates數據表來更新tdb_goods表

 

多表更新

  多表更新類似於單表更新

UPDATE table_references SET col_name1={expr1|DEFAULT}
[,col_name2={expr2|DEFAULT}]...
[WHERE where_condition]

  表的參照關係如下:

table_reference
{[INNER | CROSS] JOIN |{LEFT|RIGHT} [OUTER] JOIN}
table_reference
ON conditional_expr

  從結果中看出,tdb_goods數據表中goods_cate列中的值已經更新為tdb_goods_cates數據表中對應的cate_id的值。這樣一來,用數字替代字元串,極大地節省了存儲空間

 

兩步更新

  在上面的多表更新的操作中,實際上我們經過了兩個步驟,先創建了一個空表,將原數據表的查詢結果寫入空表,再利用寫入結果的表反向更新原數據表

  如果使用CREATE SELECT語句將可以實現兩步更新,在創建數據表同時將查詢結果寫入到數據表(合併了CREATE和INSERT...SELECT兩個操作步驟),再利用寫入結果的表反向更新原數據表

CREATE TABLE [IF NOT EXISTS] tbl_name
[(create_definition,...)]
select_statement

  下麵來處理原數據表tdb_goods中的品牌信息,首先查詢tdb_goods表的"品牌",並分組

SELECT brand_name FROM tdb_goods GROUP BY brand_name;

  將品牌信息放入新表tdb_goods_brands中

  CREATE TABLE tdb_goods_brands (
    brand_id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
    brand_name VARCHAR(40) NOT NULL
  ) SELECT brand_name FROM tdb_goods GROUP BY brand_name;

  再參照品牌表,更新原商品數據表

  這裡要註意的是,兩張表中,同時存在brand_name這個欄位。要區分它們,需要給它們起不同的別名或在欄位前面加入表名

  查看商品數據表的列結構,我們發現,雖然數據被修改為了數字,但數據類型仍然是字元型

  下麵修改商品數據表中goods_cate和brand_name的列名稱和列類型

  這樣,我們已經將一個大的數據表分為小的數據表進行存儲了。現在,分別在tdb_goods_cates和tdb_goods_brands表再插入幾條新的記錄

INSERT tdb_goods_cates(cate_name) VALUES('路由器'),('交換機'),('網卡');
INSERT tdb_goods_brands(brand_name) VALUES('海爾'),('清華同方'),('神舟');

  在tdb_goods數據表也寫入新的記錄

 INSERT tdb_goods(goods_name,cate_id,brand_id,goods_price) VALUES(' LaserJet Pro P1606dn 黑白激光印表機','12','4','1849');

 

連接

  通過上面的操作,已經把重覆的數據分散到不同的數據表中進行存儲了,儘可能的節省存儲空間了。但是,顯示時,卻需要把原來的數據顯示出來,這就需要使用下麵要介紹的概念——連接

語法結構

  MySQL在SELECT語句、多表更新、多表刪除語句中支持連接(JOIN)操作

table_reference
{[INNER | CROSS] JOIN |{LEFT|RIGHT} [OUTER] JOIN}
table_reference
ON conditional_expr

  數據表參照(table_reference)時,數據表可以使用tbl_name AS alias_name 或tbl_name alias_name賦予別名

  table_subquery可以作為子查詢使用在FROM子句中,這樣的子查詢必須為其賦予別名

tbl_name[[AS] alias] | table_subquery [AS] alias

連接類型

  連接類型主要包括內連接(INNER JOIN)、左外連接(LEFT [OUTER] JOIN)、右外連接(RIGHT [OUTER] JOIN)

  在mysql中,JOIN、CROSS JOIN 和 INNER JOIN是等價的

連接條件

  使用ON關鍵字來設定連接條件,也可以使用WHERE來代替。一般地,使用ON關鍵字來設定連接條件,使用WHERE關鍵字進行結果集記錄的過濾

內連接

  內連接顯示左表及右表符合連接條件的記錄

  下麵通過內連接來查詢所有商品的詳細信息,原來商品表中有24件商品,但只顯示出23件,因為那一件不符合連接條件

  

  關於內連接,有以下註意:使用內連接查找的記錄在連接數據表中不存在,並且在WHERE子句中嘗試一下操作:column_name IS NULL 。如果 column_name 被指定為 NOT NULL,MySQL將在找到符合連接著條件的記錄後停止搜索更多的行(查找衝突)

左外連接

  左外連接指顯示左表的全部記錄及右表符合連接條件的記錄

  下麵通過左外連接來查詢所有商品的詳細信息,原來商品表中有24件商品,現在也顯示出24件,但最後一件商品的分類為NULL,這是因為右表的這一個分類不符合條件,所以顯示為NULL

右外連接

  右外連接指顯示右表的全部記錄及左表符合連接條件的記錄

  下麵通過右外連接來查詢所有商品的詳細信息,原來商品表中有24件商品,現在顯示出26件,多出來的是符合右表但不符合左表的記錄

  關於外連接,有以下幾點註意,以左外連接為例

A LEFT JOIN B join_condition

  數據表B的結果集依賴於數據表A,數據表A的結果集根據左連接條件依賴所有數據表(B表除外)

  左外連接條件決定如何檢索數據表B(在沒有指定WHERE條件的情況下)

  如果數據表A的某條記錄符合WHERE條件,但是在數據表B不存在符合連接條件的記錄,將生成一個所有列為空的額外的B行

多表連接

  三張表以上的連接稱為多表連接,原理與兩張表的連接相同

  下麵通過內連接實現查詢所有商品的詳細信息

 

無限級表

  上圖中是tdb_goods_cates表的記錄。但實際的分類並非這10類,而是無限分類。下麵來介紹無限分類的數據表的實現

  無限級表至少需要三個列,一個是類型id,一個類型名稱,一個是父級id

CREATE TABLE tdb_goods_types(
 type_id   SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
 type_name VARCHAR(20) NOT NULL,
 parent_id SMALLINT UNSIGNED NOT NULL DEFAULT 0
); 

  然後,寫入給定數據

自身連接

  自身連接指同一個數據表對其自身進行連接。為作區分,需要添加別名。字表別名定義為s,父表別名定義為p

  下麵來查找所有分類及其父類

  下麵來查找所有分類及其子類

  下麵來查找所有分類及其子類的數目

刪除重覆項

  從記錄中,可以看出24條記錄中存在重覆的項,現在要想辦法把重覆的項刪除

  首先,先查找到重覆的項

  然後,需要使用多表刪除來實現刪除操作

DELETE tbl_name[.*][,tbl_name[.*]]...
FROM table_references
[WHERE where_condition]


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • AndRodi Studio中的按鈕時件註冊一定要寫在onCraete中 ...
  • 相信很多同學都為調試蘋果的通知煩惱過,特別是通過通知啟動app這個功能,簡直讓人欲哭無淚!!! 然而我們都遇到的問題,蘋果怎麼可能沒有想到,原來早就有了官方的解決辦法,只是我們不知道而已。。。 這次又是從stackOverFlow上找到了答案,必須記錄一下!!! iOS10以後,通知框架被完全重構了 ...
  • 當一個程式第一次啟動的時候,Android會啟動一個LINUX進程和一個主線程。預設的情況下,所有該程式的組件都將在該進程和線程中運行。 同時,Android會為每個應用程式分配一個單獨的LINUX用戶。Android會儘量保留一個正在運行進程,只在記憶體資源出現不足時,Android會嘗試停止一些進 ...
  • 1.路徑最好不要是自己拼寫的路徑/mnt/shell/emulated/0/wifidog.conf 最好是通過方法獲取的路徑,不然可能導致命令無效 (掛載點的原因) public static final String SDCARD_ROOT=Environment.getExternalStor ...
  • 前言 啦啦啦~大家好,又見面啦~ 本篇博文講和大家一起完成一個需要註冊、登錄的備忘錄的,一起學習 SharedPreferences 的基本使用,學習 Android 中常見的文件操作方法,複習 Android 界面編程。 直接進入正題~ 基礎知識 1.SharedPreferences 的使用 使 ...
  • 繼前一篇大體上翻譯了Email的Action配置,本篇繼續看一下Shell的相關配置。 Shell Action Shell Action可以執行Shell腳本命令,工作流會等到shell完全執行完畢後退出,再執行下一個節點。為了運行shell,必須配置 以及 ,並且設置 來執行shell. She ...
  • 1.0點擊VMware快捷方式,右鍵打開文件所在位置 -> 雙擊vmnetcfg.exe -> VMnet1 host-only ->修改subnet ip 設置網段:192.168.1.0 子網掩碼:255.255.255.0 -> apply -> ok 回到windows --> 打開網路和共 ...
  • 安裝clamav 之前還需要安裝zlib 要不然安裝過程中會報錯的.tar -zxvf zlib-1.2.3.tar.gzcd zlib-1.2.3./configuremakemake install (zlib 編譯安裝)因為我用源碼包安裝,需要手動創建clamav 用戶groupadd cla ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...