書籍筆記-《SQL必會知識》

1、概念

  1. 數據庫:DB(database)
  2. 數據庫軟件:DBMS(database manage system)

2、基本操做

SELECT操做

  1. 從 products表中檢索一個名爲prod_name和prod_id的列 

    SELECT prod_name,prod_id FROM products;複製代碼

  2.   從 products表中檢索全部的列  

    SELECT * FROM products;複製代碼

  3. 從 products表中檢索全部供應商(過濾相同的id),使用 DISTINCT 關鍵字

    SELECT DISTINCT vend_id FROM products;複製代碼

  4. 從 products表中檢索很少於5行數據,使用 LIMIT 關鍵字
    • 獲取前5行(從第一行開始,索引爲0即LIMIT 0,5)

      SELECT prod_name FROM products LIMIT 5;複製代碼

    • 從第6行開始,獲取10條數據(指定開始的行數,和獲取的行數)

      // 第1種方式
      SELECT prod_name FROM products LIMIT 5,10;
      // 第2中方式
      SELECT prod_name FROM products LIMIT 10 OFFSET 6;複製代碼
  5. 限定數據庫下的表和表下的列名稱

    SELECT products.prod_name FROM carshcourse.products;複製代碼

排序檢索數據

排序規則說明:默認按照字母排序,不區分大小寫(如要區分大小寫,須要在數據庫中設置,經過SQL語句設置不了)git

  1. 先按價格排序,而後在每一個價格中再按名排序 ,使用 ORDER BY 

    SELECT prod_id,prod_price,prod_name FROM products ORDER BY prod_price,prod_name;複製代碼

  2. 指定排序方向,使用 DESC (降序)

    SELECT prod_id,prod_price,prod_name FROM products ORDER BY prod_price DESC;複製代碼

  3. 多個排序字段,指定排序方向,未指定的字段按照默認升序 (ASC) 排序

    SELECT prod_id,prod_price,prod_name FROM products ORDER BY prod_price DESC,prod_name;複製代碼

  4. 使用ORDER BY和LIMIT的組合,可以找出一個列中最高或最低的值 

    SELECT prod_price FROM products ORDER BY prod_price DESC LIMIT 1; 複製代碼

簡單過濾數據

  1. 從products表中檢索兩個列,但不返回全部行,只返回prod_price值爲2.50的行  

    SELECT prod_price,prod_name FROM products WHERE prod_price = 2.50; 複製代碼

  2. 條件操做符:等於(=)、不等於(<>或者!=)、小於(<)、小於等於(<=)、大於(>)、大於等於(>=)、在指定的兩個值之間(BETWEEN)在使用 BETWEEN 時,必須指定兩個值——所需範圍的低端值和高端值。這兩個值必須用AND關鍵字分隔

    SELECT prod_price,prod_name FROM products WHERE prod_price BETWEEN 5 AND 10; 複製代碼

  3. 空值(NULL)檢查

    SELECT prod_name FROM products WHERE prod_price IS NULL; 複製代碼

複雜數據過濾

  1. 檢索由供應商1003製造且價格小於等於10美圓的全部產品的名稱和價格 ( AND )

    SELECT prod_price,prod_name FROM products WHERE vend_id = 1003 AND prod_price = 10; 複製代碼

  2. 檢索由任一個指定供應商製造的全部產品的產品名和價格  ( OR )

    SELECT prod_price,prod_name FROM products WHERE vend_id = 1002 OR vend_id = 1003; 複製代碼

  3. 列出價格爲10美圓(含)以上且由1002或1003製造的全部產品 ,必定要使用「()」,由於AND的計算次序優先級高於OR

    SELECT prod_price,prod_name FROM products WHERE (vend_id = 1002 OR vend_id = 1003) AND prod_price >= 10;; 複製代碼

  4. IN操做符 - 用來指定條件範圍 。例:檢索供應商1002和1003製造的全部產品  
    // 在使用長的合法選項清單時, IN操做符的語法更清楚且更直觀 
    // 在使用IN時,計算的次序更容易管理(由於使用的操做符更少)
    // IN操做符通常比OR操做符清單執行更快
    // IN的最大優勢是能夠包含其餘SELECT語句,使得可以更動態地創建WHERE子句
    SELECT prod_price,prod_name FROM products WHERE vend_id IN (1002,1003);複製代碼
  5. NOT操做符 - 否認以後所跟的任何條件。 例:列出除1002和1003以外的全部供應商製造的產品  

    SELECT prod_price,prod_name FROM products WHERE vend_id NOT IN (1002,1003);複製代碼

通配符過濾數據

  1. LIKE操做符
    • 百分號(%)通配符 - 表示任何字符出現任意次數。 注意:尾部的空格會干擾通配符匹配,即便值使用"%",也不能匹配值爲NULL的元素。 

      // 例:檢索任意以jet起頭的詞 
      SELECT prod_price,prod_name FROM products WHERE product_name LIKE 'jet%';
      // 例:匹配任何位置包含文本anvil的值 
      SELECT prod_price,prod_name FROM products WHERE product_name LIKE '%anvil%';
      // 例:找出以s起頭以e結尾的全部產品 
      SELECT prod_price,prod_name FROM products WHERE product_name LIKE 's%e';複製代碼

    • 下劃線(_)通配符 - 用途與%同樣,但下劃線只匹配單個字符而不是多個字符。
      正則表達式

      // a jet , b jet * jet 這些均可以匹配
      SELECT prod_price,prod_name FROM products WHERE product_name LIKE '_ jet';複製代碼
    • 注意:%能匹配0個或多個字符,_老是匹配一個字符,不能多也不能少
  2. 使用技巧:由於通配符搜索的處理通常要比前面討論的其餘搜索所花時間更長 ,因此通配符使用時應注意如下幾點
    • 不要過分使用通配符。若是其餘操做符能達到相同的目的,應該
      使用其餘操做符。
    •  在確實須要使用通配符時,除非絕對有必要,不然不要把它們用
      在搜索模式的開始處。把通配符置於搜索模式的開始處,搜索起
      來是最慢的

正則表達式

  1. 使用 REGEXP 關鍵字(默認匹配不區分大小寫,添加 BINARY 關鍵字能夠設置區分大小寫),例:檢索列prod_name包含文本1000的全部行:

    SELECT prod_name FROM products WHERE product_name REGEXP '1000';複製代碼

  2. 檢索列prod_name包含文本1000或2000的全部行,使用"|"

    SELECT prod_name FROM products WHERE product_name REGEXP '1000|2000';複製代碼

  3. 匹配幾個字符之一 ,使用"[]" 

    // 1 Ton, a Ton, b Ton均可以被匹配
    SELECT prod_name FROM products WHERE product_name REGEXP '[1ab] Ton';
    // 等價於
    SELECT prod_name FROM products WHERE product_name REGEXP '[1|a|b] Ton';複製代碼

  4. 匹配除指定字符外的任何東西 ,使用"^"

    SELECT prod_name FROM products WHERE product_name REGEXP '[^1ab] Ton';複製代碼
  5. 匹配範圍:[0-9]

    SELECT prod_name FROM products WHERE product_name REGEXP '[0-9] Ton';複製代碼

  6. 匹配特殊字符 :如匹配"."則須要寫成"\\." 

    SELECT prod_name FROM products WHERE product_name REGEXP '\\.';複製代碼

  7. 匹配任意字符:"."

    SELECT prod_name FROM products WHERE product_name REGEXP '.';複製代碼

  8. 字符類匹配
    • [:alnum:] 任意字母和數字(同[a-zA-Z0-9]) 
    • [:alpha:] 任意字符(同[a-zA-Z])
    • [:blank:] 空格和製表(同[\\t])
    • [:cntrl:] ASCII控制字符(ASCII 0到31和127)
    • [:digit:] 任意數字(同[0-9])
    • [:graph:] 與[:print:]相同,但不包括空格
    • [:lower:] 任意小寫字母(同[a-z])
    • [:print:] 任意可打印字符
    • [:punct:] 既不在[:alnum:]又不在[:cntrl:]中的任意字符
    • [:space:] 包括空格在內的任意空白字符(同[\\f\\n\\r\\t\\v])
    • [:upper:] 任意大寫字母(同[A-Z])
    • [:xdigit:] 任意十六進制數字(同[a-fA-F0-9])
  9. 多個匹配
    • *         0個或多個匹配
    • +        1個或多個匹配(等於{1,})
    • ?         0個或1個匹配(等於{0,1})
    • {n}      指定數目的匹配
    • {n,}     很多於指定數目的匹配
    • {n,m}  匹配數目的範圍(m不超過255)  
  10. 例:匹配連在一塊兒的4位數字  

    SELECT prod_name FROM products WHERE product_name REGEXP '[[:digit:]]{4}';
    // 等價於
    SELECT prod_name FROM products WHERE product_name REGEXP '[0-9]{4}';
    // 等價於
    SELECT prod_name FROM products WHERE product_name REGEXP '[0-9][0-9][0-9][0-9]';複製代碼
  11. 定位符
    • ^          文本的開始(注意:在集合中(用[和]定義),用它來否認該集合 )
    • $          文本的結尾
    • [[:<:]]   詞的開始
    • [[:>:]]   詞的結尾  

計算字段及經常使用數據處理函數

  1. 拼接字段 Concat 。例:建立由兩列組成的標題 

    SELECT Concat(vend_name,'(',vend_country,')') FROM vendors;複製代碼

  2. RTrim()(去掉字符串右邊的空格),LTrim()(去掉左邊的空格),Trim()(去掉左右兩邊的空格)

    SELECT Concat(RTrim(vend_name),'(',Trim(vend_country),')') FROM vendors;複製代碼

  3. 使用別名AS

    SELECT Concat(RTrim(vend_name),'(',Trim(vend_country),')') AS vend_title FROM vendors;複製代碼

  4.  檢索訂單號20005中的全部物品並計算價格

    SELECT prod_id,quantity,item_price,quantity*item_price AS expanded_price FROM orderitems WHERE order_num = 20005;複製代碼

  5. Upper()函數將文本轉換爲大寫

    SELECT vend_name, Upper(vend_name) AS vend_name_upcase FROM vendors複製代碼

  6. Left()函數返回指定長度的字符串,例:取列prod_description左側的50個字符。

    SELECT prod_name, LEFT(prod_description, 50) summary FROM products;  複製代碼
  7. 日期和時間處理函數
    • AddDate() 增長一個日期(天、周等)
    • AddTime() 增長一個時間(時、分等)
    • CurDate() 返回當前日期
    • CurTime() 返回當前時間
    • Date() 返回日期時間的日期部分-返回格式都是yyyy-mm-dd格式

      // 檢索出一個訂單記錄,該訂單記錄的order_date爲2005-09-01。 
      SELECT cust_id,order_num FROM orders WHERE Date(order_date) = '2005-09-01';
      // 檢索出2005年9月下的全部訂單 
      SELECT cust_id,order_num FROM orders WHERE Date(order_date) BETWEEN '2005-09-01' AND '2005-09-30';
      // 檢索出2005年9月下的全部訂單(不須要記住每月中有多少天或不須要操心閏年2月)
      SELECT cust_id,order_num FROM orders WHERE Year(order_date)= 2005 AND Month(order_date) = 9;
      複製代碼

    • DateDiff() 計算兩個日期之差
    • Date_Add() 高度靈活的日期運算函數
    • Date_Format() 返回一個格式化的日期或時間串
    • Day() 返回一個日期的天數部分
    • DayOfWeek() 對於一個日期,返回對應的星期幾
    • Hour() 返回一個時間的小時部分
    • Minute() 返回一個時間的分鐘部分
    • Month() 返回一個日期的月份部分
    • Now() 返回當前日期和時間
    • Second() 返回一個時間的秒部分
    • Time() 返回一個日期時間的時間部分
    • Year() 返回一個日期的年份部分  
  8. 數值處理函數
    • Abs() 返回一個數的絕對值
    • Cos() 返回一個角度的餘弦
    • Exp() 返回一個數的指數值
    • Mod() 返回除操做的餘數
    • Pi() 返回圓周率
    • Rand() 返回一個隨機數
    • Sin() 返回一個角度的正弦
    • Sqrt() 返回一個數的平方根
    • Tan() 返回一個角度的正切  
  9. 彙集函數
    • AVG() 返回某列的平均值(AVG()只能用來肯定特定數值列的平均值,並且列名必須做爲函數參數給出 ,忽略NULL的行)。例:返回products表中全部產品的平均價格 
      SELECTAVG(prod_price) AS avg_price FROM products;複製代碼

    • COUNT() 返回某列(*表示全部行數)的行數(若是指定列名,則指定列的值爲空的行被COUNT()函數忽略,但若是COUNT()函數中用的是星號( *),則不忽略 )

      // 統計全部行數
      SELECT COUNT(*) AS num_cust FROM custormers;
      // 只對具備電子郵件地址的客戶計數 
      SELECT COUNT(cust_email) AS num_cust FROM custormers;複製代碼

    • MAX() 返回某列的最大值(雖然MAX()通常用來找出最大的數值或日期值,但MySQL容許將它用來返回任意列中的最大值,包括返回文本列中的最大值。在用於文本數據時,若是數據按相應的列排序,則MAX()返回最後一行。 忽略列值爲NULL的行。 )
    • MIN() 返回某列的最小值
    • SUM() 返回某列值之和 (忽略列值爲NULL的行 )
  10. 其餘經常使用函數:
    • Length() 返回串的長度
    • Locate() 找出串的一個子串
    • Lower() 將串轉換爲小寫
    • Soundex() 返回串的SOUNDEX值,對串進行發音比較而不是字母比較。
    • SubString() 返回子串的字符

分組數據

  1. GROUP BY 分組數據
    • GROUP BY子句能夠包含任意數目的列。這使得能對分組進行嵌套,爲數據分組提供更細緻的控制。 
    • 若是在GROUP BY子句中嵌套了分組,數據將在最後規定的分組上進行彙總。換句話說,在創建分組時,指定的全部列都一塊兒計算(因此不能從個別的列取回數據)
    • GROUP BY子句中列出的每一個列都必須是檢索列或有效的表達式(但不能是彙集函數)。若是在SELECT中使用表達式,則必須在GROUP BY子句中指定相同的表達式。不能使用別名
    • 除彙集計算語句外, SELECT語句中的每一個列都必須在GROUP BY子句中給出
    • 若是分組列中具備NULL值,則NULL將做爲一個分組返回。若是列中有多行NULL值,它們將分爲一組。
    • GROUP BY子句必須出如今WHERE子句以後, ORDER BY子句以前。   

      // 例:按vend_id分組數據,並統計相同vend_id的產品有多少個
      SELECT vend_id, COUNT(*) AS num_prods FROM products GROUP BY vend_id;複製代碼

  2. HAVING 過濾分組  (與WHERE相似,WHERE用來過濾行,HAVING用來過濾分組)

    // 例:按vend_id分組數據,並統計相同vend_id的產品有多少個,而且只須要大於兩條的數據
    SELECT vend_id, COUNT(*) AS num_prods FROM products GROUP BY vend_id HAVING COUNT(*)>=2;
    // 組合HAVING和WHERE,例:它列出具備2個(含)以上、價格爲10(含)以上的產品的供應商 
    SELECT vend_id, COUNT(*) AS num_prods FROM products WHERE prod_price >= 10 GROUP BY vend_id HAVING COUNT(*)>=2;複製代碼

子查詢

例子:(利用子查詢進行過濾)數據庫

(1) 檢索包含物品TNT2的全部訂單的編號。bash

(2) 檢索具備前一步驟列出的訂單編號的全部客戶的ID。函數

(3) 檢索前一步驟返回的全部客戶ID的客戶信息。 性能

上述每一個步驟均可以單獨做爲一個查詢來執行。能夠把一條SELECT語句返回的結果用於另外一條SELECT語句的WHERE子句。也可使用子查詢來把3個查詢組合成一條語句。  
測試

在SELECT語句中,子查詢老是從內向外處理。

SELECT cust_name,cust_contact FROM customers WHERE cust_id IN (
SELECT cust_id FROM orders WHERE order_num IN (
SELECT order_num FROM orderitems WHERE prod_id = 'TNT2'));
// 使用聯結方式性能更好-聯結在後面介紹
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';複製代碼

例子:(利用子查詢做爲計算字段使用)spa

(1) 從customers表中檢索客戶列表。設計

(2) 對於檢索出的每一個客戶,統計其在orders表中的訂單數目。  code

SELECT cust_name,cust_state,
(SELECT COUNT(*) FROM orders WHERE orders_cust_id = customers.cust_id) AS orders 
FORM customers ORDER BY cust_name;複製代碼

聯結(Join)

一條SELECT語句中能夠聯結的表的數目沒有限制  

若是數據存儲在多個表中,怎樣用單條SELECT語句檢索出數據? 

子查詢雖然也能夠解決問題,可是性能並非最好。

SELECT vend_name, prod_name, prod_price FR複製代碼

  1. 內部聯結 INNER JOIN ,基於兩個表之間的相等測試。這種聯結也稱爲內部聯結。

    SELECT vend_name,prod_name,prod_price FROM vendors INNER JOIN 
    products 
    ON vendors.vend_id = products.vend_id;複製代碼

  2. 自聯結  

    SELECT p1.prod_id,p1.prod_name FROM products AS p1,
    products AS p2 WhERE
    p1.vend_id = p2.vend.id AND
    p2.prod_id = 'DTNTR';複製代碼

高級聯結

  1. 使用表別名

    SELECT cust_name,cust_contact FROM customers AS c WHERE c.cust_id = 1;複製代碼

  2. 天然聯結:排除屢次出現,使每一個列只返回一次。 

    SELECT c.*, o.order_num FROM customers AS c,orders AS o WHERE c.cust_id = o.cust_id; 複製代碼
  3. 外部聯結(與內部聯結關聯兩個表中的行不一樣的是,外部聯結還包括沒有關聯行 )在使用OUTER JOIN語法時,必須使用RIGHT或LEFT關鍵字指定包括其全部行的表(RIGHT指出的是OUTER JOIN右邊的表,而LEFT指出的是OUTER JOIN左邊的表)  

    // 左外聯結
    SELECT customers.cust_id, orders.order_num FROM customers 
    LEFT OUTER JOIN orders ON 
    customers.cust_id = orders.cust_id;
    // 右外聯結
    SELECT customers.cust_id, orders.order_num FROM customers 
    RIGHT OUTER JOIN orders ON 
    orders.cust_id = customers.cust_id;複製代碼

組合查詢 

 有兩種基本狀況,其中須要使用組合查詢: 

  • 在單個查詢中從不一樣的表返回相似結構的數據  
  • 對單個表執行多個查詢,按單個查詢返回數據。 

使用UNION  

  • UNION必須由兩條或兩條以上的SELECT語句組成,語句之間用關鍵字UNION分隔(所以,若是組合4條SELECT語句,將要使用3個UNION關鍵字)。  
  • UNION中的每一個查詢必須包含相同的列、表達式或彙集函數(不過 各個列不須要以相的次序列出)。  
  • 列數據類型必須兼容:類型沒必要徹底相同,但必須是DBMS能夠隱含地轉換的類型(例如,不一樣的數值類型或不一樣的日期類型)。  

// 返回的數據會自動去除查詢語句中都出現的重複的行
SELECT vend_id,prod_id,prod_privice FROM products WHERE prod_price <=5 
UNION
SELECT vend_id,prod_id,prod_price FROM products WHERE vend_id IN (1001,1002);複製代碼

包含或取消重複的行(UNION AL)

使用UNION返回的數據會自動去除查詢語句中都出現的重複的行

使用UNION ALL, MySQL不取消重複的行

全文搜索

MySQL支持幾種基本的數據庫引擎。並不是全部的引擎都支持本書所描述的全文本搜索。兩個最常使用的引擎爲MyISAMInnoDB,前者支持全文本搜索,然後者不支持。  默認MySQL建立的表都是InnoDB模式,若是須要用到全文搜索,則該表要建立爲MyISAM模式

在使用全文本搜索時, MySQL不須要分別查看每一個行,不須要分別分析和處理每一個詞。MySQL建立指定列中各詞的一個索引,搜索能夠針對這些詞進行。這樣, MySQL能夠快速有效地決定哪些詞匹配(哪些行包含它們),哪些詞不匹配,它們匹配的頻率,等等。  

爲了進行全文本搜索,必須索引被搜索的列,並且要隨着數據的改變不斷地從新索引。在對錶列進行適當設計後, MySQL會自動進行全部的索引和從新索引。  

在索引以後, SELECT可與Match()Against()一塊兒使用以實際執行搜索。  

下面的CREATE語句演示了FULLTEXT子句的使用: 

CREATE TABLE productnotes
(
 note_id int         NOT NULL AUTO_INCREMENT,
 prod_id char(10)    NOT NULL,
 note_text text      NOT NULL,
 PRIMARY KEY(note_id),
 FULLTEXT(note_text)
) ENGINE = MyISAM;複製代碼

爲了進行全文本搜索,MySQL根據子句FULLTEXT(note_text)的指示對它進行索引  這裏的FULLTEXT索引單個列,若是須要也能夠指定多個列。

在定義以後, MySQL自動維護該索引。在增長、更新或刪除行時,索引隨之自動更新。  

在索引以後,使用兩個函數Match()和Against()執行全文本搜索,其中Match()指定被搜索的列, Against()指定要使用的搜索表達式。  

SELECT note_text FROM productnotes WHERE Match(note_text) Against('rabbit');複製代碼

傳 遞 給 Match() 的 值 必 須 與FULLTEXT()定義中的相同。若是指定多個列,則必須列出它們(並且次序正確)  

使用查詢擴展  

查詢擴展用來設法放寬所返回的全文本搜索結果的範圍  

SELECT note_text FROM productnotes WHERE Match(note_text) Against('rabbit' WITH QUERY EXPANSION);複製代碼

全文本布爾操做符  

例:匹配包含heavy但不包含任意以rope開始的詞的行, 可以使用如下查詢: 

SELECT note_text FROM productnotes WHERE Match(note_text) Against('rabbit -rope' IN BOOLEAN MODE);複製代碼

例:搜索匹配包含詞rabbit和bait的行 

SELECT note_text FROM productnotes WHERE Match(note_text) Against('+rabbit +bait' IN BOOLEAN MODE);複製代碼

例:搜索匹配包含rabbit和bait中的至少一個詞的行。 

SELECT note_text FROM productnotes WHERE Match(note_text) Against('rabbit bait' IN BOOLEAN MODE);複製代碼

例:匹配短語rabbit bait而不是匹配兩個詞rabbit和bait 

SELECT note_text FROM productnotes WHERE Match(note_text) Against('"rabbit bait"' IN BOOLEAN MODE);複製代碼

  1. + 包含,詞必須存在

  2. - 排除,詞必須不出現
  3. > 包含,並且增長等級值
  4. < 包含,且減小等級值
  5. () 把詞組成子表達式(容許這些子表達式做爲一個組被包含、排除、排列等)
  6. ~ 取消一個詞的排序值
  7. * 詞尾的通配符
  8. "" 定義一個短語(與單個詞的列表不同,它匹配整個短語以便包含或排除這個短語)  

註釋事項

  • 若是表中的行數少於3行,則全文本搜索不返回結果(由於每一個詞或者不出現,或者至少出如今50%的行中)。 
  •  忽略詞中的單引號。例如, don't索引爲dont。  
  • 僅在MyISAM數據庫引擎中支持全文本搜索。  
  • 在索引全文本數據時,短詞被忽略且從索引中排除。短詞定義爲那些具備3個或3個如下字符的詞(若是須要,這個數目能夠更改)。  
  • MySQL帶有一個內建的非用詞(stopword)列表,這些詞在索引 全文本數據時老是被忽略。若是須要,能夠覆蓋這個列表(請參閱MySQL文檔以瞭解如何完成此工做)  

INSERT

插入一條包含全部記錄的行

INSERT INTO Customers VALUES(NULL,
'Pep E. LaPew',
'100 Main Street',
'CA',
'90047',
NULL,
NULL);複製代碼
INSERT INTO Customers(cust_name,cust_contact,cust_email) VALUES(
'Pep E. LaPew',
NULL,
NULL);複製代碼
沒有輸出 INSERT語句通常不會產生輸出  

各個列必須以它們在表定義中出現的次序填充。第一列cust_id也爲NULL。這是由於每次插入一個新行時,該列由MySQL自動增量。  

插入多行

INSERT INTO Customers(cust_name,cust_contact,cust_email) VALUES(
'Pep E. LaPew',
NULL,
NULL),(
'Peo L',
NULL,
NULL);複製代碼

UPDATE

更新一行

UPDATE Customers SET cust_email = 'elmer@fudd.com' WHERE cust_id = 10005;複製代碼

更新多行

UPDATE Customers SET cust_email = 'elmer@fudd.com',cust_name='THe Fudds' WHERE cust_id = 10005;複製代碼
UPDATE語句中可使用子查詢,使得能用SELECT語句檢索出的數據更新列數據 
  若是用UPDATE語句更新多行,而且在更新這些 行中的一行或多行時出一個現錯誤,則整個UPDATE操做被取消 (錯誤發生前更新的全部行被恢復到它們原來的值)。爲即便是發 生錯誤,也繼續進行更新,可以使用IGNORE關鍵字,以下所示: UPDATE IGNORE customers… 

DELETE

刪除一行: 

DELETE FROM customers WHERE cust_id = 10005;複製代碼
DELETE語句從表中刪除行,甚至是刪除表中全部行。可是, DELETE不刪除表自己。  
若是想從表中刪除全部行,不要使用DELETE。可以使用TRUNCATE TABLE語句,它完成相同的工做,但速度更快  

在對UPDATE或DELETE語句使用WHERE子句前,應該先用SELECT進行測試,保證它過濾的是正確的記錄,以防編寫的WHERE子句不正確  

CREATE TABLE

CREATE TABLE `t_bas_user` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '用戶id',
  `account` varchar(128) NOT NULL COMMENT '帳戶',
  `password` varchar(128) NOT NULL COMMENT '密碼',
  `name` varchar(128) NOT NULL COMMENT '帳戶角色名稱(如:管理員)',
  `phone` varchar(20) NOT NULL COMMENT '手機號碼',
  `status` tinyint(1) NOT NULL DEFAULT 1 COMMENT '帳號狀態,默認1(0:禁用,1:啓用)',
  `meta_created` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP  COMMENT '建立時間',
  `meta_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '最後一次修改時間',
  `meta_logic_flag` tinyint(1) NOT NULL DEFAULT 0 COMMENT '邏輯刪除標識,默認0(0:否,1:是)',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;複製代碼

設置默認值

默認時間:

// 數據庫中datetime默認保存的格式爲'2019-06-03 15:26:51'
`meta_created` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP  COMMENT '建立時間';
複製代碼

引擎類型  

InnoDB是一個可靠的事務處理引擎,它不支持全文本搜索;  

MEMORY在功能等同於MyISAM, 但因爲數據存儲在內存(不是磁盤)中,速度很快(特別適合於臨時表);  

MyISAM是一個性能極高的引擎,它支持全文本搜索,但不支持事務處理。  

更新表(ALTER TABLE)

給表添加一列

ALTER TABLE vendors ADD vend_phone CHAR(20);複製代碼

刪除一列

ALTER TABLE vendors DROP COLUMN vend_phone;複製代碼

重命名錶  (RENAME TABLE )

RENAME TABLE vendors TO vendors1;複製代碼
相關文章
相關標籤/搜索