1. 程式人生 > 其它 >mysql 第3次課程筆記

mysql 第3次課程筆記

一、MySQL查詢結果分組操作

1.分組操作

分組允許把資料表中的資料按照某一個或幾個欄位,分為多個組,欄位值相同的為一組。分組是為了便於對每個組進行聚集計算。 

SELECT vend_id,count(*) as prod_num FROM crashcourse.products GROUP BY vend_id;

 

【注意】GROUP BY子句指示MySQL分組資料,然後對每個組而不是 整個結果集進行聚集。在具體使用GROUP BY子句前,需要知道一些重要的規定:

(1)GROUP BY子句可以包含任意數目的列。這使得能對分組進行巢狀,為資料分組提供更細緻的控制。

(2)除聚集計算語句外,SELECT語句中的每個列都必須在GROUP BY子句中給出。  

(3)GROUP BY子句必須出現在WHERE子句之後,ORDER BY子句之前。

(4)如果在GROUP BY子句中嵌套了分組,資料將在最後規定的分組上進行彙總。

 

2.過濾分組

除了能用GROUP BY分組資料外,MySQL還允許過濾分組,使用having子句來完成該操作。 

WHERE vs HAVING:

HAVING非常類似於WHERE。事實上,目前為止所學過的所有型別的WHERE子句都可以用HAVING來替代。所學過的有關WHERE的所有這些技術和選項都適用於HAVING。它們的句法是相同的,只是關鍵字有差別。唯一的差別就是WHERE過濾行,而HAVING過濾分組。另一種理解是WHERE在資料分組前進行過濾,HAVING在資料分組後進行過濾。 

SELECT cust_id,COUNT(*) AS order_num FROM crashcourse.orders GROUP BY cust_id HAVING COUNT(*) >=2 ;

SELECT vend_id,COUNT(*) AS num_prods FROM products WHERE prod_price >= 10 GROUP BY vend_id HAVING COUNT(*) >=2;

 

 

3.Select子句順序

 

4.子查詢 

子查詢(subquery)即巢狀在其他查詢中的查詢。

 

例如:查詢safe產品名供應商的名字?

SELECT * FROM products WHERE prod_name = 'safe';

SELECT * FROM vendors WHERE vend_id = 1003;

SELECT vend_name FROM vendors WHERE vend_id = 1003;

SELECT vend_name FROM vendors WHERE vend_id = (SELECT vend_id FROM vendors WHERE vend_id = 1003);

 

【注意】子查詢需要注意幾個事項:

(1) 在WHERE子句中使用子查詢,應該保證SELECT語句具有與WHERE子句中相同數目的列。通常,子查詢將返回單個列並且與單個列匹配,但如果需要也可以使用多個列。

(2) 子查詢一般與IN操作符結合使用,但也可以用於測試等於(=)、 不等於(<>)等。

(3) 對於能巢狀的子查詢的數目沒有限制,不過在實際使用時由於效能的限制,不能巢狀太多的子查詢。

(4) 使用子查詢並不總是最有效的方法。

 

 

二、MySQL資料增刪改操作

1.資料的新增操作

INSERT是用來插入(或新增)行到資料庫表的。插入可以用幾種方式使用:

(1) 插入完整的行;

(2) 插入行的一部分;

(3) 插入多行;

(4) 插入某些查詢的結果。

 

插入完整行的格式:

insert into 表名(所有列名)Values(各個列的值);

INSERT INTO products(prod_id, vend_id, prod_name, prod_price, prod_desc) VALUES ('ANV023213', 1001, '.5 ton anvil', 5.99, '.5 ton anvil, black, complete with handy hook');

 

【注意】INSERT語句提供了列名,VALUES必須以其指定的次序匹配指定的列名,不一定按各個列出現在實際表中的次序。其優點是,即使表的結構改變, 此INSERT語句仍然能正確工作。

 

插入行的一部分格式:

insert into 表名(列名1,列名2,列名3,…,列名n)Values(各個列的值);

INSERT INTO customers (cust_name)  VALUES ('Coyote Inc123.');

 

【注意】INSERT語句可以省略部分列名,如果表的定義允許,則可以在INSERT操作中省略某些列。省略的列必須滿足以下某個條件,一個是該列定義為允許NULL值(無值或空值),另外一個是在表定義中給出預設值,這表示如果不給出值,將使用預設值。

 

插入多行的格式:

insert into 表名(所有列名)Values(各個列的值),(各個列的值),(各個列的值);

insert into 表名(列名1,列名2,列名3,…,列名n)Values(各個列的值),(各個列的值),(各個列的值);

INSERT INTO customers (cust_id, cust_name) VALUES (10007, 'Coyote Inc.'),(10008, 'Coyote Inc.');

 

插入其他查詢得到的資料的格式:

Insert  into 表A (列1,列2) select 列1,列2  from  表B;

INSERT INTO customers (cust_id, cust_name) SELECT vend_id,vend_country from vendors where vend_id = '1006';

 

2.資料的更新操作

為了更新(修改)表中的資料,可使用UPDATE語句。

可採用兩種方式使用UPDATE:更新表中特定行 或者 更新表中所有行。 

注意】UPDATE語句如果後面不跟where語句的話,將修改表中所有的行,使用的時候需要小心,以免產生錯誤的修改。

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

update customers set cust_name = 'aimi',cust_email = '[email protected]' where cust_id = '10005';

 

#未加where條件語句會導致表中所有行被修改,而且不可逆。

UPDATE customers SET cust_email = NULL;  

 

【注意】在UPDATE語句中使用子查詢 UPDATE語句中可以使用子查詢,使得能用SELECT語句檢索出的資料更新列資料。

3.資料的刪除操作

為了從一個表中刪除(去掉)資料,使用DELETE語句。可以兩種方式使用DELETE:從表中刪除特定的行 或者 從表中刪除所有行。

注意】DELETE語句如果後面不跟where語句的話,將刪除表中所有的行,使用的時候需要小心,以免產生錯誤的刪除。

 

CREATE TABLE products_backup as SELECT * FROM products;

DELETE FROM products_backup WHERE prod_price = 10;

SELECT * FROM products_backup;

DELETE FROM products_backup;

SELECT * FROM products_backup;

  

DELETE子句刪除的是表中的行,而不是表本身。

TRUNCATE語句是先刪除整張表,然後重新建立一個空表。

DROP語句刪除表但不重新建立。

 

TRUNCATE TABLE products_backup;

DROP TABLE  products_backup;

 

【注意】如果想從表中刪除所有行,不要使用DELETE。可使用TRUNCATE TABLE語句,它完成相同的工作,但速度更快。