《MySQL必知必會》知識彙總四

来源:https://www.cnblogs.com/Changes404/archive/2022/12/06/16960428.html
-Advertisement-
Play Games

十七、插入數據 本章將介紹如何利用sql的INSERT語句將數據插入表中 數據插入 插入分為以下幾種方式:插入完整的行、插入行的一部分、插入多行、插入某些查詢結果 插入完整的行 INSERT INTO Customers VALUES(NULL, 'Pep E. LaPew', '100 Main ...


十七、插入數據

本章將介紹如何利用sql的INSERT語句將數據插入表中

  • 數據插入

插入分為以下幾種方式:插入完整的行、插入行的一部分、插入多行、插入某些查詢結果

  • 插入完整的行
INSERT INTO Customers
VALUES(NULL,
   'Pep E. LaPew',
   '100 Main Street',
   'Los Angeles',
   'CA',
   '90046',
   'USA',
   NULL,
   NULL);

上述sql語句將高度依賴於表中列的定義次序,某個列沒有值,應該設置為null

INSERT INTO customers(cust_name,
   cust_address,
   cust_city,
   cust_state,
   cust_zip,
   cust_country,
   cust_contact,
   cust_email)
VALUES('Pep E. LaPew',
   '100 Main Street',
   'Los Angeles',
   'CA',
   '90046',
   'USA',
   NULL,
   NULL);

此時該sql指定了插入具體列名,那麼values的順序就將與指定的插入列一一對應

註意:

一般建議使用這種指定插入列的INSERT語句

不論使用上述哪種INSERT語句,values必須為每個列提供值

使用指定列的INSERT語句並不用將所有列都指定出來,可以省略列,指定列的順序也不用與資料庫表中列的順序一致,但是省略的列必須允許為NULL值或者表定義中給出預設值

  • 插入多個行

當前可以多次執行INSERT語句實現插入多個行,但是也可以使用一條INSERT語句

INSERT INTO customers(cust_name,
   cust_address,
   cust_city,
   cust_state,
   cust_zip,
   cust_country)
VALUES(
        'Pep E. LaPew',
        '100 Main Street',
        'Los Angeles',
        'CA',
        '90046',
        'USA'
     ),
      (
        'M. Martian',
        '42 Galaxy Way',
        'New York',
        'NY',
        '11213',
        'USA'
   );

建議使用這種單條INSERT語句來插入多行數據,會提高性能

  • 插入檢索出的數據

需求:想從另一表中合併客戶列表到你的customers表。

INSERT INTO customers(cust_id,
    cust_contact,
    cust_email,
    cust_name,
    cust_address,
    cust_city,
    cust_state,
    cust_zip,
    cust_country)
SELECT cust_id,
    cust_contact,
    cust_email,
    cust_name,
    cust_address,
    cust_city,
    cust_state,
    cust_zip,
    cust_country
FROM custnew;

註意:

custnew表與customers表具有相同的表結構

上述sql中,不需要select返回的列名與customers的列名一致,它使用的是列的位置,select的第一列(不管其列名)將填充表列中指定的第一列

當然,select語句還可以使用where子句進行過濾數據!

十八、更新和刪除數據

本章將介紹如何利用UPDATE和DELETE語句進一步操縱表數據

  • 更新數據

可採用兩種方式使用update:更新表中特定行、更新表中所有行

update customers
set cust_emal = '[email protected]'
where cust_id = 10005;

註意:

不要省略where語句,否則將會更新所有行

update customers
set cust_emal = '[email protected]',
    cust_name = 'The Fudds'
where cust_id = 10005;

通過單個set命令,可以更新多個列

UPDATE IGNORE customers 
set cust_emal = '[email protected]',
    cust_name = 'The Fudds'
where cust_id = 10005;

如果在更新行時,出現一行或者多行錯誤,則整個UPDATE操作被取消,當然可以是使用IGNORE關鍵字進行繼續更新

  • 刪除數據

同樣可以採用兩種方式使用DELETE:從表中刪除特定行、從表中刪除所有行

delete from customers
where cust_id = 10006;

註意:

如果忽略了where子句,將刪除所有行

更快的刪除

如果想從表中刪除所有行,可以使用TRUNCATE TABLE,速度更快,實際上底層是刪除表後再新建一個表

  • 更新和刪除的指導原則

一定要使用帶where的update和delete語句

使用where子句前先用select進行查看測試,防止where過濾的數據不正確

MySQL沒有撤銷命令,一定要小心使用!

十九、創建和操縱表

本章講述表的創建、更改和刪除的基本知識

  • 表的基本創建
CREATE TABLE customers
(
  cust_id      int       NOT NULL AUTO_INCREMENT,
  cust_name    char(50)  NOT NULL ,
  cust_address char(50)  NULL ,
  cust_city    char(50)  NULL ,
  cust_state   char(5)   NULL ,
  cust_zip     char(10)  NULL ,
  cust_country char(50)  NULL ,
  cust_contact char(50)  NULL ,
  cust_email   char(255) NULL ,
  PRIMARY KEY (cust_id)
) ENGINE=InnoDB;

需要給出以下信息:

新表的名字,再create table後給出

表列的名字和定義,用逗號隔開

註意:

在創建新的表時,指定的表名必須不存在,可以在表名後使用IF NOT EXISTS做判斷

  • 使用NULL值

null值就是沒有值或者缺少值,上述創建表的sql中,cust_id、cust_name就不能為空,其他可以為空

不要將null值與空串相混淆,空串是一個有效的值,它不是無值

  • 主鍵再介紹
PRIMARY KEY (vend_id)

或者

PRIMARY KEY (order_num,order_id)

可以使用單個列作為主鍵,也可以使用組合列作為主鍵

主鍵不允許使用null值

  • 使用AUTO_INCREMENT
cust_id  int  NOT NULL AUTO_INCREMENT

這樣MySQL在插入數據時,自動分配一個遞增的int值

使用SELECT last_insert_id()函數將能查看最後一個自增的值

  • 指定預設值
quantity  int  NOT NULL DEFAULT 1

表示在未給出數量的情況下使用預設數量1

  • 引擎類型
ENGINE=InnoDB

還可以使用其他引擎如MyISAM

  • 更新表

通過alter table來改變表結構,必須給出要更改的表名,所作更改的列

ALTER TABLE vendors
ADD vend_phone CHAR(20);
ALTER TABLE vendors
DROP COLUME vend_phone;

註意:

一定要小心使用alter table,刪除了不該刪除的列,會造成數據丟失

  • 刪除表
DROP TABLE customers2;
  • 重命名錶
RENAME TABLE customers2 TO customers;

二十、使用視圖

本章將介紹何為視圖,怎樣工作的,何時使用,利用視圖簡化sql

需求:從三個表中檢索數據

SELECT cust_name, cust_contact
FROM customers, orders, orderitems
WHERE customers.cust_id = orders.cust_id
  AND orderitems.order_num = orders.order_num
  AND prod_id = 'TNT2';

如果三個表的數據都在一張表中,那麼sql將變為

SELECT cust_name,cust_contact
FROM productcustomers
WHERE prod_id ='TNT2';

這就是視圖的作用,productcustomers可以看作是一個視圖,它不包含表中應該有的數據,僅包含的是一個SQL查詢

  • 為什麼使用視圖

重用SQL語句,簡化複雜的SQL操作,使用表的組成部分、保護數據、更改數據格式和表示

視圖本身不包含數據,返回的數據是從其他表中檢索出來的

性能問題

每次使用視圖之前都要處理查詢後返回給視圖,處理複雜多表聯查會降低性能

註意:

視圖不能有索引、必須有足夠的訪問許可權

  • 使用視圖

使用SHOW CREATE VIEW viewname;來查看創建視圖的語句。

用DROP刪除視圖,其語法為DROP VIEW viewname;

更新視圖時,可以先用DROP 再用CREATE,也可以直接用CREATE OR REPLACE VIEW。如果要更新的視圖不存在,則第2條更新語句會創建一個視圖;如果要更新的視圖存在,則第2條更新語句會替換原有視圖

  • 使用視圖簡化複雜聯結
CREATE VIEW productcustomers AS
SELECT cust_name, cust_contact, prod_id
FROM customers, orders, orderitems
WHERE customers.cust_id = orders.cust_id
  AND orderitems.order_num = orders.order_num;

該sql創建了productcustomers視圖,聯結了三個表,返回訂購了任意商品的客戶信息

SELECT cust_name,cust_contact
FROM productcustomers
WHERE prod_id ='TNT2';

因此,檢索購買了TNT的客戶這條sql即可滿足

  • 使用視圖重新格式話檢索的數據
CREATE VIEW vendorlocations AS
SELECT Concat(RTrim(vend_name), ' (', RTrim(vend_country), ')')
       AS vend_title
FROM vendors
ORDER BY vend_name;
  • 用視圖過濾不想要的數據
CREATE VIEW customeremaillist AS
SELECT cust_id, cust_name, cust_email
FROM customers
WHERE cust_email IS NOT NULL;
  • 使用視圖與計算欄位
CREATE VIEW orderitemsexpanded AS
SELECT order_num,
       prod_id,
       quantity,
       item_price,
       quantity*item_price AS expanded_price
FROM orderitems;
  • 更新視圖

其實,對視圖更新也就是對視圖表示的基表進行更新,通過視圖增加和刪除一行,也是對基表進行增加和刪除

但是如果視圖涉及到分組、聯結、子查詢、並、聚集函數、DISTINCT、計算列那將不能進行更新

一般將視圖用於檢索而不用於更新


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

-Advertisement-
Play Games
更多相關文章
  • 一、序言 關於HuTool工具包,相信很多技術朋友都聽說甚至使用過。在HuTool之前,已經有比較成熟的工具包比如Apache Common包,谷歌推出的Guava包,他們已經在全世界大範圍使用了。 究竟是什麼原因導致HuTool有後來居上的趨勢,傳統的工具包對於國內開發者來講劣勢在哪裡呢,不妨來扒 ...
  • 簡介 CSAPP實驗介紹 學生實現他們自己的帶有作業控制的Unix Shell程式,包括Ctrl + C和Ctrl + Z按鍵,fg,bg,和 jobs命令。這是學生第一次接觸併發,並且讓他們對Unix的進程式控制制、信號和信號處理有清晰的瞭解。 什麼是Shell? ​ Shell就是用戶與操作系統內核 ...
  • JZ33 二叉搜索樹的後序遍歷序列 描述 輸入一個整數數組,判斷該數組是不是某二叉搜索樹的後序遍歷的結果。如果是則返回 true ,否則返回 false 。假設輸入的數組的任意兩個數字都互不相同。 提示: 1.二叉搜索樹是指父親節點大於左子樹中的全部節點,但是小於右子樹中的全部節點的樹。 2.該題我 ...
  • 前言 在使用mybatis框架進行開發時,編寫sql少不了<=,>=,>,<,<>等比較符號,但是直接在mapper文件中,直接使用這些符號是不行的,此時就需要對類似於這種的符號進行轉換。 正文 直接符號轉義 以下羅列出sql中的比較符合和對應的轉義符號: 大於 > ==> &gt; 大於等於 >= ...
  • 本文主要介紹方法引用的5種形式:對象的非靜態方法引用、類的靜態方法引用、類的非靜態方法引用、構造器的引用、數組的引用。 ...
  • 有來實驗室結合正式的商城訂單支付業務場景將 Seata 分散式事務可視化,通過現象去看本質(原理和源碼),告別被動式輸入的短期記憶學習。 ...
  • C# 簡介 C#是微軟公司發佈的一種由C和C++衍生出來的面向對象的編程語言,它不僅去掉了 C++ 和 Java 語言中的一些複雜特性,還提供了可視化工具,能夠高效地編寫程式。 C#是由C和C++衍生出來的一種安全的、穩定的、簡單的、優雅的面向對象編程語言。它在繼承C和C++強大功能的同時去掉了一些 ...
  • 防禦式編程的重點就是需要防禦一些程式未曾預料的錯誤,這是一種提高軟體質量的輔助性方法,斷言assert就用於防禦式編程,編寫代碼時,我們總是會做出一些假設,斷言就是用於在代碼中捕捉這些假設。使用斷言是為了驗證預期的結果——當程式執行到斷言的位置時,對應的斷言應該為真;若斷言不為真時,程式會終止執行, ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...