mysql學習總結

  1. 檢索數據
    • 檢索單個列數據
    • 檢索多個列數據
    • 檢索所有列數據
    • 檢索不同的值
      • 使用 DISTINCT關鍵字
      • 不能部分使用DISTINCT,關鍵字用於所有列,不僅僅是跟在其後的列。
    • 限制結果
      • 輸出指定的行數 SELECT name FROM user limit 5;
      • 輸出指定的行數從哪一行開始 SELECT name FROM user limit 5 offset 5;
    • 使用註釋
      • 在一行的開始使用#,這一整行都將作爲註釋。
      • 多行註釋,/**/
  2. 排序檢索數據
    • 爲了明確地排序用SELECT語句檢索出來的數據,可使用ORDER BY子句。
      • ORDER BY子句取一個或多個列的名字,據此對輸出進行排序。
    • ORDER BY子句的位置
      • 在指定一條ORDER BY子句的事後,應該確保它是SELECT語句的最後一條子句。如果它不是最後一條子句,將會出現錯誤信息。
    • 按多個列排序
      • 要按多個列排序,簡單指定列名,列名之間使用逗號分隔。
    • 按照列位置進行排序
      • 除了能用列名指出排序順序外,ORDER BY還支持按照相對位置進行排序。
      • 例子 SELECT prod_id, prod_price, prod_name FROM Products ORDER BY 2, 3;
      • 這一技術的主要好處是不用重新輸入列名,但它也有缺點。不明確地給出列名可能會造成錯用列名排序。
    • 指定排序方向
      • 降序排序 DESC.
      • 升序 ASC
  3. 過濾數據
    • 使用WHERE子句
      • 只檢索所需數據需要指定搜索條件(search criteria),搜索條件也稱爲過濾條件。
      • 警告:在同時使用ORDER BYWHERE子句,應該讓ORDER BY位於WHERE之後,否則將會產生錯誤。
    • WHERE子句操作符
      • 檢查單個值
      • 不匹配檢查
        • 例子: SELECT vend_id, prod_name FROM Products WHERE vend_id <> 'DLL01'SELECT vend_id, prod_name FROM Products WHERE vend_id != 'DLL01'
      • 範圍值檢測
        • 要檢查某個範圍的值,可以使用BETWEEN操作符。
      • 空值檢查
        • 確定值是否爲NULL,不能簡單地檢查是否=NULL
        • 例子:SELECT prod_name FROM Products WHERE prod_price IS NULL
      • 警告:通過過濾選擇不包含指定值的所有行,你可能希望返回含NULL值的行。但是這做不到,因爲未知(unknown)有特殊的含義,數據庫不知道他們是否匹配,所以在進行匹配過濾或非匹配過濾時,不會返回這些結果。
  4. 高級過濾數據
    • 爲了進行更強的過濾控制,SQL允許給出多個WHERE子句。這些子句有兩種使用方式,即以ANDOR子句的方式使用。
      • 操作符(operator)用來聯接或改變WHERE子句中的子句的關鍵字,也稱爲邏輯運算符(logical operation)
    • AND操作符
      • 要通過不止一個列進行過濾,可以使用AND操作符給WHERE子句附加條件。
      • 例子:SELECT prod_id, prod_price, prod_name FROM Products WHERE vend_id = 'DLL01' AND prod_price <= 4;
    • OR操作符
      • AND操作符相反
    • 求值順序
      • 允許兩者結合以進行復雜、高級的過濾。
      • SQL在處理OR操作符前,優先處理AND操作符。解決這個問題的方法是使用圓括號來進行明確分組。
      • 任何時候使用具有ANDOR操作符的WHERE子句,都應該使用圓括號明確地分組操作符。不要過分依賴默認求值順序。
    • IN操作符
      • IN操作符用來指定條件範圍。
    • NOT操作法
      • NOT操作符只有一格功能,否定其後所跟的任何條件。
  5. 用通配符進行 過濾
    • like操作符
      • %通配符
        • 在搜索中,百分號表示任意字符出現任意次數
        • 例子
          • 找出所有詞Fish起頭的產品:SELECT prod_id, prod_name FROM Products WHERE prod_name LIKE 'Fish%'; # 執行這條語句將檢索任意以Fish起頭的詞。
          • 多個匹配符:SELECT prod_id, prod_name FROM Products WHERE prod_name LIKE '%began bag%'; # 搜索模式’%began bag%'表示任何位置商包含文本began bag的值,不論它之前或之後出現什麼字符。
          • 通配符出現在搜索模式的中間:SELECT prod_name FROM Products WHERE prod_name LIKE 'F%y'; # 有一種情況下把通配符放在中間是有用的,比如WHERE email LIKE b%forta.com
        • 注意NULL:子句SELECT prod_name LIKE %不會匹配產品名稱爲NULL的行
      • 下劃線(_)通配符
        • 用途和%一樣,但它只匹配單個字符,而不是多個字符。
        • 例子
          • SELECT prod_id, prod_name FROM Products WHERE prod_name LIKE '__ inch teddy bear' # 注意後面的空格
        • 注意:_總是剛好匹配一格字符,不能多也不能少,與%匹配0個不一樣。
      • 方括號([])通配符
        • 方括號([])通配符用來指定一格字符集,它必須匹配指定位置的一個字符。
    • 使用通配符技巧
      • 不要過度使用通配符
      • 在確實使用通配符時,也儘量不要把他們用在搜索模式開始處。
      • 仔細注意通配符的位置
  6. 創建計算字段
    • 計算字段
      • 字段(field):基本上與列(column)意思相同,進程互相使用
    • 拼接字段
      • 拼接(concatenate):將值聯接到一起(將一個值附加到另一個值)構成單個值
      • 例子:
        • SELECT vend_name + '(' + vend_country + ')' FROM Vendors ORDER BY vend_name
        • 相同效果:SELECT vend_name || '(' || vend_contry || ')' FROM Vendors ORDER BY vend_name;
    • 使用別名
      • SQL支持列別名。別名(alias)是一個字段或值的替換名。別名用AS關鍵字賦予。
      • 例子
        • SELECT RTRIM(vend_name) + '(' + RTRIM(vend_contry) + ')' AS vend_title FROM Vendors ORDER BY vend_name;
    • 執行算數計算
      • 例子:
        • SELECT prod_id, quantity, item_price, quantity * item_price AS expand_price FROM OrderItems WHERE order_num = 20008;
  7. 使用數據處理函數
    • 函數
      • 可移植(portable):所編寫的代碼可以在多個系統上運行
    • 使用函數
      • 文本處理函數
        • 例子:SELECT vend_name, UPPER(vend_name) AS vend_name_upcase FROM Vendors ORDER BY vend_name;
      • 日期和時間處理函數
        • 應用程序一般不使用日期和時間的存儲格式。
        • 例子:
          • SELECT order_num FROM Orders WHERE YEAR(order_date) = 2012;
      • 數值處理函數
  8. 彙總數據
    • 聚集函數
      • 聚集函數(aggregate function)對某些運行的函數,計算並返回一格值。
      • 例子:
        • AVG():返回某列的平均值
        • COUNT(): 計算某列的行數
        • MAX() :返回某列的最大值
        • MIN(): 返回某列的最小值
        • SUM(): 返回某列值值和
      • AVG()函數:
        • AVG()通過對錶中行數計算並計算其列值之和。
        • 例子:SELECT AVG(prod_price) AS avg_price FROM Products;
        • AVG()函數忽略值爲NULL的行
      • COUNT 函數
        • COUNT()函數進行計數。
        • COUNT()函數兩種使用方式
          • 使用COUNT(*)對錶中數目進行計算,不管表列中是否包含的是空值(NULL)還是非空值
          • 使用COUNT(column)對特定列中具有值的行進行計算,忽略NULL值
      • MAX函數
        • 返回指定列中的最大值
        • 例子:SELECT MAX(prod_price) AS max_price FROM Products;
        • 對非數值數據使用MAX(),用於文本數據時,MAX()返回按該列排序後的最後一行。
      • MIN函數
        • MIN函數與MAX函數功能相反
        • 例子:SELECT MIN(prod_price) AS min_price FROM Products
        • 雖然MIN()函數一般用來找出最小的數值或日期,但在用於文本數據的時候,MIN()會返回該列排序後最前面的行。
      • SUM函數
        • SUM()函數用來返回指定列值的和(總計)。
        • 例子:SELECT SUM(quantity) AS items_ordered FROM OrderItems WHERE order_num = 2005;
        • NULL值,SUM函數會自動忽略NULL的值
    • 聚集不同值
      • DISTINCT不能用於COUNT(*)
        • 如果指定列名,則DISTINCT只能用於COUNTDISTINCT不能用於COUNT(*)。類似地,DISTINCT必須使用列名,不能用於計算或表達式。
    • 組合聚集函數
      • 例子
        • SELECT COUNT(*) AS num_items,
          MIN(prod_price) AS price_min,
          MAX(prod_price) AS price_max,
          MAX(prod_price) AS price_avg
          FROM Products
  9. 分組數據
    • 數據分組
      • 例子:SELECT COUNT(*) AS num_prods FROM Products WHERE vend_id = 'DLL01'
    • 創建分組
      • 分組是使用SELECTGROUP BY子句。
      • 例子:SELECT vend_id, COUNT(*) AS num_prods FROM Products GROUP BY vend_id
    • 過濾分組
      • HAVING非常類似於WHERE。事實上,目前所有類型的WHERE都可以用HAVING來代替。唯一的差別,WHERE過濾行,而HAVING過濾分組。
      • 過濾分組例子:
        • SELECT cust_id, COUNT(*) AS orders
          FROM Orders
          GROUP BY cust_id
          HAVING COUNT(*) >= 2;
    • 分組和排序
      • GROUP BYORDER BY完成相同工作。
      • ORDER BY對產生的輸出排序,任意列都可以使用,但不一定需要。
      • 一般在使用GROUP BY子句時,應該也使用ORDER BY子句。這是保證數據正確排序的唯一方法。千萬不要依賴GROUP BY排序數據。
      • 例子:
        • SELECT order_num, COUNT(*) AS items
          FROM OrderItems
          GROUP BY order_num
          HAVING COUNT(*) >= 3
    • SELECT子句順序
  10. 使用子查詢
    • 子查詢
      • 查詢(query):任何SQL語句都是查詢。
    • 使用子查詢過濾
      • 例子
        • SELECT cust)id
          FROM Orders
          WHERE order_num IN (SELECT order_num
          FROM OrderItems
          WHERE prod_id = 'RGAN01');
        • SELECT cust_name, cust_contact
          FROM Customers
          WHERE cust_id IN (SELECT cust_id
          FROM Order
          WHERE order_num IN (SELECT order_num
          FROM OrderItems
          WHERE prod_id = 'RANGE01'));
    • 作爲計算字段使用子查詢
      • 使用子查詢的另一個方法是創建計算字段。
      • 例子
        • SELECT cust_name,
          cust_state,
          (SELECT Orders
          FROM Orders
          WHERE Orders.cust_id = Customers.cust_id) AS orders
          FROM Customers
          ORDER BY cust_name;
  11. 創建和操作表
    • 創建表
      • 表創建基礎
        • 使用CREATE TABLE
          • 新表的名字
          • 表列的名字和定義,逗號分隔
          • 有的DBMS還要求表的位置
        • 例子
          • 創建Products
            • CREATE TABLE Products
              (
              prod_id CHAR(10) NOT NULL,
              prod_vend_id CHAR(10) NOT NULL,
              prod_name CHAR(254) NOT NULL,
              prod_price DECIMAL(8, 2) NOT NULL,
              prod_desc VARCHAR(1000) NULL
              )
        • 注意:指定的表名必須不存在,否則將會報錯。
      • 使用NULL值
        • 允許NULL值的列也允許在插入行時不給該列的值
        • 不允許NULL值的列不接受沒有列值的行
        • 每個表列要麼是NULL列,要麼是NOT NULL值。
        • 例子
          • CREATE TABLE Vendors
            (
            vend_id CHAR(10) NOT NULL,
            vend_name CHAR(50) NOT NULL,
            vend_city CHAR(50) ,
            vend_zip CHAR(10)
            );
      • 指定默認值
        • SQL允許指定默認值,在插入行時如果不給出值,將會採用默認值。默認值在CREATE TABLE語句的列定義中用關鍵字DEFAULT指定。
        • 例子
          • CREATE TABLE OrderItems
            (
            order_num INTEGER NOT NULL,
            order_item INTEGER NOT NULL,
            prod_id CHAR(10) NOT NULL,
            quantity INTEGER NOT NULL DEFAULT 1,
            item_price DECIMAL(8,2) NOT NULL
            );
    • 更新表
      • 更新表定義,可以使用ALTER TABLE語句。
      • 例子
        • ALTER TABLE Vendors
          ADD vend_phone CHAR(20);
        • ALTER TABLE Vendors
          DROP COLUMN vend_phone
      • 小心使用ALTER TABLE
        • 使用ALTER TABLE要極爲小心,應該在進行該動前做完整的備份。(模式和數據的備份)。數據表的更改不能撤銷,如果增加了不需要的列,業務無法刪除他們。
    • 刪除表
      • DROP TABLE CustCopy;
    • 重新命名錶
      • 不存在嚴格標準,MySQL使用RENAME語句。
  12. 插入數據
    • 數據插入
      • 插入完整行
        • 例子
          • INSERT INTO TABLE Customer
            VALUES ('1004',
            'Toy Land'
            );
      • 插入部分行
      • 插入檢索出數據
        • INSERT一般用來給表插入具有指定列的值的行。INSERT還存在另外一種形式,可以利於它將SELECT語句的結果插入表中。這就是所謂的INSERT SELECT.
        • 例子
          • INSER INTO Customers(
            cust_id,
            cust_contact)
            SELECT cust_id,
            cust_contact
            FROM Custnew;
    • 從一個表複製到另一個表
      • 有一種數據插入不使用INSERT語句。要將表的內容複製到另一個全新的表,可以使用SELECT INTO.
      • 例子:
        • SELECT *
          INTO CustCopy
          FROM Customer;
  13. 更新和刪除數據
    • 更新數據使用UPDATE
    • 刪除數據使用DELETE
      • 例子
        • DELETE FROM Customer
          WHERE cust_id = '100';
      • 如果要刪除所有的行,請使用TRUNCATE TABLE;語句
    • 跟新和刪除的指導原則
      • 下面是很多SQL程序員使用UPDATEDELETE時所遵循的原則
        • 除非確實打算更新和刪除每一行,否則絕不要使用不帶WHERE子句的UPDATEDELETE
        • 保證每個表都有主鍵,儘可能像WHERE那樣使用它。
        • UPDATEDELETE語句使用WHERE子句之前,應該先使用SELECT進行測試,確保它過濾的是正確的記錄,以防止編寫的WHERE子句不正確。
  14. 視圖
    • 視圖是虛擬的表。與包含數據的表不一樣,視圖只包含使用動態檢索數據的查詢。
      • 例子
        • 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 = 'RGAN01';
    • 創建視圖
      • 視圖用CREATE VIEW來創建視圖。只能用於創建不存在的視圖。刪除視圖使用DROP VIEW,覆蓋更新視圖需要先刪除存在的視圖。
      • 例子
        • CREATE VIEW ProductCustomer AS
          SELECT custom_id, custom_contact, prod_id
          FROM Customer, Orders, OrderItems
          WHERE Customer.cust_id = Orders.cust_id
          AND OrderItems.order_num = Orders.order_num;

          SELECT custom, cust_content
          FROM ProductCustomer
          WHERE prod_id = 'RGAN01';

    • 利用視圖簡化複雜的聯接
      • 一個最常見的視圖作用是隱藏複雜的SQL,這通常涉及到聯結。
      • 視圖大大簡化了複雜的SQL語句的使用。利用視圖,可一次性編寫基礎的SQL,然後根據多次使用。
        • 創建不綁定特定數據的視圖是一個好方法。擴展視圖的範圍不僅使得它能被重用,而且可能很有用。這樣做不需要創建和維護多個類似視圖。
    • 用視圖重新格式化檢索出的數據
  15. 聯結表
    • 聯結
      • SQL最強大的功能之一就是在 數據查詢的執行中聯結(join)表。聯結就是利用SQL 的SELECT能執行的最重要動作。
    • 創建聯結
    • 聯結表是SQL一個最重要、最強大的特性,有效地使用聯結需要對關係數據庫設計的基本瞭解。
  16. 創建高級聯結
    • 使用表別名
      • 例子
        • SELECT RTRIM(vend_name) + '(' + RTRIM(vend_price) + ')'
          AS vend_title
          FROM Vendors
          ORDER BY vend_name;
    • 使用不同類型的聯結
    • 使用帶聚集函數的聯結
    • 使用聯結和聯結條件
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章