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語句,它完成相同的工作,但速度更快。